{ "info": { "author": "Jon Wedell", "author_email": "wedell@bmrb.wisc.edu", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License (GPL)", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Scientific/Engineering :: Bio-Informatics", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# PyNMRSTAR\nA Python module for reading, writing, and manipulating NMR-STAR files. [![BuildStatus](https://travis-ci.org/uwbmrb/PyNMRSTAR.svg?branch=v2)](https://travis-ci.org/uwbmrb/PyNMRSTAR)\n\nPython versions supported: 2.6, 2.7, 3.3, 3.4, 3.5, and 3.6\n\n## Overview\n\nThis library was developed by the BMRB to give the Python-using NMR community tools to work with the NMR-STAR data format. It is used internally and is actively maintained. The library is thoroughly documented such that calling `help(object_or_method)` from an interactive python session will print the documentation for the object or method.\n\nThat same documentation, as well as some notes on module-level variables is located [here](documentation/full.md).\nFinally, there are several command-line based tools developed to enable simple queries to pull data out of an NMR-STAR file. Those tools also serve as great examples of how to use the library. You can view those [here](cmdline).\n\n## Introduction to NMR-STAR\n\nTo understand how the library works, you first need to understand the NMR-STAR terminology and file format. If you are already familiar with NMR-STAR, feel free to [jump ahead](#quick-start-to-pynmrstar) to the section on this library.\n\nA NMR-STAR entry/file is componsed of one or more saveframes (conceptually you should think of a saveframe as a data block), each of which contain tags and loops. There can only be one of each tag in a saveframe. If a tag has multiple values, the only way to represent it is to place it inside a loop. A loop is simply a set of tags with multiple values.\n\nTherefore, hierarchically, you can picture a NMR-STAR file as a tree where the entry is the trunk, the large branches are the saveframes, and each saveframe may contain one or more loops - the branches.\n\nHere is a very simple example of a NMR-STAR file:\n\n```\ndata_dates\n save_special_dates_saveframe_1\n _Special_Dates.Type Holidays\n loop_\n _Events.Date\n _Events.Desciption\n 12/31/2017 \"New Year's Eve\"\n 01/01/2018 \"New Year's Day\"\n stop_\n save_\n```\n\nIn the previous example, the entry name is `dates` because that is what follows the `data_` tag. Next, there is one saveframe, with a name of `special_dates_saveframe_1` and a tag prefix (which corresponds to the saveframe category) of `Special_Dates`. There is one tag in the saveframe, with a tag name of `Type` and a value of `Holidays`. There is also one loop of category `events` that has information about two different events (though an unlimited number of events could be present).\n\nThe first datum in each row corresponds to the first tag, `Date`, and the second corresponds to the second tag, `Description`.\n\nValues in NMR-STAR format need to be quoted if they contain a space, tab, vertical tab, or newline in the value. This library takes care of that for you, but it is worth knowing. That is why in the example the dates are not quoted, but the event descriptions are.\n\n# Quick Start to PyNMRSTAR\n\nFirst, pull up an interactive python session and import the module:\n```python\n>>> import pynmrstar\n```\n\nThere are many ways to load an NMR-STAR entry, but lets focus on the most common two.\n\nFrom the BMRB API (loads the most up to date version of an entry from the BMRB API):\n```python\n>>> entry15000 = pynmrstar.Entry.from_database(15000)\n```\n\nFrom a file:\n\n```python\n>>> entry = pynmrstar.Entry.from_file(\"/location/of/the/file.str\")\n```\n\nContinuing on we will assume you have loaded entry 15000 from the API using the from_database command.\n\nWriting out a modified entry or saveframe to file is just as easy:\n\n```python\n>>> entry15000.write_to_file(\"output_file_name.str\")\n```\n\n### Viewing the structure of the entry\nTo see the overall structure of the entry, use the `print_tree()` method.\n```python\n>>> entry15000.print_tree()\n\n [0] \n [0] \n [1] \n [2] \n [3] \n [4] \n [5] \n [6] \n [1] \n [0] \n [2] \n [0] \n [3] \n [0] \n [1] \n [2] \n [4] \n [0] \n [5] \n [0] \n [6] \n [0] \n [1] \n [2] \n [7] \n [0] \n [8] \n [0] \n [9] \n [0] \n [10] \n [0] \n [1] \n [11] \n [0] \n [1] \n [12] \n [0] \n [1] \n [13] \n [0] \n [1] \n [14] \n [0] \n [1] \n [15] \n [16] \n [17] \n [18] \n [19] \n [20] \n [21] \n [0] \n [22] \n [0] \n [23] \n [0] \n [24] \n [0] \n [1] \n```\n\nYou can see that there are 24 saveframes, and each saveframe contains some number of loops.\n\n### Accessing saveframes and loops\n\nThere are several ways to access saveframes and loops depending on what you hope to accomplish.\n\n#### The interactive session way\nWhen playing with the library, debugging, or learning about NMR-STAR you will most likely find the following method most convenient. Note that it is not the correct pattern to use if you want to iterate all of the data in an entry (for reasons that will be explained below).\n\nYou can access the saveframes in an entry directly using their *names*. For example, to get a reference to the spectrometer saveframe named `spectrometer_1` you can simply do the following:\n```python\n>>> a_spectrometer = entry15000['spectrometer_1']\n```\nNote that you can see the saveframe names in the tree printout above.\n\nYou can do the same for loops within a saveframe, but for loops you must use their tag category (the part before the period) to access them (note that to get to the `Vendor` loop we first had to go through its parent saveframe, named `X-PLOR_NIH` (the `X-PLOR_NIH` saveframe is of the category `software` - you'll see where you access the category later and why accessing by category is preferrable).\n```python\n>>> explor_nih_vendor = entry15000['X-PLOR_NIH']['_Vendor']\n>>> print explor_nih_vendor\n loop_\n _Vendor.Name\n _Vendor.Address\n _Vendor.Electronic_address\n _Vendor.Entry_ID\n _Vendor.Software_ID\n\n 'CD Schwieters, JJ Kuszewski, N Tjandra and GM Clore' . . 15000 5\n\n stop_\n\n```\n\nThese shortcuts are there for your convenience when writing code. The reason you shouldn't use them in production code is because the saveframe names - what you use as a reference - can actually have any arbitrary value. They are fairly consistent, and for certain saveframes are always the same, but for other saveframes users can set them to whatever value they want during the deposition. Therefore the much better way to access data is via the *category*. Note that only one saveframe in an entry can have a given name, but multiple saveframes may be of the same category.\n\nThe `_` prior to the `Vendor` loop category is to make it clear you want to access the loop and not a saveframe tag with the name `Vendor`.\n\n#### The robust (and recommended) way\n\nA better way to access data is via the category of the data you want to read, or by searching for it with a full tag name. Before going into detail, take a look at what one saveframe from the entry above looks like:\n\n```data\n############################\n# Computer software used #\n############################\n\nsave_X-PLOR_NIH\n _Software.Sf_category software\n _Software.Sf_framecode X-PLOR_NIH\n _Software.Entry_ID 15000\n _Software.ID 5\n _Software.Name 'X-PLOR NIH'\n _Software.Version .\n _Software.Details .\n\n loop_\n _Vendor.Name\n _Vendor.Address\n _Vendor.Electronic_address\n _Vendor.Entry_ID\n _Vendor.Software_ID\n\n 'CD Schwieters, JJ Kuszewski, N Tjandra and GM Clore' . . 15000 5\n\n stop_\n\n loop_\n _Task.Task\n _Task.Entry_ID\n _Task.Software_ID\n\n refinement 15000 5\n 'structure solution' 15000 5\n\n stop_\n\nsave_\n```\n\nThis is a saveframe describing software that was used during an NMR study. You can see from the saveframe tags that the name of this software package is X-PLOR-NIH. You can see from the tag `ID` that it is the fifth software saveframe in this entry. The category of this saveframe is \"software\" which you can see in the `Sf_category` (short for saveframe category) tag.\n\nThis saveframe also has two loops, a vendor loop and a task loop. These are loops rather than free tags as a given software package can have more than one vendor and more than one task it performs.\n\n#### Reading the software packages\nThe more robust way to access the data in the software saveframes is by iterating over all of the software saveframes in the entry and pulling out the data we want. To do this for software, we would write the following:\n```python\n>>> software_saveframes = entry15000.get_saveframes_by_category('software')\n>>> software_saveframes\n[,\n ,\n ,\n ,\n ]\n```\n\nYou can see that this method, `get_saveframes_by_category` returned all of the software saveframes in the entry. Now we can iterate through them to either pull out data, modify data, or remove data. (One note, each loop category - the text before the period in the loop tags - is unique to its parent saveframe. Therefore you will never find a `Task` loop in a saveframe with a category of anything other than `software`. Furthermore, a saveframe can only have one loop of a given category. This means that accessing loops within a saveframe using the category notation is robust and will not lead to you missing a loop.)\n\nThe following will combine all the task loops in the entry into CSV format.\n```python\n>>> csv_data = \"\"\n>>> for software_sf in software_saveframes:\n>>> print_header = True\n>>> # Wrap this in try/catch because it is not gauranteed a software saveframe will have a task loop\n>>> try:\n>>> csv_data += software_sf['_Task'].get_data_as_csv(header=print_header)\n>>> print_header = False\n>>> except KeyError:\n>>> continue\n>>> csv_data\n'_Task.Task,_Task.Entry_ID,_Task.Software_ID\\nprocessing,15000,1\\n_Task.Task,_Task.Entry_ID,_Task.Software_ID\\nchemical shift assignment,15000,2\\ndata analysis,15000,2\\npeak picking,15000,2\\n_Task.Task,_Task.Entry_ID,_Task.Software_ID\\nchemical shift assignment,15000,3\\n_Task.Task,_Task.Entry_ID,_Task.Software_ID\\nstructure solution,15000,4\\n_Task.Task,_Task.Entry_ID,_Task.Software_ID\\nrefinement,15000,5\\nstructure solution,15000,5\\n'\n```\n\n#### Using get_tag to pull tags directly from an entry\nAnother way to access data in by using the full tag name. Keep in mind that a full tag contains a category first, a period, and then a tag name. So if we wanted to see all of the various `_Task.Task` that the software packages associated with this entry performed, a simple way to do so is with the `get_tag()` method of the entry:\n```python\n>>> entry15000.get_tag('Task.Task')\n[u'processing',\n u'chemical shift assignment',\n u'data analysis',\n u'peak picking',\n u'chemical shift assignment',\n u'structure solution',\n u'refinement',\n u'structure solution']\n```\nOr to get all of the spectrometer information - `get_tags()` accepts a list of tags to fetch and returns a dictionary pointing to all the values of each tag, with the order preserved:\n```python\n>>> entry15000.get_tags(['_NMR_spectrometer.Manufacturer', '_NMR_spectrometer.Model', '_NMR_spectrometer.Field_strength'])\n{'_NMR_spectrometer.Field_strength': [u'500',\n u'500',\n u'750',\n u'600',\n u'800',\n u'900'],\n '_NMR_spectrometer.Manufacturer': [u'Bruker',\n u'Bruker',\n u'Bruker',\n u'Varian',\n u'Varian',\n u'Varian'],\n '_NMR_spectrometer.Model': [u'Avance',\n u'Avance',\n u'Avance',\n u'INOVA',\n u'INOVA',\n u'INOVA']}\n```\nTo view all of the tags in the NMR-STAR schema and their meanings, please go [here](http://www.bmrb.wisc.edu/dictionary/tag.php).\n# Assigned Chemical Shifts\n\n*\"I just want to get the chemical shift data as an array - how do I do that?\"*\n\nKeep in mind that an entry may have multiple sets of assigned chemical shifts. (For examples, there made be two sets of assignments that were made under two differerent sample conditions.) So to get the chemical shifts it is best to iterate through all the assigned chemical shift loops:\n\n```python\n>>> cs_result_sets = []\n>>> for chemical_shift_loop in entry15000.get_loops_by_category(\"Atom_chem_shift\"):\n>>> cs_result_sets.append(chemical_shift_loop.get_tag(['Comp_index_ID', 'Comp_ID', 'Atom_ID', 'Atom_type', 'Val', 'Val_err']))\n>>> cs_result_sets\n[[[u'2', u'SER', u'H', u'H', u'9.3070', u'0.01'],\n [u'2', u'SER', u'HA', u'H', u'4.5970', u'0.01'],\n [u'2', u'SER', u'HB2', u'H', u'4.3010', u'0.01'],\n [u'2', u'SER', u'HB3', u'H', u'4.0550', u'0.01'],\n [u'2', u'SER', u'CB', u'C', u'64.6000', u'0.1'],\n [u'2', u'SER', u'N', u'N', u'121.5800', u'0.1'],\n [u'3', u'ASP', u'H', u'H', u'8.0740', u'0.01'],\n [u'3', u'ASP', u'HA', u'H', u'4.5580', u'0.01'],\n [u'3', u'ASP', u'HB2', u'H', u'2.835', u'0.01'],\n ...\n```\n\nNote that we used the `get_tag()` method of the loop to only pull out the tags we were concerned with. `get_tag()` accepts an array of tags in addition to a single tag. The full assigned chemical saveframe loop will contain extra tags you may not need. For example:\n\n```python\n>>> print entry15000.get_loops_by_category(\"Atom_chem_shift\")[0]\n loop_\n _Atom_chem_shift.ID\n _Atom_chem_shift.Assembly_atom_ID\n _Atom_chem_shift.Entity_assembly_ID\n _Atom_chem_shift.Entity_ID\n _Atom_chem_shift.Comp_index_ID\n _Atom_chem_shift.Seq_ID\n _Atom_chem_shift.Comp_ID\n _Atom_chem_shift.Atom_ID\n _Atom_chem_shift.Atom_type\n _Atom_chem_shift.Atom_isotope_number\n _Atom_chem_shift.Val\n _Atom_chem_shift.Val_err\n _Atom_chem_shift.Assign_fig_of_merit\n _Atom_chem_shift.Ambiguity_code\n _Atom_chem_shift.Occupancy\n _Atom_chem_shift.Resonance_ID\n _Atom_chem_shift.Auth_entity_assembly_ID\n _Atom_chem_shift.Auth_asym_ID\n _Atom_chem_shift.Auth_seq_ID\n _Atom_chem_shift.Auth_comp_ID\n _Atom_chem_shift.Auth_atom_ID\n _Atom_chem_shift.Details\n _Atom_chem_shift.Entry_ID\n _Atom_chem_shift.Assigned_chem_shift_list_ID\n\n 1 . 1 1 2 2 SER H H 1 9.3070 0.01 . . . . . . 2 SER H . 15000 1\n 2 . 1 1 2 2 SER HA H 1 4.5970 0.01 . . . . . . 2 SER HA . 15000 1\n 3 . 1 1 2 2 SER HB2 H 1 4.3010 0.01 . . . . . . 2 SER HB2 . 15000 1\n ...\n```\n\n*\"But I want to access the chemical shifts as numbers, not strings!\"*\n\nThat is easy to do. When you first load an entry it is by default loaded with all values as strings. To instead load it such that the values match the schema, simply turn on CONVERT_DATATYPES prior to loading it.\n\n```python\n>>> pynmrstar.CONVERT_DATATYPES = True\n>>> ent15000 = pynmrstar.Entry.from_database(15000)\n>>> cs_result_sets = []\n>>> for chemical_shift_loop in entry15000.get_loops_by_category(\"Atom_chem_shift\"):\n>>> cs_result_sets.append(chemical_shift_loop.get_tag(['Comp_index_ID', 'Comp_ID', 'Atom_ID', 'Atom_type', 'Val', 'Val_err']))\n>>> cs_result_sets\n[[[2, u'SER', u'H', u'H', Decimal('9.3070'), Decimal('0.01')],\n [2, u'SER', u'HA', u'H', Decimal('4.5970'), Decimal('0.01')],\n [2, u'SER', u'HB2', u'H', Decimal('4.3010'), Decimal('0.01')],\n [2, u'SER', u'HB3', u'H', Decimal('4.0550'), Decimal('0.01')],\n [2, u'SER', u'CB', u'C', Decimal('64.6000'), Decimal('0.1')],\n [2, u'SER', u'N', u'N', Decimal('121.5800'), Decimal('0.1')],\n [3, u'ASP', u'H', u'H', Decimal('8.0740'), Decimal('0.01')],\n [3, u'ASP', u'HA', u'H', Decimal('4.5580'), Decimal('0.01')],\n [3, u'ASP', u'HB2', u'H', Decimal('2.835'), Decimal('0.01')],\n [3, u'ASP', u'HB3', u'H', Decimal('2.754'), Decimal('0.01')],\n [3, u'ASP', u'CA', u'C', Decimal('57.6400'), Decimal('0.1')],\n [3, u'ASP', u'N', u'N', Decimal('121.1040'), Decimal('0.1')],\n ...\n```\n\nThis is a great opportunity to point out that if all you want is the chemical shifts, or one or two tags, you may find it significantly easier to use the [BMRB API](https://github.com/uwbmrb/BMRB-API#bmrb-api) ([chemical shift endpoint](https://github.com/uwbmrb/BMRB-API#get-assigned-chemical-shift-list-get)) to fetch that data directly and on-demand rather than dealing directly with NMR-STAR at all.\n\n# Creating new loops and saveframes\n\nThis tutorial has so far focused on how to read and access data. This section will focus on how to create new loop and saveframe objects.\n\n## Loops\n\nThere are five ways to make a new loop: `from_file()`, `from_json()`, `from_scratch()`, `from_string()`, and `from_template()`. All of these are classmethods. `from_scratch()` makes a new loop, `from_string()` parses an NMR-STAR loop from a python string containing NMR-STAR data, `from_json()` parses a JSON object (reversely, `get_json()` will get a JSON representation of the loop), `from_scratch()` makes a completely empty loop, and `from_template()` makes a loop with the tags prefilled from the BMRB schema based on the provided category. `from_file`, `from_json`, and `from_string` are fairly self-explanatory - see the full documentation if needed for usage.\n\n#### `from_scratch()`\n\n```python\n>>> lp = pynmrstar.Loop.from_scratch()\n>>> print lp\n\n loop_\n\n stop_\n\n>>> lp.add_tag(['loop_category.tag1', 'loop_category.tag2', 'loop_category.tag3'])\n>>> print lp\n\n loop_\n _loop_category.tag1\n _loop_category.tag2\n _loop_category.tag3\n\n\n stop_\n\n# Note that when calling add_data the length of the array must match the number of tags in the loop\n>>> lp.add_data(['value_1', 2, 'value 3'])\n>>> print lp\n loop_\n _loop_category.tag1\n _loop_category.tag2\n _loop_category.tag3\n\n value_1 2 'value 3'\n\n stop_\n\n# Alternatively, you can (with caution) directly modify the array corresponding to the loop data\n>>> lp.data = [[1,2,3],[4,5,6]]\n>>> print lp\n loop_\n _loop_category.tag1\n _loop_category.tag2\n _loop_category.tag3\n\n 1 2 3\n 4 5 6\n\n stop_\n```\n\nNote that the loop category was set automatically when the tag `loop_category.tag1` was added. You could have also provided the tag when creating the loop by providing it as an argument to the optional `category` argument to the constructor.\n\n#### `from_template()`\n\nThis method will create a new loop ready for data with the tags from the BMRB schema corresponding to that loop category.\n\n```python\n>>> chemical_shifts = pynmrstar.Loop.from_template('atom_chem_shift_list')\n>>> print chemical_shifts\n loop_\n _Atom_chem_shift.ID\n _Atom_chem_shift.Assembly_atom_ID\n _Atom_chem_shift.Entity_assembly_ID\n _Atom_chem_shift.Entity_ID\n _Atom_chem_shift.Comp_index_ID\n _Atom_chem_shift.Seq_ID\n _Atom_chem_shift.Comp_ID\n _Atom_chem_shift.Atom_ID\n _Atom_chem_shift.Atom_type\n _Atom_chem_shift.Atom_isotope_number\n _Atom_chem_shift.Val\n _Atom_chem_shift.Val_err\n _Atom_chem_shift.Assign_fig_of_merit\n _Atom_chem_shift.Ambiguity_code\n _Atom_chem_shift.Ambiguity_set_ID\n _Atom_chem_shift.Occupancy\n _Atom_chem_shift.Resonance_ID\n _Atom_chem_shift.Auth_entity_assembly_ID\n _Atom_chem_shift.Auth_asym_ID\n _Atom_chem_shift.Auth_seq_ID\n _Atom_chem_shift.Auth_comp_ID\n _Atom_chem_shift.Auth_atom_ID\n _Atom_chem_shift.Details\n _Atom_chem_shift.Entry_ID\n _Atom_chem_shift.Assigned_chem_shift_list_ID\n\n\n stop_\n```\n\n## Saveframes\n\nThere are five ways to make a new loop: `from_file()`, `from_json()`, `from_scratch()`, `from_string()`, and `from_template()`. All of these are classmethods. `from_scratch()` makes a new saveframe, `from_string()` parses an NMR-STAR saveframe from a python string containing NMR-STAR data, `from_json()` parses a JSON object (reversely, `get_json()` will get a JSON representation of the saveframe), `from_scratch()` makes a completely empty saveframe, and `from_template()` makes a saveframe with the tags prefilled from the BMRB schema based on the provided category. `from_file`, `from_json`, and `from_string` are fairly self-explanatory - see the full documentation if needed for usage.\n\n#### `from_scratch()`\n```python\n# You must provide the saveframe name (the value that comes after \"save_\" at the start of the saveframe and saveframe tag prefix (the value before the \".\" in a tag name) when creating a saveframe this way\n>>> my_sf = pynmrstar.Saveframe.from_scratch(\"sf_name\", \"example_sf_category\")\n>>> print my_sf\nsave_sf_name\n\nsave_\n\n# Add a tag using the add_tag() method. Update=True will override existing tag with the same name. Update=False will raise an exception if the tag already exists\n>>> my_sf.add_tag(\"tagName1\", \"tagValue1\")\n>>> print my_sf\nsave_sf_name\n _example_sf_category.tagName1 tagValue1\n\nsave_\n\n>>> my_sf.add_tag(\"tagName1\", \"tagValue2\", update=False)\nValueError: There is already a tag with the name 'tagName1'.\n>>> my_sf.add_tag(\"tagName1\", \"tagValue2\", update=True)\n>>> print my_sf\nsave_sf_name\n _example_sf_category.tagName1 tagValue1\n\nsave_\n# Alternatively, you can access or write tag values using direct subset access:\n>>> my_sf['tagName1']\n['tagValue2']\n>>> my_sf['tagName2'] = \"some value\"\n>>> print my_sf\nsave_sf_name\n _example_sf_category.tagName1 tagValue2\n _example_sf_category.tagName2 'some value'\n\nsave_\n\n# Now add the loop we created before\n>>> my_sf.add_loop(lp)\n>>> print my_sf\nsave_sf_name\n _example_sf_category.tagName1 tagValue2\n _example_sf_category.tagName2 'some value'\n\n loop_\n _loop_category.tag1\n _loop_category.tag2\n _loop_category.tag3\n\n 1 2 3\n 4 5 6\n\n stop_\n\nsave_\n\n# Now write out our saveframe to a file. Optionally specify format=\"json\" to write in JSON format.\n>>> my_sf.write_to_file(\"file_name.str\")\n>>> my_sf.write_to_file(\"file_name.json\", format_=\"json\")\n```\n\n#### `from_template()`\n```python\n\n>>> my_sf = pynmrstar.Saveframe.from_template(\"assigned_chemical_shifts\")\n>>> print my_sf\nprint my_sf\n ###################################\n # Assigned chemical shift lists #\n ###################################\n\n###################################################################\n# Chemical Shift Ambiguity Index Value Definitions #\n# #\n# The values other than 1 are used for those atoms with different #\n# chemical shifts that cannot be assigned to stereospecific atoms #\n# or to specific residues or chains. #\n# #\n# Index Value Definition #\n# #\n# 1 Unique (including isolated methyl protons, #\n# geminal atoms, and geminal methyl #\n# groups with identical chemical shifts) #\n# (e.g. ILE HD11, HD12, HD13 protons) #\n# 2 Ambiguity of geminal atoms or geminal methyl #\n# proton groups (e.g. ASP HB2 and HB3 #\n# protons, LEU CD1 and CD2 carbons, or #\n# LEU HD11, HD12, HD13 and HD21, HD22, #\n# HD23 methyl protons) #\n# 3 Aromatic atoms on opposite sides of #\n# symmetrical rings (e.g. TYR HE1 and HE2 #\n# protons) #\n# 4 Intraresidue ambiguities (e.g. LYS HG and #\n# HD protons or TRP HZ2 and HZ3 protons) #\n# 5 Interresidue ambiguities (LYS 12 vs. LYS 27) #\n# 6 Intermolecular ambiguities (e.g. ASP 31 CA #\n# in monomer 1 and ASP 31 CA in monomer 2 #\n# of an asymmetrical homodimer, duplex #\n# DNA assignments, or other assignments #\n# that may apply to atoms in one or more #\n# molecule in the molecular assembly) #\n# 9 Ambiguous, specific ambiguity not defined #\n# #\n###################################################################\n\nsave_assigned_chemical_shifts\n _Assigned_chem_shift_list.Sf_category assigned_chemical_shifts\n _Assigned_chem_shift_list.Sf_framecode assigned_chemical_shifts\n _Assigned_chem_shift_list.Entry_ID .\n _Assigned_chem_shift_list.ID .\n _Assigned_chem_shift_list.Sample_condition_list_ID .\n _Assigned_chem_shift_list.Sample_condition_list_label .\n _Assigned_chem_shift_list.Chem_shift_reference_ID .\n _Assigned_chem_shift_list.Chem_shift_reference_label .\n _Assigned_chem_shift_list.Chem_shift_1H_err .\n _Assigned_chem_shift_list.Chem_shift_13C_err .\n _Assigned_chem_shift_list.Chem_shift_15N_err .\n _Assigned_chem_shift_list.Chem_shift_31P_err .\n _Assigned_chem_shift_list.Chem_shift_2H_err .\n _Assigned_chem_shift_list.Chem_shift_19F_err .\n _Assigned_chem_shift_list.Error_derivation_method .\n _Assigned_chem_shift_list.Details .\n _Assigned_chem_shift_list.Text_data_format .\n _Assigned_chem_shift_list.Text_data .\n\n loop_\n _Chem_shift_experiment.Experiment_ID\n _Chem_shift_experiment.Experiment_name\n _Chem_shift_experiment.Sample_ID\n _Chem_shift_experiment.Sample_label\n _Chem_shift_experiment.Sample_state\n _Chem_shift_experiment.Entry_ID\n _Chem_shift_experiment.Assigned_chem_shift_list_ID\n\n\n stop_\n\n loop_\n _Systematic_chem_shift_offset.Type\n _Systematic_chem_shift_offset.Atom_type\n _Systematic_chem_shift_offset.Atom_isotope_number\n _Systematic_chem_shift_offset.Val\n _Systematic_chem_shift_offset.Val_err\n _Systematic_chem_shift_offset.Entry_ID\n _Systematic_chem_shift_offset.Assigned_chem_shift_list_ID\n\n\n stop_\n\n loop_\n _Chem_shift_software.Software_ID\n _Chem_shift_software.Software_label\n _Chem_shift_software.Method_ID\n _Chem_shift_software.Method_label\n _Chem_shift_software.Entry_ID\n _Chem_shift_software.Assigned_chem_shift_list_ID\n\n\n stop_\n\n loop_\n _Atom_chem_shift.ID\n _Atom_chem_shift.Assembly_atom_ID\n _Atom_chem_shift.Entity_assembly_ID\n _Atom_chem_shift.Entity_ID\n _Atom_chem_shift.Comp_index_ID\n _Atom_chem_shift.Seq_ID\n _Atom_chem_shift.Comp_ID\n _Atom_chem_shift.Atom_ID\n _Atom_chem_shift.Atom_type\n _Atom_chem_shift.Atom_isotope_number\n _Atom_chem_shift.Val\n _Atom_chem_shift.Val_err\n _Atom_chem_shift.Assign_fig_of_merit\n _Atom_chem_shift.Ambiguity_code\n _Atom_chem_shift.Ambiguity_set_ID\n _Atom_chem_shift.Occupancy\n _Atom_chem_shift.Resonance_ID\n _Atom_chem_shift.Auth_entity_assembly_ID\n _Atom_chem_shift.Auth_asym_ID\n _Atom_chem_shift.Auth_seq_ID\n _Atom_chem_shift.Auth_comp_ID\n _Atom_chem_shift.Auth_atom_ID\n _Atom_chem_shift.Details\n _Atom_chem_shift.Entry_ID\n _Atom_chem_shift.Assigned_chem_shift_list_ID\n\n\n stop_\n\n loop_\n _Ambiguous_atom_chem_shift.Ambiguous_shift_set_ID\n _Ambiguous_atom_chem_shift.Atom_chem_shift_ID\n _Ambiguous_atom_chem_shift.Entry_ID\n _Ambiguous_atom_chem_shift.Assigned_chem_shift_list_ID\n\n\n stop_\n\nsave_\n\n```\n\n# Schema methods\n\nThe library makes it easy to add missing tags, sort the tags according to the BMRB schema, and validate the data against the schema. Let's do a simple example of creating a chemical shift loop, adding any missing tags, ordering the tags in the standard order (not required), and then checking for errors.\n\n```python\n# Create the loop with the proper category\n>>> my_cs_loop = pynmrstar.Loop.from_scratch(\"Atom_chem_shift\")\n# Add the tags we will fill\n>>> my_cs_loop.add_tag(['Comp_ID', 'Atom_ID', 'Comp_index_ID', 'Atom_type', 'Val', 'Val_err'])\n loop_\n _Atom_chem_shift.Comp_ID\n _Atom_chem_shift.Atom_ID\n _Atom_chem_shift.Comp_Index_ID\n _Atom_chem_shift.Atom_type\n _Atom_chem_shift.Val\n _Atom_chem_shift.Val_err\n\n\n stop_\n# Populate the data array\n>>> my_cs_loop.data = [['SER', 'H', '2', 'H', '9.3070', '0.01'],\n ['SER', 'HA', '2', 'H', '4.5970', '0.01'],\n ['SER', 'HB2', '2', 'H', '4.3010', '0.01']]\n>>> print my_cs_loop\n loop_\n _Atom_chem_shift.Comp_ID\n _Atom_chem_shift.Atom_ID\n _Atom_chem_shift.Comp_Index_ID\n _Atom_chem_shift.Atom_type\n _Atom_chem_shift.Val\n _Atom_chem_shift.Val_err\n\n SER H 2 H 9.3070 0.01\n SER HA 2 H 4.5970 0.01\n SER HB2 2 H 4.3010 0.01\n\n stop_\n\n# Now lets sort the tags to match the BMRB schema\n>>> my_cs_loop.sort_tags()\n# You can see that the Comp_index_ID tag has been moved to the front to match the BMRB standard\n>>> print my_cs_loop\n loop_\n _Atom_chem_shift.Comp_index_ID\n _Atom_chem_shift.Comp_ID\n _Atom_chem_shift.Atom_ID\n _Atom_chem_shift.Atom_type\n _Atom_chem_shift.Val\n _Atom_chem_shift.Val_err\n\n 2 SER H H 9.3070 0.01\n 2 SER HA H 4.5970 0.01\n 2 SER HB2 H 4.3010 0.01\n\n stop_\n\n# Check for any errors - returns a list of errors. No errors here:\n>>> print my_cs_loop.validate()\n[]\n# Let us now set 'Comp_index_ID' to have an invalid value\n>>> my_cs_loop.data[0][0] = \"invalid\"\n# You can see that there is now a validation error - the data doesn't match the specified type\n>>> print my_cs_loop.validate()\n[\"Value does not match specification: '_Atom_chem_shift.Comp_index_ID':'invalid' on line '0 tag 0 of loop'.\\n Type specified: int\\n Regular expression for type: '-?[0-9]+'\"]\n# If you use the pynmrstar.validate(object) function, it will print the report in a human-readable format\n>>> pynmrstar.validate(my_cs_loop)\n1: Value does not match specification: '_Atom_chem_shift.Comp_index_ID':'invalid' on line '0 tag 0 of loop'.\n Type specified: int\n Regular expression for type: '-?[0-9]+'\n\n# Finally, add in any tags that you didn't have a value for\n>>> my_cs_loop.add_missing_tags()\n# You can see that all the standard \"Atom_chem_shift\" loop tags have been added, and their values all set to a logical null value - \".\"\n>>> print my_cs_loop\n\n loop_\n _Atom_chem_shift.ID\n _Atom_chem_shift.Assembly_atom_ID\n _Atom_chem_shift.Entity_assembly_ID\n _Atom_chem_shift.Entity_ID\n _Atom_chem_shift.Comp_index_ID\n _Atom_chem_shift.Seq_ID\n _Atom_chem_shift.Comp_ID\n _Atom_chem_shift.Atom_ID\n _Atom_chem_shift.Atom_type\n _Atom_chem_shift.Atom_isotope_number\n _Atom_chem_shift.Val\n _Atom_chem_shift.Val_err\n _Atom_chem_shift.Assign_fig_of_merit\n _Atom_chem_shift.Ambiguity_code\n _Atom_chem_shift.Ambiguity_set_ID\n _Atom_chem_shift.Occupancy\n _Atom_chem_shift.Resonance_ID\n _Atom_chem_shift.Auth_entity_assembly_ID\n _Atom_chem_shift.Auth_asym_ID\n _Atom_chem_shift.Auth_seq_ID\n _Atom_chem_shift.Auth_comp_ID\n _Atom_chem_shift.Auth_atom_ID\n _Atom_chem_shift.Details\n _Atom_chem_shift.Entry_ID\n _Atom_chem_shift.Assigned_chem_shift_list_ID\n\n . . . . invalid . SER H H . 9.3070 0.01 . . . . . . . . . . . . .\n . . . . 2 . SER HA H . 4.5970 0.01 . . . . . . . . . . . . .\n . . . . 2 . SER HB2 H . 4.3010 0.01 . . . . . . . . . . . . .\n\n stop_\n```\n\n\nFor more examples of PyNMRSTAR library usage, please look [here](documentation/examples.md).\nFor the full documentation of all available methods and classes, please look [here](documentation/full.md).\n\nFor any questions or suggestions, please create an issue on the GitHub page.", "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/uwbmrb/PyNMRSTAR", "keywords": "bmrb,parser,nmr,nmrstar,biomagresbank,biological magnetic resonance bank", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "pynmrstar", "package_url": "https://pypi.org/project/pynmrstar/", "platform": "", "project_url": "https://pypi.org/project/pynmrstar/", "project_urls": { "Homepage": "https://github.com/uwbmrb/PyNMRSTAR" }, "release_url": "https://pypi.org/project/pynmrstar/2.6.4.1/", "requires_dist": null, "requires_python": "", "summary": "PyNMR-STAR provides tools for reading, writing, modifying, and interacting with NMR-STAR files. Maintained by the BMRB.", "version": "2.6.4.1" }, "last_serial": 4967937, "releases": { "2.2.2": [ { "comment_text": "", "digests": { "md5": "2723303a2c1fe85fd235df1d2a23021d", "sha256": "0ab4425ad3fa446911296dfde99fd1e0fa64d7524db6195a213bc76c22933603" }, "downloads": -1, "filename": "pynmrstar-2.2.2.tar.gz", "has_sig": true, "md5_digest": "2723303a2c1fe85fd235df1d2a23021d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 441340, "upload_time": "2016-11-11T20:28:03", "url": "https://files.pythonhosted.org/packages/d8/0f/1836b764a94f5759a80b76f7ba87478ca77e8b08188ac2fd7f565680c187/pynmrstar-2.2.2.tar.gz" } ], "2.2.3": [ { "comment_text": "", "digests": { "md5": "b26313313f47d18457a939450488117d", "sha256": "d17fa0bbf2912a9f589dc5e2f027f5cf56b6b24e2be0029dddb1e3bf9aeb9e43" }, "downloads": -1, "filename": "pynmrstar-2.2.3.tar.gz", "has_sig": true, "md5_digest": "b26313313f47d18457a939450488117d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 441864, "upload_time": "2016-11-29T17:54:52", "url": "https://files.pythonhosted.org/packages/cb/f7/0b53cf584fc15de6604de9373b91e82c668dd02b0421813436df1bc287d7/pynmrstar-2.2.3.tar.gz" } ], "2.2.4": [ { "comment_text": "", "digests": { "md5": "1ad438add517b8ca9474ea9918122cdf", "sha256": "f50a0ad82e3a930878876c62a0878b4d3f0a6a3749a680e0747fce3e8417b17a" }, "downloads": -1, "filename": "pynmrstar-2.2.4.tar.gz", "has_sig": true, "md5_digest": "1ad438add517b8ca9474ea9918122cdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 439713, "upload_time": "2016-12-05T18:20:24", "url": "https://files.pythonhosted.org/packages/8e/a7/6d78ff40a397d1eed88108beda6b2b525d4603143c7f40618e6148cc22f2/pynmrstar-2.2.4.tar.gz" } ], "2.2.5": [ { "comment_text": "", "digests": { "md5": "5b2eb98d27a92454039b793e271401c2", "sha256": "288930cee2ab27bd0be48c86a8778dd5db6ebc3e98be877098d9700c07deddf0" }, "downloads": -1, "filename": "pynmrstar-2.2.5.tar.gz", "has_sig": true, "md5_digest": "5b2eb98d27a92454039b793e271401c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 441369, "upload_time": "2016-12-15T17:11:32", "url": "https://files.pythonhosted.org/packages/57/39/68fa00efc9cb830608cf6a1dd689960050a108c91958cbd673a0ba9f40d6/pynmrstar-2.2.5.tar.gz" } ], "2.2.6": [ { "comment_text": "", "digests": { "md5": "e645eeb3ffe1c838c2e528055871eb1d", "sha256": "a21ad01d1bc88083ea775ac83caea729b5e5e8fcb2ad164c56d467aeb88ffa91" }, "downloads": -1, "filename": "pynmrstar-2.2.6.tar.gz", "has_sig": true, "md5_digest": "e645eeb3ffe1c838c2e528055871eb1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 442048, "upload_time": "2016-12-15T18:05:17", "url": "https://files.pythonhosted.org/packages/ec/0a/5d4047c6c84bf81255a9cd9e1e1d31c87b297af1593d032576c4475e220c/pynmrstar-2.2.6.tar.gz" } ], "2.2.7": [ { "comment_text": "", "digests": { "md5": "167dce77b8bc0ab4c2b5a26c1141315f", "sha256": "fd40aa06cafa95b597a8686ca45f7745d4f98995db220ef79630bde2f0a4fd4c" }, "downloads": -1, "filename": "pynmrstar-2.2.7.tar.gz", "has_sig": true, "md5_digest": "167dce77b8bc0ab4c2b5a26c1141315f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 456666, "upload_time": "2017-02-08T12:52:36", "url": "https://files.pythonhosted.org/packages/72/99/26fee28186aed4e2efb76e4d74ec5b9fb1acdee5f6d48197a3f2329166f4/pynmrstar-2.2.7.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "0164a9273b7d9e10842b1141744c4837", "sha256": "ea0948cb6be7ee2918e153bebd822893563f7fddf7f8e9d4bfdf5bb78d63dd9d" }, "downloads": -1, "filename": "pynmrstar-2.3.tar.gz", "has_sig": true, "md5_digest": "0164a9273b7d9e10842b1141744c4837", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 457421, "upload_time": "2017-02-24T19:59:21", "url": "https://files.pythonhosted.org/packages/6f/94/d80d0057459bab23e6e6bfcc14623a8831daad3a36e1171e5811b683b8f4/pynmrstar-2.3.tar.gz" } ], "2.3.1": [ { "comment_text": "", "digests": { "md5": "712eb620d5e4c27516e8bc36000016a9", "sha256": "14b61142c1803adc05a22c3741e4cf6345ab1af3a28afb81a5137242849026fd" }, "downloads": -1, "filename": "pynmrstar-2.3.1.tar.gz", "has_sig": true, "md5_digest": "712eb620d5e4c27516e8bc36000016a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 455136, "upload_time": "2017-03-02T20:40:20", "url": "https://files.pythonhosted.org/packages/25/16/5071317a45ac7d2e7b6f9022ff597c1294f15fcfa005cef7e31a7c4cff15/pynmrstar-2.3.1.tar.gz" } ], "2.3.2": [ { "comment_text": "", "digests": { "md5": "2406ab8e8c69218fac1ffcc0ef83cab9", "sha256": "b10aae964b2ed166f08b496d9120d6cee44150d1bdaf12565612c2cdae192ae3" }, "downloads": -1, "filename": "pynmrstar-2.3.2.tar.gz", "has_sig": true, "md5_digest": "2406ab8e8c69218fac1ffcc0ef83cab9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 457405, "upload_time": "2017-03-09T18:27:47", "url": "https://files.pythonhosted.org/packages/e6/1c/0da167a442b9c0b4d61dd02cbb14e1aaf544c3cd69e6e3da7c2ccb243913/pynmrstar-2.3.2.tar.gz" } ], "2.3.3": [ { "comment_text": "", "digests": { "md5": "413d2db33b37082faa5a0dea2c424161", "sha256": "079adea18e48514bb4ad267b5e4f999ef76d456d220f21859bd2cf5be6b99231" }, "downloads": -1, "filename": "pynmrstar-2.3.3.tar.gz", "has_sig": true, "md5_digest": "413d2db33b37082faa5a0dea2c424161", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 454127, "upload_time": "2017-03-21T17:37:41", "url": "https://files.pythonhosted.org/packages/1d/94/aee808aad96131c54820aedb5f9b12e6c563f7420e1a03caa4b186c78f5a/pynmrstar-2.3.3.tar.gz" } ], "2.3.4": [ { "comment_text": "", "digests": { "md5": "b3d77081d322f6f1a1cdc5dc97153b4d", "sha256": "fb047ef2c0ff866dcac1cad1ae48f4407b8b9fc6b1ba327bcd8a35c4dbfdd5bd" }, "downloads": -1, "filename": "pynmrstar-2.3.4.tar.gz", "has_sig": true, "md5_digest": "b3d77081d322f6f1a1cdc5dc97153b4d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 454132, "upload_time": "2017-06-01T13:45:51", "url": "https://files.pythonhosted.org/packages/44/2e/692bff3d74bee2830002fd1aae1944580dd038a483cf0545daaed5b2e57a/pynmrstar-2.3.4.tar.gz" } ], "2.4": [ { "comment_text": "", "digests": { "md5": "17ebecef12194d2a1686101867d02fa7", "sha256": "1ba03f383c4510a3733e933796888d1c1d1b2c60c6c62bcdb5289da7c4126fb1" }, "downloads": -1, "filename": "pynmrstar-2.4.tar.gz", "has_sig": true, "md5_digest": "17ebecef12194d2a1686101867d02fa7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 454515, "upload_time": "2017-07-24T20:08:58", "url": "https://files.pythonhosted.org/packages/c6/65/d6f82f7762d0cab8ace4a7aacceb8076fdcbe6c9c97dce10c7e1f28960c1/pynmrstar-2.4.tar.gz" } ], "2.4.1": [ { "comment_text": "", "digests": { "md5": "b248bdeed980a617e93e5276aa3ef397", "sha256": "449d72e584a4da6740ad755acabbd0d0a0687829fffb9d1482912b1e4cc6b406" }, "downloads": -1, "filename": "pynmrstar-2.4.1.tar.gz", "has_sig": true, "md5_digest": "b248bdeed980a617e93e5276aa3ef397", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 459624, "upload_time": "2017-09-01T16:12:55", "url": "https://files.pythonhosted.org/packages/66/a5/d8c461be041e4555cf33ca159e82916db7f4ecdb805600653a9ad723849e/pynmrstar-2.4.1.tar.gz" } ], "2.4.2": [ { "comment_text": "", "digests": { "md5": "3fd401acdc2064c2c602ac143f9df512", "sha256": "3e11cf36a998c8cd60adaf76863f080105fe3100408866139d9c7303b2fea7a4" }, "downloads": -1, "filename": "pynmrstar-2.4.2.tar.gz", "has_sig": true, "md5_digest": "3fd401acdc2064c2c602ac143f9df512", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 462064, "upload_time": "2017-09-01T17:10:24", "url": "https://files.pythonhosted.org/packages/61/07/48b7ca8d77a0c7e73e1544871f8bd1b3b49c121f24366897aa8ac0f34eff/pynmrstar-2.4.2.tar.gz" } ], "2.4.3": [ { "comment_text": "", "digests": { "md5": "3da6406e73a48d33f6978445697a2681", "sha256": "4eaa75023a7f7228d752fa249635c50677914f49bb5c3e3d86b2d2b85da584d0" }, "downloads": -1, "filename": "pynmrstar-2.4.3.tar.gz", "has_sig": true, "md5_digest": "3da6406e73a48d33f6978445697a2681", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 456113, "upload_time": "2017-09-01T18:53:51", "url": "https://files.pythonhosted.org/packages/da/e7/5eae8010bd04b7dfeb149d8ce54f145af6f8a346894a3791024fc60cb78b/pynmrstar-2.4.3.tar.gz" } ], "2.4.4": [ { "comment_text": "", "digests": { "md5": "792c4f2f51496b05e13d708d73f08015", "sha256": "66ca9a8bc8bff696f3451a5b470c112208626e5aa0faad2d50104e934d64cf74" }, "downloads": -1, "filename": "pynmrstar-2.4.4.tar.gz", "has_sig": true, "md5_digest": "792c4f2f51496b05e13d708d73f08015", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 467052, "upload_time": "2017-09-14T15:37:50", "url": "https://files.pythonhosted.org/packages/8d/30/8d75f1ec9d51b525c67a3658ad60b7db580ae78dc4181cf2e0eab1f37ad7/pynmrstar-2.4.4.tar.gz" } ], "2.5": [ { "comment_text": "", "digests": { "md5": "bbc303987755285bc28d9bb2ba5e8249", "sha256": "14cb09068ec466fa9ff6d403c50322f1ca82ccf57cd5228fdaca8d00924cb95f" }, "downloads": -1, "filename": "pynmrstar-2.5.tar.gz", "has_sig": true, "md5_digest": "bbc303987755285bc28d9bb2ba5e8249", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 463241, "upload_time": "2017-10-13T15:06:10", "url": "https://files.pythonhosted.org/packages/3b/81/971470f8b4211b8841b11f4c6612be7ffc7564cd06a60744fb847d2d06c2/pynmrstar-2.5.tar.gz" } ], "2.5.1": [ { "comment_text": "", "digests": { "md5": "4365b125431e35160f673b25adaac220", "sha256": "f5f89d67335f547ab50fe0452b4cb67adf93f2f55957be3c36327580eb5b0c94" }, "downloads": -1, "filename": "pynmrstar-2.5.1.tar.gz", "has_sig": true, "md5_digest": "4365b125431e35160f673b25adaac220", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 459874, "upload_time": "2017-12-14T18:34:34", "url": "https://files.pythonhosted.org/packages/fb/72/d2d588172203f753f74b31d16bd79b11a05d0a4fd1612e88e490b574bc19/pynmrstar-2.5.1.tar.gz" } ], "2.6": [ { "comment_text": "", "digests": { "md5": "0e5f58e850b14cfeece66c8ed3a2e563", "sha256": "3eb4df217835875083bd70a54dad908a89c2fecae43eee74235190a4eeefdea1" }, "downloads": -1, "filename": "pynmrstar-2.6.tar.gz", "has_sig": true, "md5_digest": "0e5f58e850b14cfeece66c8ed3a2e563", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 478409, "upload_time": "2018-02-19T21:43:25", "url": "https://files.pythonhosted.org/packages/35/fa/08a53c915ba04615615746543776433e8745db0ceffc2395ca6b497ed3ce/pynmrstar-2.6.tar.gz" } ], "2.6.2": [ { "comment_text": "", "digests": { "md5": "688f537f53bba48a5ef185cad8c13f56", "sha256": "b20731f97d9c74f87933d81aa0705f94e435dddc2dfcf3668a269e0dd85c58bf" }, "downloads": -1, "filename": "pynmrstar-2.6.2.tar.gz", "has_sig": true, "md5_digest": "688f537f53bba48a5ef185cad8c13f56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 478305, "upload_time": "2018-07-26T21:05:58", "url": "https://files.pythonhosted.org/packages/c9/c4/d56a756c3f1fb3c8896815c5ccea6f4a4c318446ebbfaeea3392a46dad79/pynmrstar-2.6.2.tar.gz" } ], "2.6.3": [ { "comment_text": "", "digests": { "md5": "466e70cd21242615b868c21635e241fa", "sha256": "6149bdbcaea301364430f1e1d439bfbbd1820f59c0b7878c2ee7183e026414eb" }, "downloads": -1, "filename": "pynmrstar-2.6.3.tar.gz", "has_sig": true, "md5_digest": "466e70cd21242615b868c21635e241fa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 338260, "upload_time": "2019-02-12T20:11:47", "url": "https://files.pythonhosted.org/packages/42/d1/73b084c090669f21cb59f001932aa9addc2f06628203ee325f8728c84213/pynmrstar-2.6.3.tar.gz" } ], "2.6.4": [ { "comment_text": "", "digests": { "md5": "b21f92a0d238763909a9bab2341665da", "sha256": "9a09ed539ddb116b4896fd10dd79b63275d2a5c9f1344752a536a77fb81c6136" }, "downloads": -1, "filename": "pynmrstar-2.6.4.tar.gz", "has_sig": true, "md5_digest": "b21f92a0d238763909a9bab2341665da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 338826, "upload_time": "2019-03-20T17:19:56", "url": "https://files.pythonhosted.org/packages/4a/17/0efdaa67c19a4fe06d15566c95237a0c37174baa2c27f016c45a1924db27/pynmrstar-2.6.4.tar.gz" } ], "2.6.4.1": [ { "comment_text": "", "digests": { "md5": "a92645f77dec5198e0f013d0d76868ba", "sha256": "b75861f9f928c11e9b43ab9007693956f35d7438c000e7b56c2e49a6937ca739" }, "downloads": -1, "filename": "pynmrstar-2.6.4.1.tar.gz", "has_sig": true, "md5_digest": "a92645f77dec5198e0f013d0d76868ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 346278, "upload_time": "2019-03-21T12:41:22", "url": "https://files.pythonhosted.org/packages/88/ed/09f8f1b866f7979b541ec82a6b66b26bf397981b6c1d29bb9b6e876c9bef/pynmrstar-2.6.4.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a92645f77dec5198e0f013d0d76868ba", "sha256": "b75861f9f928c11e9b43ab9007693956f35d7438c000e7b56c2e49a6937ca739" }, "downloads": -1, "filename": "pynmrstar-2.6.4.1.tar.gz", "has_sig": true, "md5_digest": "a92645f77dec5198e0f013d0d76868ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 346278, "upload_time": "2019-03-21T12:41:22", "url": "https://files.pythonhosted.org/packages/88/ed/09f8f1b866f7979b541ec82a6b66b26bf397981b6c1d29bb9b6e876c9bef/pynmrstar-2.6.4.1.tar.gz" } ] }