pynmr-star提供了用于读取、写入、修改和与nmr-star文件交互的工具。由BMRB维护。

pynmrstar的Python项目详细描述


Pynmrstar

用于读取、写入和操作nmr-star文件的python模块。buildstatus

支持的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-plornihsaveframe属于软件类别-稍后您将看到您在何处访问该类别以及为什么更喜欢按类别访问)。

>>>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_

这些快捷方式是为了您编写代码时的方便。不应该在生产代码中使用它们的原因是,存储帧名称(用作引用的名称)实际上可以具有任意值。它们是相当一致的,并且对于某些存储帧总是相同的,但是对于其他存储帧,用户可以在沉积期间将它们设置为他们想要的任何值。因此,访问数据的更好方法是通过类别。请注意,一个条目中只有一个存储帧可以具有给定的名称,但多个存储帧可能属于同一类别。

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_

这是一个存储框架,描述在核磁共振研究中使用的软件。从saveframe标签中可以看到,这个软件包的名称是x-plor-nih。从标记id中可以看到,它是此项中的第五个软件保存框架。此存储帧的类别是"软件",您可以在sf_category(saveframe category的缩写)标记中看到它。

这个saveframe还有两个循环,一个vendor循环和一个task循环。这些是循环而不是免费的标签,因为给定的软件包可以有多个供应商和多个执行的任务。

阅读软件包

访问软件saveframes中的数据的更健壮的方法是遍历条目中的所有软件saveframes并提取所需的数据。要对软件执行此操作,我们将编写以下代码:

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_
0

您可以看到,此方法get_saveframes_by_category返回了条目中的所有软件保存帧。现在我们可以遍历它们来提取数据、修改数据或删除数据。(注意,每个循环类别(循环标记中句点之前的文本)对于其父存储帧是唯一的。因此,在保存框架中,您将永远找不到任务循环,它的类别不是软件。此外,一个保存帧只能有一个给定类别的循环。这意味着使用类别符号访问保存帧中的循环是健壮的,不会导致丢失循环。)

下面将把条目中的所有任务循环合并成csv格式。

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_
1

使用get_tag直接从条目中提取标记

使用完整标记名访问数据的另一种方法。记住完整标记首先包含类别、句点,然后包含标记名。因此,如果我们希望看到与此条目相关联的软件包执行的所有不同的task.task,一个简单的方法是使用条目的get_tag()方法:

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_
2

或获取所有光谱仪信息-get_tags()接受要获取的标记列表,并返回指向每个标记的所有值的字典,保留顺序:

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_
3

要查看nmr-star模式中的所有标记及其含义,请转到此处

指定的化学位移

"我只想把化学位移数据作为一个数组——我该怎么做?"< /P>

请记住,一个条目可能有多组指定的化学位移。(例如,有两组分配是在两个不同的样品条件下进行的)因此,为了得到化学位移,最好遍历所有分配的化学位移循环:

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

注意,我们使用循环的get_tag()方法只提取我们关心的标记。get_tag()除了单个标记之外,还接受一个标记数组。完整分配的化学存储帧循环将包含您可能不需要的额外标记。例如:

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_
5

"但我想用数字而不是字符串来表示化学位移!"< /P>

这很容易做到。第一次加载条目时,默认情况下将以字符串形式加载所有值。要加载它,使其值与架构匹配,只需在加载前启用convert_datatypes即可。

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

这是一个很好的机会来指出,如果您只需要化学位移,或者一个或两个标签,那么您可能会发现使用bmrb-api非常容易。化学位移列表获取" rel="nofollow">化学位移终点)以直接按需获取数据,而不是直接处理nmr-star。

创建新循环和保存帧

到目前为止,本教程的重点是如何读取和访问数据。本节将重点介绍如何创建新的循环和保存帧对象。

循环

创建新循环有五种方法: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_filefrom_jsonfrom_string都是非常简单的—如果需要使用,请参阅完整的文档。

从头开始()

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_
7

请注意,当添加了tagloop_category.tag1时,会自动设置循环类别。您还可以在创建循环时提供标记,方法是将其作为可选类别的参数提供给构造函数。

来自_template()

此方法将创建一个新的循环,该循环将使用与该循环类别相对应的bmrb模式中的标记来准备数据。

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_
8

保存帧

创建新循环有五种方法: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_filefrom_jsonfrom_string都是非常简单的—如果需要使用,请参阅完整的文档。

从头开始()

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_
9

来自_template()

>>>importpynmrstar
0

模式方法

该库使添加缺少的标记、根据bmrb模式对标记进行排序以及根据模式验证数据变得容易。让我们做一个简单的例子,创建一个化学移位循环,添加任何丢失的标签,按标准顺序(不需要)排序标签,然后检查错误。

>>>importpynmrstar
1

有关pynmrstar库使用的更多示例,请查看此处的。 有关所有可用方法和类的完整文档,请在此处查看

如有任何问题或建议,请在github页面上创建一个问题。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
google chrome我在哪里可以下载Mac OSX Lion的Java 6?   java管道化hadoop映射减少作业   java避免在使用jsoup解析html时删除空格和换行符   java将arrayList中的元素相互比较   如何创建一个计算一组数字之和的程序(Java)?   java JavaFX 8 JVM在退出后保留   升华文本3升华文本3 Java交互控制台?   JAVAutil。扫描仪和维基百科   java Android在RecyclerView中更新TextClock的时间格式(12/24小时格式)   java集合,如果达到限制,则可以在添加新项之前删除旧项   hex Java将十六进制转换为带符号的8位代码   java如何使用SQL中其他列的数据?   java如何确保返回指定类型的列表?   列出如何在java中声明匿名arraylist?   在JavaSpringBoot中使用RESTXML文件   使用Java在ColdFusion中计算HMACSHA256摘要的加密