4. 力场参数文件结构解析(AMBER)
做 AMBER 模拟的人,迟早要跟那三个文件打交道:.prmtop、.inpcrd、.frcmod。很多新手上来就跑 tleap,生成一堆文件后直接扔进 sander,结果跑崩了也不知道去哪查。
我个人习惯是,拿到一个新体系,先手工翻一遍 .prmtop 头几行。它就像一张「力场参数配置表」,读完你基本就知道 AMBER 在算什么了。这一节,我们就掰开揉碎看看这三个文件到底长什么样。
4.1 .prmtop 文件——体系的「参数身份证」
.prmtop 是 AMBER 里最核心的拓扑文件。它不存坐标,只存「该怎么算」——原子类型、键连关系、电荷、力常数、平衡值……所有力场参数都在里面。
嗯,这里要注意:它是个纯文本文件,虽然动辄几百KB,但结构是分块的。每个块以 %FLAG 开头,后面跟着块名,然后用 %FORMAT 说明数据格式。
| %FLAG 块名 | 内容说明 | 数据量 |
|---|---|---|
POINTERS |
记录原子数、残基数、键数、二面角数等元信息 | 固定 31 个整型 |
ATOM_NAME |
每个原子的名称(例如 CA, CB, N, H) | 原子数 |
CHARGE |
每个原子的部分电荷,固定系数需要除以 18.2223 | 原子数 |
ATOM_TYPE_INDEX |
原子的力场类型 ID,指向参数表 | 原子数 |
BOND_FORCE_CONSTANT |
键伸缩力常数 | 键数 |
BOND_EQUIL_VALUE |
键平衡距离 | 键数 |
DIHEDRAL_FORCE_CONSTANT |
二面角力常数 | 二面角数 |
DIHEDRAL_PERIODICITY |
二面角周期性 | 二面角数 |
DIHEDRAL_PHASE |
二面角相位角 | 二面角数 |
LENNARD_JONES_ACOEF |
LJ A 系数(ε·Rmin¹²) | 原子类型数 |
LENNARD_JONES_BCOEF |
LJ B 系数(2ε·Rmin⁶) | 原子类型数 |
EXCLUDED_ATOMS_LIST |
被排除的 1-2、1-3、1-4 相互作用原子列表 | 可变 |
我刚开始接触时,老以为 CHARGE 块里存的就是真实电荷。错了。AMBER 为了省空间,把电荷值乘以了 18.2223。所以你看到 0.834,实际电荷是 0.834 / 18.2223 ≈ 0.0458 e。这个坑我踩过,后来花了一上午核对能量才发现的。
关键记忆点: .prmtop 里的 POINTERS 块第 10 个值指向二面角类型数。如果你加了新的二面角参数,一定要确认这个数对不对。
4.2 .inpcrd 文件——坐标与盒子信息
.inpcrd 基本上就干两件事:存原子坐标、存周期性盒子信息。它的格式很死板,但解析起来也最简单。
我习惯用 ambpdb 把它转成 PDB 看看结构有没有畸形。如果有残基坐标爆到几十埃外,不用跑直接改坐标就行。
一个典型 .inpcrd 文件长这样:
Initial structure from minimization
30
0.000 0.000 0.000 1.500 1.200 0.800 2.100 2.300 1.900
3.200 3.100 2.800 1.200 1.300 0.400 0.500 0.700 0.300
...(共 30 个原子,每行 3 个坐标)
10.0 10.0 10.0 90.0 90.0 90.0
结构说明:
- 第一行:标题行,随便写,但最好描述一下结构是什么。
- 第二行:原子总数。
- 后续行:坐标数据。每行 6 个浮点数,按我个人的经验,如果你有奇数原子,最后一行可能会不满 6 个数,AMBER 能自动补全。
- 最后一行:盒子参数(如果体系是周期性的)。a、b、c、alpha、beta、gamma。
警告: 如果 .inpcrd 里没有盒子信息(比如气相模拟),但 .prmtop 里设置了周期性边界,跑 sander 时大概率会报段错误。我遇到过好多次,排查下来都是这个问题。
为什么会这样?因为 AMBER 在运行时先读 .prmtop 里的 IFBOX 标志位。如果标志位是 1(指周期性体系),它就去 .inpcrd 末尾找盒子参数,找不到就直接崩溃。
4.3 .frcmod 文件——参数补丁的「活页夹」
.frcmod 可能是这三个文件里最容易被忽略的。它不像 .prmtop 那么大,但它在力场参数版本锁定中是真正的核心。
简单说,.frcmod 就是一组参数的「增补条款」。当你从文献或自定义力场里新加了一组键、角、二面角或 LJ 参数时,你不必改动 GAFF 或 FF14SB 主参数文件,直接写一个 .frcmod 文件,在 tleap 里用 loadamberparams 命令加载即可。
一个典型的 .frcmod 文件分多个段:
MASS
CA 12.01 0.600 ! 自定义 CA 原子质量与范德华半径
CB 12.01 0.600
BOND
CA-CA 310.0 1.40 ! 新增键伸缩参数:力常数 310 kcal/mol·Å²,平衡键长 1.40 Å
ANGL
CA-CA-CA 63.0 120.0 ! 键角参数
DIHE
CA-CA-CA-CA 1 0.156 180.0 2.0 ! 二面角参数:势垒高度、相位角、周期性
NONBON
CA 0.0860 1.9080 0.0 0.0
CB 0.0860 1.9080 0.0 0.0
注意看 NONBON 段的最后两个 0.0,那是 Rmin/2 的值,AMBER 默认用 Rmin/2 方式。你想想看,如果你从别的力场搬参数,这里的格式对不上,算出来的 LJ 能直接差一个数量级。
提示: 我建议在 .frcmod 文件头部加注释 ! Generated for project X, date Y。项目做久了,你会有几十个 .frcmod,不标注来源根本分辨不出来哪个对应哪个。
4.4 三个文件的关系:一张图讲明白
这三个文件在模拟中的角色,我用一张 SVG 结构图来展示:
4.5 典型流程:从 tleap 到完整输入
实际项目中,你通常是这么操作的:
- 准备分子结构:用
antechamber生成 GAFF 参数,或者用已有库文件。 - 写 tleap 脚本:在输入文件里引用 .frcmod 和原始库。
- 运行 tleap:生成 .prmtop 和 .inpcrd。
- 检查关键参数:用
parmchk或手工打开 .prmtop 看BOND_FORCE_CONSTANT和CHARGE是否正确。 - 归档 .frcmod:把自定义参数单独存到版本控制里,方便后续复现或修改。
这里我提一个避坑指南:有一次我在跑金属配合物体系时,直接把文献里的 .frcmod 文件复制过来用,没细看二面角 DIHEDRAL_PERIODICITY 是不是 2。结果模拟中二面角一直在转,没有势垒。后来我用 ambmask 扫了一遍才发现周期数写成了 1,应该是 2 的。从此以后,凡是新的 .frcmod,我都会在加载后用 parmed 验证一遍参数是不是跟预期一致。
一句话总结: .prmtop 是参数集合,.inpcrd 是当前状态,.frcmod 是自定义补丁。版本锁定主要锁定的是 .frcmod 和 tleap 输入脚本,而不是每次重新生成的 .prmtop。