6.1. 轨迹读者和作者 MDAnalysis.coordinates

坐标子模块包含读取、写入和存储坐标信息的代码,或者单个帧(例如, GRO 格式)或轨迹(例如 DCD 格式);请参阅 支持的坐标格式表 适用于所有格式。

MDAnalysis调用读取坐标轨迹并使数据可用的类 《读者》 。同样,写出坐标的类也称为 “作家” 。读取器和写入器为底层坐标数据提供公共接口。通过面向对象的接口对坐标访问进行抽象是MDAnalysis的关键功能之一。

6.1.1. 读者

所有读取器都基于 ProtoReader 类,该类定义公共 轨迹API 并且允许其他代码以相同的方式与所有轨迹格式接口,而与轨迹格式本身的细节无关。

这个 Universe 包含API入口点属性 Universe.trajectory 这指向了实际的 ProtoReader 对象;所有读取器都可以通过这个入口点以相同的方式访问(“Duck tying”)。

有三种类型的基本阅读器作为每种特定格式的起点。它们是:

ReaderBase

一个标准的多帧读取器,允许在单个文件上迭代以提供多个数据帧。这由TRR和DCD等格式使用。

SingleFrameReaderBase

一种简化的阅读器,它读取只包含单帧信息的文件。它与GRO和CRD等格式一起使用

ChainReader

一种高级阅读器,旨在读取一系列文件,以无缝地迭代每个文件中的所有帧。该阅读器还可以在不同格式的文件序列上提供此功能。

正常情况下,不需要明确选择读卡器。这是在创建 Universe 并为文件类型选择适当的读取器(通常按文件扩展名,但此选择可以用 format 参数为 Universe )。

如果有其他模拟数据可用,则可使用将其添加到轨迹并与其一起读取 add_auxiliary() 如中所述 辅助API

6.1.2. 作家

为了 写坐标 ,提供了出厂功能 (MDAnalysis.coordinates.core.writer() ,它也可以通过以下方式提供 MDAnalysis.Writer() ),它返回一个 作家 适用于所需的文件格式(由文件名后缀指示)。此外,一条弹道 ProtoReader 也可以有一种方法 Writer() 这将返回一个适当的 WriterBase 以获取轨迹的文件格式。

类比于 MDAnalysis.coordinates.core.writer() ,还有一个 MDAnalysis.coordinates.core.reader() 可用于返回轨迹的函数 ProtoReader 实例,尽管这通常是不需要的,因为 Universe 类可以自动选择适当的读取器。

典型的方法是从旧的轨迹生成新的轨迹,例如,仅保留蛋白质:

u = MDAnalysis.Universe(PDB, XTC)
protein = u.select_atoms("protein")
with MDAnalysis.Writer("protein.xtc", protein.n_atoms) as W:
    for ts in u.trajectory:
        W.write(protein)

使用 with() 语句将在写入最后一帧后自动关闭轨迹。

6.1.3. 时间步长

读者和作家都使用时间步长作为他们的工作对象。一个 Timestep 表示轨迹中给定帧的所有数据。对象中的数据 Timestep 通常通过 AtomGroup 但也有可能直接操纵时间步长。

海流 Timestep 可以通过 ts 附加到活动对象的轨迹的属性 Universe **

ts = u.trajectory.ts
ts.positions  # returns a numpy array of positions

由于各个模拟包的不同,大多数单独的格式在每个时间步长中的可用数据略有不同,但所有格式都共享广泛的基本数据集,详细信息请参见 Timestep API

6.1.4. 支持的坐标格式

下表列出了MDAnalysis理解的坐标文件格式。重点是在流行的分子动力学代码中使用的格式。默认情况下,MDAnalysis通过查看扩展来确定格式。因此,DCD文件始终必须以“.dcd”结尾才能被识别,除非使用 格式化 关键字至 Universeload_new() 。使用压缩后的文件也可以识别许多文件 gzipbzip2 例如“.xyz.bz2”。

支持的坐标格式表

名字

分机

IO

备注

查尔姆,NAMD

DCD

读/写

标准CHARMM二进制轨迹;自动检测字符顺序。固定原子可能无法正确处理(需要测试)。模块 MDAnalysis.coordinates.DCD

LAMMPS

DCD

读/写

CHARMM风格的二进制轨迹;自动检测字符顺序。单位适用于LAMMPS。模块 MDAnalysis.coordinates.LAMMPS

LAMMPS [1]

数据

R

从.data文件读取的单帧坐标

LAMMPS [1]

Lammps转储

R

Atom风格的ASCII轨迹

格罗麦克斯

XTC

读/写

压缩(有损)XTC轨迹格式。模块 MDAnalysis.coordinates.XTC

格罗麦克斯

TRR

读/写

全精度TRR轨迹。对坐标和速度进行处理。模块 MDAnalysis.coordinates.TRR

格罗麦克斯

TNG

R

变精度的弹道。坐标、速度和力与任何 additional tng block data 已请求阅读。使用 PyTNG package 用于文件读取。模块 MDAnalysis.coordinates.TNG

XYZ [1]

XYZ

读/写

通用空格分隔XYZ格式;可以压缩(gzip或bzip2)。模块 MDAnalysis.coordinates.XYZ

TXYZ [1]

Txyz,圆弧

R

Tinker XYZ格式。模块 MDAnalysis.coordinates.TXYZ

HOOMD [1]

政府物料供应处

R

HOOMD GSD格式(使用 gsd.hoomd )。模块 MDAnalysis.coordinates.GSD

GAMESS

GM,注销,注销

R

通用半格式化游戏S输出日志;可以压缩(gzip或bzip2)。模块 MDAnalysis.coordinates.GMS

AMBER

TRJ,MDCRD

R

格式化(ASCII)轨迹;自动检测周期框的存在( 实验性的 )。模块 MDAnalysis.coordinates.TRJ

AMBER

Inpcrd,restrt

R

格式化(ASCII)坐标/重新启动文件模块 MDAnalysis.coordinates.INPCRD

AMBER

北卡罗来纳州NCDF

读/写

完全支持二进制(NetCDF)轨迹,可选 netcdf4-python 模块(坐标和速度)。模块 MDAnalysis.coordinates.TRJ

布鲁克海文 [1]

PDB/ENT

读/写

默认情况下读取宽松的PDB格式(如MD模拟中使用的);支持多个帧(模型),但需要 多帧 关键字。模块 MDAnalysis.coordinates.PDB

XPDB

PDB

R

扩展的PDB格式(可以使用5位余数)。要使用,请明确指定格式“xpbd”: Universe(..., format="XPDB") 。模块 MDAnalysis.coordinates.PDB

PDBQT [1]

PDBQT

读/写

具有ATOM类型的AutoDock使用的文件格式 t 和部分收费 q 。模块: MDAnalysis.coordinates.PDBQT

PQR [1]

PQR

读/写

带有电荷和半径信息的类似PDB但以空格分隔的文件。模块 MDAnalysis.coordinates.PQR

GROMOS96

[1]

GRO

读/写

基本GROMOS96格式(以及速度)。只会读取出现的第一个帧。模块 MDAnalysis.coordinates.GRO

CHARMM卡 [1]

CRD

读/写

CHARMM的“CARD”坐标输出;处理标准或扩展格式。模块 MDAnalysis.coordinates.CRD

DESRES [1]

DMS

R

DESRES分子结构文件格式阅读器。模块 MDAnalysis.coordinates.DMS

IBISCO/YASP

TRZ

读/写

二进制IBIsCO或YASP轨迹模块 MDAnalysis.coordinates.TRZ

MOL2

钼2

读/写

基于文本的Tripos分子结构格式 MDAnalysis.coordinates.MOL2

DL_Poly [1]

配置

R

DL_POLY ASCII配置文件 MDAnalysis.coordinates.DLPOLY

DL_Poly [1]

历史

R

DL_POLY ASCII历史文件 MDAnalysis.coordinates.DLPOLY

MMTF [1]

MMTF

R

大分子传输格式 MDAnalysis.coordinates.MMTF

NAMD

Coor,Namdbin

读/写

坐标的NAMD二进制文件格式 MDAnalysis.coordinates.NAMDBIN

FHIAIMS

在……里面

读/写

FHI-AIMS坐标文件格式 MDAnalysis.coordinates.FHIAIMS

H5MD

H5md

R

H5MD 坐标的文件格式 MDAnalysis.coordinates.H5MD

chemfiles 类库

CHEMFILES

读/写

接口到 chemfiles ,请参阅 list of chemfiles file formatsMDAnalysis.coordinates.chemfiles

6.1.5. 轨迹API

这个 轨迹API 定义必须如何构造类以允许读取和写入坐标文件。通过遵循该API,可以无缝地增强MDAnalysis的I/O功能。实际的底层I/O代码可以用C或PYTHON或两者的混合编写。

通常,每种格式都驻留在其自己的模块中,该模块由格式说明符命名(按照约定使用大写)。

Reader和Writer类派生自 MDAnalysis.coordinates.base

6.1.5.1. 登记处

在不同的地方,MDAnalysis试图自动选择适当的格式(例如,通过查看文件扩展名)。为了使其能够选择正确的格式,所有I/O类必须是子类 MDAnalysis.coordinates.base.ReaderBaseMDAnalysis.coordinates.base.SingleFrameReaderBase ,或 MDAnalysis.coordinates.base.WriterBase 并将 format 属性,该属性包含定义预期后缀的字符串。要为I/O类分配多个后缀,可以给出一个后缀列表。

除此之外,读取器还可以定义 _format_hint 方法,该方法返回它是否可以处理给定对象的布尔值。例如, MDAnalysis.coordinates.memory.MemoryReader 将自身标识为能够读取NumPy数组。此功能用于 MDAnalysis.core._get_readers.get_reader_for() 在弄清楚如何读取对象(通常是提供给mda.宇宙)时。

若要定义编写器可以写入多个轨迹帧,请设置 multiframe 属性为 True 。默认值为 False 。为作家下定义 支持单帧写入 singleframe 属性可以设置为 False 。这是 True 默认情况下,即我们假设所有的编写者也可以制作单个帧。

6.1.5.2. TimeStep类

TimeStep实例保存当前帧的数据。每当读取轨迹的新帧时,它都会被更新。

TimeStep类派生自 MDAnalysis.coordinates.timestep.Timestep ,这是主要的实现示例(直接用于DCDReader)。

有关此格式的详细讨论请参阅 Issue 250

6.1.5.2.1. 方法:

__init__(n_atoms, positions=True, velocities=False, forces=False)

定义此时间步长将包含的原子数,以及它是否将包含速度和力信息

__eq__

将时间步长与另一个时间步长进行比较

__getitem__(atoms)

原子的位置;可以是切片或数字数组,然后返回坐标数组

__len__()

框中的坐标(原子数)数

__iter__()

所有坐标上的迭代器

copy()

实例的深层副本

_init_unitcell

该挂钩返回此特定文件格式的单位单元表示形式的空数据结构;从内部调用 __init__() 要进行初始化 Timestep._unitcell

6.1.5.2.2. 属性

n_atoms

框架中的原子数

frame

当前帧编号(从0开始)

_frame

轨迹的本地帧编号。这可能不同于 frame 因为这将始终在迭代时从0开始按顺序计数,而 _frame 是直接从弹道上取出来的。

time

当前系统时间,单位为ps。该值可以从设置为TimeStep属性的时间计算,也可以从 frame * dt 。任何一种方法都允许对时间应用偏移量。

dt

不同帧之间系统时间的变化。可以将其设置为属性,但默认为1.0 ps。

data

包含当前时间步长的所有其他信息的词典。

positions

此时间步中所有位置的Numy数组,否则将引发 NoDataError

velocities

如果存在,则返回一个稀疏的速度数组,否则引发 NoDataError

forces

如果存在,则返回力的稀疏数组,否则引发 NoDataError

has_positions

位置数据是否可用的布尔值

has_velocities

速度数据是否可用的布尔值

has_forces

力数据是否可用的布尔值

dimensions

系统框尺寸 (x, y, z, alpha, beta, gamma )还附带一个setter,它接受MDAnalysis框,以便您可以执行以下操作::

Timestep.dimensions = [A, B, C, alpha, beta, gamma]

,然后自动转换为基础表示形式并将其存储在 Timestep._unitcell

volume

系统箱体积(作为箱向量的行列式导出 dimensions )

aux

任何添加的辅助数据的代表值的命名空间。

6.1.5.2.3. 私有属性

这些属性由底层轨迹读取器直接设置。通常情况下,用户不应该直接访问它们,而是应该使用上面的属性。

_pos

原始坐标,a numpy.float32 数组; X = _pos[:,0], Y = _pos[:,1], Z = _pos[:,2]

_velocities

原始速度,a numpy.float32 包含速度的数组(与 _pos )

_forces

力,类似于上面的速度。

_unitcell

原生单位单元格描述;格式取决于基本轨迹格式。用户应使用 dimensions 属性以规范格式访问数据,而不是访问 Timestep._unitcell 直接去吧。

该方法 Timestep._init_unitcell() 是初始化此属性的挂钩。

6.1.5.3. 弹道读取器类

轨迹读取器源自 MDAnalysis.coordinates.base.ReaderBase (或来自 MDAnalysis.coordinates.base.ProtoReader 如果他们不需要 Reader.__del__() 方法)。一个特例是 SingleFrame readers 用于仅包含单个坐标框架的格式。这些读取器派生自 ProtoReader 名为 MDAnalysis.coordinates.base.SingleFrameReaderBase

通常,许多方法和属性都会被覆盖,但下面列出的方法和属性 must 将会得到实施。

参见

请参阅 读者 在……里面 MDAnalysis.coordinates.base 以了解实施细节。

6.1.5.3.1. 方法:

这个 MDAnalysis.coordinates.DCD.DCDReader 类是主要的实现示例。

必选方法

以下方法必须在Reader类中实现。

__init__(filename, **kwargs)

打开 文件名 ;其他 科瓦格人 根据需要进行处理,阅读器可以自由忽略它们。通常,当MDAnalysis从以下位置创建读取器 MDAnalysis.Universe 它提供了尽可能多的信息 kwargs ;目前提供的数据如下:

  • n_atoms :提供的拓扑中的原子数。这是

    对于所有读卡器不是必需的,如果不是必需的,可以忽略。

__iter__()

允许从头到尾迭代::

for ts in trajectory:
    print(ts.frame)

在开始迭代之前,阅读器会自动将轨迹回放到初始帧之前(通常通过重新打开文件)。 Multi frame readers (见 读者 )也将使轨迹倒带 after 迭代,以便将当前轨迹帧设置为第一个轨迹帧。 Single frame readers 不要在迭代后显式回放,而只是停留在轨迹中的一个帧上。

close()

关闭文件并停止I/O

next()

前进到下一个时间步长或提升 IOError 当移过最后一帧时

rewind()

重新定位到第一帧

__entry__()

一种录入方法 Context Manager (返回SELF)

__exit__()

的退出方法。 Context Manager ,应该打电话给 close()

备注

一个 __del__() 还应提供方法,以确保弹道正确闭合。但是,某些类型的阅读器可能会忽略这一要求。其中包括 SingleFrameReaderBase (文件读取在上下文管理器中完成,不需要手动关闭)和 ChainReader (它是一个读者的集合,每个读者都已经有了自己的 __del__ 方法)。

可选方法

并非所有轨迹格式都支持以下方法,要么是因为数据不可用,要么是因为这些方法尚未实施。代码应该优雅地处理缺少的方法。

__len__()

轨迹中的帧数

__getitem__(arg)

前进到时间步长 arg = frame 然后返回 Timestep ;或如果 arg 是一个切片,然后在轨迹的该部分返回一个迭代数。

第一个功能允许用户随机访问轨迹中的帧:

universe.trajectory[314]

会将帧314加载到当前 Timestep

使用切片允许对轨迹的部分进行迭代::

for ts in universe.trajectory[1000:2000]:
    process_frame(ts)   # do some analysis on ts

或跳过帧:

for ts in universe.trajectory[1000::100]:
    process_frame(ts)   # do some analysis on ts

最后一个示例从第1000帧开始读取轨迹,并每隔100帧读取一次,直到最后。

还可以提供索引序列或布尔值掩码来索引轨迹。

该项目的表现 __getitem__() 方法取决于底层轨迹读取器以及它是否可以实现对帧的随机访问。MDAnalysis中的所有读取器都应支持随机访问。

对于外部定制读取器,这可能不容易(或可靠地)实现,因此仅限于顺序迭代。如果读取器不能提供对帧的随机访问,则它应该引发 TypeError 关于索引。有可能部分地实现 __getitem__ (如上所示 MDAnalysis.coordinates.base.ProtoReader.__getitem__ 其中切片完整的轨迹相当于 MDAnalysis.coordinates.base.ProtoReader.__iter__ (它始终被实现)和其他切片引发 TypeError

使用片、索引序列或布尔值掩码编制索引时,返回值是 FrameIteratorSlicedFrameIteratorIndices 。看见 FrameIterators 了解更多详细信息。

parse_n_atoms(filename, **kwargs)

提供轨迹文件中的原子数量,以便使用Reader提供极小的拓扑。必须实现为静态方法或类方法。

Writer(filename, **kwargs)

返回一个 WriterBase 其被设置为与正被读取的轨迹相同的参数(例如,时间步长、长度等),这便于复制和简单的即时操纵。

如果未定义编写器,则一个 NotImplementedError 都被养大了。

这个 科瓦格人 可用于定制Writer,因为它们通常被传递给Writer的init方法,并填充了合理的默认值;实际的关键字参数取决于Writer。

timeseries(atomGroup, [start[,stop[,skip[,format]]]])

返回坐标数据的子集

6.1.5.3.2. 属性

filename

轨迹的文件名

n_atoms

一帧中的原子数(坐标集)(常量)

n_frames

帧总数(如果已知)-- None 如果不知道

ts

这个 Timestep 对象;通常为每种轨迹格式定制并派生自 timestep.Timestep

units

带关键字的词典 time长度速度 和适当的单位(例如‘AKMA’和‘Angstrom’代表Charmm dcd,‘ps’和‘nm’代表Gromacs轨迹, None 和‘Angstrom’的PDB)。任何未使用的字段都应设置为 None

format

标识文件格式的字符串,例如“DCD”、“PDB”、“CRD”、“XTC”、“TRR”;这通常是大写的文件扩展名。

dt

帧之间的时间(PS);动态计算的托管属性(只读) skip_timestep * delta 并将时间转换为MDAnalysis基本单位(默认情况下为皮秒)

totaltime

轨迹的总长度= n_frames * dt

time

当前时间点的时间,以MDAnalysis时间单位(PS)表示

frame

当前时间步长的帧编号(从0开始)

aux_list

任何添加的辅助数据的名称列表。

_auxs

百科全书 AuxReader 任何添加的辅助数据的实例。

可选属性

delta

积分器时间步长(以本地单位表示);因此,目标帧的“长度”为 skip_timestep*delta 时间单位

compressed

标识压缩的字符串(例如“gz”或“bz2”)或 None

fixed

Bool,表示是否有固定的原子(例如dcd)

periodic

布尔表示如果包含周期边界条件的框信息,则将单元格信息存储在属性中 dimensions

skip_timestep

帧之间的积分步数+1(即对MD模拟进行采样的步长)

6.1.5.4. 轨迹编写器类

轨迹编写器源自 MDAnalysis.coordinates.base.WriterBase 。它们用于将多个帧写入轨迹文件。每一次 write() 方法,则会将另一帧追加到轨迹。

通常,许多方法和属性都会被覆盖。

签名::

with TrajectoryWriter(filename, n_atoms, **kwargs) as w:
    w.write(Universe)    # write a whole universe

或:

w.write(AtomGroup)  # write a selection of Atoms from Universe

参见

请参阅 作家 在……里面 MDAnalysis.coordinates.base 以了解实施细节。

6.1.5.4.1. 方法:

__init__(filename, n_atoms, **kwargs)

设置阅读器。这 may 打开文件 文件名may 立即向其写入内容(如标头),但允许编写器将I/O延迟到第一次调用 write()

任何 **kwargs 必须以静默方式忽略未由编写器处理的。

write(obj)

将时间步长数据写入 obj

convert_dimensions_to_unitcell(timestep)

从TimeStep中获取尺寸并将其转换为格式的原生单位单元表示

close()

关闭文件并完成I/O

__del__()

确保调用Close()

6.1.5.4.2. 属性

filename

轨迹文件的名称

units

带关键字的词典 time长度速度 和适当的单位(例如‘AKMA’和‘Angstrom’代表Charmm dcd,‘ps’和‘nm’代表Gromacs轨迹, None 和‘Angstrom’的PDB)。任何未使用的字段都应设置为 None

format

标识文件格式的字符串,例如“DCD”、“PDB”、“CRD”、“XTC”、“TRR”

Optional

ts

Timestep 实例

6.1.5.5. 单帧编写器类

单帧写入器是轨迹写入器的特例,因为它只将单个坐标帧写入文件,例如PDB或GRO文件。与只包含坐标的轨迹格式不同, 单帧 格式包含更多信息(例如原子和残基的名称和数字),因此可以以有意义的方式编写原子选择。

签名::

W = FrameWriter(filename, **kwargs)
W.write(AtomGroup)
W.write(Universe)

毯子 科瓦格人 是必需的,以便可以传递与轨迹编写器相同类型的参数(文件名和n_ATOM)。这样,简单的 writer() 工厂功能可用于所有写入器。

6.1.5.5.1. 方法:

__init__(filename, **kwargs)

vt.打开,打开 文件名 用于写作; kwargs 通常被忽略

write(obj)

写入对象 obj ,包含一个 AtomGroup 原子组(通常从选择中获得)或 Universe 复制到该文件并关闭该文件

备注

轨迹编写器和帧编写器的使用方式几乎完全相同,但帧编写器无法处理RAW Timestep 物体。