拓扑文件(.top)核心参数:原子类型、键、角、二面角、成对非键参数
咱们做GROMACS模拟,一开始就是写拓扑文件。说白了,拓扑文件就是分子的“身份证”,告诉GROMACS分子里有哪些原子、它们怎么连、互相之间怎么作用。我见过不少新手,参数抄来抄去最后跑出个离谱结果,回头一看——拓扑文件里原子类型写错了,或者键长参数乱填。
这一章咱们就把拓扑文件的几个核心参数讲透。你把它搞懂了,后面做什么模拟都不会慌。
3.1 原子类型——分子的“基本粒子”
每个原子在拓扑文件里都要有一个类型。类型决定了它的质量、电荷,以及它跟别的原子怎么相互作用。原子类型名你自己定,但同一套力场里不能重复。
核心规则:原子类型名称通常用大写字母+数字,比如 C、O、H1、OW。别用特殊符号,别用空格。
定义原子类型的格式很简单,就在 [ atomtypes ] 段下面:
[ atomtypes ]
; type mass charge ptype sigma(nm) epsilon(kJ/mol)
C 12.01 0.0 A 0.34 0.42
O 16.00 0.0 A 0.30 0.71
H 1.008 0.0 A 0.25 0.13
这里 ptype 固定填 A,表示这是原子类型(不是虚拟原子)。sigma和epsilon是LJ参数,用于非键相互作用。
我个人习惯:原子类型命名尽量跟力场文件保持一致。比如OPLS力场里烷基碳常用 CT,那么我写拓扑时也用 CT,方便排查。
如果你用了多个分子(比如水和离子),不同分子的原子类型可以混合在同一个 [ atomtypes ] 段里。顺序无所谓,但别漏掉任何一个类型。
3.2 原子定义——给每个原子贴上“标签”
定义好原子类型后,在每个分子的 [ atoms ] 段里给具体的原子分配类型和电荷。比如水分子:
[ moleculetype ]
; molname nrexcl
SOL 2
[ atoms ]
; nr type resnr residu atom cgnr charge mass
1 OW 1 SOL O 1 -0.82 16.00
2 HW 1 SOL H1 2 0.41 1.008
3 HW 1 SOL H2 2 0.41 1.008
注意 cgnr 是电荷组编号,同一电荷组内的原子电荷总和通常为零(或接近零)。这个在做长程静电计算时有用。
3.3 键参数——原子之间的“弹簧”
力场用谐振子模型来描述化学键。你需要定义 平衡键长 和 力常数。GROMACS支持多种键函数,最常见的是 1(谐振)。定义在 [ bondtypes ] 段:
[ bondtypes ]
; i j func r0(nm) k(kJ/mol/nm^2)
C O 1 0.123 502416.0
C H 1 0.109 284512.0
O H 1 0.096 462750.0
然后在每个分子的 [ bonds ] 段里引用这些类型:
[ bonds ]
; ai aj funct r0 k
1 2 1 0.123 502416.0
1 3 1 0.109 284512.0
你可能会问:为什么 [ bondtypes ] 里已经定义了参数,分子里还要写一遍?其实可以只写 [ bonds ],参数直接填在分子定义里。但我建议把它们抽出来放在 [ bondtypes ]里,这样多个分子复用的时候,改一个地方就行。
我曾经踩过的坑:给一个蛋白配体复合物写拓扑,直接从旧文件复制了键参数,结果键长单位不一致(一个用nm,一个用Angstrom),导致键能爆炸。后来我养成了习惯——每次检查单位,nm就是nm,千万别混。
3.4 角参数——三原子弯曲
角的定义方式和键几乎一样,只是多了个原子。函数 1 也是谐振:
[ angletypes ]
; i j k func theta0(deg) k(kJ/mol/rad^2)
C O H 1 109.5 418.4
O C H 1 120.0 460.24
在分子段内使用:
[ angles ]
; ai aj ak funct theta0 k
1 2 3 1 109.5 418.4
注意角度单位是度,力常数用的单位是 kJ/(mol·rad²)。GROMACS内部会自动换算。
你想想看,如果角度力常数太大或太小,分子构象就可能扭曲。一般力场文件里这些值都已经经过量子化学计算,咱们直接用就行,除非你有特殊理由不改。
3.5 二面角参数——扭转的“门闩”
二面角描述四个连续原子之间的扭转势。它比较复杂,因为可能有多个势能项(比如Ryckaert-Bellemans函数)。GROMACS里二面角函数有很多种,常用的是 1(周期性)和 9(RB势)。
这里展示一个典型的周期性二面角:
[ dihedraltypes ]
; i j k l func phase(deg) kd(kJ/mol) multiplicity
C C O H 1 0.0 0.42 1
C C O H 1 180.0 0.15 3
在分子里引用时,多个同类型的二面角可以合并成一行(用 9 函数更容易处理)。但你如果觉得麻烦,可以直接在分子段里写。
我个人的经验:二面角是最容易出错的参数。我记得有一次跑一个多肽,二面角参数漏了,结果GROMACS报错说“missing dihedral for atom pair”。排查了半天,发现我在 [ dihedraltypes ] 里少写了一个原子组合。
避坑提示:二面角参数必须覆盖分子中所有连续的四个原子。你可以写 [ dihedrals ] 段,也可以用 [ dihedraltypes ] 加通配符。建议初学者先在分子段里逐条写,确认无误后再抽象到类型段。
3.6 成对非键参数——LJ与静电
非键相互作用包括Lennard-Jones和库仑静电。参数已经在 [ atomtypes ] 里定义了sigma和epsilon,GROMACS会自动组合(例如用Lorentz-Berthelot规则)。
但有时你需要手动指定某些原子对之间的非键参数(比如1-4相互作用)。这时用 [ pairtypes ] 段:
[ pairtypes ]
; i j func sigma(nm) epsilon(kJ/mol)
C C 1 0.34 0.42
C O 1 0.32 0.55
然后在分子内的 [ pairs ] 段引用:
[ pairs ]
; ai aj funct sigma epsilon
1 4 1 0.34 0.42
一般力场会自动处理1-4比例因子(比如将LJ和静电缩小一半)。你如果不放心,可以在 [ defaults ] 段里设置 nbfunc 和 comb-rule。
注意:不要手动把1-2和1-3也写成非键对,那会破坏拓扑结构。GROMACS会忽略你写的 [ pairs ] 段里的错误原子对,但最好还是按规则来——只有1-4和更远的原子才写。
一张图理清拓扑参数关系
下面这张SVG图把拓扑文件中各个参数段的关系画出来了。你可以当个“地图”用。
实战中别忘了检查全局段
拓扑文件最开头还有一个 [ defaults ] 段,控制非键组合规则和1-4缩放因子。很多人跳过去不改,结果不符合自己用的力场。
[ defaults ]
; nbfunc comb-rule gen-pairs fudgeLJ fudgeQQ
1 2 yes 0.5 0.5
这里 nbfunc=1 表示LJ用 C6-C12 形式;comb-rule=2 是Lorentz-Berthelot规则。这两个一般别改,除非你很清楚自己在做什么。
总的来说,拓扑文件的编写就是个“定义-引用”的过程。先在大脑里理清你的分子有哪些原子、怎么连接,再照着 [ moleculetype ] → [ atoms ] → [ bonds ] → [ angles ] → [ dihedrals ] → [ pairs ] 的顺序依次写。每写一个段,就检查一遍原子序号是否正确。我见过有人把原子序号写反,结果GROMACS报bond length out of range。
最后一个小总结:参数段(带types的)是模板,分子段是实例。用模板可以轻松切换力场,实例负责具体分子。掌握这个思想,拓扑文件就不会乱。