Groups of atoms

MDAnalysis 有一个由原子容器组成的层级结构,该结构在代码中被广泛使用。

示例图片

首先需要了解的是AtomGroup。AtomGroup是主要的Atom容器;通过它可以访问几乎所有内容,详见AtomGroup篇。这包括具有化学意义的Atom组,例如一个Residue或一个Segment。

残基和片段

一个Residue由Atom组成,一个Segment由Residue组成。对应的容器组为ResidueGroup、SegmentGroup。这些有与AtomGroup相似的属性和方法。

1
2
3
4
5
6
7
8
import MDAnalysis as mda
from MDAnalysis.tests.datafiles import TPR, XTC

u = mda.Universe(TPR, XTC)
ag = u.atoms.select_atoms('resname ARG and name CA')

ag
## <AtomGroup with 13 atoms>

这些容器组中的每一个都可以通过其他容器组进行访问。这种行为在不同层级上有所不同。例如,这些ag的残基就是ag原子所属的残基。

访问这些残基的原子是返回这些残基的所有原子,而不是ag原来的原子。片段对残基、原子也是如此。

1
2
ag.residues.atoms
## <AtomGroup with 312 atoms>

对于添加自定义的Residue或Segment的相关信息,参考Adding a Residue or Segment to a Universep篇.

通过AtomGroup对象访问其他类非常有用,但是小心使用以防访问数据越界。因此我们展现了两个常用的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import MDAnalysis as mda

import io

pdb = io.StringIO("""
ATOM 414 N GLY A 402 -51.919 9.578 -14.287 1.00 68.46 N
ATOM 415 CA GLY A 402 -52.405 10.954 -14.168 1.00 68.41 C
ATOM 416 C GLY A 402 -51.821 11.946 -15.164 1.00 69.71 C
ATOM 417 O GLY A 402 -51.958 13.159 -14.968 1.00 69.61 O
ATOM 418 H GLY A 402 -52.551 8.935 -14.743 1.00 0.00 H
ATOM 419 HA3 GLY A 402 -52.225 11.313 -13.155 1.00 0.00 H
ATOM 420 HA2 GLY A 402 -53.492 10.960 -14.249 1.00 0.00 H
TER
HETATM 1929 N1 XYZ A 900 -40.275 19.399 -28.239 1.00 0.00 N1+
TER
ATOM 1029 N ALA B 122 -25.408 19.612 -13.814 1.00 37.52 N
ATOM 1030 CA ALA B 122 -26.529 20.537 -14.038 1.00 37.70 C
ATOM 1031 C ALA B 122 -26.386 21.914 -13.374 1.00 45.35 C
ATOM 1032 O ALA B 122 -26.885 22.904 -13.918 1.00 48.34 O
ATOM 1033 CB ALA B 122 -27.835 19.889 -13.613 1.00 37.94 C
ATOM 1034 H ALA B 122 -25.636 18.727 -13.385 1.00 0.00 H
ATOM 1035 HA ALA B 122 -26.592 20.707 -15.113 1.00 0.00 H
ATOM 1036 HB1 ALA B 122 -28.658 20.583 -13.783 1.00 0.00 H
ATOM 1037 HB2 ALA B 122 -27.998 18.983 -14.196 1.00 0.00 H
ATOM 1038 HB3 ALA B 122 -27.788 19.635 -12.554 1.00 0.00 H
ATOM 1039 N GLY B 123 -25.713 21.969 -12.223 1.00 41.18 N
ATOM 1040 CA GLY B 123 -25.550 23.204 -11.460 1.00 41.40 C
ATOM 1041 C GLY B 123 -24.309 24.018 -11.745 1.00 45.74 C
ATOM 1042 O GLY B 123 -24.349 25.234 -11.601 1.00 46.81 O
ATOM 1043 H GLY B 123 -25.290 21.133 -11.845 1.00 0.00 H
ATOM 1044 HA3 GLY B 123 -25.593 22.976 -10.395 1.00 0.00 H
ATOM 1045 HA2 GLY B 123 -26.430 23.831 -11.600 1.00 0.00 H
TER
""")

u = mda.Universe(pdb, format="PDB")

用例:按片段划分的残基序列

为了只选择ATOM记录类型,以及通过片段获取残基列表,需执行以下操作:

1
2
3
4
5
residues_by_seg = list()

for seg in u.segments:
p_seg = seg.atoms.select_atoms("record_type ATOM")
residues_by_seg.append(p_seg.residues)

可以使用 Python 的列表推导式提取残基名称。根据需要,HETATM 记录类型行(line)不考虑:

1
2
[rg.resnames for rg in residues_by_seg]
## [array(['GLY'], dtype=object), array(['ALA', 'GLY'], dtype=object)]

注意通过首次选择AtomGroup的片段得到的残基包含ATOM和HETATM记录类型。这句话的意思是:“给我至少有一个选定原子的片段的所有残基名称”。

1
2
3
4
5
6
selected_atoms = u.select_atoms("record_type ATOM")

all_residues = selected_atoms.segments.residues

all_residues.resnames
## array(['GLY', 'XYZ', 'ALA', 'GLY'], dtype=object)

用例:按残基分组的原子列表

为了列出每个残基中的蛋白质骨架和侧链的重原子(非H),需要执行以下操作:

1
2
3
4
5
6
atoms_in_residues = list()

for seg in u.segments:
p_seg = seg.atoms.select_atoms("record_type ATOM and not name H*")
for p_res in p_seg.residues:
atoms_in_residues.append(p_seg.select_atoms(f"resid {p_res.resid} and resname {p_res.resname}"))

可以使用 Python 的列表推导式提取原子名称。根据需要,HETATM 记录类型行和H原子不考虑:

1
2
3
4
[ag.names for ag in atoms_in_residues]
## [array(['N', 'CA', 'C', 'O'], dtype=object),
## array(['N', 'CA', 'C', 'O', 'CB'], dtype=object),
## array(['N', 'CA', 'C', 'O'], dtype=object)]

Python语法可以使用split()进一步简化(不是字符串分割的split):

1
2
3
4
5
6
7
rds = u.select_atoms("record_type ATOM and not name H*").split("residue")

[ag.names for ag in rds]

## [array(['N', 'CA', 'C', 'O'], dtype=object),
## array(['N', 'CA', 'C', 'O', 'CB'], dtype=object),
## array(['N', 'CA', 'C', 'O'], dtype=object)]

碎片

Fragment与Segment的区别在于Segment是连接的、连续的片段,Fragment是破碎的、切割的片段。
MDAnalysis 中的某些分析方法还使用其他方法对原子进行分组。一个关键概念是片段。片段是通常被认为是一个分子:一个原子群,其中任何原子都可以通过遍历键从原子群中的任何其他原子到达,并且它的任何原子都没有与原子群之外的任何原子键合。(MDAnalysis 方法中的“分子”是指 GROMAS 特定的概念)。Universe的碎片由 MDAnalysis 确定为派生量。只有当键信息可用时才能确定它们。

AtomGroup的片段可通过fragments属性访问。下面是来自溶菌酶 (PDB ID: 2LYZ) 的 GROMACS TPR 文件中的 Universe,其中包含 101 个水分子。虽然它有 230 个残基,但只有 102 个片段:1 个蛋白质和 101 个水片段。

1
2
3
4
5
6
7
8
from MDAnalysis.tests.datafiles import TPR2021

u = mda.Universe(TPR2021)
len(u.residues)
## 230

len(u.atoms.fragments)
## 102

有关bond的更多信息,以及哪些文件格式提供 MDAnalysis 绑定信息,请参阅topology_system篇。

您还可以查看特定Atom属于哪个片段,即Atom.fragment

注意:AtomGroup.fragments返回的是AtomGroup中每个原子所属的片段的去重的元组,而不是所有原子共同所属片段的元组。

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