10.5. EDR辅助阅读器 MDAnalysis.auxiliary.EDR
在 2.4.0 版本加入.
10.5.1. 背景
EDR files 是跟在 XDR 协议。它们是由GROMACS在模拟期间编写的,包含关于系统的时间序列非轨迹数据,如能量、温度或压力。
pyedr 是一个Python包,它读取EDR二进制文件并将其作为NumPy数组的字典返回给人类可读的形式。EDR辅助读取器使用它来解析EDR文件。因此,具有字符串键和NumPy数组值的字典被加载到 EDRReader
。它基本上是基于Python的C++代码版本 GROMACS.
此模块中的类基于 pyedr 包裹。Pyedr是一个可选的依赖项,必须安装才能使用此读卡器。使用未安装pyedr的读卡器会引发 ImportError 。变量 HAS_PYEDR 指示此模块是否有可用的pyedr。
EDR辅助读取器从pyedr获取输出,并使该数据在MDAnalysis中可用。通常的工作流程首先创建一个EDRReader,然后将文件传递给它以进行读取:
import MDAnalysis as mda
aux = mda.auxiliary.EDR.EDRReader(some_edr_file)
新创建的 aux 对象包含在EDR文件中找到的所有数据。它存储在 data_dict
字典,它将GROMACS提供给每个数据条目的名称映射到保存相关数据的NumPy数组。这些由GROMACS指定的名称存储在 terms
属性。除了数字数据,新的 EDRReader 还将每个条目的单位存储在 data_dict
ITS中的词典 unit_dict
字典。
警告
单位将转换为 MDAnalysis base units 除非另有说明,否则自动执行。但是,并非所有单位类型都在MDAnalysis中定义了基本单位。(比照 MDAnalysis.units.MDANALYSIS_BASE_UNITS
)。例如,当前未定义压力单位,因此不会进行转换。这可能会导致单位之间的不一致!可以通过传递以下命令关闭转换 convert_units=False 创建EDRReader时:
aux = mda.auxiliary.EDR.EDRReader(some_edr_file, convert_units=False)
10.5.2. EDRReader的独立使用
这个 EDRReader
可用于单独访问存储在EDR文件中的数据,而无需将数据与轨迹帧相关联。例如,这对于打印很有用。可以以词典的形式返回单个术语、术语列表或所有术语的数据。此词典中始终返回“time”,以便更轻松地绘制::
temp = aux.get_data("Temperature")
plt.plot(temp["Time"], temp["Temperature"])
some_terms = aux.get_data(["Potential", "Kinetic En.", "Box-X"])
plt.plot(some_terms["Time"], some_terms["Potential"])
all_terms = aux.get_data()
plt.plot(all_terms["Time"], all_terms["Pressure"])
10.5.3. 将EDR数据添加到轨迹
与其他辅助阅读器一样, EDRReader
通过将其关联到适当的时间点,可以将其数据附加到轨迹。一般来说,要将EDR数据添加到轨迹中,需要提供两个参数。
备注
以下内容将随着MDAnalys3.0的发布而发生变化。从那时起,这两个论点的顺序将颠倒过来。
第一个参数是 aux_spec 字典。使用它,用户可以指定要从EDR文件中添加哪些条目,并为其指定一个更方便的名称,以便在MDAnalysis中使用(因为GROMACS会创建类似“#Surf*SurfTen”或“‘Constr.rmsd’”的名称,这可能不太方便使用。)此词典可能如下所示::
aux_spec = {"epot": "Potential",
"surf_tension": "#Surf*SurfTen"}
如下所示提供时,这将引导 EDRReader
获取它在其 data_dict
字典并将其附加到下面的轨迹时间步长 u.trajectory.ts.aux.epot (表面张力也是如此)。
需要的第二个参数是EDR数据本身的来源。此处是EDR文件的路径或先前创建的 EDRReader
对象可以被提供。
示例:
import MDAnalysis as mda
from MDAnalysisTests.datafiles import AUX_EDR, AUX_EDR_TPR, AUX_EDR_XTC
import matplotlib.pyplot as plt
A Universe
和一个 EDRReader
对象并打印EDR文件中的可用数据:
In [1]: u = mda.Universe(AUX_EDR_TPR, AUX_EDR_XTC)
In [2]: aux = mda.auxiliary.EDR.EDRReader(AUX_EDR)
In [3]: aux.terms
Out[3]: ['Time', 'Bond', 'Angle', ...]
数据与轨迹相关联,使用 aux_spec 字典以指定要在哪个名称下添加哪些数据。使用此方法可以添加任意数量的术语。然后,可以在 ts.aux 通过属性和字典语法实现的命名空间::
In [4]: u.trajectory.add_auxiliary({"epot": "Potential",
"angle": "Angle"}, aux)
In [5]: u.trajectory.ts.aux.epot
Out[5]: -525164.0625
In [6]: u.trajectory.ts.aux.Angle
Out[6]: 3764.52734375
In [7]: u.trajectory.ts.aux["epot"]
Out[7]: -525164.0625
备注
一些GROMACS-提供 terms
留出空间。除非提供不带空格的属性名称,否则无法通过属性语法访问这些术语。在这种情况下,只有字典语法可以工作。
此外,还可以将EDR文件中的所有数据添加到轨迹。要做到这一点, aux_spec 省略了字典,并且数据源(如上所述的第二个参数)被显式提供为 auxdata 。以这种方式添加数据时,中的术语 terms
成为中使用的名称 ts.aux **
In [7]: u.trajectory.add_auxiliary(auxdata=aux)
In [8]: u.trajectory.ts.aux["#Surf*SurfTen"]
Out[8]: -1857.519287109375
10.5.4. 班级
- class MDAnalysis.auxiliary.EDR.EDRReader(filename: str, convert_units: bool = True, **kwargs)[源代码]
从.edr文件中读取数据的辅助读取器。
EDR files 是由GROMACS在模拟期间创建的。它们是二进制文件,包含时间序列能量数据和与模拟相关的其他数据。
.edr文件的默认读取器。文件中的所有数据将在初始化时被读取和存储。
- 参数:
filename (str) -- 包含辅助数据的文件的位置。
convert_units (bool, optional) -- 如果为True(默认),则EDR文件中的单位将自动转换为MDAnalysis基本单位。如果为False,则按原样从文件中获取单位。如果未在MDAnalysis中定义基本单位,则不会进行任何转换。单位类型在
MDAnalysis.units.MDANALYSIS_BASE_UNITS
将在默认情况下自动转换。**kwargs -- 其他AuxReader选项。
- _auxdata
辅助数据文件所在的路径
- data_dict
包含辅助数据的字典,将GROMACS为EDR文件中的条目指定的名称映射到包含此数据的NumPy数组
- 类型:
DICT
- unit_dict
包含辅助数据单位的字典,将
data_selector
读取器的名称(即EDR文件中数据集的名称)到其单位。- 类型:
DICT
- _n_steps
AUXDATA可用的步骤数
- 类型:
集成
- terms
中提供的辅助数据条目的名称 data_dict 。这些是在EDR文件中设置的GROMACS名称。
- 类型:
列表
备注
假定该文件的大小使得读取和存储全部内容是可行的。当内存使用量超过1 GB时,会发出警告。此警告限制可通过
memory_limit
科瓦格。
每个步骤的实际数据由EDRStep的实例存储。