MDAnalysis中文教程-Selections
原子选择语句
可以通过使用 MDAnalysis 原子选择语言选择原子来创建 AtomGroups:
1 | import MDAnalysis as mda |
AtomGroup 或 Universe 的select_atoms()方法都返回一个AtomGruop。这两种方法具有不同的行为:Universe.select_atoms对universe中的所有原子进行作用,而AtomGroup.select_atoms仅对原始 AtomGroup 内的原子进行作用。单个选择短语总是返回一个AtomGroup,原子根据拓扑中的index 进行排序。这是为了确保没有任何重复项,这可能发生在复杂的选择中。当顺序很重要时,您可以传入多个短语。
此页面记录了选择关键字及其参数。select_atoms还接受修改选择字符串和结果AtomGroup行为的关键字(本页后面记录)。例如,您可以:
- 传入命名的AtomGroup作为参数
1 | sph_6 = u.select_atoms("sphzone 6 protein") |
- 为几何关键词关闭周期性边界条件: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(
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 | ag_updating = u.select_atoms("prop x < 5 and prop y < 5 and prop z < 5", updating=True) |
它的行为与 AtomGroup 对象完全相同,不同之处在于每次轨迹帧发生变化时,选择表达式都会重新计算(这种重新计算是延迟进行的,只有在访问 UpdatingAtomGroup 对象时才会发生,这样就能避免不必要的重复计算):
1 | u.trajectory.next() |
对#预先存在的选择和修饰符使用“group”选择关键字,可以依赖于AtomGroup甚至其他UpdatingAtomGroup实例制造更新型选择。同样地,从一个已经处于更新状态的组中创建更新型选择,会导致后续的更新也反映基础组的更新情况:
1 | chained_ag_updating = ag_updating.select_atoms("resid 1:1000", updating=True) |
最后,对“UpdatingAtomGroup”执行的非更新型选择操作或切片/添加操作将会返回一个静态的“AtomGroup”,该原子组在不同帧中将不再进行更新:
1 | static_ag = ag_updating.select_atoms("resid 1:1000") |
有序选择
select_atoms() 函数会先根据原子索引对AtomGroup中的原子进行排序,然后再返回这些原子(这样做是为了消除选择过程中可能出现的重复原子)。如果原子的排列顺序至关重要(例如在描述角度或四面体时),或者如果需要重复原子的话,那么就必须将多个原子组进行拼接,而这种拼接操作并不会对原子进行排序。
注意原子顺序
1 | list(u.select_atoms("(resid 3 or resid 2) and name CA")) |
将两个原子组进行拼接最直接的方法是使用“+”运算符:
1 | ordered = u.select_atoms("resid 3 and name CA") + u.select_atoms("resid 2 and name CA") |
一种简便的方法是提供两个或多个选择项给 select_atoms() 函数,这样该函数就能自动完成连接操作:
1 | ordered = u.select_atoms("resid 3 and name CA", "resid 2 and name CA") |