3. 轨迹文件格式详解:DCD、XTC、TRR、H5、PRMTOP、PSF、PDB 等格式的特点与适用场景

做分子模拟的人,迟早都会遇到一个头疼的问题:文件格式太多。我早期做蛋白质模拟时,常用的是 CHARMM 和 AMBER,后来转 GROMACS,再后来做混合方法模拟。你想想看,每个软件都有自己的“方言”。

本章我不打算罗列枯燥的格式规范,而是从实战角度聊聊,这些格式到底该怎么选。说白了,选错格式,轻则多花时间转换,重则数据丢失。嗯,这里要注意,有些坑真的不能踩。

轨迹文件格式选型决策图 轨迹文件选型 拓扑/结构文件 纯轨迹文件 PRMTOP PSF PDB DCD XTC TRR H5 复合格式 H5可以同时存轨迹+拓扑+力场

3.1 轨迹文件:DCD、XTC、TRR、H5

轨迹文件存的是运动数据。帧、坐标、速度、盒子大小。这些东西在模拟中不断产生,所以轨迹文件往往很大。我见过最大的 XTC 文件超过 500 GB。怎么选格式?看你的核心需求。

3.1.1 DCD:CHARMM/NAMD 的原生格式

DCD 是 CHARMM 和 NAMD 的“母语”。我在早期做蛋白质配体结合自由能计算时,天天跟 DCD 打交道。这个格式有几个特点:

  • 二进制文件,读取快,体积中等
  • 只存坐标,不存速度、力、能量
  • 固定步长,所有帧必须等间隔
  • 跨平台兼容性不太好,字节序要注意

我个人建议,如果你用 NAMD 跑模拟,直接用 DCD 出结果,别转来转去。但如果你需要连续帧分析,比如看构象变化,DCD 的固定步长其实是个优点——索引简单,随机访存快。

我曾经踩过的坑:
有一次我分析一个膜蛋白的长时间模拟,NAMD 产生了多个 DCD 文件。我用 MDTraj 加载时发现原子顺序和拓扑文件对不上。后来查明,是因为 DCD 文件的原子顺序在某些版本的 NAMD 输出中变了。我的教训是:加载 DCD 前,务必用 md.load() 同时传入拓扑文件做“锚定”。
import mdtraj as md

# 正确做法:拓扑+轨迹同时加载
traj = md.load('trajectory.dcd', top='system.psf')
print(traj)

# 常见错误:只给 DCD,不给拓扑
# md.load('trajectory.dcd')  # 会报错,或者给出一堆乱序号

3.1.2 XTC vs TRR:GROMACS 的“兄弟”

GROMACS 用户基本都会遇到这两个格式。很多人问我:XTC 和 TRR 到底选哪个?

我一般这么回答:

特征XTCTRR
存储内容坐标(压缩)坐标+速度+力+盒子
压缩比非常高(丢失精度)无压缩或有损小
文件大小小大
读取速度快(得益于压缩)中等
典型场景长期模拟存档重启/扩展模拟

我个人习惯是:日常分析用 XTC。因为大部分分析只需要坐标,XTC 的压缩比能节省很多磁盘。但如果你需要做能量分析或者需要精确速度做温度校正,那就必须用 TRR。

一个小技巧:
MDTraj 加载 XTC 时,可以通过 stride 参数跳帧读取。比如 md.load('traj.xtc', top='topol.pdb', stride=10),只读每 10 帧。这在处理几十万帧的大轨迹时特别有用。

3.1.3 H5:HDF5 复合格式

H5 格式可能很多初学者不熟悉,但我认为它是未来趋势。HDF5 的底层结构允许你把轨迹、拓扑、力场参数塞进一个文件里。我参与的一个项目,需要同时存 500 条短轨迹和相应的拓扑,全放一个 H5 文件里,管理起来比分散的几十个文件方便多了。

MDTraj 也原生支持 H5 格式:

# 保存为 H5
traj.save('output.h5')

# 加载 H5,不需要再传拓扑
traj = md.load('output.h5')

H5 的好处:

  • 自包含——一个文件搞定所有
  • 支持大文件——几十 GB 级别没问题
  • 分层索引——可以只读部分数据

3.2 拓扑文件:PRMTOP、PSF、PDB

拓扑文件描述分子怎么连、原子类型、电荷、质量。没有拓扑,轨迹坐标就是一堆漂浮的数字。

3.2.1 PRMTOP:AMBER 的“户口本”

PRMTOP 是 AMBER 生态的核心拓扑文件。它记录了:

  • 原子类型和参数
  • 键、角、二面角
  • 非键相互作用参数
  • 残基序列和连接

我建议,如果你用 AMBER 做模拟,一定要保留 PRMTOP 原始文件。不要试图自己改写,里面的格式很脆弱,一个符号错位就全废了。MDTraj 加载 PRMTOP 很简单:

traj = md.load('prod.nc', top='prmtop_file.prmtop')
# 或者单独加载拓扑
top = md.load_prmtop('prmtop_file.prmtop')

3.2.2 PSF:CHARMM/NAMD 的“身份证”

PSF 是 CHARMM 系列软件的拓扑。它和 PRMTOP 类似,但结构不同。PSF 文件一般分为两个部分:段头(ATOM、BOND、ANGLE等)和数据行。我在项目中遇到过一个问题:

PSF 的“水坑”:
PSF 文件中水的残基名通常是 TIP3 或 SPCE。如果在 PSF 里写成了 TIP3P(多了一个P),MDTraj 会报错说原子类型不匹配。我曾经排查了整整半天才发现是一个字符的差异。所以,手动修改 PSF 时一定要小心残基名称。

MDTraj 加载 PSF:

traj = md.load('traj.dcd', top='structure.psf')
# 或者直接用 psf 构建拓扑
top = md.load_psf('structure.psf')

3.2.3 PDB:通用但“粗糙”

PDB 是万能格式。几乎所有分子模拟软件都支持。但它有两个痛点:

  • 只能存单帧——一个 PDB 文件就是一个静态结构
  • 信息有限——只存坐标、残基、链,不存键参数和力场信息

不过 PDB 在快速检查时很香。我经常用它做“预览”:

# 保存轨迹的第 0 帧为 PDB
traj[0].save('frame0.pdb')

# 从 PDB 加载拓扑
top = md.load_pdb('reference.pdb').topology

如果你只是需要看一眼分子长什么样,PDB 就够了。但要是做正规模拟分析,请用 PRMTOP 或 PSF。

3.3 格式选择速查表

你的需求推荐格式(轨迹)推荐格式(拓扑)
CHARMM/NAMD 模拟DCDPSF
GROMACS 模拟XTC(分析)/ TRR(重启)PDB/GRO
AMBER 模拟NetCDF (NC)PRMTOP
跨平台交换H5PDB
存档长期保存XTC(最小体积)PRMTOP/PSF
核心原则:
不管是哪种格式,拓扑文件和轨迹文件必须一致。原子数量、顺序、残基编号要对齐。MDTraj 在加载时会自动检查,但万一你用的是其他软件,手动验证一下总没错。
我个人建议:每次开始新项目时,花 2 分钟用 md.load() 测试一下,确保格式兼容。比事后发现数据全废要划算得多。

本章聊了常见的轨迹和拓扑格式。其实没有“最好”的格式,只有“最适合”你当前任务的格式。我个人经过这么多年的折腾,养成一个习惯:分析阶段优先用 H5,因为一个文件搞定;存档阶段用 XTC,因为省空间;生产模拟阶段,尊重原始软件的格式。记住,格式转换是有代价的。能不转,就别转。