layout: post
title: GROMACS选区(selection)语法及用法
categories:


翻译: 陈珂; 修订: 李继存

选区用于选择原子/分子/残基以进行后续分析. 与传统索引(index)文件不同, 选区可以是动态的, 即, 可以对轨迹中的不同帧选择不同的原子. GROMACS手册的第八章《分析》中有一小节对选区进行了简短的介绍, 并给出了一些建议. 当你初次接触选区概念时, 这些建议可帮助你熟悉它. 下面将就选区的技术细节和语法方面给出更加详细的说明.

每个分析工具需要的选区数目各不相同, 对选区的解读也不一样, 但大致意思仍然相同: 每个选区最终都归结为一套位置(a set of position), 位置可以是一些原子的原子位置, 质心, 或几何中心. 分析工具可使用这些位置进行分析, 这样处理时更加灵活. 需要注意的是, 某些分析工具对允许使用的选区种类可能存在限制.

在命令行中指定选区

如果没有在命令行中提供选区, 分析工具会提示你交互式地输入选区(对大多数工具而言, 在这种情况下也可以用管道提供选区). 尽管测试时这样做很方便, 但当选区很复杂, 或使用脚本时, 在命令行中提供选区更为容易.

每个工具用于指定选区的命令行参数都不一样(参见每个工具的帮助文档). 你可以传递包含所有选区的一个单一字符串(以分号分隔), 或多个字符串, 每个字符串包含一个选区. 注意你需要将选区用引号引起来, 以防止shell对它们进行转换.

如果你设置了一个选区命令行参数, 但没有提供任何选区, 分析工具会提示你交互式地为该参数输入选区. 当选区命令行参数可选时, 这一作法很有用, 因为在这种情况下工具通常不会给出输入提示.

要使用一个文件提供选区, 可以在为选区参数提供的选区处使用-sf file.dat(例如-select -sf file.dat). 通常情况下, -sf参数从所提供的文件中读取选区, 并将它们赋值给所有已设置但尚未指定选区的选区参数. 有一种特殊情况是, -sf单独给出, 而没有前置的选区参数, 这时-sf会把选区赋值给所有(尚未设置)的必需选区参数(即, 那些如果没有从命令行得到选区, 就会给出交互式提示的选区参数).

要使用传统索引文件中的组(group), 可以使用参数-n提供一个文件. 组的使用方法可参见《语法》小节. 如果没有提供此选项, 就会生成默认组. 默认组的生成逻辑与非选区工具中的相同.

根据分析工具的不同, 可能会有两个额外的命令行参数供使用, 以控制分析工具行为:

关于这些选项的更多信息, 参见《位置》小节.

选区语法

一套选区由一个或多个选区组成, 彼此以分号分隔. 每个选区定义了一套位置用于分析. 每个选区也可以用一个前置字符串进行命名, 以便在某些环境, 如图例中使用名称. 如果没有提供名称, 则会自动以描述选区的字符串作为名称.

在交互式输入中, 语法稍有不同: 换行符也可用以分隔选区. 如果需要, 可使用\后接换行符来续行. 注意上述作法仅能用于真正的交互式输入, 而不适用于通过其他渠道, 比如管道, 提供选区的情况.

用户可以使用变量存储选区表达式. 定义变量的语法如下:

VARNAME = EXPR ;

其中EXPR可以是任何合法的选区表达式. 定义后, 在任何EXPR合法的地方都可以使用VARNAME.

选区包含三种主要的表达式类型: 定义原子的(ATOM_EXPR), 定义位置的(POS_EXPR), 以及归结为数值的(NUM_EXPR). 每个选区应是一个POS_EXPR或一个ATOM_EXPR(后者会自动转换为位置). 基本规则如下:

某些关键词基于字符串的值, 比如原子名称, 来选中原子. 对这些关键词, 用户可以使用通配符(如name "C*")或正则表达式(如resname "R[AB]"). 匹配类型会自动由字符串进行猜测: 如果它包含除字母, 数字, *?以外的字符, 就被视为一个正则表达式. 要强制使用字符串的字面内容进行匹配, 可以使用name = "C*"来匹配字面的C*. 要强制使用其他匹配类型, 可以分别用?~取代=, 这样就可以强制使用通配符或正则表达式进行匹配.

包含非字母数字符号的字符串应该用双引号引起来, 像示例中那样. 对于其他字符串, 双引号是可选的, 但如果字符串的值与保留关键词冲突, 会导致语法错误. 如果你的字符串包含大写字母, 这就不该发生.

由命令行选项-n提供或默认生成的索引组都可以使用group NRgroup NAME进行引用, 其中NR为该组以零开始计数的索引号, NAME为该组名称的一部分. 如果整个选区都由一个索引组提供, 关键词group是可选的. 在交互模式下, 在行首按下回车键可以查看到可用组的列表.

在选区中指定位置

用于在选区中指定位置的方法有:

  1. 常量位置可用[XX, YY, ZZ]定义, 其中XX, YYZZ为实数.
  2. com of ATOM_EXPR [pbc]cog of ATOM_EXPR [pbc]计算ATOM_EXPR的质心/几何中心. 如果指定了pbc, 会迭代地计算中心以应对ATOM_EXPR沿周期性边界条件折叠的情况.
  3. POSTYPE of ATOM_EXPRATOM_EXPR中的原子计算指定的位置. POSTYPE可以是atom, res_com, res_cog, mol_commol_cog, 还可使用可选的前缀whole_, part_dyn_. whole_计算整个残基/分子的中心, 即使它只有一部分被选中. part_前缀计算选中原子的中心, 但对同一残基/分子总是使用相同的原子. 所使用的原子从选区允许的最大组中确定. dyn_严格地只计算选中原子的中心. 如果没有指定前缀, 整个选区默认为part_, 而其他地方则默认为whole_. 后者通常适用于在不同工具中选中相同的分子, 而前者是速度与直觉行为的折衷(求值时dyn_位置会慢于part_).
  4. 对整个选区给出的ATOM_EXPR, 将如上面第3条那样进行处理, 并使用命令行参数-seltype指定的位置类型.

基于位置选择原子的选区关键词, 比如dist from, 默认使用命令行选项-selrpos定义的位置. 可以通过在关键词前面添加POSTYPE限定符来改变这一行为. 例如, res_com dist from POS求值为残基质心的距离. 在这个例子中, 基于计算出来的单个距离值, 一个残基中的所有原子将同时被选中或不被选中.

选区中的算术表达式

选区的数值表达式中支持基本的算术求值. 支持的操作有加, 减, 负, 乘, 除和幂(使用^). 除以零或其他非法操作的结果未定义.

选区关键词(keyword)

以下为当前可用的选区关键词. 带加号标记的关键词会有一小节KEYWORD提供额外的帮助信息, 其中KEYWORD为该关键词的名字.

##

name
pdbname
atomname
pdbatomname

这些关键词通过名称选中原子, name选中使用GROMACS原子命名约定的原子. 对于除PDB以外的输入文件格式, 原子名称严格按照它们在输入文件中出现的形式匹配. 对于PDB文件, 处理以数字开头的4字符原子名称时, 会先把数字移到末尾再进行匹配(例如, 要匹配PDB文件中的3HG2, 应使用name HG23). pdbname只能用于PDB输入文件, 并基于输入文件中给出的精确名称选中原子, 不会进行上述的转换.

atomnamepdbatomname是以上两个关键词的同义词.

##

distance from POS [cutoff REAL]
mindistance from POS_EXPR [cutoff REAL]
within REAL of POS_EXPR

distancemindistance计算到给定位置的距离, 唯一的区别是distance只接受单个位置, 而mindistance可接受任意数目的位置, 然后计算到最近位置的距离. within直接选中到POS_EXPR的距离处于REAL之内的原子.

对前两个关键词, 可以指定截断距离以加速求值: 所有大于指定截断值距离的返回值都等于截断值.

##

insolidangle center POS span POS_EXPR [cutoff REAL]

此关键词选中从POS(一个求值为单个位置的位置表达式)看去, 处于POS_EXPR中任意位置的REAL度(默认为5度)之内的原子, 即, 在以POS为中心, 由POS_EXPR中的位置张成的立体角之内的原子.

技术上, 立体角是一些小圆锥体的合集. 这些小圆锥体的顶点位于POS, 轴线穿过POS_EXPR中的一个点. 对POS_EXPR中的每一位置都有这样一个圆锥体. 如果某点处于这些圆锥体的任意一个之内, 它就处于这个立体角中. cutoff值决定了圆锥的宽度.

【陈珂 注】此段第一句原文为: This keyword selects atoms that are within REAL degrees (default=5) of any position in POS_EXPR as seen from POS (a position expression that evaluates to a single position). 上面的翻译未必准确, 容易使人误解为只有POS_EXPR内的原子才会被选中. 从下文的技术性解释来看, POS_EXPR中的原子只用于确定每个小圆锥的轴线, 而落在任意一个小圆锥内的原子都会被选中. 所以POS_EXPR确定的并不是待选原子的范围, 而是立体角的轴线位置.

##

POSEXPR merge POSEXPR [stride INT]
POSEXPR merge POSEXPR [merge POSEXPR ...]
POSEXPR plus POSEXPR [plus POSEXPR ...]

基本选区关键词只能创建每个原子至多出现一次的选区. mergeplus选区关键词可用于绕开这一限制. 二者创建的选区可以包含所有给定位置表达式中的位置, 即使其中有重复. 二者的差别在于, merge接受两个或以上, 所含位置个数相同的选区, 其输出包含从各选区中依次选出的输入位置, 即, 其输出类似于A1 B1 A2 B2并依此类推. 大小不等的选区也可以使用merge, 只要第一个选区的大小是第二个的整数倍. stride参数可用于显式地指定这个倍数. plus简单地把位置合并在一起, 也能用于大小不等的选区. 这些关键词只在选区级别合法, 不能用于任何子表达式.

##

permute P1 ... PN

默认情况下, 所有选区求值的返回形式为递增排序的原子索引. 可通过在表达式后面添加permute P1 P2 ... PN来改变这种行为. 所有Pi应形成数字1到N的一个排列. 这个关键词对选区中每个包含N个位置的位置块进行排列, 这样位置块中的第i个位置会变为第Pi个. 注意排列的是位置而不是单个原子. 如果选区的大小不是n的整数倍, 会导致致命错误. 只能对整个选区表达式进行排列, 而不能用于任何子表达式, 即, 关键词permute应出现在选区的最后.

##

same KEYWORD as ATOM_EXPR

关键词same可用于选中给定KEYWORD匹配ATOM_EXPR中任意原子的所有原子. 支持求值为整数或字符串值的关键词.

选区求值和优化

逻辑求值从左向右进行并使用短路规则, 即, 一旦知道了某一原子被选中与否, 就根本不会对剩余的表达式进行求值. 这个特性可用于优化选区: 在逻辑表达式中, 你应该首先写出最严格和/或最不耗时的表达式. 动态和静态表达式之间的相对顺序是无关紧要的: 所有静态表达式只在第一帧之前求值一次, 其结果将成为最左边的表达式.

优化的另一个要点是公用子表达式: 它们不会被自动识别, 但可通过使用变量手动优化. 对于复杂的选区, 这会对性能产生非常大的影响, 尤其是当你像这样定义了几个索引组的时候:

rdist = distance from com of resnr 1 to 5;
resname RES and rdist < 2;
resname RES and rdist < 4;
resname RES and rdist < 6;

如果不设置变量, 这些距离会计算三次, 尽管在各个选区中它们完全一样. 任何赋值给变量的内容都会成为公用子表达式, 在一帧内只求解一次. 目前, 在某些情况下, 使用变量实际上会导致轻微的性能损失, 因为需要进行检查以确定表达式已经对哪些原子进行过求值, 但这应该不是大的问题.

选区的限制

选区示例

以下, 给出不同类型选区使用方法的示例.