原子选择语句

可以通过使用 MDAnalysis 原子选择语言选择原子来创建 AtomGroups:

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

u = mda.Universe(PSF, DCD)
ala = u.select_atoms('resname ALA')

ala
## <AtomGroup with 190 atoms>

AtomGroup 或 Universe 的select_atoms()方法都返回一个AtomGruop。这两种方法具有不同的行为:Universe.select_atoms对universe中的所有原子进行作用,而AtomGroup.select_atoms仅对原始 AtomGroup 内的原子进行作用。单个选择短语总是返回一个AtomGroup,原子根据拓扑中的index 进行排序。这是为了确保没有任何重复项,这可能发生在复杂的选择中。当顺序很重要时,您可以传入多个短语。

此页面记录了选择关键字及其参数。select_atoms还接受修改选择字符串和结果AtomGroup行为的关键字(本页后面记录)。例如,您可以:

  • 传入命名的AtomGroup作为参数
1
2
sph_6 = u.select_atoms("sphzone 6 protein")
u.select_atoms("around 3 group sph_6", sph_6=sph_6)
  • 为几何关键词关闭周期性边界条件:periodic=False
  • 创建动态的UpdatingAtomGroup:updating=True

借助Selection exporters可以导出选中部分供外部软件。

选择关键词

下面介绍了当前由selection解析器理解的所有选择关键字。以下内容适用于所有选择:

  • 关键字区分大小写

  • 原子在结果选择中自动按顺序排序

  • 选择从左到右解析,括号可用于分组

  • 字符串选择,例如名称和残余名称,可以与 Unix shell 样式通配符匹配。这些规则包括:

    • 在字符串中使用*匹配任意数量的任意字符
    • 在字符串中使用?匹配任意单个字符
    • [seq]匹配seq中的任意单个字符
    • [!seq]匹配不在seq中的任意单个字符
    • [!?]选择空字符串

详见fnmatch篇。

简单选择

protein

选择属于蛋白质标准残基编码的原子

backbone

选择属于蛋白质标准残基编码的骨架原子:CA, C, O, N.

nucleic

选择属于核酸标准残基编码的原子

nucleicbackbone

选择属于核酸标准残基编码的骨架原子:P, O5’, C5’, C3’, O3’.

nucleicbase

选择属于核酸碱基原子

nucleicsugar

选择属于核糖原子

segid seg-name

通过segid选择,如segid 4AKE, segid DMPC

resid residue-number-range

resid 可以是单个的残基编号,也可以是多个编号组成的范围,并且后面跟着插入编码。一个范围由两个用冒号分隔的选项组成(包括两端的选项),例如:resid 1A:1C 选择resid==1且icode属于(‘A’,‘B’,‘C’)的所有残基。残基编号(“resid”)和icode是直接从拓扑结构中获取的。不同于resnum,resid对插入编码敏感。

resnum residue-number-range

resnum 可以是单个的残基编号,也可以是多个编号组成的范围,并且后面跟着插入编码。一个范围由两个用冒号分隔的选项组成(包括两端的选项),如resnum 1:5。残基编号(“resnum”)和icode是直接从拓扑结构中获取的。与resid不同,resnum对插入编码不敏感。

resname residue-name

通过resname选择,如resname LYS

name atom-name

通过atom-name选择。通常这是依赖于力场。如name CA()、name OW(SPC的水氧原子)

type atom-type

通过原子类型选择。这也是一串依赖于力场的字符,读取自拓扑文件(如:包含数值型的原子类型的CHARMM PSF文件)。这使用Atom.type的拓扑属性。

atom seg-name residiue-number atom-name

由片段编号segid 残基编号resid 原子名atomname 组成的单个原子的选择器,如:选择DMPC片段上第一个残基的C2原子:DMPC 1 C2

altloc alternative-location

对有替代位置(alternative location)的原子的选择,即 通常情况下,高分辨率晶体结构。 例如 仅选择ALA-4具有替代位置的B记录的原子:resid 4 and name ALA and altloc B.

icode icode

插入代码可用的原子的选择器。这可以使用上面的选择器与残基数组合使用。 例如 选择没有插入代码的原子:resid icode [!?]

moltype molecule-type

根据拓扑属性moltype选择,如moltype Protein_A。此时,仅TPR定义moltype。

布尔

没什么好解释的

not

and

or

几何

默认情况下,当可从 Universe 访问有效单元尺寸时,下面的几何关键字都实现周期性边界条件。这可以通过传递关键字来关闭:periodic=False
同时,所有距离判据皆为质心距离,不排除原子半径。

around distance selection

选择与另一个选择有一定截止距离的所有原子,例如: 选择所有不属于蛋白质的原子且与蛋白质相距3.5埃以内的原子:around 2.5 protein
值得注意的是,VMD中的within选择则包含参考组:即 within 3.5 of protein 将选择所有与蛋白质相距3.5 Å以内的原子,包括蛋白质本身。

sphzone externalRadius selection

选择以给定选择的几何中心(COG)周围球内的所有原子。例如,选择 蛋白质中残基号130和残基号80的几何中心附近半径6.0 Å的球体内的原子:

sphlayer innerRadius externalRadius selectionsphzone 6.0 (protein and (resid 130 and resid 80))

选择以给定选择的几何中心(COG)周围球壳内的所有原子。例如,选择 蛋白质中残基号130和残基号80的几何中心附近半径2.4~6.0 Å的球壳内的原子:sphlayer 2.4 6.0 ( protein and ( resid 130 or resid 80 ) )

cylzone externalRadius zMax zMin selection

以给定原子的几何中心为原点,向上下延伸zMax、zMin,作半径为externalRadius的圆柱体。例如:cyzone 15 4 -8 protein and resid 42
zMax、zMin可正可负。但zMax必须大于zMin,否则选择为空。注意,圆柱体的轴向为z轴正方向,几何中心为原点,zMax、zMin为轴刻度的数值。 不要理解为“zMax向上为正值、zMin向下为正值,zMax向下为负值、zMin向上为负值”

cylayer innerRadius externalRadius zMax zMin selection

以给定原子的几何中心为原点,向上下延伸zMax、zMin,作半径为innerRadius、externalRadius的圆柱壳。如:选择蛋白质中心轴向-8~10、径向5~10的圆柱壳内的原子: cylayer 5 10 10 -8 protein

point x y z distance

选择距离点(x,y,z)一定距离内的所有原子,请确保坐标由空格分隔。例如:选择距离点(5.0, 5.0, 5.0) 3.5Å内的原子: point 5.0 5.0 5.0 3.5

prop [abs] property operator value

使用坐标属性x,y,z根基位置选择原子。支持绝对值关键词abs和以下操作符: > < <= >= == !=。例如:选择z坐标大于等于5.0的原子:prop z >= 5.0、选择 -5.0 <= z <= 5.0 的原子: prop abs z <= -5.0。

相似性和连接性

same subkeyword as selection

选择与给定选择具有相同子关键词值的所有原子。支持子关键词为原子属性:name, type, resname, resid, resnum, segid, mass, charge, radius, bfactor, 组属性: residue, segment, fragment, 原子坐标: x, y, z。(请注意,目前仅适用于 MMTF 格式)。例如:选择与蛋白质中任何原子具有相同电荷的所有原子: same charge protein

byres selection

选择与给定选择具有相同片段编号、残基编号的所有原子。在“byres”关键字之后指定子选择项。

bonded selection

选择与selection连接的所有原子。例如:仅选择连接N的H原子name H and boned name N

索引

index index-range

选择给定范围的原子(从0开始计数,且包括两端),这实际上是用了拓扑属性Atom.index。例如:选择universe的第1个原子: index 0、选择第6到11个原子: index 5:10。

bynum number-range

选择给定范围的原子(从1开始计数,且包括两端)。例如:选择universe的第1个原子: bynum 1、选择第5到10个原子: bynum 5:10。

预先存在的选择和修饰符

group group-name

group group-name 会选取传递给函数作为名为 group-name 的参数的 AtomGroup 中的原子。除非 group 前面有 global 关键字,否则只会考虑 group-name 与调用 select_atoms() 的实例共有的原子。group-name 将仅通过原子索引的比较来解析。这意味着用户必须确保 group-name 组在适当的 Universe 中已定义。 见原子选择语句的示例。

global selection

默认情况下,当从原子组中调用 select_atoms() 方法时,所返回的选择和子选择都会与该实例中的原子相交。在选择项前加上“global”关键字会使该选择完整地返回。例如,全局关键字允许使用lipids.select_atoms(“around 10 global protein”)这样的选择条件——其中“lipids”是一个不包含任何蛋白质的组。如果没有全局关键字,结果将会是一个空的选择,因为蛋白质子选择本身是空的。当从Universe中调用 select_atoms() 方法时,全局关键字将被忽略。只会考虑与组名和调用 select_atoms() 方法的实例所共有的原子,除非组前面加上了全局关键字。通过比较原子索引,组名会直接包含在解析中。这意味着用户必须确保组名所在的组是在适当的Universe中定义的。

动态选择

默认情况下,select_atoms() 函数会返回一个 AtomGroup 对象,其中原子列表在轨迹帧的变化中是保持不变的。如果在调用 select_atoms() 时将名为 updating 的参数设置为 True,则会返回一个 UpdatingAtomGroup 类型的对象。

1
2
3
ag_updating = u.select_atoms("prop x < 5 and prop y < 5 and prop z < 5", updating=True)
ag_updating
## <AtomGroup with 917 atoms, with selection 'prop x < 5 and prop y < 5 and prop z < 5' on the entire Universe.>

它的行为与 AtomGroup 对象完全相同,不同之处在于每次轨迹帧发生变化时,选择表达式都会重新计算(这种重新计算是延迟进行的,只有在访问 UpdatingAtomGroup 对象时才会发生,这样就能避免不必要的重复计算):

1
2
3
4
5
u.trajectory.next()
## < Timestep 1 with unit cell dimensions [ 0. 0. 0. 90. 90. 90.] >

ag_updating
## <AtomGroup with 923 atoms, with selection 'prop x < 5 and prop y < 5 and prop z < 5' on the entire Universe.>

#预先存在的选择和修饰符使用“group”选择关键字,可以依赖于AtomGroup甚至其他UpdatingAtomGroup实例制造更新型选择。同样地,从一个已经处于更新状态的组中创建更新型选择,会导致后续的更新也反映基础组的更新情况:

1
2
3
4
5
6
7
8
9
chained_ag_updating = ag_updating.select_atoms("resid 1:1000", updating=True)
chained_ag_updating
## <AtomGroup with 923 atoms, with selection 'resid 1:1000' on another AtomGroup.>

u.trajectory.next()
## < Timestep 2 with unit cell dimensions [ 0. 0. 0. 90. 90. 90.] >

chained_ag_updating
## <AtomGroup with 921 atoms, with selection 'resid 1:1000' on another AtomGroup.>

最后,对“UpdatingAtomGroup”执行的非更新型选择操作或切片/添加操作将会返回一个静态的“AtomGroup”,该原子组在不同帧中将不再进行更新:

1
2
3
4
5
6
7
8
9
static_ag = ag_updating.select_atoms("resid 1:1000")
static_ag
## <AtomGroup with 921 atoms>

u.trajectory.next()
## < Timestep 3 with unit cell dimensions [ 0. 0. 0. 90. 90. 90.] >

static_ag
## <AtomGroup with 921 atoms>

有序选择

select_atoms() 函数会先根据原子索引对AtomGroup中的原子进行排序,然后再返回这些原子(这样做是为了消除选择过程中可能出现的重复原子)。如果原子的排列顺序至关重要(例如在描述角度或四面体时),或者如果需要重复原子的话,那么就必须将多个原子组进行拼接,而这种拼接操作并不会对原子进行排序。
注意原子顺序

1
2
3
list(u.select_atoms("(resid 3 or resid 2) and name CA"))
## [<Atom 22: CA of type 22 of resname ARG, resid 2 and segid 4AKE>,
## <Atom 46: CA of type 22 of resname ILE, resid 3 and segid 4AKE>]

将两个原子组进行拼接最直接的方法是使用“+”运算符:

1
2
3
4
ordered = u.select_atoms("resid 3 and name CA") + u.select_atoms("resid 2 and name CA")
list(ordered)
## [<Atom 46: CA of type 22 of resname ILE, resid 3 and segid 4AKE>,
## <Atom 22: CA of type 22 of resname ARG, resid 2 and segid 4AKE>]

一种简便的方法是提供两个或多个选择项给 select_atoms() 函数,这样该函数就能自动完成连接操作:

1
2
3
4
ordered = u.select_atoms("resid 3 and name CA", "resid 2 and name CA")
list(ordered)
## [<Atom 46: CA of type 22 of resname ILE, resid 3 and segid 4AKE>,
## <Atom 22: CA of type 22 of resname ARG, resid 2 and segid 4AKE>]

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