pynmr-star提供了用于读取、写入、修改和与nmr-star文件交互的工具。由BMRB维护。
pynmrstar的Python项目详细描述
Pynmrstar
用于读取、写入和操作nmr-star文件的python模块。
支持的Python版本:2.6、2.7、3.3、3.4、3.5和3.6
概述
这个库是由bmrb开发的,它让python使用nmr社区工具来处理nmr-star数据格式。它在内部使用并积极维护。该库有完整的文档记录,因此从交互式python会话调用help(object\u或_method)
将打印该对象或方法的文档。
同样的文档,以及模块级变量的一些注释,都位于这里。 最后,开发了一些基于命令行的工具,使简单的查询能够从nmr-star文件中提取数据。这些工具也是如何使用库的很好的例子。您可以在此处查看这些文件。
NMR-STAR简介
要了解库的工作原理,首先需要了解nmr-star术语和文件格式。如果您已经熟悉NMR-STAR,请随意跳到本库中的部分。
nmr-star条目/文件由一个或多个存储帧组成(概念上,您应该将存储帧视为数据块),每个存储帧都包含标记和循环。在一个保存框架中,每个标记只能有一个。如果一个标记有多个值,表示它的唯一方法是将它放在循环中。循环只是一组具有多个值的标记。
因此,按层次结构,您可以将nmr-star文件描绘成一棵树,其中条目是主干,大的分支是保存帧,每个保存帧可能包含一个或多个循环(分支)。
下面是一个非常简单的nmr-star文件示例:
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
在前面的示例中,条目名称是dates
,因为这是data\u
标记后面的内容。接下来,有一个saveframe,其名称为special_dates_saveframe_1
,标记前缀(对应于saveframe类别)为special_dates
。存储框中有一个标记,标记名为type
,值为holidays
。还有一个类别的循环events
包含有关两个不同事件的信息(尽管可能存在无限数量的事件)。
每行中的第一个数据对应于第一个标记,日期
,第二个对应于第二个标记,说明
如果值中包含空格、制表符、垂直制表符或换行符,则需要引用NMR-STAR格式的值。这个图书馆帮你保管,但值得一提。这就是为什么在示例中没有引用日期,但事件描述是。
Pynmrstar快速入门
首先,启动一个交互式python会话并导入模块:
>>>importpynmrstar
有很多方法可以加载nmr-star条目,但让我们关注最常见的两种方法。
从bmrb api(从bmrb api加载条目的最新版本):
>>>entry15000=pynmrstar.Entry.from_database(15000)
从文件:
>>>entry=pynmrstar.Entry.from_file("/location/of/the/file.str")
继续,我们假设您已经使用from_database命令从API加载了条目15000。
将修改后的条目或保存帧写入文件同样简单:
>>>entry15000.write_to_file("output_file_name.str")
查看条目的结构
要查看条目的总体结构,请使用print_tree()
方法。
>>>entry15000.print_tree()<pynmrstar.Entry'15000'from_database(15000)>[0]<pynmrstar.Saveframe'entry_information'>[0]<pynmrstar.Loop'_Entry_author'>[1]<pynmrstar.Loop'_SG_project'>[2]<pynmrstar.Loop'_Struct_keywords'>[3]<pynmrstar.Loop'_Data_set'>[4]<pynmrstar.Loop'_Datum'>[5]<pynmrstar.Loop'_Release'>[6]<pynmrstar.Loop'_Related_entries'>[1]<pynmrstar.Saveframe'citation_1'>[0]<pynmrstar.Loop'_Citation_author'>[2]<pynmrstar.Saveframe'assembly'>[0]<pynmrstar.Loop'_Entity_assembly'>[3]<pynmrstar.Saveframe'F5-Phe-cVHP'>[0]<pynmrstar.Loop'_Entity_db_link'>[1]<pynmrstar.Loop'_Entity_comp_index'>[2]<pynmrstar.Loop'_Entity_poly_seq'>[4]<pynmrstar.Saveframe'natural_source'>[0]<pynmrstar.Loop'_Entity_natural_src'>[5]<pynmrstar.Saveframe'experimental_source'>[0]<pynmrstar.Loop'_Entity_experimental_src'>[6]<pynmrstar.Saveframe'chem_comp_PHF'>[0]<pynmrstar.Loop'_Chem_comp_descriptor'>[1]<pynmrstar.Loop'_Chem_comp_atom'>[2]<pynmrstar.Loop'_Chem_comp_bond'>[7]<pynmrstar.Saveframe'unlabeled_sample'>[0]<pynmrstar.Loop'_Sample_component'>[8]<pynmrstar.Saveframe'selectively_labeled_sample'>[0]<pynmrstar.Loop'_Sample_component'>[9]<pynmrstar.Saveframe'sample_conditions'>[0]<pynmrstar.Loop'_Sample_condition_variable'>[10]<pynmrstar.Saveframe'NMRPipe'>[0]<pynmrstar.Loop'_Vendor'>[1]<pynmrstar.Loop'_Task'>[11]<pynmrstar.Saveframe'PIPP'>[0]<pynmrstar.Loop'_Vendor'>[1]<pynmrstar.Loop'_Task'>[12]<pynmrstar.Saveframe'SPARKY'>[0]<pynmrstar.Loop'_Vendor'>[1]<pynmrstar.Loop'_Task'>[13]<pynmrstar.Saveframe'CYANA'>[0]<pynmrstar.Loop'_Vendor'>[1]<pynmrstar.Loop'_Task'>[14]<pynmrstar.Saveframe'X-PLOR_NIH'>[0]<pynmrstar.Loop'_Vendor'>[1]<pynmrstar.Loop'_Task'>[15]<pynmrstar.Saveframe'spectrometer_1'>[16]<pynmrstar.Saveframe'spectrometer_2'>[17]<pynmrstar.Saveframe'spectrometer_3'>[18]<pynmrstar.Saveframe'spectrometer_4'>[19]<pynmrstar.Saveframe'spectrometer_5'>[20]<pynmrstar.Saveframe'spectrometer_6'>[21]<pynmrstar.Saveframe'NMR_spectrometer_list'>[0]<pynmrstar.Loop'_NMR_spectrometer_view'>[22]<pynmrstar.Saveframe'experiment_list'>[0]<pynmrstar.Loop'_Experiment'>[23]<pynmrstar.Saveframe'chemical_shift_reference_1'>[0]<pynmrstar.Loop'_Chem_shift_ref'>[24]<pynmrstar.Saveframe'assigned_chem_shift_list_1'>[0]<pynmrstar.Loop'_Chem_shift_experiment'>[1]<pynmrstar.Loop'_Atom_chem_shift'>
您可以看到有24个存储帧,每个存储帧都包含一些循环。
访问存储帧和循环
根据您希望完成的任务,有几种访问保存帧和循环的方法。
交互式会话方式
在使用库、调试或学习nmr-star时,您很可能会发现以下方法最方便。请注意,如果要迭代条目中的所有数据,则使用该模式是不正确的(原因如下所述)。
您可以直接使用其名称来访问条目中的存储帧。例如,要获取对名为spectrometer_1的光谱仪保存帧的引用,您只需执行以下操作:
>>>a_spectrometer=entry15000['spectrometer_1']
请注意,您可以在上面打印的树中看到保存帧名称。
对于存储帧中的循环,您也可以这样做,但是对于循环,您必须使用它们的标记类别(句点之前的部分)来访问它们(注意,要到达vendor
循环,我们首先必须经过它的父存储帧,名为x-plor nih
(thex-plornih
saveframe属于软件类别
-稍后您将看到您在何处访问该类别以及为什么更喜欢按类别访问)。
>>>explor_nih_vendor=entry15000['X-PLOR_NIH']['_Vendor']>>>printexplor_nih_vendorloop__Vendor.Name_Vendor.Address_Vendor.Electronic_address_Vendor.Entry_ID_Vendor.Software_ID'CD Schwieters, JJ Kuszewski, N Tjandra and GM Clore'..150005stop_
这些快捷方式是为了您编写代码时的方便。不应该在生产代码中使用它们的原因是,存储帧名称(用作引用的名称)实际上可以具有任意值。它们是相当一致的,并且对于某些存储帧总是相同的,但是对于其他存储帧,用户可以在沉积期间将它们设置为他们想要的任何值。因此,访问数据的更好方法是通过类别。请注意,一个条目中只有一个存储帧可以具有给定的名称,但多个存储帧可能属于同一类别。
访问数据的更好方法是通过要读取的数据的类别,或者使用完整的标记名进行搜索。在详细介绍之前,请查看上面条目中的一个保存帧的外观: 这是一个存储框架,描述在核磁共振研究中使用的软件。从saveframe标签中可以看到,这个软件包的名称是x-plor-nih。从标记 这个saveframe还有两个循环,一个vendor循环和一个task循环。这些是循环而不是免费的标签,因为给定的软件包可以有多个供应商和多个执行的任务。 访问软件saveframes中的数据的更健壮的方法是遍历条目中的所有软件saveframes并提取所需的数据。要对软件执行此操作,我们将编写以下代码: 您可以看到,此方法 下面将把条目中的所有任务循环合并成csv格式。 使用完整标记名访问数据的另一种方法。记住完整标记首先包含类别、句点,然后包含标记名。因此,如果我们希望看到与此条目相关联的软件包执行的所有不同的task.task 或获取所有光谱仪信息- 要查看nmr-star模式中的所有标记及其含义,请转到此处 "我只想把化学位移数据作为一个数组——我该怎么做?"< /P> 请记住,一个条目可能有多组指定的化学位移。(例如,有两组分配是在两个不同的样品条件下进行的)因此,为了得到化学位移,最好遍历所有分配的化学位移循环: 注意,我们使用循环的 "但我想用数字而不是字符串来表示化学位移!"< /P> 这很容易做到。第一次加载条目时,默认情况下将以字符串形式加载所有值。要加载它,使其值与架构匹配,只需在加载前启用convert_datatypes即可。 这是一个很好的机会来指出,如果您只需要化学位移,或者一个或两个标签,那么您可能会发现使用bmrb-api非常容易。化学位移列表获取" rel="nofollow">化学位移终点)以直接按需获取数据,而不是直接处理nmr-star。 到目前为止,本教程的重点是如何读取和访问数据。本节将重点介绍如何创建新的循环和保存帧对象。 创建新循环有五种方法: 请注意,当添加了tag 此方法将创建一个新的循环,该循环将使用与该循环类别相对应的bmrb模式中的标记来准备数据。 创建新循环有五种方法: 该库使添加缺少的标记、根据bmrb模式对标记进行排序以及根据模式验证数据变得容易。让我们做一个简单的例子,创建一个化学移位循环,添加任何丢失的标签,按标准顺序(不需要)排序标签,然后检查错误。 有关pynmrstar库使用的更多示例,请查看此处的。
有关所有可用方法和类的完整文档,请在此处查看
如有任何问题或建议,请在github页面上创建一个问题。vendor
循环类别之前的是为了明确您要访问循环,而不是名为
vendor
的保存框标记
稳健的(和推荐的)方法
############################
# Computer software used #
############################
save_X-PLOR_NIH
_Software.Sf_category software
_Software.Sf_framecode X-PLOR_NIH
_Software.Entry_ID 15000
_Software.ID 5
_Software.Name 'X-PLOR NIH'
_Software.Version .
_Software.Details .
loop_
_Vendor.Name
_Vendor.Address
_Vendor.Electronic_address
_Vendor.Entry_ID
_Vendor.Software_ID
'CD Schwieters, JJ Kuszewski, N Tjandra and GM Clore' . . 15000 5
stop_
loop_
_Task.Task
_Task.Entry_ID
_Task.Software_ID
refinement 15000 5
'structure solution' 15000 5
stop_
save_
id
中可以看到,它是此项中的第五个软件保存框架。此存储帧的类别是"软件",您可以在sf_category
(saveframe category的缩写)标记中看到它。阅读软件包
0
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
get_saveframes_by_category
返回了条目中的所有软件保存帧。现在我们可以遍历它们来提取数据、修改数据或删除数据。(注意,每个循环类别(循环标记中句点之前的文本)对于其父存储帧是唯一的。因此,在保存框架中,您将永远找不到任务
循环,它的类别不是软件
。此外,一个保存帧只能有一个给定类别的循环。这意味着使用类别符号访问保存帧中的循环是健壮的,不会导致丢失循环。)
1
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
使用get_tag直接从条目中提取标记
,一个简单的方法是使用条目的
get_tag()
方法:
2
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
get_tags()
接受要获取的标记列表,并返回指向每个标记的所有值的字典,保留顺序:
3
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
指定的化学位移
4
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
get_tag()
方法只提取我们关心的标记。get_tag()
除了单个标记之外,还接受一个标记数组。完整分配的化学存储帧循环将包含您可能不需要的额外标记。例如:
5
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
6
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
创建新循环和保存帧
循环
from_file()
,from_json()
,from_scratch()
,from_string()
,以及from_template()
。所有这些都是类方法。from戋scratch()
创建一个新循环,from戋string()
从包含NMR-star数据的Python字符串解析NMR-star循环,from戋json()
解析JSON对象(相反,get戋json()
将获得循环的JSON表示),from戋scratch()
生成一个完全空的循环,并且from_template()
生成一个循环,其中的标记根据提供的类别预先从bmrb模式填充。from_file
,from_json
和from_string
都是非常简单的—如果需要使用,请参阅完整的文档。从头开始()
7
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
loop_category.tag1
时,会自动设置循环类别。您还可以在创建循环时提供标记,方法是将其作为可选类别的参数提供给构造函数。
来自_template()
8
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
保存帧
from_file()
,from_json()
,from_scratch()
,from_string()
,以及from_template()
。所有这些都是类方法。from_scratch()
创建一个新的存储帧,from_string()
从包含nmr-star数据的python字符串中解析nmr-star存储帧,from_json()
解析json对象(相反,get_json()
将获得存储帧的json表示),from_scratch()
将生成一个完全空的存储帧,并且fromm_template()
根据所提供的类别,使用BMRB架构中预先填充的标记生成一个保存帧。from_file
,from_json
和from_string
都是非常简单的—如果需要使用,请参阅完整的文档。从头开始()
9
data_dates
save_special_dates_saveframe_1
_Special_Dates.Type Holidays
loop_
_Events.Date
_Events.Desciption
12/31/2017 "New Year's Eve"
01/01/2018 "New Year's Day"
stop_
save_
来自_template()
>>>importpynmrstar
0
模式方法
>>>importpynmrstar
1
推荐PyPI第三方库