理解PDB文件格式

PDB 文件说白了就是蛋白质的“存档”文件。你打开一看,全是固定格式的文本行。我第一次接触时也觉得眼花,但只要搞懂几条核心记录,剩下的都大同小异。

我个人习惯把 PDB 文件分成三个部分:文件头(告诉你这个结构是谁、怎么测的)、原子坐标(核心,每个原子的 xyz 坐标)以及连接和结束信息。下面我们就拆开聊。

PDB 文件整体框架

先看一张图,把 PDB 文件的骨架烙进脑子里。后面讲细节时,你就能知道每段代码该往哪放。

PDB 文件核心记录结构 文件头组 HEADER TITLE COMPND / EXPDTA 坐标记录组 ATOM HETATM (主链 + 侧链 + 配体) 连接 & 结束组 CONECT END (键连接 / 文件终止) 所有记录行长度固定为 80 个字符(含换行前 79 列) 记录类型标识符写在每行的前 6 个字符(如“ATOM ”) ATOM 记录核心字段布局 1-6: 记录名 | 7-11: 序号 | 13-16: 原子名 | 17: 备用 18-20: 残基名 | 22: 链ID | 23-26: 残基号 | 31-54: xyz

最重要的记录:ATOM

ATOM 记录是整个 PDB 文件的价值所在。它描述蛋白质中每一个“标准氨基酸”的原子坐标和化学信息。

看一个真实的例子,这是 1CRN 结构(一种植物毒素蛋白)中的第一个残基:

ATOM      1  N   THR A   1       6.316  24.238  47.845  1.00 12.44           N  
ATOM      2  CA  THR A   1       7.608  23.623  48.228  1.00 10.32           C  
ATOM      3  C   THR A   1       7.904  23.924  49.693  1.00 15.27           C  
ATOM      4  O   THR A   1       8.105  25.101  50.030  1.00 12.63           O  
ATOM      5  CB  THR A   1       8.722  23.649  47.186  1.00 12.94           C  
ATOM      6  OG1 THR A   1       9.396  24.933  46.975  1.00 15.90           O  
ATOM      7  CG2 THR A   1       8.426  22.719  46.046  1.00 13.45           C  

每一列都有明确含义。下表总结了 ATOM 记录的 12 个固定字段:

列号(1-index) 字段名 含义 格式与示例
1-6 Record Name 记录类型标识 ATOM (注意末尾两个空格)
7-11 Serial Number 原子在文件中的顺序号 1 右对齐,整数
13-16 Atom Name 原子名称(例:N、CA、C、O、CB) N (长度 4,不足右补空格)
17 Alt Loc 可替换构象标识(空格表示无) 或 A
18-20 Residue Name 残基名称(三字母码) THR
22 Chain ID 链标识符 A
23-26 Residue Number 残基序列号 1
27 Code for Insertion 插入残基码(用于非标准序列编号)
31-38 X (Å) 正交坐标 X 6.316
39-46 Y (Å) 正交坐标 Y 24.238
47-54 Z (Å) 正交坐标 Z 47.845
55-60 Occupancy 占有率(通常为 1.00) 1.00
61-66 Temp Factor 温度因子(B 值) 12.44
77-78 Element 元素符号(右对齐) N 或 C
79-80 Charge 形式电荷(极少使用) 或 2+
我曾经踩过一个坑:早期版本 PDB 文件的 Atom Name 在列 13-15(长度 3),而非 13-16(长度 4)。如果你解析的是 1990 年代的老结构,比如 1BTL,必须按三字符规则来。我建议解析前先判断 HEADER 记录中的发布年份。

HETATM:与标准残基说再见

HETATM 记录长得跟 ATOM 一模一样——列位置、字段顺序完全相同。唯一的区别是前 6 个字符写着 “HETATM”。

那它用来存什么?说白了,非蛋白质标准组分的原子。比如:

  • 配体(抑制剂、辅因子、金属离子,如 Zn²⁺、ATP)
  • 水分子(HOH 或 H2O)
  • 修饰残基(比如乙酰化的赖氨酸,但有时也被放进 ATOM)

举个例子,一个结合在蛋白活性位点的锌离子:

HETATM 1234 ZN   A 100      12.345  56.789  23.456  1.00  8.50          Zn  

我在做药物对接项目时,常需要从 HETATM 中单独提取配体。这时我会先过滤 Record Name,再根据 Residue Name 找出目标配体(比如 1A4G 中的配体叫做 “STU”)。注意:不要把水分子(HOH)也当作配体,除非你明确需要它。

我的习惯:写脚本处理 PDB 文件时,ATOM 和 HETATM 我总是分开处理。前者做结构建模,后者做配体分析——混在一起容易搞乱坐标排序。

CONECT:原子之间的“隐形桥梁”

ATOM 和 HETATM 只告诉你“这里有一个原子,坐标是 xyz”。但你还需要知道谁和谁成键。PDB 标准做法是用 CONECT 记录来定义共价连接关系。

基本格式:

CONECT serial bonded1 bonded2 bonded3 bonded4

每个字段都是 1-4 位整数,右对齐。例如:

CONECT 1234 1235 1236 1240

表示原子 #1234 与 #1235、#1236、#1240 分别成单键。

但是……现实往往没那么完美。

避坑指南(我遇到过的真实问题):

  • 很多 PDB 文件缺失 CONECT 记录——特别是旧的 X 射线结构。这时你需要靠自己算距离。
  • 部分 PDB 文件用SSBOND记录二硫键,而不是 CONECT。
  • 还有的配体键信息被藏在LINK或HYDBND里,不是标准格式。

所以,如果你做分子模拟(比如准备 GROMACS 拓扑),我建议不要完全依赖 PDB 的 CONECT。最好用VMD 或 PyMOL的自动键识别功能重算一遍,或者用 RDKit / OpenMM 的模板化加键逻辑。

下面是一个真实的 PDB 文件片段,展示完整的文件结尾部分(包含 CONECT 和 END):

CONECT 1234 1235 1236 1240
CONECT 1235 1234 1241 1242
CONECT 1240 1234
END

文件结构与解析思路

现在来总结一下,你拿到一个 PDB 文件后,脑子里要有一个“扫描清单”:

  1. 先看 HEADER:确认结构类型(蛋白质 / DNA / 复合物)、分辨率、发布年份。
  2. 跳过 REMARK、TITLE 等注释行(除非你需要提取实验细节)。
  3. 读取所有 ATOM 记录:按残基分组,构建主链和侧链坐标。
  4. 读取 HETATM 记录:提取配体、水、金属离子。
  5. 找 CONECT、SSBOND、LINK:建立键拓扑(如果做分子动力学这一步不能省)。
  6. 遇到 END 记录:停止解析。

一个小技巧:如果你用 Python 解析 PDB,推荐用 Biopython,它处理字段对齐和续行的问题非常稳。自己手写解析时,注意 ATOM 的 Atom Name 可能从第 13 列开始而不是第 12 列——有些 PDB 格式变体把第 12 列也占用了。

最后,我想强调一点:PDB 格式看似死板,但它的长度固定、字段位置严格恰好是它最大的优点。你写一次解析代码,基本所有 PDB 文件都能吃。比那些 XML 啊、JSON 啊的变体格式省心多了。