6.26. 从记忆中读取轨迹 MDAnalysis.coordinates.memory

作者:

沃特布姆斯马

:

2016

版权所有:

GNU公共许可证v2

维护员:

WouterBoomsma<wb@di.ku.dk>,将在GitHub上运行

在 0.16.0 版本加入.

该模块包含一个轨迹读取器,它对内存中的数组进行操作,而不是从文件中读取。这使得使用现有的MDAnalysis工具对原始坐标进行操作成为可能。此外,它还允许用户更改轨迹中的坐标(例如,通过 MDAnalysis.core.groups.AtomGroup.positions ),而不必将整个州写入文件。

6.26.1. 如何使用 MemoryReader

这个 MemoryReader 可用于将轨迹直接生成为数字数组,或通过将现有轨迹传输到存储器。

6.26.1.1. 任意轨迹的内存表示

如果有足够的内存可用来在内存中保存整个轨迹,则可以通过将轨迹转移到内存来大大加快分析速度。

最直接的用法是 MemoryReader 就是简单地使用 in_memory=True 的旗帜 Universe 类,它自动将轨迹传输到内存::

import MDAnalysis as mda
from MDAnalysisTests.datafiles import TPR, XTC

universe = mda.Universe(TPR, XTC, in_memory=True)

当然,必须有足够的内存来容纳整个轨迹。

6.26.1.2. 将轨迹切换到内存中表示

将轨迹转移到内存的决定可以随时使用 transfer_to_memory() A的方法 Universe ::

universe = mda.Universe(TPR, XTC)
universe.transfer_to_memory()

此操作可能需要一段时间(使用 verbose=True 显示进度条),但是随后对轨迹的后续操作直接在存储器内阵列上操作,并且将非常快。

6.26.1.3. 从数字数组构造读取器

这个 MemoryReader 提供了极大的灵活性,因为可以创建 Universe 直接从一个稀疏的数组中。

一个简单的示例由从DCD提取的数组创建的新语义层组成 timeseries() ::

import MDAnalysis as mda
from MDAnalysisTests.datafiles import DCD, PSF
from MDAnalysis.coordinates.memory import MemoryReader

universe = mda.Universe(PSF, DCD)

coordinates = universe.trajectory.timeseries(universe.atoms)
universe2 = mda.Universe(PSF, coordinates, format=MemoryReader, order='afc')

使用创建内存中的轨迹 AnalysisFromFunction()

这个 timeseries() 当前仅为 DCDReader 。然而, MDAnalysis.analysis.base.AnalysisFromFunction() 可以为任何支持的轨迹格式提供相同的功能:

import MDAnalysis as mda
from MDAnalysis.tests.datafiles import PDB, XTC

from MDAnalysis.coordinates.memory import MemoryReader
from MDAnalysis.analysis.base import AnalysisFromFunction

u = mda.Universe(PDB, XTC)

coordinates = AnalysisFromFunction(lambda ag: ag.positions.copy(),
                                   u.atoms).run().results['timeseries']
u2 = mda.Universe(PDB, coordinates, format=MemoryReader)

6.26.1.4. 创建子系统的内存中轨迹

仅为现有轨迹的选择创建轨迹需要传输适当的坐标以及创建子系统的拓扑。对于后者,可以使用 Merge() 函数,对于前者, load_new() A的方法 UniverseMemoryReader 。在下面的代码中,只创建了蛋白质的内存轨迹:

import MDAnalysis as mda
from MDAnalysis.tests.datafiles import PDB, XTC

from MDAnalysis.coordinates.memory import MemoryReader
from MDAnalysis.analysis.base import AnalysisFromFunction

u = mda.Universe(PDB, XTC)
protein = u.select_atoms("protein")

coordinates = AnalysisFromFunction(lambda ag: ag.positions.copy(),
                                   protein).run().results['timeseries']
u2 = mda.Merge(protein)            # create the protein-only Universe
u2.load_new(coordinates, format=MemoryReader)

蛋白质坐标被提取到 coordinates 然后从这些坐标加载内存中的轨迹。原则上,这一切可以用一句话来完成:

u2 = mda.Merge(protein).load_new(
         AnalysisFromFunction(lambda ag: ag.positions.copy(),
                              protein).run().results['timeseries'],
         format=MemoryReader)

新的 Universe u2 例如,可以用来写出新的轨迹或对子系统执行快速分析。

6.26.2. 班级

class MDAnalysis.coordinates.memory.MemoryReader(coordinate_array, order='fac', dimensions=None, dt=1, filename=None, velocities=None, forces=None, **kwargs)[源代码]

内存阅读器使用表示为NumPy数组的轨迹。

轨迹读取器接口到多个坐标阵列。为了与TimeSeries接口兼容,提供了通过 order 关键字。

在 0.16.0 版本加入.

在 1.0.0 版本发生变更: 支持过时的 format 的关键字 MemoryReader.timeseries() 现已被移除。

参数:
  • coordinate_array (numpy.ndarray) -- 底层的坐标数组。内存阅读器现在必须使用np.ndarray

  • order ({"afc", "acf", "caf", "fac", "fca", "cfa"} (optional)) -- 对应于(A)tom、(F)rame、(C)坐标的返回数据数组的顺序/形状被允许,即,形状是(帧、原子数目、坐标)的返回数组。

  • dimensions ([A, B, C, alpha, beta, gamma] (optional)) -- 单元格尺寸( ABCAlphabeta伽马 )长度 ABC 以MDAnalysis长度单位(?)表示,角度以度为单位。可以给出一个维度数组,然后必须对其进行整形(n帧,6)

  • dt (float (optional)) -- 帧之间的时间差(PS)。如果 time 已设置,则 dt 将被忽略。

  • filename (string (optional)) -- 从中创建此实例的文件的名称。设为 None 从阵列创建时

  • velocities (numpy.ndarray (optional)) -- 原子速度。必须与COLIDATE_ARRAY的形状匹配。将与坐标共享顺序。

  • forces (numpy.ndarray (optional)) -- 原子力。必须匹配坐标的形状_数组将与坐标共享顺序

抛出:

TypeError if the coordinate array passed is not a np.ndarray --

备注

目前,只有固定的 dimension is supported, i.e., the same unit cell for all frames in coordinate_array. See issue #1041

在 0.19.0 版本发生变更: 内存读取器的输入现在必须是np.ndarray增加了可选的速度和力

在 2.2.0 版本发生变更: 输入kwarg现在存储在 _kwargs 属性,并在类创建时在 copy()

OtherWriter(filename, **kwargs)

返回适用于的编写器 文件名

设置默认关键字 开始stepdt (如果可用)。 n_atoms 始终设置为 Reader.n_atoms

参见

Reader.Writer()

Writer(filename, **kwargs)

具有与此轨迹相同属性的轨迹写入器。

add_auxiliary(aux_spec: str | Dict[str, str] = None, auxdata: str | AuxReader = None, format: str = None, **kwargs) None

添加要与轨迹一起读取的辅助数据。

辅助数据可以是除了由轨迹读取器读入的轨迹之外的来自轨迹的任何数据时间序列。 辅助数据 可以是一个 AuxReader 实例,或数据本身作为文件名;在后一种情况下,适当的 AuxReader 是从数据/文件格式中猜测出来的。一种适当的 format 也可以直接作为关键字参数提供。

添加时,AuxReader最初与轨迹的当前时间步长匹配,并将在轨迹时步更改时更新(通过调用 next() 或者跳跃时间步长 trajectory[i] )。

每个时间步长的辅助数据的代表值(S)(由 AuxReader )存储在 ts.aux 下的命名空间 aux_spec ;例如,要添加存储在Pull-force.xvg中的其他拉力数据::

u = MDAnalysis.Universe(PDB, XTC)
u.trajectory.add_auxiliary('pull', 'pull-force.xvg')

然后,当前时间步长的代表值可以被访问为 u.trajectory.ts.aux.pullu.trajectory.ts.aux['pull']

以下内容适用于能源读者,如 EDRReader

可以通过省略来添加(能源)文件中存在的所有数据 aux_spec 像这样::

u.trajectory.add_auxiliary(auxdata="ener.edr")

aux_spec 属性中映射所需属性名称的字典。 ts.aux 命名空间设置为要添加的精确数据,该数据由 data_selector **

term_dict = {"temp": "Temperature", "epot": "Potential"}
u.trajectory.add_auxiliary(term_dict, "ener.edr")

例如,添加此数据对于基于非坐标数据(如每个时间步长的势能)过滤轨迹帧可能很有用。轨迹切片允许处理帧的子集:

selected_frames = np.array([ts.frame for ts in u.trajectory
                            if ts.aux.epot < some_threshold])
subset = u.trajectory[selected_frames]

备注

假设辅助数据是按时间排序的,没有重复。请参阅 辅助API

add_transformations(*transformations)[源代码]

添加要应用于轨迹的所有变换。

此函数将转换列表作为参数。这些转换是将由Reader调用的函数,并为其提供 Timestep 对象作为参数,它将被转换并返回给读取器。这些转换可以是 transformations 模块,或由用户创建,并以列表形式存储 transformations 。此列表只能修改一次,进一步调用此函数将引发异常。

u = MDAnalysis.Universe(topology, coordinates)
workflow = [some_transform, another_transform, this_transform]
u.trajectory.add_transformations(*workflow)
参数:

transform_list (list) -- 将应用于坐标的所有变换的列表

property aux_list

列出新增辅助数据的名称。

check_slice_indices(start, stop, step)

检查帧索引是否有效,并剪裁以适合轨迹。

该用法遵循以下标准的Python约定 range() 但请参阅下面的警告。

参数:
  • start (int or None) -- 起始帧索引(含)。 None 对应于缺省值0,即初始帧。

  • stop (int or None) -- 最后一帧索引(独占)。 None 对应于默认的n帧,即它包括轨迹的最后一帧。

  • step (int or None) -- 切片的步长大小, None 对应于缺省值1,即包括范围中的每一帧 startstop

返回:

开始、停止、步进 --表示切片的整数

返回类型:

tuple (int, int, int)

警告

返回值 startstopstep 传入时给出预期结果 range() ,但在传入 slice 什么时候 stop=Nonestep=-1

对于此方法的输出的下游处理来说,这可能是一个问题。例如,轨迹切片是通过传递 check_slice_indices()range() ::

range(start, stop, step)

并将其作为随机寻求的指标。另一方面,在 MDAnalysis.analysis.base.AnalysisBase 由返回的值 check_slice_indices() 用于拼接轨迹,方法是创建 slice 实例::

slice(start, stop, step)

这会造成差异,因为这两行不相等::

range(10, -1, -1)             # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
range(10)[slice(10, -1, -1)]  # []
close()

关闭轨迹文件。

convert_forces_from_native(force, inplace=True)

力阵的换算 从原生单位到基本单位

参数:
  • force (array_like) -- 转型的力量

  • inplace (bool (optional)) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 被就地修改并也被返回。就地操作提高了性能,因为避免了分配新阵列。

在 0.7.7 版本加入.

convert_forces_to_native(force, inplace=True)

力阵的换算 从基本单位到原生单位。

参数:
  • force (array_like) -- 转型的力量

  • inplace (bool (optional)) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 force 被就地修改并也被返回。就地操作提高了性能,因为避免了分配新阵列。

在 0.7.7 版本加入.

convert_pos_from_native(x, inplace=True)

坐标数组x从原生单位到基本单位的转换。

参数:
  • x (array_like) -- 要转型的职位

  • inplace (bool (optional)) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 x 被就地修改并也被返回。就地操作提高了性能,因为避免了分配新阵列。

在 0.7.5 版本发生变更: 关键字 inplace 可以设置为 False 以便返回修改后的副本 除非 不会发生转换,在这种情况下,对未修改的 x 返回。

convert_pos_to_native(x, inplace=True)

坐标数组的转换 x 从基本单位到本地单位。

参数:
  • x (array_like) -- 要转型的职位

  • inplace (bool (optional)) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 x 被就地修改并也被返回。就地操作提高了性能,因为避免了分配新阵列。

在 0.7.5 版本发生变更: 关键字 inplace 可以设置为 False 以便返回修改后的副本 除非 不会发生转换,在这种情况下,对未修改的 x 返回。

convert_time_from_native(t, inplace=True)

转换时间 t 从原生单位到基本单位。

参数:
  • t (array_like) -- 要转换的时间值

  • inplace (bool (optional)) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 t 被就地修改并返回(尽管请注意标量值 t 在Python中通过值传递,因此就地修改对调用方没有任何影响。)就地操作提高了性能,因为避免了分配新阵列。

在 0.7.5 版本发生变更: 关键字 inplace 可以设置为 False 以便返回修改后的副本 除非 不会发生转换,在这种情况下,对未修改的 x 返回。

convert_time_to_native(t, inplace=True)

转换时间 t 从基本单位到本地单位。

参数:
  • t (array_like) -- 要转换的时间值

  • inplace (bool, optional) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 t 被就地修改并也被返回。(另请注意,标量值 t 在Python中通过值传递,因此就地修改对调用方没有任何影响。)

在 0.7.5 版本发生变更: 关键字 在位 可以设置为 False 以便返回修改后的副本 除非 不会发生转换,在这种情况下,对未修改的 x 返回。

convert_velocities_from_native(v, inplace=True)

速度阵的换算 v 从原生单位到基本单位

参数:
  • v (array_like) -- 转型的速度

  • inplace (bool (optional)) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 v 被就地修改并也被返回。就地操作提高了性能,因为避免了分配新阵列。

在 0.7.5 版本加入.

convert_velocities_to_native(v, inplace=True)

坐标数组的转换 v 从基本单位到原生单位

参数:
  • v (array_like) -- 转型的速度

  • inplace (bool (optional)) -- 是否就地修改数组,覆盖以前的数据

备注

默认情况下,输入 v 被就地修改并也被返回。就地操作提高了性能,因为避免了分配新阵列。

在 0.7.5 版本加入.

copy()[源代码]

返回此内存读取器的副本

property dt: float

两个轨迹帧之间的时间,以皮秒为单位。

property frame: int

当前时间步长的帧编号。

这是一条简单的捷径 Timestep.frame

get_array()[源代码]

返回底层数组。

get_aux_attribute(auxname, attrname)

获取的价值 属性名称 从辅助器 辅助名称

参数:
  • auxname (str) -- 要获取其值的辅助设备的名称

  • attrname (str) -- 辅助读取器中的gettable属性的名称

get_aux_descriptions(auxnames=None)

获取描述以允许重新加载指定的辅助项。

如果未提供辅助名称,则默认为添加的辅助名称的完整列表。

将生成的描述传递给 add_auxiliary() 将允许辅助人员的娱乐活动。例如,将所有辅助词复制到第二个轨迹中:

descriptions = trajectory_1.get_aux_descriptions()
for aux in descriptions:
    trajectory_2.add_auxiliary(**aux)
返回:

描述每个辅助词的args/kwargs词典列表。

返回类型:

list

iter_as_aux(auxname)

迭代至少有一个来自辅助步骤的分配步骤的时间步长 辅助名称 中指定的截止范围内 辅助名称

iter_auxiliary(auxname, start=None, stop=None, step=None, selected=None)

遍历辅助词 辅助名称 与弹道无关。

将迭代辅助的指定步骤(默认为所有步骤)。允许访问辅助对象中的所有值,包括轨迹时间范围之外的值,而不必同时迭代轨迹。

迭代后,辅助器将重新定位在当前步骤。

参数:
  • auxname (str) -- 要迭代的辅助对象的名称。

  • (start (optional) -- 用于在辅助对象的切片上迭代的选项。

  • stop (optional) -- 用于在辅助对象的切片上迭代的选项。

  • step) (optional) -- 用于在辅助对象的切片上迭代的选项。

  • selected (lst | ndarray, optional) -- 要迭代的步骤列表。

生成器:

AuxStep 对象

参见

iter_as_aux()

next() Timestep

前进一步到下一帧。

next_as_aux(auxname)

移动到辅助时间步长至少有一个步长的下一个时间步长 辅助名称 中指定的截止范围内 辅助名称

这允许在轨迹中前进,而不会遇到 NaN 代表值(除非这些值特别是辅助数据的一部分)。

如果未设置辅助截止,则辅助步骤较少 (auxiliary.dt > trajectory.dt ),这允许以辅助步调(四舍五入到最接近的时间步长)前进;而如果辅助步长更频繁,这将与调用 next()

请参阅 辅助API

参见

iter_as_aux()

static parse_n_atoms(filename, order='fac', **kwargs)[源代码]

推断给定坐标数组中的原子数量

参数:
  • filename (numpy.ndarray) -- 稍后将在内存读取器中使用的数据

  • order ({"afc", "acf", "caf", "fac", "fca", "cfa"} (optional)) -- 对应于(A)tom、(F)rame、(C)坐标的返回数据数组的顺序/形状被允许,即,形状是(帧、原子数目、坐标)的返回数组。

返回:

n_atoms --系统中的原子数

返回类型:

int

remove_auxiliary(auxname)

清除数据并关闭 AuxReader 对于辅助者 辅助名称

rename_aux(auxname, new)

更改辅助设备的名称 辅助名称new

假设还没有名为 new ,辅助名称将在t.aux名称空间、轨迹的添加辅助项列表以及辅助阅读器本身中更改。

参数:
  • auxname (str) -- 要重命名的辅助设备的名称

  • new (str) -- 要尝试设置的新名称

抛出:

ValueError -- 如果该名称 new 已被现有的辅助设备使用。

rewind() Timestep

轨迹起始处的位置

set_array(coordinate_array, order='fac')[源代码]

按所需的列顺序设置基础数组。

参数:
  • coordinate_array (ndarray object) -- 底层的坐标数组

  • order ({"afc", "acf", "caf", "fac", "fca", "cfa"} (optional)) -- 对应于(A)tom、(F)rame、(C)坐标的返回数据数组的顺序/形状被允许,即,形状是(帧、原子数目、坐标)的返回数组。

set_aux_attribute(auxname, attrname, new)

设置的值 属性名称 在辅助词中 辅助名称

参数:
  • auxname (str) -- 要更改的辅助设备的名称

  • attrname (str) -- 辅助读取器中的可设置属性的名称

  • new -- 要尝试设置的新值 属性名称

property time

当前帧的时间,以MDAnalysis时间单位表示(通常为ps)。

这要么直接从TimeStep读取,要么计算为time= Timestep.frame * Timestep.dt

timeseries(asel=None, start=0, stop=-1, step=1, order='afc')[源代码]

以所需的列顺序返回原子组的坐标数据子集。如果没有给出选择,它将返回底层数组的一个视图,否则返回一个副本。

参数:
  • asel (AtomGroup (optional)) -- 原子选择。默认为 None 在这种情况下,将返回完整的坐标数据集。请注意,在这种情况下,将返回基础NumPy数组的视图,而无论何时 asel 不同于 None

  • start (int (optional)) -- 开始轨迹框

  • stop (int (optional)) -- 结束轨迹框..已弃用::2.4.0请注意 stop 是目前 inclusive 但将会被改变为有利于 exclusive 在3.0版中。

  • step (int (optional)) -- 要跳过的轨迹帧的数量

  • order ({"afc", "acf", "caf", "fac", "fca", "cfa"} (optional)) -- 对应于(A)tom、(F)rame、(C)坐标的返回数据数组的顺序/形状被允许,即,形状是(帧、原子数目、坐标)的返回数组。

在 1.0.0 版本发生变更: 已弃用 format 关键字已删除。使用 order 取而代之的是。

在 2.4.0 版本发生变更: 空输入原子组现在引发ValueError,而不是NoDataError

property totaltime: float

轨迹的总长度

时间的计算方式为 (n_frames - 1) * dt 也就是说,我们假设第一帧没有经过时间。因此,具有两个帧的轨迹将被视为具有单个时间步的长度 dt 并且具有单帧的“轨迹”将被报告为长度0。

property transformations

返回转换列表

units = {'length': None, 'time': None, 'velocity': None}

带有以下单位的词典 time长度 (及 速度 ..用于支持它的格式)