{ "info": { "author": "chris deitrick", "author_email": "chrisdeitrick1@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# A set of scripts to cluster mutational trajectories into genotypes and cluster genotypes by background\n![muller_plot](./example/example.muller.unannotated.png)\n\n# Contents\n- [A set of scripts to cluster mutational trajectories into genotypes and cluster genotypes by background](#a-set-of-scripts-to-cluster-mutational-trajectories-into-genotypes-and-cluster-genotypes-by-background)\n- [Contents](#contents)\n- [Installation](#installation)\n- [Requirements](#requirements)\n\t- [Optional Packages](#optional-packages)\n- [Sample Usage](#sample-usage)\n- [General Workflow](#general-workflow)\n- [Script Options](#script-options)\n\t- [General Options](#general-options)\n\t- [Filtering Options](#filtering-options)\n\t- [Clustering Options](#clustering-options)\n\t- [Nesting Options](#nesting-options)\n\t- [Graphics Options](#graphics-options)\n- [Input Dataset](#input-dataset)\n- [Output](#output)\n\t- [Tables](#tables)\n\t\t- [Timeseries tables](#timeseries-tables)\n\t\t- [Tables for ggmuller](#tables-for-ggmuller)\n\t\t- [Linkage matrix](#linkage-matrix)\n\t\t- [Distance Matrix](#distance-matrix)\n\t\t- [Muller table](#muller-table)\n\t- [Graphics](#graphics)\n\t\t- [Muller Plots](#muller-plots)\n\t\t- [Lineage Diagrams](#lineage-diagrams)\n\t\t- [Timeseries plots](#timeseries-plots)\n\t\t- [Distance Heatmap](#distance-heatmap)\n\t\t- [Dendrogram](#dendrogram)\n\t- [Scripts](#scripts)\n\t- [Supplementary files](#supplementary-files)\n\n# Installation\nThese scripts are available on [pypi](https://pypi.org/project/muller/) and can be installed with\n```bash\npip install muller \n```\nTo update the scripts to the newest version, simply run \n```bash\npip install muller --upgrade\n```\n\nThen run the scripts using \n```\nlineage [args]\n```\n\nIt is also possible to simply clone the package, although the additional required packages would then need to be installed separately.\n```\ngit clone https://github.com/cdeitrick/muller_diagrams.git\ncd muller_diagrams\nlineage [args]\n```\n\n# Requirements\nThe scripts require a few python packages to work. Each of these can be installed using `pip install [package]` or `conda install [package]`.\n- dataclasses (if using a python version below 3.7)\n- loguru\n- matplotlib\n- pandas\n- pygraphviz\n- scipy\n- seaborn\n- xlrd (to read excel files)\n\nIf the package `pygraphviz` throws an error during installation, it is usually because it can't find the correct dependancies in the current environment.\nInstall the dependancies using \n\nLinux:\n```bash\nsudo apt-get install python-dev graphviz libgraphviz-dev pkg-config\n```\nMac:\n```bash\nbrew install graphviz\n```\nor the equivalent package manager on your system.\n\n## Optional Packages\n- `tqdm`: If `tqdm` is also installed, the scripts will display a progressbar for large datasets.\n- `beautifulsoup4`: Sometimes the encoding of csv files is ambiguous (the scripts throw a UnicodeDecodeError). If `beautifulsoup4` is installed the scripts will attempt to correct encoding errors.\n\n\n# Sample Usage\nThe scripts currently default to hierarchical clustering using the binomial distance. More information is available in the \"description\" folder.\nUse python to call the \"muller\" folder:\n```\nMuller.py --input [input filename] --output [output folder]\n```\n\nRun with default parameters.\n\n```\nMuller.py --input [filename] --frequencies 0.05 --detected 0.10\n```\nGroups genotypes in groups of 0.05 (i.e. `[0.00, 0.05, 0.10, ... , 0.90, 0.95, 1.00]`) based on each genotype's maximum frequency. Each genotype in each group is then sorted by the timepoint it was first detected (the first timepoint where the frequency was greater than 0.10). Output files are saved to the same folder as the input table.\n\n# General Workflow\n\nFlowcharts for each individual step can be found under docs/flowcharts.\n\n![overview](./docs/flowcharts/0-overview.png)\n\n# Script Options\n\n## General Options\n\t-h, --help \n Show a help message and exit\n --name \n Prefix to use when naming the output files. defaults to the dataset filename.\n\t-i, --input \n The table of trajectories to cluster. Must be an excel file or csv/tsv file.\n The delimiter will be inferred from the file extension.\n\t-o, --output \n The output folder to save the files to.\n --threads [2] \n The number of processes to use. This is only relevant for very large datasets.\n\t-d, --detection \n The uncertainty to apply when performing\n\t frequency-based calculations. For\n\t example, a frequency at a given timepoint\n\t is considered undetected if it falls\n\t below 0 + `detection`.\n\t--fixed \n The minimum frequency at which to\n\t consider a mutation fixed. Defaults to\n\t 1 - `uncertainty`\n\t-s, --significant \n [0.15] The frequency at which to consider a genotype\n\t significantly greater than zero.\n\t-f, --frequencies \n [0.10] The frequency cutoff or step to use when sorting genotypes.\n\t May be a comma-separated string of frequencies, or a set inverval\n\t to use when generating the frequency breakpoints. This affects\n the filtering step and the nesting step.\n\t For example, a value of 0.15 will use the frequencies 0,.15,.30,.45...\n\t--genotypes Indicates that the input table contains genotypes rather\n\t than mutational trajectories. This will skip the filtering and clustering steps.\n --sheetname \n Specifies the sheet to use when the input is an excel file. Defaults to\n the first sheet in the spreadsheet.\n --gene-alias ALIAS_FILENAME\n An optional two-column file with more accurate gene\n names. This is useful when using a reference\n annotated via prokka.\n\n## Filtering Options\n\t--dasable-all-filters \n Disables the genotype filtering step.\n --disable-filter-single \n Keep trajectories only detected at a single timepoint.\n --disable-filter-startsfixed\n Keeps mutational trajectories which begin the experiment fixed.\n --filter-constant \n [0.10] Sets the delta value by which a mutational trajectory must vary by to not \n be removed for being a constant mutation. Set to 0 to disable\n\n## Clustering Options\n -m, --method Selects the clustering method to use. 'two-step' will use the original two-step\n method of sorting trajectories into genotypes while 'hierarchy' will use\n hierarchical clustering to do the clustering. Defaults to 'matlab'\n --metric Used to select the distance metric when `--method` is set to 'hierarchy'.\n Available Options:\n 'similarity', 'binomial' [Default] Uses the binomial test implemented in the original matlab scripts as a distance metric.\n 'jaccard' Uses the Jaccard distance between two series to determine the distance metric.\n 'minkowski' Uses the minkowski distance as a distance metric. Primarily influenced by the\n difference between two series.\n 'pearson' Uses the pearson correlation coefficient as the distance metric. Primarily\n influenced by the correlation of two series against each other.\n 'combined' A combination of the 'pearson' and 'minkowski' distances to account for the\n correlation of two series as well as the difference between them.\n -r --similarity-cutoff \n [0.05] Used when grouping trajectories into genotypes.\n Maximum p-value difference to consider trajectories related when using\n the two-step method, and selects the maximum distance to consider\n trajectories related when `--method` is `hierarchy`.\n -d, --difference-cutoff [0.10] Only used when `--method` is `twostep`.\n Used to unlink unrelated trajectories present in a genotype. Is not used\n when using hierarchical clustering.\n -g, --known-genotypes \n Path to a file listing trajectories which are known to be in the same genotype.\n Each line in the file represents a single genotype, and each line should be a\n comma-separated list of trajectory labels as they appear in the input dataset.\n --filename-pairwise \n A table of pairwise distance calculations computed in a previous run using\n identical input parameters. This is only usefull if the dataset being re-run \n would other wise take a very onlg time to process (such as data from the \n Long Term Evolution Experiment).\n\n## Nesting Options\n --additive\n [0.03] Controls how the additive score between a nested and\n unnested genotype is calculated. Defaults to the\n detection cutoff value.\n --subtractive\n Controls when the combined frequencies of a nested and\n unnested genotype are considered consistently larger\n than the fixed cutoff.Defaults to the detection cutoff\n value. (default: None)\n --derivative\n Controls how much a nested and unnested genotype\n should be correlated/anticorrelated to be considered\n significant (default: 0.01). Correlation implies a positive relationship\n between the nested/unnested genotypes while anticorrelation is evidence\n against nesting the unnested genotype under the nested genotype.\n --known-ancestry\n A tab-delimited file designating the known ancestry of certain\n genotypes. The left column should be the genotype to nest,\n right column should be its parent. Column names are ignored.\n Genotype names are generated during the clustering step,\n so this is only useful when re-running the analysis.\n\n## Graphics Options\n --genotype-colors Path to a file with a custom genotype colorscheme. The file should be tab-delimited\n with a genotype name (ex. 'genotype-13') in the first column and a HEX color code\n (ex. '#F5674A') in the second. These colors will override the default colorscheme.\n --no-outline\n Disables the white ouline surrounding each series in the muller plots.\n\t--no-render \n\t Disables `.svg` renders.\n\t--highlight \n\t A comma-separated list of genotype names or annotations to highlight in the generated graphics.\n\t--highlight-color \n\t [#F34A20] What the color of highlighted genotypes should be. Only HEX color codes are supported.\n\n# Input Dataset\n\nThe script operates on a table listing all mutations and their corresponding frequencies at each timepoint (refered to as \"trajectories\" in this script) or a table with each genotype and frequency at each timepoint (ex. the genotype table in the examples folder).\nThe table must have a column named `Trajectory` with labels for each mutational trajectory (or `Genotype` when using `--genotype`) and integer columns for each timepoint. The labels are solely used to identify trajectories belonging to a specific genotype, and must be integers. All other columns will be ignored when calculating genotypes and genotype clusters.\nThe frequencies can be represented as either a number between 0 - 1,\na number between 0 - 100 or as percentage.\nThe `Trajectory` and `Genotype` columns can contain any kind of label, but must be unique for each trajectory/genotype.\n\n| Population | Trajectory | Chromosome | Position | Class | Mutation | 0 | 17 | 25 | 44 | 66 | 75 | 90 |\n|------------|---------------|------------|----------|-------|----------|---|-------|-------|-------|-------|-------|-------|\n| B2 | 1 | 1 | 38102 | SNP | C>T | 0 | 0 | 26.1% | 100% | 100% | 100% | 100% |\n| B2 | 2 | 1 | 62997 | SNP | T>G | 0 | 0 | 0 | 52.5% | 45.4% | 91.1% | 91% |\n| B2 | 3 | 1 | 78671 | SNP | A>C | 0 | 0 | 0 | 14.7% | 45% | 92.4% | 88.7% |\n| B2 | 4 | 1 | 96585 | SNP | T>G | 0 | 0 | 0 | 0 | 21.1% | 81.1% | 81.3% |\n| B2 | 5 | 1 | 115010 | SNP | G>T | 0 | 0 | 0 | 40.3% | 48.9% | 5.7% | 8% |\n| B2 | t16 | 1 | 299332 | SNP | C>T | 0 | 0 | 0 | 0 | 20.9% | 20.9% | 0 |\n| B2 | 6 | 1 | 156783 | SNP | C>G | 0 | 0 | 0 | 0 | 0 | 100% | 100% |\n| B2 | 7 | 1 | 176231 | SNP | T>A | 0 | 0 | 0 | 27.3% | 78.1% | 100% | 100% |\n| B2 | 8 | 1 | 205211 | SNP | C>T | 0 | 0 | 0 | 0 | 34.5% | 83.3% | 79.3% |\n| B2 | 9 | 1 | 223199 | SNP | C>G | 0 | 0 | 0 | 0 | 0 | 26.9% | 34% |\n| B2 | trajectory-10 | 1 | 262747 | SNP | T>C | 0 | 0 | 11.7% | 0 | 0 | 0 | 10.3% |\n| B2 | trajectory-11 | 1 | 264821 | SNP | C>T | 0 | 0 | 0 | 10.8% | 15.1% | 0 | 0 |\n| B2 | trajectory-12 | 1 | 298548 | SNP | G>A | 0 | 12.5% | 0 | 15.3% | 18.1% | 17.5% | 19.1% |\n| B2 | trajectory-13 | 1 | 299331 | SNP | G>A | 0 | 0 | 0 | 0 | 25.8% | 5.7% | 7.5% |\n| B2 | trajectory-14 | 1 | 299332 | SNP | C>T | 0 | 38% | 43.2% | 0 | 0 | 0 | 0 |\n| B2 | t15 | 1 | 299332 | SNP | C>T | 0 | 0 | 6.6% | 10.4% | 6.2% | 0 | 0 |\n| B2 | t16 | 1 | 299332 | SNP | C>T | 0 | 0 | 0 | 0 | 20.9% | 20.9% | 0 |\n| B2 | t17 | 1 | 299332 | SNP | C>T | 0 | 0 | 0 | 0 | 0 | 26.6% | 31.2% |\n| B2 | t18 | 1 | 299332 | SNP | C>T | 0 | 0 | 0 | 11.5% | 0 | 13.1% | 0 |\n| B2 | t19 | 1 | 299332 | SNP | C>T | 0 | 0 | 0 | 18.8% | 17.1% | 23.2% | 24.4% |\n| B2 | 20 | 1 | 299332 | SNP | C>T | 0 | 0 | 0 | 13.8% | 29.5% | 0 | 8.1% |\n| B2 | 21 | 1 | 299332 | SNP | C>T | 0 | 0 | 0 | 11.4% | 0 | 11% | 12.3% |\n\n\n# Output\nAll files are prefixed by the name of the original input table if the `--name` parameter is unfilled.\n\n## Tables\n\n### Timeseries tables\n- .muller_genotypes.tsv\n- .muller.trajectories.tsv\n- tables/.muller_genotypes.original.tsv\n- tables/.trajectories.original.tsv\n\nTables listing the genotypes and trajectories encountered in the analysis. The trajectory tables also link each trajectory to its respective genotype. There are two versions of these tables: one set with the original input trajectories and the initial calculated genotypes and another set with the final trajectories and genotypes left in the analysis after the filtering step. The trajectory tables include all columns from the input trajectory table as well as the timeseries and annotation columns used in the analysis.\n\nExample Genotype Table:\n\n| Genotype | 0.000 | 17.000 | 25.000 | 44.000 | 66.000 | 75.000 | 90.000 |\n| ----------- | ----- | ------ | ------ | ------ | ------ | ------ | ------ |\n| genotype-1 | 0.000 | 0.380 | 0.432 | 0.000 | 0.000 | 0.000 | 0.000 |\n| genotype-2 | 0.000 | 0.000 | 0.000 | 0.403 | 0.489 | 0.057 | 0.080 |\n| genotype-3 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | 1.000 | 1.000 |\n| genotype-4 | 0.000 | 0.000 | 0.261 | 1.000 | 1.000 | 1.000 | 1.000 |\n| genotype-5 | 0.000 | 0.000 | 0.000 | 0.273 | 0.781 | 1.000 | 1.000 |\n| genotype-6 | 0.000 | 0.000 | 0.092 | 0.052 | 0.031 | 0.000 | 0.052 |\n| genotype-7 | 0.000 | 0.000 | 0.000 | 0.000 | 0.278 | 0.822 | 0.803 |\n| genotype-8 | 0.000 | 0.000 | 0.000 | 0.336 | 0.452 | 0.918 | 0.899 |\n| genotype-9 | 0.000 | 0.000 | 0.000 | 0.076 | 0.043 | 0.219 | 0.255 |\n| genotype-10 | 0.000 | 0.021 | 0.000 | 0.086 | 0.182 | 0.095 | 0.058 |\n\n\n### Tables for ggmuller\n- tables/.ggmuller.populations.tsv\n- tables/.ggmuller.edges.tsv\n\nThese tables are designed for use with the ggmuller r package. The `populations` table describes the population/abundance of each genotype at each timepoint while the `edges` table describes the ancestry relationship between genotypes.\n\n### Linkage matrix\n- tables/.linkagematrix.tsv\n\nThis table is generated using the [scipy](https://docs.scipy.org/doc/scipy/reference/cluster.hierarchy.html) python package. It describes the agglomeration of clusters starting with the individual trajectories, as well as the mean, variance, and trajectory count of each cluster.\nColumns:\n- `left`, `right`: The two sub-clusters merged to create the current clusters\n- `clusterId`: The id assigned to this cluster. Note that since the individual genotypes are not included in the table, the clusters are numbered in order starting with 1 + the total number of genotypes.\n- `distance`: The distance between the two sub-clusters.\n- `observations`: The number of mutational trajectories contained in this cluster.\n\nExample linkage matrix:\n\n| left | right | distance | observations | resultingCluster |\n|------|-------|----------|--------------|------------------|\n| 7 | 18 | 0.034 | 2 | 19 |\n| 13 | 17 | 0.175 | 2 | 20 |\n| 8 | 11 | 0.199 | 2 | 21 |\n| 2 | 5 | 0.239 | 2 | 22 |\n| 10 | 3 | 0.279 | 2 | 23 |\n| 9 | 12 | 0.370 | 2 | 24 |\n| 23 | 6 | 0.529 | 3 | 25 |\n| 22 | 21 | 0.624 | 4 | 26 |\n| 26 | 1 | 0.708 | 5 | 27 |\n| 24 | 16 | 0.760 | 3 | 28 |\n| 14 | 25 | 0.786 | 4 | 29 |\n| 15 | 20 | 0.988 | 3 | 30 |\n| 29 | 27 | 1.094 | 9 | 31 |\n| 31 | 19 | 1.358 | 11 | 32 |\n| 30 | 28 | 1.362 | 6 | 33 |\n| 4 | 32 | 1.499 | 12 | 34 |\n| 33 | 0 | 2.125 | 7 | 35 |\n| 34 | 35 | 4.943 | 19 | 36 |\n\n### Distance Matrix\n- tables/.distance.tsv\n\nA table of pairwise distance values between each trajectory.\n\n### Muller table\n- tables/.muller.tsv\n\nThe converted form of the `.ggmuller.populations.tsv` and `.ggmuller.edges.tsv` used to generate the muller plots. This file is created from the r script, described later.\n\n## Graphics\nEach of the output plots use the same palette for genotypes and trajectories. A genotype colored a shade of blue will share that color across all graphs and diagrams which depict that genotype. There are two palettes: one to indicate each clade in the geneology and one to easily distinguish between different genotypes. Each graphic is created with both palettes, and some are provided in multiple formats for convienience.\n\n### Muller Plots\n- .muller.annotated.png\n- graphics/clade/.muller.annotated.svg\n- graphics/clade/.muller.annotated.png\n- graphics/clade/.muller.unannotated.png\n- graphics/distinctive/.muller.annotated.distinctive.png\n- graphics/distinctive/.muller.annotated.distinctive.svg\n\nThe main value of a muller plot is to quickly visualize abundance and geneology of genotypes over the course of an evolution experiment.\n\n![muller](example/example.trajectories.clade.annotated.png)\n\n### Lineage Diagrams\n- .lineage.png\n- graphics/.lineage.distinctive.png\n\nThese are simple flowcharts indicating the relationship between genotypes and clades. The original genotype of each clade are shown to arise in \"genotype-0\", the root background. The ancestry of all other genotypes are then shown relative to these clades.\n\n![geneology](example/example.trajectories.lineage.clade.png)\n\n### Timeseries plots\n- .genotypes.png\n- .genotypes.filtered.png\n- .trajectories.distinctive.png\n\nTimeseries plots of the frequency of each trajectory and genotype at each timepoint. Trajectories are colored according to which genotype they were grouped into. The `.genotypes.filtered.png` file includes trajectories that were filtered out during the filtering step (clored black).\n\n![timeseries](example/graphics/clade/example.trajectories.clade.unannotated.png)\n\n### Distance Heatmap\n- graphics/.heatmap.distance.png\n\nA pairwise comparison of the calculated distance between each mutational trajectory. Trajectories are grouped by the final genotype. The heatmap will be annotated with the distance values if there are fewer than thirty total trajectories in the analysis.\n\n![heatmap](example/graphics/example.trajectories.pairwisedistance.svg)\n\n### Dendrogram\n- graphics/.dendrogram.png\nShows the arrangement and distance between clusters and member trajectories. Not available with `--method twostep`.\n\n![dendrogram](example/graphics/example.trajectories.dendrogram.png)\n\n## Scripts\n- scripts/example.r\n\nOne external script is used during the course of this analysis. The r script is based on the [ggmuller](https://cran.r-project.org/web/packages/ggmuller/vignettes/ggmuller.html) package implemented in r, and is used to convert the genotypes data into a format required to generate the muller plots. This script also generates a basic muller plot (/graphics/distinctive/.muller.png), although all other muller plots are created with the python implementation.\n\n## Supplementary files\n- supplementary-files/.json\n\nA json-formatted file with all parameters used in the analysis.\n\n- supplementary-files/.nestscores.tsv\n\nLists the scores between each genotype and the corresponding candidate ancestry genotypes. The highest score above or equal to 1 determines the parent genotype.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/cdeitrick/muller_diagrams", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "muller", "package_url": "https://pypi.org/project/muller/", "platform": "", "project_url": "https://pypi.org/project/muller/", "project_urls": { "Homepage": "https://github.com/cdeitrick/muller_diagrams" }, "release_url": "https://pypi.org/project/muller/0.6.0/", "requires_dist": [ "pandas", "loguru", "scipy", "matplotlib", "graphviz", "pygraphviz", "seaborn", "numpy", "xlrd", "beautifulsoup4 ; extra == 'additional_support_for_parsing_files'", "fuzzywuzzy ; extra == 'list_similar_annotations_when_selecting_genotypes'", "tqdm ; extra == 'show_progressbar_for_large_datasets'", "pytest ; extra == 'to_run_tests'" ], "requires_python": "", "summary": "A set of scripts to cluster mutational trajectories into genotypes and cluster genotypes by background", "version": "0.6.0" }, "last_serial": 5711362, "releases": { "0.4.10": [ { "comment_text": "", "digests": { "md5": "5ad4074d1bfe8b48aacd3bbb3ed1238e", "sha256": "25e03e0bd54208ab8b1d5d616a14b899c479f7b1106137390f390b29e32db754" }, "downloads": -1, "filename": "muller-0.4.10-py3-none-any.whl", "has_sig": false, "md5_digest": "5ad4074d1bfe8b48aacd3bbb3ed1238e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 69203, "upload_time": "2019-05-28T16:08:58", "url": "https://files.pythonhosted.org/packages/e3/9a/79de13f9a67c261d585438dc58fa3898c599e9a77d214f73c512206c0bd0/muller-0.4.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e8f6fdae625a7bc752595e741914ad9", "sha256": "51b99a70640f9f41b1fa86b01de96f68d2bed7bddf2ad316f25674e6112cc488" }, "downloads": -1, "filename": "muller-0.4.10.tar.gz", "has_sig": false, "md5_digest": "5e8f6fdae625a7bc752595e741914ad9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56699, "upload_time": "2019-05-28T16:08:59", "url": "https://files.pythonhosted.org/packages/12/9c/630a0fcffd0c877e30ab8c51f91aae57c812c52f34fb0978a4ef0f22e400/muller-0.4.10.tar.gz" } ], "0.4.11": [ { "comment_text": "", "digests": { "md5": "7fdb014e7963ec50a08fad379f8d9692", "sha256": "ef3fa57fbde0c7d0e8116c9a0e3ee7c20dd4d30a77b27dbcbe7b93032891b83e" }, "downloads": -1, "filename": "muller-0.4.11-py3-none-any.whl", "has_sig": false, "md5_digest": "7fdb014e7963ec50a08fad379f8d9692", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 69236, "upload_time": "2019-05-28T16:16:27", "url": "https://files.pythonhosted.org/packages/3b/69/99c23bded58ddb14ffd1de6f269aaaa629fa653c62d0dd93009cd27c5157/muller-0.4.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1ce6bf97c4874c4d9ef47d633de112a", "sha256": "099ced3164d34f513ebe2e78c96269d11b24f8256951cca0df0cff5cb0f3b508" }, "downloads": -1, "filename": "muller-0.4.11.tar.gz", "has_sig": false, "md5_digest": "e1ce6bf97c4874c4d9ef47d633de112a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56753, "upload_time": "2019-05-28T16:16:28", "url": "https://files.pythonhosted.org/packages/62/ab/f44f20324429e30703b0c03ec0735bd59ef3f22cce5f515c5b2270430ee7/muller-0.4.11.tar.gz" } ], "0.4.12": [ { "comment_text": "", "digests": { "md5": "0ccfd494701f019030133d7a553d4ad6", "sha256": "f7ac0a4cc99e2b4b4a7aecb4b77d9e7508e71e585e7eba84623f4c24c22d8399" }, "downloads": -1, "filename": "muller-0.4.12-py3-none-any.whl", "has_sig": false, "md5_digest": "0ccfd494701f019030133d7a553d4ad6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 69293, "upload_time": "2019-05-28T16:29:13", "url": "https://files.pythonhosted.org/packages/55/3e/14357ca76d0e8c36f8f8b0d4d10fc99fc0b1798e93cf621ee5c161a50298/muller-0.4.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7cb56d74c9441fbda119169efa677458", "sha256": "48fd72c3809931a06eb4c8e90aebdf4fa0f165511ac6af6bb222824d51e0df83" }, "downloads": -1, "filename": "muller-0.4.12.tar.gz", "has_sig": false, "md5_digest": "7cb56d74c9441fbda119169efa677458", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56782, "upload_time": "2019-05-28T16:29:15", "url": "https://files.pythonhosted.org/packages/66/10/0d4c678c8f67baf62d497efba5a820daff65a6d4c739d2aaa37d2ba0dc74/muller-0.4.12.tar.gz" } ], "0.4.13": [ { "comment_text": "", "digests": { "md5": "faf51e8817d29f9bfbd8ad4bab9687c4", "sha256": "2c75add29326e5e61e5d4a6f941012d4f8b6f69891438b3da0201945e412ff24" }, "downloads": -1, "filename": "muller-0.4.13-py3-none-any.whl", "has_sig": false, "md5_digest": "faf51e8817d29f9bfbd8ad4bab9687c4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 69296, "upload_time": "2019-05-28T16:40:34", "url": "https://files.pythonhosted.org/packages/1b/37/93101b0f22e9481889108f793a505e21fba242619b2d3489a48854e5c5c4/muller-0.4.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d19a0527ceb728bfbb89a7922c64fb22", "sha256": "cb429873fd015ebdc1b6dfb22faaebec626f1eca75affeef8a2c932f4ef0f906" }, "downloads": -1, "filename": "muller-0.4.13.tar.gz", "has_sig": false, "md5_digest": "d19a0527ceb728bfbb89a7922c64fb22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56759, "upload_time": "2019-05-28T16:40:35", "url": "https://files.pythonhosted.org/packages/e7/46/bdf6320caab786b82348c67a525850b0af3d8bf9972ad5a1839068e1cefc/muller-0.4.13.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "e3d1acbdf848df7113e8299c59683922", "sha256": "963dbbed93bae6504704cd701e9b3d0a0d139ba890e016fb184c7372076aafb1" }, "downloads": -1, "filename": "muller-0.4.5-py3-none-any.whl", "has_sig": false, "md5_digest": "e3d1acbdf848df7113e8299c59683922", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62609, "upload_time": "2019-05-28T14:37:48", "url": "https://files.pythonhosted.org/packages/98/d8/07d634d5f5f5fd890488042b730a72631455aba83eb15f3d2488ca9a47c1/muller-0.4.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5b0c86056dc14bd7ed44b76ac6b7f044", "sha256": "0c201481c207b9c9e6bf8cdef20dd7b2a36068a7ad4928b4412168a92085c8a3" }, "downloads": -1, "filename": "muller-0.4.5.tar.gz", "has_sig": false, "md5_digest": "5b0c86056dc14bd7ed44b76ac6b7f044", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48909, "upload_time": "2019-05-28T14:37:50", "url": "https://files.pythonhosted.org/packages/e2/a9/3ae7cee32d0cae1f915bae17733d75d4db71f715866325773016e08a91c8/muller-0.4.5.tar.gz" } ], "0.4.6": [ { "comment_text": "", "digests": { "md5": "88dee47b9b95308244db1855201d2985", "sha256": "07b13bcc0ab0b2ee1a28bd8c3693510287c752d2cc9c811d09bea2174d7b4073" }, "downloads": -1, "filename": "muller-0.4.6-py3-none-any.whl", "has_sig": false, "md5_digest": "88dee47b9b95308244db1855201d2985", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62620, "upload_time": "2019-05-28T15:11:16", "url": "https://files.pythonhosted.org/packages/aa/fd/f26f0f4966cc577b33279a4110c83f067bc3094e44cd6a5a4146af1bb8c1/muller-0.4.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d76400773cfd9f32e56796adf7744a1c", "sha256": "9d72739ce07fc98d9fc8856dac267b136657b1c92d1f351090ac8fb6f9417561" }, "downloads": -1, "filename": "muller-0.4.6.tar.gz", "has_sig": false, "md5_digest": "d76400773cfd9f32e56796adf7744a1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49108, "upload_time": "2019-05-28T15:11:17", "url": "https://files.pythonhosted.org/packages/14/49/c82b897c4381926bb284155582ad1b9bb290e12468203d9c5adb606dc795/muller-0.4.6.tar.gz" } ], "0.4.7": [ { "comment_text": "", "digests": { "md5": "22c042f4ed2a3f51334a98b1ac9266c6", "sha256": "aaded42778ddf202bca61783995eee5d80b722ec9dd786ad0617087d3e7b60b8" }, "downloads": -1, "filename": "muller-0.4.7-py3-none-any.whl", "has_sig": false, "md5_digest": "22c042f4ed2a3f51334a98b1ac9266c6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62620, "upload_time": "2019-05-28T15:17:48", "url": "https://files.pythonhosted.org/packages/53/e4/675e288a104aee109d4640012a7c509d870c69d05f223cb7cfa511975324/muller-0.4.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c47fd92c0ab47e20ffbfedc2d8399102", "sha256": "207dd2d8cba83fb3d9862a552cc9893f5f89b0bad91c3cf21f446aaa261bcb3d" }, "downloads": -1, "filename": "muller-0.4.7.tar.gz", "has_sig": false, "md5_digest": "c47fd92c0ab47e20ffbfedc2d8399102", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49109, "upload_time": "2019-05-28T15:17:49", "url": "https://files.pythonhosted.org/packages/a8/56/696616b11e5ec1db210670439750ea72504f4d0690a88f44b71f3e5f9040/muller-0.4.7.tar.gz" } ], "0.4.8": [ { "comment_text": "", "digests": { "md5": "ce07060dae5ce65dc8cb147f6a4bc138", "sha256": "a0a654c3f4c7c3c55a7c050f5d062b5efdadd4511c20f7221076036f4d692911" }, "downloads": -1, "filename": "muller-0.4.8-py3-none-any.whl", "has_sig": false, "md5_digest": "ce07060dae5ce65dc8cb147f6a4bc138", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 64105, "upload_time": "2019-05-28T15:34:26", "url": "https://files.pythonhosted.org/packages/69/c0/42c6171da404e057a06d0107e30a8d8ac30679742df7b1c974c801e54d1a/muller-0.4.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4814dce8f20c211c8bd4ee6fd41b5cec", "sha256": "c6596f7a647dc2f27bae39eaffb1492189e74a7353136a549be560838711a44d" }, "downloads": -1, "filename": "muller-0.4.8.tar.gz", "has_sig": false, "md5_digest": "4814dce8f20c211c8bd4ee6fd41b5cec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49187, "upload_time": "2019-05-28T15:34:28", "url": "https://files.pythonhosted.org/packages/fc/cc/280768f82c20277106c5fc756a757e4a52fe5d813654e74b04b49043ec6f/muller-0.4.8.tar.gz" } ], "0.4.9": [ { "comment_text": "", "digests": { "md5": "56f6237315924cb06905e5d878880adf", "sha256": "dd329bb06c1fd836b888669ea345acc52b21280e5b2d7ce40d7619fa00b2f69a" }, "downloads": -1, "filename": "muller-0.4.9-py3-none-any.whl", "has_sig": false, "md5_digest": "56f6237315924cb06905e5d878880adf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 69192, "upload_time": "2019-05-28T15:54:28", "url": "https://files.pythonhosted.org/packages/4c/1f/2fb6c0946a389d7229e6a97110ce4d3f8a448533e081fd47ba44b040a60b/muller-0.4.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d3d8865e7f5265da9bc51de56dc4527", "sha256": "40e7288a35bf6ce88325ef413c28fabc4f5b2b7b81aad718423357d215c78a66" }, "downloads": -1, "filename": "muller-0.4.9.tar.gz", "has_sig": false, "md5_digest": "8d3d8865e7f5265da9bc51de56dc4527", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56707, "upload_time": "2019-05-28T15:54:30", "url": "https://files.pythonhosted.org/packages/21/70/13ab945c521f3d347de9e597efa096a15d64b0dcad75f8e06857e8c0cf77/muller-0.4.9.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "061e768c6c5494f150e500a3a6cbd389", "sha256": "4a111781635b873d0aa039252704fa65414997be9f25d67b57bef166c7e90ed5" }, "downloads": -1, "filename": "muller-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "061e768c6c5494f150e500a3a6cbd389", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 69390, "upload_time": "2019-05-28T17:07:16", "url": "https://files.pythonhosted.org/packages/4d/1e/68ff45993c80672ff125202139c096455e6c8b315ac97a5529b1db77bff9/muller-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2882e2df9e12e97210782ad553c17063", "sha256": "e1e84027b1401cab42f5b515b735369d246b52b7c4e23b4db1a5e33958b8d27f" }, "downloads": -1, "filename": "muller-0.5.0.tar.gz", "has_sig": false, "md5_digest": "2882e2df9e12e97210782ad553c17063", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57009, "upload_time": "2019-05-28T17:07:17", "url": "https://files.pythonhosted.org/packages/76/9b/adbefbb87e28a2efcda3be3c154c148dc394513029c0a377672feeb4c30f/muller-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "2613983faa7a5f298a4933559bdff072", "sha256": "f3150498bf8d54df1d8dbeb5f4b8bc2122d5a9201c7bc1c823e8231f2a1dd424" }, "downloads": -1, "filename": "muller-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2613983faa7a5f298a4933559bdff072", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 70155, "upload_time": "2019-06-11T19:23:36", "url": "https://files.pythonhosted.org/packages/da/c2/2d4f54ab48fe4e6f5d867835adc7a7a861744ea9b1a941f1ec4d82b6b482/muller-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2811723d07d70b8df8e5f0d5c83c5bec", "sha256": "41a866dd7f995b0cd30b936452b025b19322a68aeaf0771696c0c2d062933ca0" }, "downloads": -1, "filename": "muller-0.5.1.tar.gz", "has_sig": false, "md5_digest": "2811723d07d70b8df8e5f0d5c83c5bec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58263, "upload_time": "2019-06-11T19:23:38", "url": "https://files.pythonhosted.org/packages/eb/62/a11b89e031af9baa5d9f4bde60a23e04454f8da221c2a81a338c7a1a01f5/muller-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "6ee8632d0d0305dc4e68ffb337d1da03", "sha256": "06bb9cea5737d836a587fffde57a2f9f90febf0d8ca5d6ca240970899cf301f9" }, "downloads": -1, "filename": "muller-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6ee8632d0d0305dc4e68ffb337d1da03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75997, "upload_time": "2019-06-18T20:09:03", "url": "https://files.pythonhosted.org/packages/32/51/58b2454e215d60c4549ab48ecb0a1e43b7d3eb6ee6f361f74884d233f0fc/muller-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9414b543eae7b42f77edfa7b1e36c2cc", "sha256": "e6e2d09e6621ac0e45130009c0d0d57c326d35b0a9731c8acf3532bfd88cec57" }, "downloads": -1, "filename": "muller-0.5.2.tar.gz", "has_sig": false, "md5_digest": "9414b543eae7b42f77edfa7b1e36c2cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62939, "upload_time": "2019-06-18T20:09:04", "url": "https://files.pythonhosted.org/packages/fe/d8/3feb698d7e876de0d040b76481a843146485d05e7540804ed8858fe8eec3/muller-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "18159da772b54ef3eb117419c65bf5e1", "sha256": "658c6b2b0800a5c69a3d1813970001bd81d3eb188c791fb6697016e49f67c83f" }, "downloads": -1, "filename": "muller-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "18159da772b54ef3eb117419c65bf5e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 86786, "upload_time": "2019-08-21T19:31:05", "url": "https://files.pythonhosted.org/packages/4e/4d/8c5ce83b3bed9db033ffe88d8ebb11c76772a9fbf560d0830916b1ccc4da/muller-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8de283c87743f710468f2001291b7ded", "sha256": "11f5191bc9563805b350a4f4a9b4ec1594b236565dfc108b82fe3cab8c65b0dd" }, "downloads": -1, "filename": "muller-0.6.0.tar.gz", "has_sig": false, "md5_digest": "8de283c87743f710468f2001291b7ded", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73251, "upload_time": "2019-08-21T19:31:07", "url": "https://files.pythonhosted.org/packages/25/af/af565b9532003e23d50d6664ea6a92f6c57bf5c8420f2d2e94c39d030268/muller-0.6.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "18159da772b54ef3eb117419c65bf5e1", "sha256": "658c6b2b0800a5c69a3d1813970001bd81d3eb188c791fb6697016e49f67c83f" }, "downloads": -1, "filename": "muller-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "18159da772b54ef3eb117419c65bf5e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 86786, "upload_time": "2019-08-21T19:31:05", "url": "https://files.pythonhosted.org/packages/4e/4d/8c5ce83b3bed9db033ffe88d8ebb11c76772a9fbf560d0830916b1ccc4da/muller-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8de283c87743f710468f2001291b7ded", "sha256": "11f5191bc9563805b350a4f4a9b4ec1594b236565dfc108b82fe3cab8c65b0dd" }, "downloads": -1, "filename": "muller-0.6.0.tar.gz", "has_sig": false, "md5_digest": "8de283c87743f710468f2001291b7ded", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73251, "upload_time": "2019-08-21T19:31:07", "url": "https://files.pythonhosted.org/packages/25/af/af565b9532003e23d50d6664ea6a92f6c57bf5c8420f2d2e94c39d030268/muller-0.6.0.tar.gz" } ] }