第2章:输入文件体系——.top、.itp、.gro、.pdb、.mdp 文件的作用与关系

开始上手 GROMACS,你第一眼看到的,往往不是炫酷的分子动画,而是一堆奇奇怪怪的文件名。说实话,我第一次看到这一堆后缀时也有点懵。后来我才明白,搞懂这套文件体系,才算真正入了门。

今天我就跟你把这几个核心文件拆开揉碎了讲清楚。它们的关系不复杂,但你得知道谁负责什么,谁依赖谁。

2.1 一句话给你整明白

每个文件说白了都是在模拟中扮演一个角色:

  • .gro / .pdb:告诉系统原子长什么样、摆在哪(坐标)
  • .top:告诉系统原子之间怎么连、带什么电(拓扑)
  • .itp:.top 的得力助手,用来拆分和组织拓扑内容
  • .mdp:告诉系统模拟过程怎么跑、跑多久(参数)

你可以把 .gro/.pdb 想象成「演员表」,.top/.itp 是「角色设定和台词」,.mdp 则是「导演拍摄方案」。缺哪个,戏都演不下去。

2.2 .top 文件:总拓扑文件

.top 是体系拓扑的总指挥。它只管连接关系和质量参数,不管坐标。我个人习惯在一开始就把 .top 写得干干净净,后面能省很多事。

一个典型 .top 长这样:

[ defaults ]
; nbfunc        comb-rule       gen-pairs       fudgeLJ  fudgeQQ
1               1               yes             0.5      0.5

[ atomtypes ]
; name   mass     charge   ptype  sigma(nm)   epsilon(kJ/mol)
CA       12.01100  0.000 A     0.34         0.360

[ moleculetype ]
; name   nrexcl
Protein  3

[ atoms ]
; nr   type   resnr   residu   atom   cgnr   charge   mass
1      CA     1       ALA      CA     1      0.20     12.01100

[ bonds ]
; i    j   funct   r(nm)   k(kJ/mol/nm^2)
1      2   1       0.153   502080.0

这里要注意,[ defaults ] 和 [ atomtypes ] 定义全局参数。[ moleculetype ] 定义分子的内部连接。电荷和质量就是在这个文件里配好的。我见过有人把拓扑配错了,结果模拟出来两个原子之间多了一根莫名其妙的键,那场面……嗯,后来我学会了多检查几遍。

2.3 .itp 文件:模块化拓扑文件

.itp 就是用来拆解 .top 的。一个复杂体系,比如蛋白质加溶剂加离子,全塞一个 .top 里会乱成一团。这时候 .itp 就派上用场了。

一个 .itp 里通常只写一种分子的拓扑:

[ moleculetype ]
; name   nrexcl
SOL     2

[ atoms ]
; nr   type   resnr   residu   atom   cgnr   charge   mass
1      OW     1       SOL      OW     1      -0.82    15.999
2      HW1    1       SOL      HW1    2       0.41     1.008
3      HW2    1       SOL      HW2    3       0.41     1.008

[ settles ]
; i    funct   doh     dhh
1     1       0.1     0.1633

之后在 .top 里用 #include 把它引进来:

#include "water.itp"
#include "protein.itp"

[ system ]
; name
My System

[ molecules ]
; name      number
Protein       1
SOL        10000

小技巧:.itp 文件可以复用。你今天写一个力场的 .itp,明天换个分子体系,直接 #include 进来就行。我之前做过一套力参数,用了整整三个项目。

2.4 .gro / .pdb 文件:坐标文件

.gro 和 .pdb 存储原子的三维坐标。.gro 是 GROMACS 的原生格式,紧凑且含盒信息;.pdb 是通用格式,更易读,但信息量少一点。

.gro 的结构:

Protein in water
    3
    1ALA     CA   1   0.126   1.345   0.457
    1ALA     CA   2   0.189   1.432   0.498
    1SOL     OW   3   0.256   1.111   0.602
   1.00000   1.00000   1.00000

第一行是注释,第二行是原子数,后面每行就是 残基名称、原子名称、编号和 xyz 坐标,最后一行是盒子尺寸。这个格式很短小,我喜欢用它做快速检查。

.pdb 则长得啰嗦一些:

ATOM      1  N   ALA A   1       1.452   1.342   0.789  1.00  0.00           N
ATOM      2  CA  ALA A   1       1.562   1.278   0.892  1.00  0.00           C

注意:.gro 和 .pdb 如果坐标和拓扑不一致,grompp 会报错。比如你拓扑里定义了一个原子带正电,但坐标里没这个原子……别问我怎么知道的,我吃过这个亏。

2.5 .mdp 文件:运行参数文件

.mdp 是模拟的「遥控器」。你让系统跑多久、压力多大、用哪种算法,全写在这里。

一个基础 .mdp:

integrator               = md
nsteps                   = 50000
dt                       = 0.002
nstxout                  = 100
nstenergy                = 100
pbc                      = xyz
pcoupl                   = Berendsen
tau_p                    = 1.0
ref_p                    = 1.0
compressibility          = 4.5e-5
gen_vel                  = yes
gen_temp                 = 300
gen_seed                 = -1

这里有几点你得留心:

  • integrator:选 md 就是标准分子动力学,选 steep 就是能量最小化。
  • nsteps × dt:决定模拟总时长。我刚开始总把 nsteps 设太小,跑完一看才几皮秒,等于白跑。
  • pbc:周期性边界条件。想清楚你的体系需不需要,别乱开。

请记住:.mdp 文件和 .top 文件要配合好,比如 .mdp 中指定的力场参数写法,得和 .top 里定义的一致。否则 grompp 会直接退出来,不给任何商量余地。

2.6 它们的关系——一张图讲明白

别急,我画了一张流程图,把这五个文件怎么配合、谁生成谁、谁依赖谁,一次说清。SVG 图在下面。

GROMACS 输入文件体系关系图 输入来源(实验/建模) .gro / .pdb(坐标文件) .top / .itp(拓扑文件) #include grompp 预处理:合并拓扑、坐标、参数 .mdp(运行参数文件) .tpr(二进制拓扑+参数,最终输入文件) mdrun 执行模拟 .top 通过 #include 引用 .itp,grompp 读取 .gro + .top + .mdp 生成 .tpr

从图里你可以看出来,.top 和 .gro 是并行的两条线,一个管连接关系,一个管空间位置。只有通过 grompp 把它们和 .mdp 合并,才能生成最终的可执行文件 .tpr。

我当时刚学的时候,总觉得 .top 和 .gro 是同一类文件,结果有一次把拓扑里的原子数和坐标里的原子数搞差了,grompp 直接报了个 syntax error。后来我养成习惯:先用 gmx check 检查两者数量是否一致。

2.7 避坑指南——我踩过的坑你都别踩

我整理了一张表,把这些文件常见的坑标出来:

文件类型常见问题怎么避免
.top原子类型与力场不匹配用同源力场参数,不要混用
.itp#include 路径写错相对路径要确认,或干脆绝对路径
.gro原子数不匹配,盒尺寸未更新每次修改后都跑一遍 gmx check
.pdb缺失某些原子记录用 pdb2gmx 转换,不要手写
.mdpnsteps × dt 明显不合理手动估算总模拟时间的数量级

我曾经有一回在 .mdp 里写了 dt = 0.002 但 nsteps = 100,跑完一看才 0.2 皮秒,啥也看不出来。那种感觉……嗯,后来我就把 nsteps 和总时间的计算写在笔记上,跑之前先算一下。

2.8 小结:你需要记住的三句话

  • .gro 给坐标,.top 给连接,.mdp 给参数。三者缺一不可。
  • .itp 是 .top 的拆分工具。复杂体系一定要用 .itp 模块化管理。
  • grompp 是大家长。它把所有输入揉一起,生成 .tpr,mdrun 才认这个。

最后送你一个实用脚本:每次新项目,先把 .gro 和 .top 的原子数对上。用这一行:

gmx check -f system.gro -top system.top

如果不一致,别往后跑,先修好再走。我保证你省下的时间比花在这行命令上的多得多。