整理来源:Jerkwin《GROMACS 选区 (selection) 语法及用法》
原文:https://jerkwin.github.io/GMX/GMXsel/
参考校对:GROMACS 2026.3 官方文档 Selection syntax and usage
https://manual.gromacs.org/current/onlinehelp/selections.html
这一节先给最常用、最容易复制的 selection。初学时可以先不管完整语法,把这些例子当作模板改名字、改链 ID、改残基名即可。
| 目标 | selection 写法 | 说明 |
|---|---|---|
| 选择 A 链 | chain A |
常用于 PDB/mmCIF 中有链 ID 的体系 |
| 选择 B 链 | chain B |
把 B 换成自己的链 ID |
| 选择残基名为 LIG 的小分子 | resname LIG |
LIG 要换成实际配体残基名 |
| 选择所有蛋白 | group "Protein" |
依赖 GROMACS/index 中已有 Protein 组 |
| 选择所有蛋白原子 | protein |
如果当前工具/版本支持该内置选择,可直接用 |
| 选择所有 RNA | group "RNA" |
如果 index 中已有 RNA 组,推荐这样写 |
| 按常见 RNA 残基名选择 RNA | resname A U G C RA RU RG RC |
不同力场/文件命名可能不同 |
| 选择所有 DNA/RNA 核酸 |
group "DNA" 或 group "RNA"
|
取决于 index 组是否存在 |
| 选择蛋白骨架 | group "Backbone" |
依赖已有 Backbone 组 |
| 不依赖 index 选择蛋白骨架 | group "Protein" and name N CA C O |
常用骨架原子;必要时可加 OXT
|
| 选择蛋白 A 链骨架 | chain A and group "Protein" and name N CA C O |
链、蛋白、原子名三重条件 |
| 选择水 | resname SOL |
GROMACS 常见水名是 SOL
|
| 选择其他常见水命名 | resname SOL WAT HOH TIP3 |
根据体系实际命名选择 |
| 选择离子 | group "Ion" |
如果 index 中已有 Ion 组,最方便 |
| 选择常见钠钾氯离子 | resname NA K CL |
命名可能是 NA+、CLA、CL- 等,需看结构文件 |
| 选择水和离子 | group "Water_and_ions" |
如果 index 中已有该组,推荐 |
| 不依赖 index 选择水和常见离子 | resname SOL WAT HOH TIP3 NA K CL |
实际残基名按体系调整 |
| 排除水和离子 | not group "Water_and_ions" |
常用于只分析溶质 |
| 选择 C-alpha 原子 | group "Protein" and name CA |
常用于蛋白结构分析 |
| 选择蛋白重原子 | group "Protein" and not name H* |
按原子名排除氢,命名规则需确认 |
| 选择配体附近 0.5 nm 内的蛋白原子 | group "Protein" and within 0.5 of resname LIG |
动态邻近选择 |
| 选择配体附近 0.5 nm 内的完整蛋白残基 | group "Protein" and same residue as within 0.5 of resname LIG |
比只选邻近原子更适合看结合口袋 |
几个小提醒:
resname LIG 里的 LIG 是残基名,不是文件名。可以先用可视化软件或 .gro/.pdb 文件确认真实残基名。group "Protein"、group "Backbone"、group "Water_and_ions" 依赖 index 组是否存在;如果报错,就用 gmx make_ndx 生成,或改用不依赖 index 的写法。在 GROMACS 里,selection 用来选择原子、残基、分子或它们的几何位置,以便后续分析工具使用。
它和传统的 index 文件不完全一样:
| 方式 | 特点 | 适合场景 |
|---|---|---|
| index group | 通常是静态分组 | 简单、固定的原子集合 |
| selection | 可以按表达式动态选择 | 距离、坐标、残基、质心等复杂条件 |
selection 最后会被求值为一组位置。这些位置可以是:
很多分析命令,例如 gmx distance、gmx select、gmx gangle,都可以使用 selection。
假设你想选择所有距离蛋白 0.5 nm 以内的配体 LIG 原子,可以写:
gmx select -s topol.tpr -f traj.xtc -select '"Close to protein" resname LIG and within 0.5 of group "Protein"'
这个 selection 可以拆成四部分:
"Close to protein" resname LIG and within 0.5 of group "Protein"
| 部分 | 作用 |
|---|---|
"Close to protein" |
给这个选区起名字 |
resname LIG |
选择残基名为 LIG 的原子 |
and |
逻辑与 |
within 0.5 of group "Protein" |
限制这些原子必须距离 Protein 组 0.5 nm 以内 |
这就是 selection 的核心思想:用一条可读的表达式,把“我要选什么”直接写出来。
flowchart LR
A["输入结构/轨迹"] --> B["读取 selection 表达式"]
B --> C["解析 atom / position / numeric 表达式"]
C --> D["逐帧求值"]
D --> E["得到一组位置"]
E --> F["交给分析工具"]
如果表达式依赖坐标,例如 within、distance、x < 2,它可以在轨迹每一帧重新计算,因此结果可能随时间变化。
多数工具会有类似 -select 的参数。不同工具的参数名可能不同,具体要看命令帮助:
gmx help select
gmx help distance
gmx help gangle
一个命令里可以传入一个或多个 selection。多个 selection 可以用分号分隔:
gmx select -s topol.tpr -f traj.xtc -select 'resname SOL and name OW; resname LIG'
注意:selection 通常要加引号,避免 shell 把括号、星号、空格等字符提前解释掉。
如果 selection 很长,建议写进文件,例如 selection.dat:
"Water oxygens" resname SOL and name OW;
"Ligand near protein" resname LIG and within 0.5 of group "Protein";
然后运行:
gmx select -s topol.tpr -f traj.xtc -select -sf selection.dat
如果你已经有传统 index 文件,可以用 -n 传入:
gmx select -s topol.tpr -f traj.xtc -n index.ndx -select 'group "Protein"'
index 组可以通过两种方式引用:
group 1
group "Protein"
如果整个 selection 就是一个 index 组,group 关键词在某些交互场景下可以省略。
GROMACS selection 里最重要的是理解三种表达式:
| 类型 | 含义 | 例子 |
|---|---|---|
ATOM_EXPR |
选出一组原子 | resname SOL and name OW |
POS_EXPR |
得到一组位置 | com of group "Protein" |
NUM_EXPR |
得到数值 | x of cog of resname LIG |
一般来说,一个完整 selection 应该是 ATOM_EXPR 或 POS_EXPR。如果写的是原子表达式,GROMACS 会按默认位置类型把它转换成位置。
选择所有水氧:
resname SOL and name OW
选择所有蛋白 C-alpha 原子:
group "Protein" and name CA
选择残基名为 LIG 的配体:
resname LIG
常用关键词:
| 关键词 | 含义 |
|---|---|
name / atomname
|
按 GROMACS 原子名选择 |
pdbname / pdbatomname
|
按 PDB 文件中的原始原子名选择 |
resname |
按残基名选择 |
atomtype / type
|
按原子类型选择 |
chain |
按链 ID 选择 |
注意:如果输入是 PDB 文件,GROMACS 可能会转换以数字开头的 4 字符原子名。例如 PDB 中的 3HG2 可能需要用 name HG23 匹配。如果想按 PDB 原始名字匹配,使用 pdbname。
选择原子编号 1 到 5,以及 7 和 9:
atomnr 1 to 5 7 9
选择残基编号 1 到 5 和 10:
resnr 1 to 5 10
常用整数关键词:
| 关键词 | 含义 |
|---|---|
atomnr |
原子编号 |
resnr / resid
|
残基编号 |
resindex / residue
|
残基索引 |
molindex / mol / molecule
|
分子索引 |
selection 可以用逻辑运算组合:
resname SOL and name OW
resname LIG or resname ATP
not resname SOL
复杂表达式建议加括号:
(resname LIG or resname ATP) and within 0.5 of group "Protein"
逻辑表达式会从左到右求值,并有短路行为。因此,把便宜、严格的条件放前面通常更高效:
resname LIG and within 0.5 of group "Protein"
比先做全体系距离判断再筛 LIG 更直观,也往往更快。
按名称选择时,可以使用普通字符串:
name CA
也可以使用通配符:
name "C*"
还可以使用正则表达式:
resname "R[AB]"
GROMACS 会根据字符串内容自动猜测匹配类型。如果想强制某种匹配方式,可以用:
| 写法 | 含义 |
|---|---|
name = "C*" |
按字面量匹配 C*
|
name ? "C*" |
强制通配符匹配 |
name ~ "C[0-9]+" |
强制正则匹配 |
包含特殊字符、空格或可能和关键词冲突的字符串,建议始终加双引号。
选择距离蛋白 0.5 nm 以内的配体原子:
resname LIG and within 0.5 of group "Protein"
选择距离固定坐标 [1.2, 3.1, 2.4] 超过 1 nm 的所有原子:
not within 1 of [1.2, 3.1, 2.4]
distance from POS 计算到单个位置的距离:
distance from com of group "Protein"
mindistance from POS_EXPR 计算到一组位置中最近一个位置的距离:
mindistance from group "Protein"
如果要提高计算效率,可以给距离关键词加 cutoff:
distance from com of group "Protein" cutoff 2.0
距离超过 cutoff 的结果会被截断为 cutoff,适合只关心某个范围内的判断。
selection 不一定只选原子,也可以选“位置”。
[1.2, 3.1, 2.4]
表示一个固定三维坐标。
蛋白质质心:
com of group "Protein"
配体几何中心:
cog of resname LIG
如果分子跨周期性边界,可以加 pbc:
com of group "Protein" pbc
| 写法 | 含义 |
|---|---|
atom |
原子位置 |
res_com |
每个残基的质心 |
res_cog |
每个残基的几何中心 |
mol_com |
每个分子的质心 |
mol_cog |
每个分子的几何中心 |
例如,残基 1 到 5 和残基 10 的质心:
res_com of resnr 1 to 5 10
位置类型可以加前缀:
| 前缀 | 含义 | 适合场景 |
|---|---|---|
whole_ |
用整个残基/分子计算中心 | 想按完整残基或完整分子理解 |
part_ |
用选中的固定原子集合计算中心 | 默认折衷,速度和直觉较平衡 |
dyn_ |
每帧只用真正满足条件的原子计算中心 | 严格动态选择,但可能更慢 |
例子:选择每个残基中 C1 C2 C3 任意一个满足 x < 2 的残基,并计算这些原子的质心:
part_res_com of name C1 C2 C3 and x < 2
如果要用整个残基计算质心:
whole_res_com of name C1 C2 C3 and x < 2
如果只用当前帧严格满足 x < 2 的那些原子计算质心:
dyn_res_com of name C1 C2 C3 and x < 2
可以在 selection 前面加一个字符串作为名字:
"Close to protein" resname LIG and within 0.5 of group "Protein"
这个名字可能出现在输出文件、图例或日志中。建议给复杂 selection 起一个短名字,后续排查会轻松很多。
复杂 selection 中,变量非常有用。变量定义语法:
VARNAME = EXPR ;
例子:计算每个 RES 残基质心到所有 RES 质心的距离,并筛选 2 到 4 nm 范围内的残基:
rdist = res_com distance from com of resname RES;
resname RES and rdist >= 2 and rdist <= 4
使用变量有两个好处:
两个 index 组的质心:
com of group 1 plus com of group 2
这可以用于 gmx distance 计算两个质心之间的距离。
固定 x 方向向量:
[0, 0, 0] plus [1, 0, 0]
这可以在 gmx gangle 里作为参考向量。
生成类似 C1 C2 C2 C3 C3 C4 ... C8 C9 的重复原子序列:
name "C[1-8]" merge name "C[2-9]"
这可用于 gmx distance 计算 C1-C2、C2-C3 等连续距离。
默认 selection 返回结果通常按原子索引递增排序。如果想把 C1 C2 变成 C2 C1:
name C1 C2 permute 2 1
这在 gmx gangle 中很有用,例如想得到 C2 -> C1 而不是 C1 -> C2 的向量。
选择至少有一个原子距离配体 LIG 0.5 nm 以内的所有蛋白残基:
group "Protein" and same residue as within 0.5 of resname LIG
这里的关键是:
same residue as ...
它不是只选中靠近配体的那些原子,而是把满足条件的原子扩展为整个 residue。
类似思路也可用于按分子、残基编号、字符串属性扩展选择。
语法:
insolidangle center POS span POS_EXPR [cutoff REAL]
它的含义是:从中心位置 POS 看过去,选择落在由 POS_EXPR 中各位置张成的小圆锥范围内的原子。cutoff 控制圆锥宽度,默认单位是角度。
这个关键词相对少用,适合处理“从某个观察点看,处在某方向区域内的原子”这一类几何问题。
| 目标 | selection |
|---|---|
| 所有水氧 | resname SOL and name OW |
| 残基 1-5 和 10 的质心 | res_com of resnr 1 to 5 10 |
| 距固定点超过 1 nm 的原子 | not within 1 of [1.2, 3.1, 2.4] |
| 距蛋白 0.5 nm 内的配体 | "Close to protein" resname LIG and within 0.5 of group "Protein" |
| 至少一个原子靠近配体的蛋白残基 | group "Protein" and same residue as within 0.5 of resname LIG |
| 两个 index 组的质心 | com of group 1 plus com of group 2 |
| C1-C2、C2-C3 连续距离 | name "C[1-8]" merge name "C[2-9]" |
| 把 C1 C2 改成 C2 C1 | name C1 C2 permute 2 1 |
命令行里建议始终给 selection 加引号:
gmx select -select 'resname SOL and name OW'
如果 selection 本身需要双引号,外层可以用单引号:
gmx select -select '"Close to protein" resname LIG and within 0.5 of group "Protein"'
如果工具同时使用 -s 和 -f,通常:
-f
-s
如果轨迹里的原子名和结构文件里的不同,GROMACS 可能不会警告你;通常只检查原子数量。
有些情况下,表达式第一个值是负数会触发语法问题:
charge -1 to -0.7
可以改写为:
charge {-1 to -0.7}
很多关键词会按原子索引递增返回结果,所以这些写法可能得到同样顺序:
resname RA RB RC
resname RB RC RA
如果分析工具依赖顺序,考虑使用:
permutemergeplusresname、name、group、and、or、not。within,这是最常见的动态选择。com of、cog of、res_com of。merge、plus、permute。GROMACS selection 的核心是:用类似自然语言的表达式,把“选择哪些原子”和“如何把它们变成位置”写清楚。
最常用的模板可以记成:
条件1 and 条件2 and within 距离 of 参考对象
例如:
resname LIG and within 0.5 of group "Protein"
掌握这个模板后,大多数日常轨迹分析的选区问题都可以逐步扩展出来。