{ "info": { "author": "Victor Alejandro Gil Sepulveda", "author_email": "victor.gil.sepulveda@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "pyRMSD\n======\n\npyRMSD goal is the fast (and easy!) calculation of rmsd collective\noperations, specially matrices of large ensembles of protein\nconformations. It also offers a symmetric distance matrix implementation\nwith improved access speed and memory efficiency.\n\nIf you like it and you are using it for your scientific projects, please\ncite `the pyRMSD\npaper `_.\n\npyRMSD distributed under MIT license, and it is currently on its version\n4.0 .\n\nSummary\n=======\n\n- `1 - Features <#1---features>`_\n\n - `Collective operations <#collective-operations>`_\n - `Condensed matrix <#condensed-matrix>`_\n\n- `2 - Usage <#2---usage>`_\n\n - `Getting coordinates <#getting-coordinates>`_\n - `Calculating the RMSD matrix <#calculating-the-rmsd-matrix>`_\n - `Available calculators <#available-calculators>`_\n - `Matrix handlers <#matrix-handlers>`_\n - `Accessing the RMSD matrix <#accessing-the-rmsd-matrix>`_\n - `Matrix statistics <#matrix-statistics>`_\n\n- `3 - Building & Installation <#3---building--installation>`_\n\n - `Before installation <#before-installation>`_\n - `Linux and MacOs <#linux-and-macos>`_\n - `Windows <#windows>`_\n\n- `4 - The custom building script <#4---the-custom-building-script>`_\n\n - `Unix-based systems <#unix-based-systems>`_\n - `Windows systems <#windows-systems>`_\n\n - `Modifying system variables <#modifying-system-variables>`_\n\n- `5 - Testing (Developers) <#5---testing-developers>`_\n- `6 - Benchmarks (Developers) <#6---benchmarks-developers>`_\n- `Future improvements <#future-improvements>`_\n- `Credits <#credits>`_\n\n1 - Features\n------------\n\nCollective operations\n~~~~~~~~~~~~~~~~~~~~~\n\npyRMSD currently has 5 basic operations:\n 1 - Pairwise RMSD calculation\n 2 - One vs. following (of a sequence of conformers).\n 3 - One vs. all the other conformations (of a sequence of conformers).\n 4 - Pairwise RMSD matrix\n 5 - Iterative superposition of a sequence.\n\nAll methods can use the same coordinates for fitting and RMSD\ncalculation, or a different set of coordinates for fitting (superposing)\nand calculating RMSD (referred into the code as 'calculation\ncoordinates' ).\n\nCurrently pyRMSD implements a total of 3 superposition algorithms\n(Kabsch's,QTRFIT and QCP) which can have serial or parallel versions\n(OpenMP and CUDA in one case).\n\nThe available calculators so far are: \\* KABSCH\\_SERIAL\\_CALCULATOR \\*\nKABSCH\\_OMP\\_CALCULATOR \\* QTRFIT\\_SERIAL\\_CALCULATOR \\*\nQTRFIT\\_OMP\\_CALCULATOR \\* QCP\\_SERIAL\\_CALCULATOR \\*\nQCP\\_OMP\\_CALCULATOR \\* QCP\\_CUDA\\_CALCULATOR (in CUDA capable\nmachines*)* QCP\\_CUDA\\_MEM\\_CALCULATOR (in CUDA capable machines\\*)\n\nIn addition it offers 2 other calculators that do not perform\nsuperposition (for cases in which the parts of interest of the system\nare already superposed): \\* NOSUP\\_SERIAL\\_CALCULATOR\n\\* NOSUP\\_OMP\\_CALCULATOR\nThis calculator will also center the coordinates, adding a little\nunnecessary overhead. This overhead will be totally diluted when\ncalculating RMSD matrices though.\n\nFinally it also holds a hidden calculator,\nQCP\\_SERIAL\\_FLOAT\\_CALCULATOR, maninly used to test against\nQCP\\_CUDA\\_CALCULATOR in its float version.\n\nMethods 1, 2 and 3 can be used to modify the input coordinates (the\ninput coordinates will be superposed). The iterative superposition\nmethod will always have this behaviour as it would be senseless\notherwise. Conversely, RMSD matrix will never modify input coordinates.\n\npyRMSD can also have fitting symmetries and rotational calculation\nsymmetries into account. Documentation about this is on its way.\n\nIf you think you need new features to be added (or better examples)\nclick `here <#contact_features>`_.\n\\* Computing capability of the GPU must be equal or higher than 1.1\n(>1.2 if built with double precision support).\n###Condensed matrix\npyRMSD contains also a C written data type called CondensedMatrix. This\nis a representation of a squared symmetric matrix and it will save you\nhalf of the, otherwise redundant, memory. Besides, its write and read\naccess outperforms other implementations like pure python's list-based\nand even Cython implementations (see the benchmarks folder). This means\nthat it will speed up for free any application that heavily relies on\naccessing a distance matrix, like clustering algorithms. See the\nexamples below to get more insight about how to use it. ##2 - Usage\nSome code snippets and explanations about them will be shown below. Note\nthat, as the code changes rapidly, this snippets can be outdated. I will\nput all my effort for this not to happen, but if you detect that the\ncode examples are being more problematic than helpful for you, please\n`contact me <#contact_features>`_. You will also find method and\nvariables documentation in the code. Do not hesitate to ask for more\ndocumentation if you find is missing.\n\nGetting coordinates\n~~~~~~~~~~~~~~~~~~~\n\nTo use the module the first thing will be to extract all the coordinates\nfrom a PDB file. Coordinates must be stored in numpy arrays, using the\nsame layout that Prody uses:\n\n::\n\n Coordset: [Conformation 1, Conformation 2, ..., Conformation N] \n Conformation: [Atom 1, Atom 2,..., Atom M] \n Atom: [x,y,z] \n\nIn order to do this there's a convenience class function in\n*pyRMSD/utils/proteinReading.py* called **Reader**. This will read a pdb\nfile using the built in reader. Despite this, we encourage the use of\n`Prody `_ if you need to do any kind of\nselection/manipulation.\n\n::\n\n from pyRMSD.utils.proteinReading import Reader \n reader = Reader().readThisFile(\"my_trajectory.pdb\").gettingOnlyCAs()\n coordinates = reader.read()\n num_of_atoms = reader.numberOfAtoms\n num_of_frames = reader.numberOfFrames\n\nSee 'pyRMSD/pyRMSD/test/testPdbReader.py for a simple usage example.\n###Calculating the RMSD matrix\nTo calculate the RMSD matrix you can use a **MatrixHandler** or use\ndirectly one calculator object to feed a CondensedMatrix.\n\nUsing **MatrixHandler** to get the RMSD pairwise matrix (given that we\nalready have read the coordinates) will look like this:\n\n::\n\n from pyRMSD.matrixHandler import MatrixHandler\n rmsd_matrix = MatrixHandler()\\\n .createMatrix(coordinates, 'QCP_OMP_CALCULATOR')\n\nCalculating the matrix using directly the RMSDCalculator is a little bit\nmore verbose:\n\n::\n\n import pyRMSD.RMSDCalculator\n calculator = pyRMSD.RMSDCalculator.\\\n RMSDCalculator(coordsets,\\\n \"QCP_SERIAL_CALCULATOR\")\n rmsd = calculator.pairwiseRMSDMatrix()\n rmsd_matrix = CondensedMatrix(rmsd)\n\nAs the resulting matrix is symmetric and its diagonal is 0, the\nrmsd\\_matrix object will store only the upper diagonal triangle\n(condensed matrix), in the same way\n`scipy.spatial.distance.pdist `_\ndoes.\n###Available calculators Programatically, available calculators can be\nqueried with:\n\n::\n\n from pyRMSD.availableCalculators import availableCalculators\n print availableCalculators()\n\nMatrix handlers\n~~~~~~~~~~~~~~~\n\nA **MatrixHandler** object will help you to create the matrix and will\nalso help you saving and loading matrix data to disk.\n\n::\n\n from pyRMSD.matrixHandler import MatrixHandler \n # Create a matrix with the coordsets and using a calculator\n mHandler = MatrixHandler() \n matrix = mHandler.createMatrix( coordsets,\\\n \"QCP_CUDA_CALCULATOR\")\n\n # Save the matrix to 'to_this_file.bin' \n m_handler.saveMatrix(\"to_this_file\") \n\n # Load it from 'from_this_file.bin' \n m_handler.loadMatrix(\"from_this_file\") \n\n # Get the inner CondensedMatrix instance\n rmsd_matrix = m_handler.getMatrix() \n\nAccessing the RMSD matrix\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can access a matrix object contents like this:\n\n::\n\n rmsd_at_pos_2_3 = rmsd_matrix[2,3]\n\nThe **row\\_lenght** parameter will give you the... row length. Remember\nthat the matrix is square and symmetric, so row\\_length ==\ncolumn\\_length, rmsd\\_matrix[i,j] == rmsd\\_matrix[j,i] and as it is a\ndistance matrix, rmsd\\_matrix[i,i] == 0.\n\nMatrix statistics\n~~~~~~~~~~~~~~~~~\n\nThe CondensedMatrix class also offers an efficient way to ask for the\nmost common statistical moments. Use the methods **calculateMean**,\n**calculateVariance**, **calculateSkewness** and **calculateKurtosis**\nto get mean, variance, skewness and kurtosis ( easy, isn't it :) ). You\ncan also use **calculateMax** and **calculateMin** to get the maximum\nand minimum value of the matrix.\n\n3 - Building & Installation\n---------------------------\n\nBefore installation\n~~~~~~~~~~~~~~~~~~~\n\n**Users** only need to install Python version 2.6/2.7 (pyRMSD has only\nbeen tested with those, however it may work with another versions of the\nPython 2.X family). Numpy is also required. Surely you already have it\ninto your machine, but, in the case you don't, it can be found\n`here `_. There you will\nbe able to find installers for almost all the combinations of platforms\nand Python versions you can think about.\n\n**Developers** may remember that header files of Python and Numpy may be\naccessible, and your Python installation must contain the python shared\nlibrary. This usually means that you have to compile it using\n./configure --enable-shared before building Python (usually 2.7\ndistributions already come with this library). Prody is not a\ndependency, but I encourage its use to handle coordinates, as it is\nwell-tested and powerful tool.\n\nLinux and MacOs\n~~~~~~~~~~~~~~~\n\nThose users have the following choices:\n\n**1)** Using the 'setup.py' file inside the root folder by typing:\n\n::\n\n > python setup.py install\n\nwith superuser provileges. Use 'build' instead to only build it. This is\nthe usual way python packages are deployed. As 'distutils' do not\nsupport CUDA directly, your package will not be able to use CUDA\ncalculators.\n\n**2)** Using the custom build.py script in pyRMSD main folder. This will\ncompile a version of pyRMSD following your configuration details. To\nfinish the installation you will need to change your PYTHONPATH in order\nto point to the parent folder of the package (or copy it in a folder\nalready inside your PYTHONPATH). See\n`this `_\nif you have any problem modifying it.\n\nWindows\n~~~~~~~\n\nWindows Installation is discontinued. I keep some very basic\ninstructions `here <#windows-systems>`_ though.\n\n4 - The custom building script\n------------------------------\n\npyRMSD includes a small build script that is indeed a recipe to compile\nthe C extensions of pyRMSD. The build.py script is the most versatile\nway to compile pyRMSD and will work in almost all situations. With this\nscript one can build x86 and x64 distributions with enabled or disbled\nCUDA calculators. Invoke it from pyRMSD root folder with:\n\n::\n\n > python build.py \\[OPTIONS\\]\n\nBy default this script won't do anything. OPTIONS can be one of these:\n\n--build -> to compile pyRMSD (OpenMP version).\n--cuda single/double -> to compile it with single or double precission\n(you must specify only one). Double precission will not work in old\ncards even if they are CUDA capable.\n--clean -> Will remove any generated .o files. --build --clean is a good\ncombination if you are not a developer.\n--clean-all -> Will remove all generated files. Combine this one with\nany other is not a good idea. It will remove any useful built file.\n--build-conf -> Will determine the file (inside *build\\_conf* folder)\nstoring the configuration info.\n--help/-h -> Will write some hints about the options.\n\nThis script uses distutil's *sysconfig* package to get the search path\nfor python headers and libs automatically.\nThe building script will try to guess the location of the needed files\nfor compilation, but it can be easily modified to be able to handle all\nkind of scenarios.\n\nConfiguration files\n~~~~~~~~~~~~~~~~~~~\n\nAs stated before, multiple configuration files can be used by the\nbuilding script to feed it with the correct variables. This\nconfiguration files are stored in the *build\\_conf* folder and by\ndefault, the 'default.conf' file is loaded (equivalent to *--build-conf\ndefault.conf*). These are the parameters that can be changed. If one key\nis not present in the file, then the contents of the key inside the\n'default.conf' file are used.\n\n- \"CUDA\\_BASE\": Base folder of the CUDA distribution installed.\n- \"CUDA\\_INCLUDE\\_FOLDER\": Folder inside CUDA\\_BASE where CUDA headers\n are found.\n- \"CUDA\\_LIBRARIES\\_FOLDER\": Folder inside CUDA\\_BASE where CUDA\n libraries are found.\n- \"CUDA\\_ARCHITECHTURE\": Arquitecture of the GPU (in the sm\\_XX\n format).\n- \"CUDA\\_LIBRARY\": Name of the cuda library (usually 'cudart').\n- \"CUDA\\_OPTIONS\": Some options for the CUDA compiler.\n- \"DEFINE\\_USE\\_CUDA\": Allows to redefine the macro that tells the\n preprocessor that CUDA is going to be used. Changing this means you\n also changed parts of the code, so is not adviced.\n- \"PYTHON\\_EXTENSION\\_OPTIONS\": Compiler options usually added to\n compile Python extensions.\n- \"PYTHON\\_INCLUDE\\_FOLDER\": If \"AUTO\" it will use\n 'distutils.sysconfig' to obtain the location of Python's header\n files, if not it must be the full location of python's header files\n folder.\n- \"PYTHON\\_LIBRARY\\_FOLDER\": If \"AUTO\" it will use\n 'distutils.sysconfig' to obtain the location of Python's libraries.\n If \"AUTO\\_ALT\", it will use os.path.dirname (useful for those\n situations in which 'distutils.sysconfig' fails to get the propper\n folder). The other option is the full location of python's libraries\n folder.\n- \"PYTHON\\_LIBRARY\" : The python library to link against.\n- \"OPENMP\\_OPTION\" : The openmp flag for the compiler used (nowadays\n the only compiler is gcc, so this flag must be -fopenmp in almost all\n cases).\n- \"NUMPY\\_INCLUDE\" : If \"AUTO\" it will use ''numpy.get\\_include' to get\n the folder where numpy headers are. If not it must be the full path\n of this folder.\n- \"PYTHON\\_EXTENSION\\_LINKING\\_OPTIONS\": Compiler options usually added\n to link Python extensions.\n\nSee the examples into the *build\\_conf* if you want to create your own\nconfiguration files.\n\nUnix-based systems\n~~~~~~~~~~~~~~~~~~\n\nThe building script was used in a Ubuntu x86 and Ubuntu x64 Os, as well\nas in MacOs (Snow Leopard) to perform a non CUDA build. It had the\n*python-dev* package installed, so python headers were available.\nPYTHON\\_X constants were left unchanged.\nIt was also used under Ubuntu x64 with CUDA 4.2 to build the CUDA\nenabled version.\n####Mac Users Roman Sloutsky warns that if you're not able to compile\nusing the build script with default configuration options, just try to\nchange \"PYTHON\\_LIBRARY\\_FOLDER\":\"AUTO\" to\n\"PYTHON\\_LIBRARY\\_FOLDER\":\"AUTO\\_ALT\" in \"default.conf\". Creating a new\nconfiguration file with only this entry will also work.\n\nWindows systems\n~~~~~~~~~~~~~~~\n\nA preliminary version of the build script was also tested in Windows 7\n32 and 64 systems using MinGW compiler tools. Here are the steps\nfollowed to succesfully compile the extensions:\n\n- `Download `_ and install MinGW. Then add its\n/bin folder to Windows PATH\n- `Download `_ and\ninstall Python 2.7.3\n- `Download `_ and install Numpy (tested\nwith v. 1.7.0 for python 2.7)\n- [Optional] `Download `_\nand install Prody (tested with v. 1.4.1 for python 2.7)\n\n*PYTHON\\_INCLUDE\\_FOLDER* and *PYTHON\\_LIBRARY\\_FOLDER* constants were\nchanged to match our Python installation paths.\n*PYTHON\\_EXTENSION\\_LINKING\\_OPTIONS* and *PYTHON\\_EXTENSION\\_OPTIONS*\nwere also changed to fit Windows extension creation options.\nOnce everything is built, create (or modify) the PYTHONPATH system\nvariable and make it point the pyRMSD folder.\n\nModifying system variables\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn order to create or modify a system variable under Windows 7, you will\nhave to go to Control Panel -> System and Security -> System -> Advanced\nSystem Settings.\n\n5 - Testing (Developers)\n------------------------\n\nOnce installed you can run the tests in *pyRMSD/test* using:\n\n::\n\n > python -m unittest discover\n\nCurrently only the *test\\_create\\_with\\_reader* test will fail if all\nthe dependencies are fullfilled (it's unwritten yet). If you didn't\nbuild pyRMSD with CUDA support, 5 tests will be skipped.\n\nIf you compiled the package using the build script, an extra test suite\nwill be available in the *src/calculators/test* folder with pure C\ntests. Run it inside this folder with ./test\\_rmsdtools\\_main\n\n6 - Benchmarks (Developers)\n---------------------------\n\nAlso available to users, inside the */benchmark* folder, there are the\nbenchmarks used to assest the performance of pyRMSD.\nThere one can find some small scripts to test OpenMP parametrizations,\ncalculation time of every implementation or even a small floating point\nerror check.\n\nFuture improvements\n-------------------\n\nIf you have used this package and you feel something is\nmissing/incorrect or whatever, you can change it and contribute. Some\nexamples of things that need to be improved are:\n\\* Solving bug in the CondensedMatrix object (erroneous creation when\nusing a numpy array)\n\\* Adding number of threads option for any OpenMP calculator. **DONE**\n\\* Adding number of blocks and threads per block option in CUDA\ncalculator. **DONE**\n\\* Create a unique installer using Python distutils (difficult because\nof the use of CUDA).\n\\* C code needs more comments and to encapsulate function arguments (an\nabsolutely needed major refactoring). **DONE** \\* Matrix generation load\nbalance can be improved. \\* Names in C code must be more\nself-explanatory. **IMPROVED** \\* C code must be revised and further\nsimplified. **DONE**\n\\* Add more and better tests to increase coverage.\n\\* Convert build.py in a Makefile generator. **PARTIALLY DONE** (it now\nacts just like make would do)\n\\* Add more comments...\n\\* Symmetry features need to be explained. \\* and of course improving\nthis README!! If you want to add new features (for instance mass\nweighting) do not hesitate to contact me at: victor.gil.sepulveda at\ngmail.com. Of course, you can fork the repository and add as many\nfeatures and improvements as you want.\n\nCredits\n-------\n\n- Some Numpy helper functions were first seen in\n http://www.scipy.org/Cookbook/C\\_Extensions/NumPy\\_arrays, by Lou\n Pecora (if I'm not wrong).\n\n- The initial Python implementation of superposition was extracted from\n Prody source code (by `Ahmet\n Bakan `_) and modified, with\n the only goal of providing a python example to compare performance\n and stability. The iterative superposition algorithm is a direct\n translation of his iterpose algorithm.\n\n- QCP superposition method code was adapted from the code\n `here `_\n\n- The statistics function code was adapted from the work of\n jjhaag@dreamincode.net (available\n `here `_ ).\n\n- Kabsch algorithm code was adapted from the work of `Dr. Bosco K.\n Ho `_. I would like to give him special tanks for\n his help.\n\n- As far as I know the first CUDA implementation of QCP is from `Yutong\n Zhao `_. He went a step further trying to\n improve memory coalescence by changing the coordinates overlay.\n Pitifully his code is not open source.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/victor-gil-sepulveda/pyRMSD.git", "keywords": null, "license": "LICENSE.txt", "maintainer": null, "maintainer_email": null, "name": "pyRMSD", "package_url": "https://pypi.org/project/pyRMSD/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/pyRMSD/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/victor-gil-sepulveda/pyRMSD.git" }, "release_url": "https://pypi.org/project/pyRMSD/4.2.1/", "requires_dist": null, "requires_python": null, "summary": "pyRMSD is a small Python package that aims to offer an integrative and efficient way of performing RMSD calculations of large sets of structures. It is specially tuned to do fast collective RMSD calculations, as pairwise RMSD matrices.", "version": "4.2.1" }, "last_serial": 1389273, "releases": { "4.0.0": [ { "comment_text": "", "digests": { "md5": "0ef39a0b603d462869864e79cf749150", "sha256": "148280a283905aa2591d0460962194d4aa2a46e3b32bcb88cb4ddf8238931efa" }, "downloads": -1, "filename": "pyRMSD-4.0.0.tar.gz", "has_sig": false, "md5_digest": "0ef39a0b603d462869864e79cf749150", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53050, "upload_time": "2013-12-02T16:27:47", "url": "https://files.pythonhosted.org/packages/80/b5/1fd41c73d58d030d036ba78ed3a9291b1916e3975c071c521576715a41c8/pyRMSD-4.0.0.tar.gz" } ], "4.0.1": [ { "comment_text": "", "digests": { "md5": "85a95ce787267ba0cb758a6215998707", "sha256": "f1775f6f9946e2f10e4403ad79e399bea8c772ae4ba63bc4bb0565ff233016fe" }, "downloads": -1, "filename": "pyRMSD-4.0.1.tar.gz", "has_sig": false, "md5_digest": "85a95ce787267ba0cb758a6215998707", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53121, "upload_time": "2014-05-07T09:16:17", "url": "https://files.pythonhosted.org/packages/f3/30/bf5cc08908f79127fecd306e126be5984ccb30be76bcdb62a39c582975aa/pyRMSD-4.0.1.tar.gz" } ], "4.1.0": [ { "comment_text": "", "digests": { "md5": "58d80eb69b82d519e4d924ac408fa11f", "sha256": "f53ca30fa47b482ec2f21af0c1470f5242bb95834ed55e0e475f6c2e78b1d45a" }, "downloads": -1, "filename": "pyRMSD-4.1.0.tar.gz", "has_sig": false, "md5_digest": "58d80eb69b82d519e4d924ac408fa11f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54122, "upload_time": "2014-10-17T10:05:11", "url": "https://files.pythonhosted.org/packages/45/7e/ac00abc640a76116139741b73c6eadd1cae264bb324f62acdb43f7806847/pyRMSD-4.1.0.tar.gz" } ], "4.2.0": [ { "comment_text": "", "digests": { "md5": "056bc05c55928d23464821b939e697c1", "sha256": "f0bd402dc9f365f266ebef6103ec81193039ebdc11085942ff30027f740bbc94" }, "downloads": -1, "filename": "pyRMSD-4.2.0.tar.gz", "has_sig": false, "md5_digest": "056bc05c55928d23464821b939e697c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54863, "upload_time": "2014-11-19T10:58:53", "url": "https://files.pythonhosted.org/packages/fb/17/cb4a46781fa84b8d974c1da54ace55674a1182c7bccd87047a8404971e41/pyRMSD-4.2.0.tar.gz" } ], "4.2.1": [ { "comment_text": "", "digests": { "md5": "2149c1a678804f75e2a6d0819cb0f18e", "sha256": "58c1e65c22b8fc135889c14036e5bfbb5a5b398d8e6acce8bd6854c0fa552e56" }, "downloads": -1, "filename": "pyRMSD-4.2.1.tar.gz", "has_sig": false, "md5_digest": "2149c1a678804f75e2a6d0819cb0f18e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54863, "upload_time": "2015-01-20T15:10:47", "url": "https://files.pythonhosted.org/packages/21/18/170ed35c7aaaae5bbb522b3c9a6bb1a7f4fd978702ea64e188975c2017aa/pyRMSD-4.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2149c1a678804f75e2a6d0819cb0f18e", "sha256": "58c1e65c22b8fc135889c14036e5bfbb5a5b398d8e6acce8bd6854c0fa552e56" }, "downloads": -1, "filename": "pyRMSD-4.2.1.tar.gz", "has_sig": false, "md5_digest": "2149c1a678804f75e2a6d0819cb0f18e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54863, "upload_time": "2015-01-20T15:10:47", "url": "https://files.pythonhosted.org/packages/21/18/170ed35c7aaaae5bbb522b3c9a6bb1a7f4fd978702ea64e188975c2017aa/pyRMSD-4.2.1.tar.gz" } ] }