Universe

    If you wish to make an apple pie from scratch, you must first invent the universe.

    如果你想从零开始制作苹果派,你必须先创造一个宇宙。

—Carl Sagan, Cosmos

MDAnalysis 围绕两个基本类构建:Universe、AtomGroup。几乎MDAnalysis所有的代码都始于Universe,它包含了描述一个分子动力学系统的所有信息。Universe有两个关键性质:

  • atoms:系统原子的一个AtomGroup,提供了获取(如下)重要分析方法的途径。
  • trajectory:当前载入的轨迹读取器。

Universe将来自拓扑的静态信息(如原子特性)与来自轨迹动态更新的信息(如坐标)联系起来,MDAnalysis的一个关键特征就是不将完整轨迹载入内存(除非用户使用MemoryReader显式操作)。取而代之的是,trajectory属性提供了对轨迹特定帧的观察,这允许分析任意长的轨迹而不剧烈影响内存。

创建Universe

从文件载入

Universe 通常是从“拓扑”文件创建的,其中包含可选的“轨迹”文件。轨迹文件的坐标必须与拓扑中的原子具有相同的顺序。格式问题详见Formats篇。

1
2
3
4
u = Universe(topology, trajectory)
u = Universe(pdbfile) ## read atoms and coordinates from PDB or GRO
u = Universe(topology, [traj1, traj2, ...]) ## read from a list of trajectories
u = Universe(topology, traj1, traj2, ...) ## read from multiple trajectories

拓扑和轨迹文件之间的界限非常模糊。例如,PDB 或 GRO 文件既被视为拓扑文件,也被视为轨迹文件。不同之处在于拓扑文件提供静态信息,例如原子特性等(名称、质量等)、电荷和键连通性。轨迹文件提供动态信息,例如坐标、速度、力和箱体尺寸。

如果仅提供单个文件,则 MDAnalysis 会尝试从中读取拓扑和轨迹信息。当提供多个轨迹文件时,坐标将按给定的顺序加载。

默认参数应创建适合大多数分析应用程序的Universe。但是,Universe构造函数也采用可选参数。

  • format:轨迹文件的格式,默认None,即猜格式
  • topology_format:拓扑文件的格式,默认None,即猜格式
  • all_coordinates:是否读取第一个文件的坐标信息,默认False,当仅提供一个文件时忽略。
  • continuous:是否给多个轨迹文件设置连续的时间。目前仅支持GRO/TPR拓扑和XTC/TRR轨迹文件,与gmx trjcat相同。默认False。
1
2
3
4
5
6
7
8
9
10
11
12
13
import MDAnalysis as mda

from MDAnalysis.tests.datafiles import PDB, GRO, XTC

u1 = mda.Universe(GRO, XTC, XTC, all_coordinates=True)

u1.trajectory
## <ChainReader containing adk_oplsaa.gro, adk_oplsaa.xtc, adk_oplsaa.xtc with 21 frames of 47681 atoms>

u2 = mda.Universe(GRO, XTC, XTC, all_coordinates=False, continuous=False)

print([int(ts.time) for ts in u2.trajectory])
## [0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 0, 100, 200, 300, 400, 500, 600, 700, 800, 900]

以下参数修改创建的Universe:

  • guess_bonds:是否猜测原子间的连接。(default: False)
  • vdwradii:用于猜测成键的范德华半径字典。{element: radius}
  • transformations: 用于动态轨迹变换的函数或函数列表。
  • in_memory: 是否将坐标加载到内存中。(default: False)
  • in_memory_step: 仅每 n 帧读取一次内存中表示。 (default: 1)
  • is_anchor:在unpickling AtomGroups时是否考虑本Universe(default: True)
  • anchor_name: unpickling AtomGroups时Universe的名字(default: None, 即自动生成)

您还可以传入关键字来解析拓扑或坐标。例如,许多文件格式不指定其轨迹的时间步长。在这些情况下,MDAnalysis 假定默认时间步长为 1 ps。如果这不正确,您可以传入参数dt来修改时间步长。这不会修改包含时间信息的格式的时刻。

1
2
3
4
5
6
7
8
9
10
11
from MDAnalysis.tests.datafiles import PRM, TRJ

default_timestep = mda.Universe(PRM, TRJ)

default_timestep.trajectory.dt
## 1.0

user_timestep = mda.Universe(PRM, TRJ, dt=5) ## ps

user_timestep.trajectory.dt
## 5

从AtomGroup创建

一个新的Universe可以使用Merge()根据一个或多个AtomGroup实例创建。这些AtomGroup实例可以来自不同的Universe,这意味着可以拼接来自不同数据集的选中部分。

例如,组合来自分离PDB文件的蛋白质、配体、溶剂:

1
2
3
4
5
u1 = mda.Universe("protein.pdb")
u2 = mda.Universe("ligand.pdb")
u3 = mda.Universe("solvent.pdb")
u = Merge(u1.select_atoms("protein"), u2.atoms, u3.atoms)
u.atoms.write("system.pdb")

从零构建

我们可以使用Universe.empty从零构建一个Universe。步骤如下:

  1. 指定原子数,创建一个空Universe。如果是坐标,设置.trajecory=True。
  2. 添加拓扑属性,如原子名。
  3. (可选)载入坐标。

例如,构建两个残基、六个原子的Universe:

1
2
3
4
5
6
7
8
9
10
11
u = mda.Universe.empty(6, 2, atom_resindex=[0, 0, 0, 1, 1, 1], trajectory=True)

u.add_TopologyAttr('masses')

coordinates = np.empty((1000, ## number of frames
u.atoms.n_atoms,
3))


u.load_new(coordinates, order='fac')
## <Universe with 6 atoms>

猜测拓扑属性

MDAnalysis 可以猜测两种信息。有时 MDAnalysis 会猜测信息,而不是从某些文件格式中读取信息,这可能会导致错误,例如为原子分配错误的元素或电荷。请参阅可用的拓扑解析器,了解 MDAnalysis 针对每种格式猜测哪些原子属性的具体情况。请参阅猜测拓扑属性,了解如何猜测属性,以及属性具有默认值的默认值和属性级别

Universe属性和方法

Universe拥有原子和拓扑对象的重要分组:

  • atoms:系统的所有Atoms
  • residues:系统的所有Residues
  • segments:系统的所有Segments
  • bonds:系统的所有bond TopologyObjects
  • angles:系统的所有angle TopologyObjects
  • dihedrals:系统的所有dihedral TopologyObjects
  • impropers:系统的所有improper TopologyObjects

Residues和Segements是Atoms的化学意义上的分组。

修改拓扑通常通过Universe完成,其中包含几种添加属性的方法,如add_TopologyAttr()、add_Residues()、add_Segments(),详见topology_system篇。

翻译https://userguide.mdanalysis.org/stable/universe.html