AtomGroup

Universe包含分子系统的所有粒子。MDAnalysis将粒子称为Atom,无论它是否真是(例如,它可能是联合原子粒子或者粗粒化珠子)。Atoms被AtomGroup分组,Universe的主组可以通过Universe.atoms获取。

创建一个AtomGroup

原子选择语言

AtomGroup实例通常使用Universe.select_atoms或者操纵另一个AtomGroup来创建,例如切片。详见 Atom selection language篇。

1
2
3
4
5
6
7
8
import MDAnalysis as mda

from MDAnalysis.tests.datafiles import PDB

u = mda.Universe(PDB)

u.select_atoms('resname ARG')
## <AtomGroup with 312 atoms>

索引和切片

AtomGroup可以像Python的列表一样索引和切片,例如:

1
2
print(u.atoms[0])
## <Atom 1: N of type N of resname MET, resid 1 and segid SYSTEM and altLoc >

单索引返回Atom,复杂索引和切片都返回一个AtomGroup。

支持布尔索引

分组操作符和集合方法

MDAnalysis 支持多种比较AtomGroup或构建新AtomGroup的方法:组操作符(例如 concatenate()、subtract())和集合方法(例如 union()、difference())。组操作符与集合方法实现的效果类似。然而,一个关键的区别在于,concatenate() 和 subtract() 会保留原子的顺序以及任何重复项。而 union() 和 difference() 则返回一个原子组,其中每个原子都是唯一的,并按照其拓扑索引排序。

1
2
3
4
5
6
7
8
9
10
11
12
ag1 = u.atoms[1:6]
ag2 = u.atoms[8:3:-1]

concat = ag1 + ag2

concat.indices
## array([1, 2, 3, 4, 5, 8, 7, 6, 5, 4])

union = ag1 | ag2

union.indices
## array([1, 2, 3, 4, 5, 6, 7, 8])

可用的操作符

不像集合操作和原子选择语句,拼接和减法保留了原子的顺序,包括重复原子。

  • len(s):组中原子数
  • s == t:组s和组t是否相同,元素和顺序都相同
  • s.concatenate(t):组s和组t的拼接,等价于:s+t
  • s.substract(t):组s中存在但组t中不存在的原子,等价于:s-t

可用集合操作

这些方法每个都创建去重原子并排序的集合

  • s.isdisjoint(t):True如果s和t没有共同的原子
  • s.issubset(t):True如果s是t的子集
  • s.is_strict_subset(t):True如果s是t的真子集
  • s.issuperset(t):True如果s是t的超集
  • s.is_strict_superset(t):True如果s是t的真超集
  • s.union(t):s和t的并集,等价于:s|t
  • s.intersection(t):s和t的交集,等价于:s&t
  • s.difference(t):s中存在但t中不存在的原子,等价于:s-t
  • s.symmetric_difference(t):s和t的对称差,等价于:s^t == s-t + t-s

分组和分割

AtomGroup可以从另一个组通过性质分割原子构建。
AtomGroup.split可以通过分割另一组的连接级别(原子、残基、分子、片段)创建AtomGroup列表。

1
2
3
4
5
6
7
8
9
ag1 = u.atoms[:100]

ag1.split('residue')

## [<AtomGroup with 19 atoms>,
## <AtomGroup with 24 atoms>,
## <AtomGroup with 19 atoms>,
## <AtomGroup with 19 atoms>,
## <AtomGroup with 19 atoms>]

AtomGroup也可以根据(多重)拓扑属性值分割,产生一个字典。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
u.atoms.groupby('masses')
#{np.float64(32.06): <AtomGroup with 7 atoms>,
## np.float64(1.008): <AtomGroup with 23853 atoms>,
## np.float64(0.0): <AtomGroup with 11084 atoms>,
## np.float64(12.011): <AtomGroup with 1040 atoms>,
## np.float64(14.007): <AtomGroup with 289 atoms>,
## np.float64(15.999): <AtomGroup with 11404 atoms>,
## np.float64(22.98977): <AtomGroup with 4 atoms>}

u.select_atoms('resname SOL NA+').groupby(['masses', 'resnames'])
#{(np.float64(0.0), 'SOL'): <AtomGroup with 11084 atoms>,
## (np.float64(1.008), 'SOL'): <AtomGroup with 22168 atoms>,
## (np.float64(22.98977), 'NA+'): <AtomGroup with 4 atoms>,
## (np.float64(15.999), 'SOL'): <AtomGroup with 11084 atoms>}

从原子构建

AtomGroup也可以从原子列表构建,例如:

1
2
3
4
5
6
7
8
9
10
atom1 = u.atoms[4]

atom2 = u.atoms[6]

atom3 = u.atoms[2]

ag = mda.AtomGroup([atom1, atom2, atom3])

print(ag)
## <AtomGroup [<Atom 5: CA of type C of resname MET, resid 1 and segid SYSTEM and altLoc >, <Atom 7: CB of type C of resname MET, resid 1 and segid SYSTEM and altLoc >, <Atom 3: H2 of type H of resname MET, resid 1 and segid SYSTEM and altLoc >]>

一个快捷操作是就简单地将一个Atom加入到AtomGroup中:ag += atom3
另一个可选的方式是提供原子的索引列表和所属Universe:mda.AtomGroup([0, 1, 2], u)

顺序和唯一性

以下创建AtomGroup的方法会产生有序、去重的原子列表:

  • 原子选择语句
  • 切片
  • 集合
  • AtomGroup.split和AtompGroup.groupby

以下方法回产生一个用户定义顺序的、包含重复元素的AtomGroup

  • 索引列表
  • AtomGroup.concatenate 和 AtomGroup.subtract
  • 直接从Atoms构建

空AtomGroup

MDAnalysis可以使用空AtomGroup,例如:u.atoms[[]],等价于mda.AtomGroup([], u)
每种创建AtomGroup的方法都可以创建空的AtomGroup。这允许分析方法跳过空AtomGroup而不是报错。

动态更新AtomGroup

正常的 AtomGroup 是静态的,其中的原子不会随着轨迹系的变化而改变。有几种方法需要动态更新 AtomGroups。这些通常是使用原子选择语言创建的。详见selections篇。

方法

MDAnalysis 中的大多数分析功能都是在分析模块中实现的,但许多有趣的方法可以直接从AtomGroup访问。例如,可以从 AtomGroups 创建 Bonds、Angles、Dihedrals 和 ImproperDihedrals。如果存在所需的拓扑属性,则许多分析方法也可用于AtomGroup、ResidueGroup和SegmentGroup。

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