3. 选择命令
一旦你有了 Universe()
对象,您可以选择原子(使用非常类似于 CHARMM's atom selection syntax ):
>>> kalp = universe.select_atoms("segid KALP")
这个 select_atoms()
A的方法 AtomGroup
或者是 Universe
返回一个 AtomGroup
,因此您可以在它们上使用为原子组定义的所有方法。所选内容始终返回 AtomGroup
根据原子在拓扑中的索引进行排序(这是为了确保不会有任何重复,这可能会在复杂的选择中发生)。
可以使用圆括号对子选择进行分组::
>>> universe.select_atoms("segid DMPC and not (name H* or type OW)")
<AtomGroup with 3420 atoms>
几乎所有基本的CHARMM选择都有效。
也可以借助导出外部软件包的选项 选择导出器 。
备注
默认情况下,原子在输出原子组中按索引排序。例如,以下代码将返回中的第一、第二和第六个原子 ag
::
>>> ag = u.select_atoms("name N")
>>> ag2 = ag[[5, 1, 0]]
>>> ag3 = ag2.select_atoms("name N")
>>> np.all(ag3.ix == ag2.ix)
False
属性关闭排序行为。 sorted
关键词::
>>> ag = u.select_atoms("name N")
>>> ag2 = ag[[5, 1, 0]]
>>> ag3 = ag2.select_atoms("name N", sorted=False)
>>> np.all(ag3.ix == ag2.ix)
True
有关有序选择的更多详细信息,请参见 有序选择 。
3.1. 选择关键字
下面描述选择解析器当前理解的所有选择关键字。以下内容适用于所有选择:
关键字区分大小写。
原子在生成的选择中自动按顺序排序(请参阅下面的注释 有序选择 关于如何在必要时规避这一点)。
所选内容从左到右进行解析,括号可用于分组。
您可以使用任何拓扑属性的单一名称作为选择关键字。 Defined topology attributes 在《用户指南》中列出。或者,您可以定义一个
TopologyAttr
您自己,只要该属性dtype
是其中之一int
,float
,str
(或object
),或bool
。但是,拓扑必须包含此属性信息才能使选择生效。选择整型或浮点型属性可以使用语法“myTopologyAttr 0-2”、“myTopologyAttr 0:2”或“myTopologyAttr 0 to 2”来选择两端都包括在内的范围。允许使用空格和负数。
“myTopologyAttr 0”可用于选择与该值匹配的所有原子;但是,由于精度差异,这对于浮点数来说可能比较棘手,我们建议尽可能使用类似上面的范围。
布尔选择缺省为True,因此“myTopologyAttr”和“myTopologyAttr True”都给所有原子
myTopologyAttr == True
。
参见
正则表达式模式 FLOAT_PATTERN
用于匹配浮点数; INT_PATTERN
用于匹配整数;以及 RANGE_PATTERN
用于匹配选择范围。
3.1.1. 简单选择
以下是可用选择关键字的非详尽列表。如上面的点所示,将为任何合适的关键字自动生成 TopologyAttr
。一份名单 Defined topology attributes 在《用户指南》中提供。
- 蛋白质、骨架、核骨架、核骨架
选择属于一组标准残基的所有原子;蛋白质通过一组硬编码的残基名称来标识,因此它可能不适用于深奥的残基。
- 塞吉德 seg-name
按segid选择(如拓扑中所示),例如
segid 4AKE
或segid DMPC
- 残存 residue-number-range
RESID可以接受单个残数或一系列数字。范围由两个用冒号(包括)分隔的数字组成,例如
resid 1:5
。残数(“REID”)直接取自拓扑。- 重新编号 resnum-number-range
Resnum是典型的残基编号;通常它被设置为原始PDB结构中的残基id。
- 重命名 residue-name
按残留物名称选择,例如
resname LYS
- 名字 atom-name
按原子名称选择(如拓扑图中所示)。通常,这是由力场决定的。示例:
name CA
(对于C&α;原子)或name OW
(适用于SPC水氧)- 类型 atom-type
按原子类型选择;这可以是字符串或数字,取决于力场;它是从拓扑文件中读取的(例如,CHARMM PSF文件包含数字原子类型)。当PDB或GRO文件用作拓扑时,它具有无意义的值。
- atom seg-name residue-number atom-name
一种用于单个原子的选择器,该选择器由segid残留原子名组成,例如
DMPC 1 C2
选择DMPC片段的第一个残基的C2碳- AltLoc alternative-location
对于有替代位置的原子的选择,这通常是高分辨率晶体结构的情况,例如
resid 4 and resname ALA and altLoc B
仅选择具有altLoc B记录的Ala-4原子。- 链ID chain-name
已定义了chainID的原子的选择。
- 元素 element-name
对已定义元素的原子的选择。例如:
element H C
- 摩尔型 molecule-type
按分子类型选择,例如
moltype Protein_A
。目前,只有TPR格式定义了分子类型。- 聪明人 SMARTS-query
使用Daylight的Smarts查询选择原子,例如
smarts [#7;R]
找到环中的氮原子。需要RDKit。所有匹配项都组合为单个唯一匹配项。这个 smarts selection accepts two sets of key word arguments from select_atoms(): therdkit_kwargs
are passed internally to RDKitConverter.convert() and thesmarts_kwargs
are passed to RDKit's GetSubstructMatches 。默认情况下, useChirality Kwarg inrdkit_kwargs
被设置为True,并且在smarts_kwargs
是max(1000, 10 * n_atoms)
,在哪里n_atoms
要么是len(AtomGroup)
或len(Universe.atoms)
,以适用者为准。请注意,匹配的数量有时可能会超过MaxMatches的缺省值,从而导致返回的原子太少。如果发生这种情况,将发出警告。可以通过增加MaxMatches的值来修复该问题。此行为可能会在将来更新- 手性 R|S
选择特定的立体中心。例如:
name C and chirality S
只选择S-手性碳原子。仅限R
和S
将是可能的选项,但其他值不会引发错误。- 正式收费 formal-charge
根据原子的形式电荷选择原子,例如
name O and formalcharge -1
选择所有带负1正式电荷的氧。
3.1.2. 模式匹配
下面描述的模式匹配表示法用于指定匹配字符串的模式(基于 fnmatch
):
?
是与任何单个字符匹配的模式。例如,
resname T?R
选择名为“TYR”和“Thr”的残基。*
是将匹配多个字符的模式。例如,
GL*
选择所有以“GL”开头的字符串,如“GLU”、“GLY”、“GLX29”、“GLN”。[seq]
将与序号中的任何字符匹配。例如,“重新命名GL [NY] 选择所有名为“GLN”或“GLY”的残基,但不选择“GLU”。
[!seq]
将匹配不在序列中的任何字符。例如,“重新命名GL [!NY] 将与名为“GLU”的残基匹配,但与“GLN”或“GLY”不匹配。
3.1.3. 布尔值
- 不
所有不在选择中的原子,例如
not protein
选择不是蛋白质一部分的所有原子- 和,或者
根据布尔代数的规则组合两个选项,例如
protein and not (resname ALA or resname LYS)
选择属于蛋白质但不在赖氨酸或丙氨酸残基中的所有原子
3.1.4. 几何学
- around distance selection
选择与另一个选择相隔一定界限的所有原子,例如
around 3.5 protein
选择所有不属于蛋白质的原子,这些原子与蛋白质的距离不超过3.5埃- sphlayer innerRadius externalRadius selection
选择以给定选择的几何中心(COG)为中心的球状层内的所有原子,例如,
sphlayer 2.4 6.0 ( protein and ( resid 130 or resid 80 ) )
选择蛋白质的几何体中心,剩余130、剩余80,并围绕COG创建内半径为2.4、外半径为6.0的球状层。- sphzone externalRadius selection
选择以给定选择的几何中心(COG)为中心的球形区域内的所有原子,例如
sphzone 6.0 ( protein and ( resid 130 or resid 80 ) )
选择蛋白质的几何体中心,分别为130和80,并围绕COG创建半径为6.0的球体。- isolayer inner radius outer radius selection
类似于sphlayer,但将在所有引用的原子周围找到层。例如,如果选择了聚合物主链的原子类型,则将生成平行于主链的等价层。作为另一个例子,如果选择一组离子作为分离第二水化层的参照物,则它们将全部包括在同一组中。然而,如果一个分子处于一个离子的第二水合层和另一个离子的第一水合层,这些原子将不被包括在内。
- cylayer innerRadius externalRadius zMax zMin selection
选择以给定选择的几何中心(COG)为中心的圆柱层内的所有原子,例如
cylayer 5 10 10 -8 protein
选择蛋白质的几何体中心,并以COG为中心创建内半径为5、外半径为10的圆柱层。在z中,圆柱体从COG上方的10延伸到下方的8。的正值 zMin ,或负面的 zMax ,是允许的。- cyzone externalRadius zMax zMin selection
选择以给定选择的几何中心(COG)为中心的圆柱形区域内的所有原子,例如
cyzone 15 4 -8 protein and resid 42
选择蛋白质的几何中心和残留物42,并创建以COG为中心、外径为15的圆柱体。在z中,圆柱体从COG上方的4延伸到下方的8。的正值 zMin ,或负面的 zMax ,是允许的。在 0.10.0 版本发生变更: 关键词 赛隆 和 环状物 现在拿着 zMax 和 zMin 相对于……的COG 选择 ,而不是框中的绝对z值。
- point x y z distance
选择空间点截止点内的所有原子,确保坐标由空格分隔,例如
point 5.0 5.0 5.0 3.5
选择坐标(5.0、5.0、5.0)3.5埃范围内的所有原子- prop [abs] property operator value
selects atoms based on position, using property x, y, or z coordinate. Supports the abs keyword (for absolute value) and the following operators: <, >, <=, >=, ==, !=. For example,
prop z >= 5.0
selects all atoms with z coordinate greater than 5.0;prop abs z <= 5.0
selects all atoms within -5.0 <= z <= 5.0.
备注
默认周期 is 与几何选择一起考虑,即选择将找到处于不同周期图像中的原子。要控制此行为,请使用布尔值 "periodic"
的关键字参数 select_atoms()
。
3.1.5. 相似性和连通性
- 相同 子关键字 作为 选择
选择所有具有相同 子关键字 值为中的任意原子 选择 。允许 子关键字 值是原子属性:
name, type, resname, resid, segid, mass, charge, radius, bfactor, resnum
,原子所属的基团:residue, segment, fragment
,以及原子坐标x, y, z
。- 拜尔斯 选择
选择相同片段和残基中的所有原子作为选择,例如在Byres关键字后指定部分选择。
byres
是一条捷径same residue as
- 捆绑在一起的 选择
选择与选择绑定的所有原子,例如:
select name H and bonded name O
只选择与氧基键相连的氢
3.1.6. 索引
- 拜纳姆 index-range
选择(基于1的)包含索引范围内的所有原子,例如
bynum 1
选择宇宙中的第一个原子;bynum 5:10
选择原子5到10(包括5和10)。原子中的所有原子MDAnalysis.Universe
是连续编号的,并且索引从1到原子总数。- ID号 index-range
选择(基于1的)包含索引范围内的所有原子,例如
id 1
选择所有id为1的原子;id 5:7
选择ID为5的所有原子、ID为6的所有原子和ID为7的所有原子。- 索引 index-range
选择(从0开始)包含索引范围内的所有原子,例如
index 0
选择宇宙中的第一个原子;index 5:10
选择原子6到11(包括6和11)。原子中的所有原子MDAnalysis.Universe
是连续编号的,并且索引从0到原子总数-1。
备注
按照惯例, id
对应于PDB格式的序列号。与之形成鲜明对比的是 bynum
,即 id
拓扑属性不一定是连续的、有序的或唯一的,并且可以由用户任意分配。
3.1.7. 预先存在的选择和修改器
- 组 group-name
选择元素中的原子
AtomGroup
作为名为的参数传递给函数 group-name 。只有原子间共有的 group-name 和实例select_atoms()
从Will中调用,除非group
在前面有global
关键字。 group-name 将仅通过比较原子索引而被包括在解析中。这意味着要由用户来确保 group-name 组是在适当的Universe
。- 全球 选择
默认情况下,在发出
select_atoms()
从一个AtomGroup
,则返回与该实例的原子相交的选择和子选择。为选择项添加前缀global
使其所选内容全部返回。作为一个例子,global
关键字允许lipids.select_atoms("around 10 global protein")
-在哪里lipids
是一个不含任何蛋白质的基团。是global
否则,结果将是空的选择,因为protein
部分选择本身将为空。在发布时select_atoms()
从一个Universe
,global
被忽略。
在 1.0.0 版本发生变更: 这个 fullgroup
所选内容现已删除。请使用等价物 global group
选择。
3.2. 动态选择
默认情况下, select_atoms()
返回一个 AtomGroup
,其中原子列表在轨迹帧变化中是恒定的。如果 select_atoms()
使用命名参数调用 updating
设置为 True
,一个 UpdatingAtomGroup
实例将改为返回。它的行为就像 AtomGroup
对象,不同之处在于每次轨迹帧更改时都会重新计算选择表达式(这会延迟地发生,只有当 UpdatingAtomGroup
对象被访问,因此不会进行冗余更新)::
# A dynamic selection of corner atoms:
>>> ag_updating = universe.select_atoms("prop x < 5 and prop y < 5 and prop z < 5", updating=True)
>>> ag_updating
<UpdatingAtomGroup with 9 atoms>
>>> universe.trajectory.next()
>>> ag_updating
<UpdatingAtomGroup with 14 atoms>
使用 group
的选择关键字 preexisting-selections ,可以使更新选择依赖于 AtomGroup
,甚至是其他 UpdatingAtomGroup
、实例。同样,从已更新的组中进行更新选择将导致以后的更新也反映基本组的更新:
>>> chained_ag_updating = ag_updating.select_atoms("resid 1:1000", updating=True)
>>> chained_ag_updating
<UpdatingAtomGroup with 3 atoms>
>>> universe.trajectory.next()
>>> chained_ag_updating
<UpdatingAtomGroup with 7 atoms>
最后,未更新的选择或对 UpdatingAtomGroup
将返回一个静态的 AtomGroup
,将不再跨帧更新::
>>> static_ag = ag_updating.select_atoms("resid 1:1000")
>>> static_ag
<UpdatingAtomGroup with 3 atoms>
>>> universe.trajectory.next()
>>> static_ag
<UpdatingAtomGroup with 3 atoms>
3.3. 有序选择
select_atoms()
中的原子进行排序。 AtomGroup
在返回它们之前按原子索引(这是为了消除选择中可能的重复项)。如果原子的顺序很重要(例如,在描述角度或二面体时),或者如果需要重复的原子,则必须连接多个原子组,这不会对它们进行排序。
连接两个原子组的最直接方法是使用 +
操作员::
>>> ordered = u.select_atoms("segid DMPC and resid 3 and name P") + u.select_atoms("segid DMPC and resid 2 and name P")
>>> print(list(ordered))
[< Atom 570: name 'P' of type '180' of resid 'DMPC', 3 and 'DMPC'>,
< Atom 452: name 'P' of type '180' of resid 'DMPC', 2 and 'DMPC'>]
一种捷径是提供 两个或两个以上 要选择的内容 select_atoms()
,然后自动执行串联::
>>> print(list(universe.select_atoms("segid DMPC and resid 3 and name P", "segid DMPC and resid 2 and name P")))
[< Atom 570: name 'P' of type '180' of resid 'DMPC', 3 and 'DMPC'>,
< Atom 452: name 'P' of type '180' of resid 'DMPC', 2 and 'DMPC'>]
仅供比较,以显示单个选择字符串并不像人们预期的那样工作::
# WRONG!
>>> print(list(universe.select_atoms("segid DMPC and (resid 3 or resid 2) and name P")))
[< Atom 452: name 'P' of type '180' of resid 'DMPC', 2 and 'DMPC'>,
< Atom 570: name 'P' of type '180' of resid 'DMPC', 3 and 'DMPC'>]