{ "info": { "author": "Victor Alejandro Gil Sepulveda", "author_email": "victor.gil.sepulveda@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "pyProCT\n=======\n\npyProCT is an open source cluster analysis software especially adapted\nfor jobs related with structural proteomics. Its approach allows users\nto define a clustering goal (clustering hypothesis) based on their\ndomain knowledge. This hypothesis will guide the software in order to\nfind the best algorithm and parameters (including the number of\nclusters) to obtain the result that better fulfills their expectatives.\nIn this way users do not need to use cluster analysis algorithms as a\nblack box, which will (hopefully) improve their results. pyProCT not\nonly generates a resulting clustering, it also implements some use cases\nlike the extraction of representatives or trajectory redundance\nelimination.\n\n`Table of Contents `_\n\n- `pyProCT <#user-content-pyproct>`_\n\n - `Installation <#user-content-installation>`_\n - `Using pyProCT as a standalone\n program <#user-content-using-pyproct-as-a-standalone-program>`_\n\n - `Global <#user-content-global>`_\n - `Data <#user-content-data>`_\n - `Clustering <#user-content-clustering>`_\n\n - `generation <#user-content-generation>`_\n - `algorithms <#user-content-algorithms>`_\n - `evaluation <#user-content-evaluation>`_\n\n - `Postprocessing <#user-content-postprocessing>`_\n - `Checking the script <#user-content-checking-the-script>`_\n - `Learn more <#user-content-learn-more>`_\n\n - `Using pyProCT as part of other\n programs <#user-content-using-pyproct-as-part-of-other-programs>`_\n\n - `Using it as a separate program from other Python\n script <#user-content-using-it-as-a-separate-program-from-other-python-script>`_\n\n - `Parallel execution <#user-content-parallel-execution>`_\n\n- `Documentation <#user-content-documentation>`_\n- `TODO <#user-content-todo>`_\n\nInstallation\n------------\n\npyProCT is quite easy to install using *pip*. Just write:\n\n``Shell > sudo pip install pyProCT`` And *pip* will take care of all the\ndependencies (shown below).\n\n It is recommended to install Numpy and Scipy before starting the\ninstallation using your OS software manager. You can try to download and\ninstall them\n`manually `_ if you\ndare.\n\n mpi4py is pyProCT's last dependency. It can give problems when\ninstalling it in OS such as SUSE. If the installation of this last\npackage is not succesful, pyProCT can still work in Serial and Parallel\n(using *multiprocessing*) modes.\n\nUsing pyProCT as a standalone program\n-------------------------------------\n\nThe preferred way to use pyProCT is through a JSON \"script\" that\ndescribes the clustering task. It can be executed using the following\nline in your shell:\n\n::\n\n > python -m pyproct.main script.json\n\nThe JSON script has 4 main parts, each one dealing with a different\naspect of the clustering pipeline. This sections are: \\* *\"global\"*:\nHandles workspace and scheduler parameterization. \\* *\"data\"*: Handles\ndistance matrix parameterization. \\* *\"clustering\"*: Handles algorithms\nand evaluation parameterization. \\* *\"preprocessing\"*: Handles what to\ndo with the clustering we have calculated.\n\n::\n\n {\n \"global\":{},\n \"data\":{},\n \"clustering\":{},\n \"postprocessing\":{}\n }\n\nGlobal\n~~~~~~\n\n``JSON { \"control\": { \"scheduler_type\": \"Process/Parallel\", \"number_of_processes\": 4 }, \"workspace\": { \"tmp\": \"tmp\", \"matrix\": \"matrix\", \"clusterings\": \"clusterings\", \"results\": \"results\", \"base\": \"/home/john/ClusteringProject\" } }``\nThis is an example of *\"global\"* section. It describes the work\nenvironment (workspace) and the type of scheduler that will be built.\nDefining the subfolders of the wokspace is not mandatory, however it may\nbe convenient in some scenarios (for instance, in serial multiple\nclustering projects, sharing the *tmp* folder would lower the disk usage\nas at each step it will be overwritten).\n\nThis is a valid global section using a serial scheduler and default\nnames for workspace inner folders:\n``JSON { \"control\": { \"scheduler_type\": \"Serial\" }, \"workspace\": { \"base\": \"/home/john/ClusteringProject\" } }``\npyProCT allows the use of 3 different schedulers that help to improve\nthe overall performance of the software by parallelizing some parts of\nthe code. The available schedulers are \"Serial\", \"Process/Parallel\"\n(uses Python's\n`multiprocessing `_)\nand \"MPI/Parallel\" (uses MPI through the module\n`mpi4py `_).\n\nData\n~~~~\n\nThe *\"data\"* section defines how pyProCT must build the distance matrix\nthat will be used by the compression algorithms. Currently pyProCT\noffers up to three options to build that matrix: \"load\", \"rmsd\" and\n\"distance\" - *\"rmsd\"*: Calculates a all vs all rmsd matrix using any of\nthe\n`pyRMSD `_\ncalculators available. It can calculate the RMSD of the fitted region\n(defined by `Prody `_ compatible selection\nstring in *fit\\_selection*) or one can use one selection to superimpose\nand another to calculate the rmsd (*calc\\_selection*). There are two\nextra *parameters* that must be considered when building an RMSD matrix.\n- *\"type\"*: This property can have two values: *\"COORDINATES\"* or\n*\"DIHEDRALS\"*. If *DIHEDRALS* is chosen, each element *(i,j)* of the\ndistance matrix will be the RMSD of the arrays containing the phi-psi\ndihedral angle series of conformation *i* and *j*. - *\"chain\\_map\"*: If\nset to *true* pyProCT will try to reorder the chains of the biomolecule\nin order to minimize the global RMSD value. This means that it will\ncorrectly calculate the RMSD even if chain coordinates were permuted in\nsome way. The price to pay is an increase of the calculation time\n(directly proportional to the number of chains or the number of chains\nhaving the same length). - *\"distance\"*: After superimposing the\nselected region it calculates the all vs all distances of the\ngeometrical center of the region of interest (*body\\_selection*). -\n*\"load\"*: Loads a precalculated matrix.\n\nJSON chunk needed to generate an RMSD matrix from two trajectories:\n``JSON { \"type\": \"pdb_ensemble\", \"files\": [ \"A.pdb\", \"B.pdb\" ], \"matrix\": { \"method\": \"rmsd\", \"parameters\": { \"calculator_type\": \"QCP_OMP_CALCULATOR\", \"fit_selection\": \"backbone\", }, \"image\": { \"filename\": \"matrix_plot\" }, \"filename\":\"matrix\" } }``\nJSON chunk to generate a dihedral angles RMSD matrix from one\ntrajectories:\n``JSON { \"type\": \"pdb_ensemble\", \"files\": [ \"A.pdb\" ], \"matrix\": { \"method\": \"rmsd\", \"parameters\": { \"type\":\"DIHEDRAL\" }, \"image\": { \"filename\": \"matrix_plot\" }, \"filename\":\"matrix\" } }``\n\nThe matrix can be stored if the *filename* property is defined. The\nmatrix can also be stored as an image if the *image* property is\ndefined.\n\npyProCT can currently load *pdb* and *dcd* files. The details to load\nthe files must be written into the array under the \"files\" keyword.\nThere are many ways of telling pyProCT the files that have to be load\nand can be combined in any way you like:\n\n1. Using a list of file paths. If the file extension is \".txt\" or\n \".list\" it will be treated as a pdb list file. Each line of such\n files will be a pdb path or a pdb path and a selection string,\n separated by comma.\n\n``A.pdb, name CA B.pdb C.pdb, name CA ...`` 2. Using a list of file\nobjects: ``JSON { \"file\": ... , \"base_selection\": ... }`` Where\n*base\\_selection* is a `Prody `_ compatible\nselection string. Loading files this way can help in cases where not all\nfiles have structure with the same number of atoms: *base\\_selection*\nshould define the common region between them (if a 1 to 1 map does not\nexist, the RMSD calculation will be wrong).\n\n3. Only for *dcd* files:\n ``JSON { \"file\": ..., \"atoms_file\": ..., \"base_selection\": ... }``\n Where *atoms\\_file* is a *pdb* file with at least one frame that\n holds the atomic information needed by the *dcd* file.\n\n**Note*: data.type is currently unsused*\n\nClustering\n~~~~~~~~~~\n\nThe *clustering* section specifies how the clustering exploration will\nbe done. It is divided in 3 other subsections:\n\n``JSON { \"generation\": { \"method\": \"generate\" }, \"algorithms\": { ... }, \"evaluation\": { ... } }``\n#### Generation Defines how to generate the clustering (*\"load\"* or\n*\"generate\"*). if *\"load\"* is chosen, this section will also contain the\nclustering that may be used in the *\"clusters\"* property. Ex.:\n\n::\n\n {\n \"clustering\": {\n \"generation\": {\n \"method\" : \"load\",\n \"clusters\": [\n {\n \"prototype \" : 16,\n \"id\": \"cluster_00\",\n \"elements\" : \"9, 14:20\"\n },\n {\n \"prototype\": 7,\n \"id\": \"cluster_01\",\n \"elements\": \"0:8, 10:14, 21\"\n }\n ]\n }\n }\n\nAlgorithms\n^^^^^^^^^^\n\nIf clustering.generation.method equals \"generate\", this section defines\nthe algorithms that will be used as well as their parameters (if\nnecessary). The currently available algorithms are : *\"kmedoids\"*,\n*\"hierarchical\"*, *\"dbscan\"*, *\"gromos\"*, *\"spectral\"* and *\"random\"*.\nEach algorithm can store its list of parameters, however the preferred\nway to work with pyProCT is to let it automatically generate them.\nAlmost all algorithms accept the property *max*, that defines the\nmaximum amount of parameter collections that will be generated for that\nalgorithm. Ex.\n\n::\n\n {\n \"kmedoids\": {\n \"seeding_type\": \"RANDOM\",\n \"max\": 50,\n \"tries\": 5\n },\n \"hierarchical\": {\n\n },\n \"dbscan\": {\n \"max\": 50\n },\n \"gromos\": {\n \"max\": 50\n },\n \"spectral\": {\n \"max\": 50,\n \"force_sparse\":true,\n }\n }\n\nAlgorithm parameters can be explicitly written, however it is not\nrecommended:\n\n::\n\n {\n \"kmedoids\": {\n \"seeding_type\": \"RANDOM\",\n \"max\": 50,\n \"tries\": 5,\n \"parameters\":[{\"k\":4},{\"k\":5},{\"k\":6}]\n }\n }\n\nEvaluation\n^^^^^^^^^^\n\nThis section holds the *Clustering Hypothesis*, the core of pyProCT.\nHere the user can define how the expected clustering will be. First the\nuser must set the expected number of clusters range. Also, an estimation\nof the dataset noise and the cluster minimum size (the minimum number of\nelements a cluster must have to not be considered noise) will complete\nthe quantitative definition of the target result.\n\nEx.\n``JSON { \"maximum_noise\": 15, \"minimum_cluster_size\": 50, \"maximum_clusters\": 200, \"minimum_clusters\": 6, \"query_types\": [ ... ], \"evaluation_criteria\": { ... } }``\n\nThe second part of the *Clustering Hypothesis* tries to characterize the\nclustering internal traits in a more qualitative way. Concepts like\ncluster \"Compactness\" or \"Separation\" can be used here to define the\nexpected clustering. To this end users must write their expectations in\nform of *criteria*. This criteria are, in general, linear combinations\nof Internal Clustering Validation Indices (ICVs). The best clustering\nwill be the one that gets the best score in any of these *criteria*. See\n`this\ndocument `_\nto get more insight about the different implemented criteria and their\nmeaning.\n\nAdditionally users may choose to ask pyProCT about the results of this\nICVs and other evaluation functions(e.g. the average cluster size) by\nadding them to the *queries* array.\n\n::\n\n {\n ...\n \"query_types\": [\n \"NumClusters\",\n \"NoiseLevel\",\n \"MeanClusterSize\"\n ],\n \"evaluation_criteria\": {\n \"criteria_0\": {\n \"Silhouette\": {\n \"action\": \">\",\n \"weight\": 1\n }\n }\n }\n }\n\nPostprocessing\n~~~~~~~~~~~~~~\n\nGetting a good quality clustering is not enough, we would like to use\nthem to extract useful information. pyProCT implements some use cases\nthat may help users to extract this information.\n\n\\`\\`\\`JSON { \"rmsf\":{},\n\n::\n\n \"centers_and_trace\":{},\n\n \"representatives\":{\n \"keep_remarks\": [true/false],\n \"keep_frame_number\": [true/false]\n },\n\n \"pdb_clusters\":{\n \"keep_remarks\": [true/false],\n \"keep_frame_number\": [true/false]\n },\n\n \"compression\":{\n \"final_number_of_frames\": INT,\n \"file\": STRING,\n \"type\":[\u2018RANDOM\u2019,\u2019KMEDOIDS\u2019]\n },\n\n \"cluster_stats\":{\n \"file\": STRING\n },\n\n\n \"conformational_space_comparison\":{},\n\n \"kullback_liebler\":{}\n\n} \\`\\`\\` - *\"rmsf\"* : Calculates the global and per-cluster (and\nper-residue) root mean square fluctuation (to be visualized using the\n`GUI `_).\n\n- *\"centers\\_and\\_trace\"* : Calculates all geometrical centers of the\n calculation selection of the system (to be visualized using the\n `GUI `_).\n\n- *\"representatives\"* : Extracts all the representatives of the\n clusters in the same pdb.\n Parameters:\n\n - *\"keep\\_remarks\"*: If true every stored model will be written\n along with its original remarks header. Default: false.\n - *\"keep\\_frame\\_number\"*: If true, the model number of any stored\n conformation will be the original pdb one. Default: false.\n\n- *\"pdb\\_clusters\"* : Extracts all clusters in separate pdbs.\n Parameters:\n\n - *\"keep\\_remarks\"*: If true every stored model will be written\n along with its original remarks header. Default: false.\n - *\"keep\\_frame\\_number\"*: If true, the model number of any stored\n conformation will be the original pdb one. Default: false.\n\n- *\"compression\"* : Reduces the redundancy of the trajectory using the\n resulting clustering.\n Parameters:\n\n - *\"file\"*: The name of the output file without extension. Default\n \"compressed\"(.pdb)\n - *\"final\\_number\\_of\\_frames\"*: The expected (minimum) number of\n frames of the compressed file.\n - *\"type\"*: The method used to get samples from each cluster.\n Options:\n\n - \"RANDOM\": Gets a random sample of the elements of each cluster.\n - \"KMEDOIDS\": Applies the k-medoids algorithm to the elements of\n a cluster and stores the representatives.\n Default: \"KMEDOIDS\".\n\n- *\"cluster\\_stats\"*: Generates a human readable file with the\n distances between cluster centers and their diameters.\n Parameters:\n\n - *\"file\"*: The name of the output file without extension (will be\n sotred into the results folder). Default:\n \"per\\_cluster\\_stats\"(.csv).\n\n- *\"conformational\\_space\\_comparison\"* : Work in progress.\n\n- *\"kullback\\_liebler\"* : Work in progress.\n\nScript validation\n~~~~~~~~~~~~~~~~~\n\nAs the control script is indeed holding a JSON object, any JSON\nvalidator can be used to discover the errors in case of script loading\nproblems. A good example of such validators is\n`JSONLint `_. pyProCT scripts accept javascript\ncomments ( // and /\\* \\*/)\n\n Using pyProCT as part of other programs\n----------------------------------------\n\n- Using algorithms\n- Clustering from label lists\n- Using ICVs with custom clusterings\n- Performing the whole protocol\n ``Python Driver(Observer()).run(parameters)``\n\nThe necessary documentation to use pyProCT classes is written inside the\ncode. It has been extracted\n`here `_ and\n`here `_. We are currently trying\nto improve this documentation with better explanations and examples.\n\nSee `this\nfile `_.\n\nUsing it as a separate program from other Python script\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n- Loading results\n- Generating scripts programatically\n\nSee `this project `_\nfor some examples.\n\nParallel execution\n------------------\n\nTo execute pyProCT in parallel you just need to issue this line:\n\n::\n\n > mpirun -np NumberOfProcesses -m pyproct.main --mpi script.json\n\n When running pyProCT using MPI you will need to use the *MPI/Parallel*\nScheduler or it will just execute several independent serial runs.\n\n Remember that you need to use the same libraries and versions to build\nmpi4py and mpirun, otherwise you won't be able to execute it.\n\nDocumentation\n=============\n\nWe are still experimenting to see which documentation generator fits\nbetter with us. Currently we have two versions of the documentations:\none using `Sphinx `_ and the other using\n`Doxygen `_+`doxpy `_.\nSee them `here `_ and\n`here `_. We will possibly publish\nit in a cloud solution like\n`readthedocs.org `_\n\nLearn more\n~~~~~~~~~~\n\nA more detailed explanation of the script contents can be found\n`here `_,\nand a discussion about the different implemented ICVs can be found\n`here `_.\n\nPlease, do not hesitate to send a mail to victor.gil.sepulveda@gmail.com\nwith your questions, criticisms and whatever you think it is not working\nor can be done better. Any contribution can help to improve this\nsoftware!\n\nTODO\n====\n\n- To improve this documentation (better explanations, more examples and\n downloadable scripts).\n\n- Refactoring and general improvements:\n\n - Total refactoring (Clustering and Clusters are inmutable, hold a\n reference to the matrix -> prototypes are always updated)\n - Rename script stuff\n - Rename functions and vars\n - Minimizing dependencies with scipy\n - Minimizing dependencies with prody (create my own reader)\n - Adding its own Hierarchical clustering code (educational\n motivations)\n - Improve spectral algoritm (add more tests - comparisons with other\n implementations, adding new types)\n - Improve MPI load balance (i.e. parameter generation must be\n processed in parallel)\n - Improve test coverage\n - The script must accept numbers and percentages\n - Use JSON schema to validate the script. Try to delegate the full\n responsibility of validating to pyProCT (instead of the GUI) [x] -\n Users must be able to comment their scripts (with '//' for\n instance).\n - When loading a dcd file, we only want to load atomic data of the\n the associated pdb.\n - Change \"compression\" by \"redundancy\\_elimination\"\n - Allow to load all files (or glob) from a folder.\n\n- Symetry handling:\n\n - Symmetry handling for fitting coordinates.\n - Improve symmetry handling for calculation coordinates (e.g.\n ligands). [x] - Simple chain mapping feature.\n\n- New algorithms:\n\n - Modularity-based (Newman J. 2003)\n - Passing messages (Frey and Dueck 2007)\n - Flow simmulation (Stijin van Dongen)\n - Fuzzy Clustering\n - `Jarvis-Patrick\n Algorithm `_\n - Others (adaptative spectral clustering flavours)\n\n- New quality functions.\n\n - Balancedness: The sizes of the clusters must be balanced.\n - J quality function: Cai Xiaoyan Proceedings of the 27th Chinese\n Control Conference\n - Metastability function (Q) in Chodera et al. J. Chem. Phys. 126\n 155101 2007 .\n - Improve separation quality functions.\n - New standard separation ICVs (require inmutable prototypes)\n\n Separation, the clusters themselves should be widely spaced.\n There are three common approaches measuring the distance\n between two different clusters:\n\n - Single linkage: It measures the distance between the\n closest members of the clusters.\n - Complete linkage: It measures the distance between the most\n distant members.\n - Comparison of centroids: It measures the distance between\n the centers of the clusters.\n\n- New features:\n\n - Refine noise in DBSCAN\n - Refine a preselected cluster (e.g \"noise\"), or \"heterogeneous\".\n\n- New postprocessing options:\n\n - Refinement\n - Kinetic analysis", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/victor-gil-sepulveda/pyProCT", "keywords": "", "license": "LICENSE.txt", "maintainer": "", "maintainer_email": "", "name": "pyProCT", "package_url": "https://pypi.org/project/pyProCT/", "platform": "", "project_url": "https://pypi.org/project/pyProCT/", "project_urls": { "Homepage": "https://github.com/victor-gil-sepulveda/pyProCT" }, "release_url": "https://pypi.org/project/pyProCT/1.7.3/", "requires_dist": null, "requires_python": "", "summary": "pyProCT is an open source cluster analysis software especially adapted for jobs related with structural proteomics", "version": "1.7.3" }, "last_serial": 3122840, "releases": { "1.4.3": [ { "comment_text": "", "digests": { "md5": "6c8cad0ca13802bfa46de35a2333fd09", "sha256": "2554d1ce27e6cb5b056d33af63500463e1517fb1dc6e06aab0ba41f1afa2674b" }, "downloads": -1, "filename": "pyProCT-1.4.3.tar.gz", "has_sig": false, "md5_digest": "6c8cad0ca13802bfa46de35a2333fd09", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 316790, "upload_time": "2014-08-11T13:29:43", "url": "https://files.pythonhosted.org/packages/52/1c/b4088ebb3c8ef5dae5a9fbf2780c32949f850f13210d441f0af834c10dc4/pyProCT-1.4.3.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "c5727c96f3acde61e2caa3fd328c55b2", "sha256": "127f30d231224c2a4179ade5402f1b29ea0ae7a57751bd5668e9b4b4b5057631" }, "downloads": -1, "filename": "pyProCT-1.5.1.tar.gz", "has_sig": false, "md5_digest": "c5727c96f3acde61e2caa3fd328c55b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 353844, "upload_time": "2014-10-13T15:23:31", "url": "https://files.pythonhosted.org/packages/4d/01/69b5080ed36e50232cc14cf2f249efe052aea5b7ad07a9de32ff7d1f0637/pyProCT-1.5.1.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "58bacca2ca4cb8e72109f9a4fb5908f4", "sha256": "40b7f4b3e2f490cceaa42894de8dfbac17e36582e5dd6e11ecbd1682f7b99eaf" }, "downloads": -1, "filename": "pyProCT-1.6.0.tar.gz", "has_sig": false, "md5_digest": "58bacca2ca4cb8e72109f9a4fb5908f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 355422, "upload_time": "2015-01-08T11:21:07", "url": "https://files.pythonhosted.org/packages/9b/3b/66b340743ed770d82f2bfc801d0cc962e6a21e7198d6f4b36f08556d5d7f/pyProCT-1.6.0.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "1380c8f4a0996526c22e4e7ec7f951b7", "sha256": "8538ac78a014cb46bbe8b6df7b7810db729a0ebb2f2888f21f836af571ea2170" }, "downloads": -1, "filename": "pyProCT-1.7.0.tar.gz", "has_sig": false, "md5_digest": "1380c8f4a0996526c22e4e7ec7f951b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 352777, "upload_time": "2015-02-12T10:30:15", "url": "https://files.pythonhosted.org/packages/2b/fc/a8bdf108133f848f24205b9ac98797fa553cbab59ab4dbd9392dfbcac130/pyProCT-1.7.0.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "ee0b5c09ad9f2e60236911a03fdcf268", "sha256": "5b2787f96cf0cc681cc84c3f4f2fb2be45780f9561c1d3c2a18612e7e6c67128" }, "downloads": -1, "filename": "pyProCT-1.7.1.tar.gz", "has_sig": false, "md5_digest": "ee0b5c09ad9f2e60236911a03fdcf268", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 352885, "upload_time": "2015-02-12T11:47:47", "url": "https://files.pythonhosted.org/packages/8c/64/691788ea3373605021028c9a320de36c42b371e2dd13dacf490d9bfd0ce8/pyProCT-1.7.1.tar.gz" } ], "1.7.2": [ { "comment_text": "", "digests": { "md5": "c80e56297c992ba005a4c1fa4c1ec95e", "sha256": "806ca0fec13967b6bcc55305079a528ad4288a6a9528d5eb79dffc1869bd05d2" }, "downloads": -1, "filename": "pyProCT-1.7.2.tar.gz", "has_sig": false, "md5_digest": "c80e56297c992ba005a4c1fa4c1ec95e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 361992, "upload_time": "2015-02-27T16:11:43", "url": "https://files.pythonhosted.org/packages/33/b3/e22e8fbacd034685cba0a1b33660d529d11a97e55a1894cbbe44afe2386c/pyProCT-1.7.2.tar.gz" } ], "1.7.3": [ { "comment_text": "", "digests": { "md5": "d27056533b02338257c7da47da8cc3ff", "sha256": "dbd5a6e834256977f1f0a8861765e6aa366166212b045c8afde89196cb5e908b" }, "downloads": -1, "filename": "pyProCT-1.7.3.tar.gz", "has_sig": false, "md5_digest": "d27056533b02338257c7da47da8cc3ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 364042, "upload_time": "2017-08-25T11:12:24", "url": "https://files.pythonhosted.org/packages/86/61/ac027e48e1feef08f5cf6e2752f1c67c4a6130de550c515dc62a03eceeb7/pyProCT-1.7.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d27056533b02338257c7da47da8cc3ff", "sha256": "dbd5a6e834256977f1f0a8861765e6aa366166212b045c8afde89196cb5e908b" }, "downloads": -1, "filename": "pyProCT-1.7.3.tar.gz", "has_sig": false, "md5_digest": "d27056533b02338257c7da47da8cc3ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 364042, "upload_time": "2017-08-25T11:12:24", "url": "https://files.pythonhosted.org/packages/86/61/ac027e48e1feef08f5cf6e2752f1c67c4a6130de550c515dc62a03eceeb7/pyProCT-1.7.3.tar.gz" } ] }