轨迹文件基础:.xtc、.trr、.gro、.pdb 格式解析与转换

做分子模拟,最头疼的事是什么?
不是力场选错了,也不是体系没平衡好。
而是模拟跑完了,拿到一堆文件……看不明白。

我见过不少新人,对着几十个G的轨迹文件发愣。
“.xtc”和“.trr”有什么区别?
“.gro”和“.pdb”哪个更小?

说白了,这四种格式就是四个不同性格的工具。
你得了解它们,才能灵活运用。

这一章,我就带你理清楚。

知识点地图:GROMACS 四种核心文件格式的「数据密度→适用场景」对比
GROMACS 轨迹文件格式生态 模拟引擎 (mdrun) .gro 结构 + 初速 文本 / 紧凑 / 输入输出 .pdb 标准 / 可移植 可视 / 后处理 .trr 全精度 / 完整 / 标准轨迹 .xtc 有损压缩 / 轻量 长模拟 / 存储友好 转换路线推荐 .gro + .top → 初始体系 .trr → 后处理分析 / 重启模拟 .xtc → 结构分析(RMSD、Rg、SASA) .pdb → 可视化 / 跨软件共享

1. .gro 格式:轻量级的结构描述

.gro 文件,本质上是 GROMACS 的亲儿子。

文本格式、体积小、读写快。
每行固定宽度,内容包含:原子序号、残基名、原子名、x/y/z 坐标、以及可选的 vx/vy/vz(初速度)。

为什么它很重要?
模拟的初始结构、平衡结束后的检查点、甚至是 mdrun 的输入参数,很多地方都依赖 .gro。
我个人习惯,在分析轨迹前,先用 .gro 做一次「结构快照确认」。

小技巧:
gmx dump -f npt.gro 可以帮你以人类可读的方式查看 .gro 的内容。
但注意,文件末尾的「盒子向量」是 nm 为单位,不是 Å!

举个例子,一个经过 NPT 平衡的体系,其 .gro 文件结构大致如下:

MD simulation of solvated protein, t= 0.00000
 15258
    1ALA     N   1   0.779   0.257   0.302
    1ALA    CA   2   0.860   0.350   0.342
  ...
    2MET    CB  10   0.798   0.481   0.285
  ...
 15258SOL    OW15258   0.516   0.213   0.475
   5.60731   5.60731   5.60731   0.00000   0.00000   0.00000

第一行是模拟标题,第二行是总原子数,接着是每个原子的坐标行,最后是 box 向量。

避坑指南:
我曾经见过有人直接用文本编辑器改 .gro 里的坐标——
嗯,结果导致模拟瞬间崩掉。因为 .gro 对列宽非常敏感,
尤其是原子名和残基名之间的空格。
改坐标,请用 gmx editconf 或 gmx trjconv。

2. .pdb 格式:人人都懂的通用语言

如果你想把 GROMACS 的轨迹放到 VMD、PyMOL 或 Chimera 里看,.pdb 是最好的桥梁。
它是生物分子模拟界的“通用语”。

.pdb 也是文本格式,但比 .gro 更啰嗦。
一行记录一个原子,包含温度因子、残基链标识等额外信息。
缺点是体积大,但可移植性好。

我记得有一次合作,对方只能用 PyMOL 看图。
我就把 .xtc 转成 .pdb 轨迹发给他。
虽然文件大了 5 倍,但人家能直接打开,谁都没废话。

转换命令很简单:

gmx trjconv -f md.xtc -s md.tpr -o md_frame.pdb -dump 500

这个命令从 md.xtc 里提取第 500 ps 的帧,存成 .pdb。
-s md.tpr 是为了提供拓扑信息,否则残基名会丢失。

3. .trr 格式:全精度的“原始负片”

.trr 是 GROMACS 的全精度二进制轨迹格式。

它包含每个原子的坐标、速度、以及力(如果你输出的话)。
浮点数用 double 存储,误差极小。

  • 优点:精度高,适合后续分析(比如计算扩散系数、动力学性质)
  • 缺点:体积大(大约是 .xtc 的 5~10 倍)

实际项目中,我很少直接保存 .trr 全长轨迹。
只在关键阶段(如自由能计算、过渡态采样)才会启用。

在 md.mdp 里这样控制输出:

; .trr 输出频率
nstxout = 500         ; 每 500 步输出一次坐标
nstvout = 500         ; 每 500 步输出一次速度
nstfout = 500         ; 每 500 步输出一次力

; .xtc 输出频率(轻量)
nstxtcout = 1000      ; 每 1000 步输出一次压缩坐标

这组参数的意思是:
.trr 每 500 步记一次全精度数据,.xtc 每 1000 步记一次压缩数据。
两者互不干扰,可以共存。

避坑指南:
我曾经在一次粗粒化模拟中,不小心把 .trr 的输出频率设成了 nstxout = 1。
跑完一看,一个 .trr 文件 200 GB!
嗯,后来我老老实实把 nstxout 设成 0(不输出),只靠 .xtc 干活。

4. .xtc 格式:存储友好的“压缩饼干”

.xtc 是 GROMACS 最常用的轨迹格式。
它是二进制、有损压缩的 — 通过牺牲一定的坐标精度(默认 0.001 nm)来大幅减小文件体积。

精度够用吗?
对于大部分结构分析:RMSD、回旋半径、二级结构分析、距离统计……完全够用。
除非你要做极其精细的自由能面计算,否则 .xtc 是你的最佳选择。

我个人的经验是:
一个 100 ns 的模拟,.trr 可能到 15 GB,.xtc 往往只有 1.5 GB。
省下的空间,可以存更多副本、做更多测试。

一句话总结:
.xtc → 日常分析(快、省空间)
.trr → 精细复查、重启模拟(全精度、但沉)
.gro → 输入、检查点、小场景(轻量文本)
.pdb → 跨软件、可视化(通用但慢)

5. 格式转换实操

在实际工作中,你经常需要在这四种格式之间切换。
核心工具有两个:gmx trjconv 和 gmx editconf。

常用命令一览:

转换需求命令示例
.xtc → .pdb(单帧)
gmx trjconv -f md.xtc -s md.tpr -o frame.pdb -dump 1000
.xtc → .gro(单帧)
gmx trjconv -f md.xtc -s md.tpr -o frame.gro -dump 1000
.xtc → .trr(无损)
gmx trjconv -f md.xtc -s md.tpr -o all.trr
.trr → .xtc(压缩)
gmx trjconv -f all.trr -s md.tpr -o small.xtc
.gro → .pdb(加氢自动处理)
gmx editconf -f init.gro -o init.pdb -conect
.xtc 提取子轨迹(帧范围)
gmx trjconv -f md.xtc -s md.tpr -o sub.xtc -b 1000 -e 2000
关键参数解析:
-b 和 -e 用于截取时间范围(单位 ps)。
-skip 用于隔帧抽取(比如 -skip 10 = 每 10 帧取 1 帧)。
-dump 只取某一时刻的单帧。

举个例子,你想从 10 ns 的轨迹里,提取 2~5 ns 之间的所有帧,并且隔 5 帧取一帧:

gmx trjconv -f md.xtc -s md.tpr -o sub.xtc -b 2000 -e 5000 -skip 5

这样既能定位时间窗口,又能稀疏采样,是分析长轨迹的常用手段。

6. 实战建议:如何选择输出格式

我做过不少项目,从几百个原子的小肽到百万原子的病毒衣壳。
不同的体系,对轨迹格式的选择完全不同。

  • 小体系(< 10k 原子,短模拟 < 50 ns): 直接存 .trr。
    精度高,省心,空间开销也不大。
  • 中大型体系(10k ~ 500k 原子,100 ns ~ 1 μs): 存 .xtc,配合 .tpr 文件。
    trr 只保留检查点间隔(checkpoint)。
  • 超大规模(百万级以上): 极小频率输出 .xtc,甚至只用 .gro + .xtc 抽样。
    存.trr 是奢侈行为。
我的个人判断标准:
如果你 60% 以上的分析都是结构相关的(RMSD、PCA、distance),那 .xtc 就足够好。
只有当分析涉及速度、均方位移(MSD)或能量相关量时,才需要 .trr。

7. 一个小坑:文件完整性检查

有时候 .xtc 文件读到一半报错「Corrupted frame」。
一种常见原因:模拟被中途 kill,trr 可能正常结尾,xtc 写了一半。

检查方法很简单:

gmx check -f md.xtc

如果输出显示 Trajectory is readable, last frame OK,恭喜。
如果报错,说明文件损坏。这种情况我遇到过多次,尤其是集群作业被超时打断时。

避坑指南:
我曾经在一次大规模分批次模拟中,因为没做文件完整性检查,
直接拿损坏的 .xtc 做了三天的后处理分析……结果 RMSD 图全是锯齿。
后来,我把 gmx check 加入了分析的自动流程里,再也不掉坑了。

好了,四种格式的核心区别和转换方法,就是这样。

你记住一句话就行:
.xtc 是轻骑兵,.trr 是重装部队,.gro 是帮手,.pdb 是翻译官。

下次拿到轨迹文件,先问自己:
「我到底要算什么东西?」
答案会帮你选出最合适的格式。