PDB 文件格式详解:ATOM、HETATM、CONECT 和 ANISOU

PDB 文件格式,说白了就是蛋白质结构的“身份证”。每个原子、每个残基、每条链,都得按固定列宽写进去。我刚开始接触时,对着 80 列宽的纯文本看了半天——这玩意儿怎么读?后来拆过几千个 PDB 文件才摸熟。

嗯,先看整体结构。PDB 文件是固定列宽的纯文本,每行 80 字符,开头有记录类型关键字。类型大概有十几种,但核心就四个:ATOM、HETATM、CONECT、ANISOU。其他像 TER、END、HEADER 是辅助行。咱们一个一个拆。

PDB 核心记录结构图 PDB 文件 ATOM 记录 标准残基原子坐标 HETATM 记录 非标准残基/配体/水 ANISOU 记录 各向异性温度因子 CONECT 记录 化学键连接关系 ⚠ 注意 ATOM/HETATM 的列偏移 必须严格按照 80 列 不能多加空格或换行

1. ATOM 记录——骨架与侧链的坐标

ATOM 记录存的是标准氨基酸的原子坐标。每行对应一个原子,格式从第 1 列到第 80 列,一个萝卜一个坑。
我记得第一次自己写解析器时,把第 55-60 列的 occupancy 读成了 float,结果发现有的文件把 occupancy 写成整数——解析就崩了。后来我改成先读字符串再转浮点,稳多了。

标准 ATOM 行格式(列偏移从 1 开始):

COLUMNS        DATA TYPE       FIELD        DEFINITION
------------------------------------------------------
 1 -  6        Record name     "ATOM  "     ATOM 或 HETATM
 7 - 11        Integer         serial       原子序号
13 - 16        Atom            name         原子名(如 CA, CB, N)
17             Character       altLoc       备用位置指示符
18 - 20        Residue name    resName      残基名(如 ALA, GLU)
22             Character       chainID      链标识(A, B, ...)
23 - 26        Integer         resSeq       残基编号
27             AChar           iCode        插入码
31 - 38        Real(8.3)       x            正交 x 坐标
39 - 46        Real(8.3)       y            正交 y 坐标
47 - 54        Real(8.3)       z            正交 z 坐标
55 - 60        Real(6.2)       occupancy    占有率(0 到 1)
61 - 66        Real(6.2)       tempFactor   温度因子(B 因子)
77 - 78        LString(2)      element      元素符号
79 - 80        LString(2)      charge       原子电荷

个人习惯:我解析时通常先按 line[:6] 判断记录类型,再用 line[30:54] 提取坐标。注意原子名在第 13-16 列,如果原子名只有三个字符(如 CA),第 13 列往往填空格,千万别把第 13 列本身的空格当成 atom name 的一部分。

2. HETATM 记录——水、配体与修饰残基

HETATM 跟 ATOM 长得一模一样,格式完全相同。唯一区别是:ATOM 只用于标准氨基酸,HETATM 用于其他一切——水分子(HOH)、配体(ATP、NAD)、修饰残基(比如甲基化赖氨酸)。

你想想看,如果某个配体在晶体结构中占了多个构象,HETATM 记录的 altLoc 列(第 17 列)也会填字母 A、B 之类的。我在一个激酶项目里碰见过一个大配体,同一个原子写了 4 个 HETATM,altLoc 分别标了 A、B、C、D。解析时我忘了处理 altLoc,结果三维结构上出现了四个重叠的幻影原子……后来我直接用 line[16] 判断备用构象,只取 A 的坐标。

踩过的坑:我曾经因为“HOH”残基名在 HETATM 行里,却当成 ATOM 处理,导致键合分析全乱套。记住:只要不是标准 20 种氨基酸,它就叫 HETATM。哪怕是“HOH”,也是 HETATM。

3. CONECT 记录——原子间化学键

CONECT 记录描述原子之间的连接关系。我没骗你,很多 PDB 文件压根不包含 CONECT,或者只写了部分键。尤其是那些用旧版软件精修的结构,CONECT 经常残缺。我一般会自己算键——根据原子间距和元素类型重建。

CONECT 行的列格式很简单:

COLUMNS        DATA TYPE      FIELD         DEFINITION
------------------------------------------------------
 1 -  6        Record name    "CONECT"      CONECT
 7 - 11        Integer        serial        起始原子序号
12 - 16        Integer        serial        键连原子 1
17 - 21        Integer        serial        键连原子 2
22 - 26        Integer        serial        键连原子 3
27 - 31        Integer        serial        键连原子 4
32 - 36        Integer        serial        键连原子 5  (可选)
37 - 41        Integer        serial        键连原子 6  (可选)

注意:serial 是 ATOM/HETATM 行中的原子序号,不一定是行号。而且 CONECT 行可以包含多达 6 个连接原子,每个 5 列宽。实际超过 4 个连接的情况很少见,但水分子周围可能连 4 个氢键供体。我没遇到过需要第 5 个连接的情况,但结构生物学的朋友跟我说某些大配体确实可能。

重建键的常用策略:若 CONECT 缺失,可基于范德华半径 +0.5 Å 的阈值自动搜索原子对。但注意:金属离子(如 Zn²⁺、Mg²⁺)半径较小,需单独设阈值。

4. ANISOU 记录——各向异性的温度因子

ANISOU 记录对应同一条 ATOM 或 HETATM 行的各向异性温度因子。格式跟 ATOM/HETATM 几乎一样,但在第 1-6 列写的是 "ANISOU" 。主要字段是 U11、U22、U33、U12、U13、U23 这六个张量分量,放在第 29-70 列。

COLUMNS        DATA TYPE      FIELD         DEFINITION
------------------------------------------------------
 1 -  6        Record name    "ANISOU"       ANISOU
 7 - 11        Integer        serial        原子序号(与对应的ATOM/HETATM一致)
13 - 16        Atom           name          原子名
17             Character      altLoc        备用位置
18 - 20        Residue name   resName       残基名
22             Character      chainID       链标识
23 - 26        Integer        resSeq        残基编号
27             AChar          iCode         插入码
29 - 35        Integer        u[0][0]       U11 (×10⁴)
36 - 42        Integer        u[1][1]       U22
43 - 49        Integer        u[2][2]       U33
50 - 56        Integer        u[0][1]       U12
57 - 63        Integer        u[0][2]       U13
64 - 70        Integer        u[1][2]       U23

嗯,这里要注意:ANISOU 存储的是整数×10⁴,不是浮点数!比如 U11 存 1234,实际值是 0.1234。我早期解析时直接转 float 忘了除以 10000,算出来的椭球大得离谱。其实 ANISOU 不代表所有结构都有,只有分辨率很高(比如 ≤1.5 Å)的结构才会提供。我处理过一堆 2.0 Å 以上的 PDB,里面就根本没有 ANISOU 行。

5. 其他常见记录

除了上面四个,还有几个辅助记录也得了解:

  • TER 行:标记一条链的结束。位于链最后一个原子之后,第 18-20 列写残基名,第 22 列写链 ID。解析时遇到 TER 我就知道要切一条链了。
  • END 行:文件结束标记,就一行。
  • HEADER、TITLE:元数据,描述分子、发表信息,一般解析坐标时直接跳过。
  • SSBOND:二硫键信息,但我更信任基于距离自己算。

我见过某些结构用空行结束链而不是 TER,或者 END 行根本不写——嗯,解析器一定要容忍这些异常。我写的解析代码会先扫一遍文件末尾,如果没遇到 END 就把最后一行的原子当作结尾。

6. 避坑指南

  1. 列偏移必须精确到字符:PDB 格式是列固定的,不是空格分隔。比如第 13-16 列原子名,如果原子名是 "CA "(CA 后跟一个空格),用 split() 拆出来的长度可能会乱。
  2. 区分 altLoc:如果 ATOM 和 HETATM 的 altLoc 不为空(空格),那么同一个 serial 会对应多个副本。通常只取 altLoc='A' 或第一个出现的,除非你需要多构象分析。
  3. CONECT 缺失时的补救:我建议始终运行一个基于距离的键重建步骤,特别是做分子动力学或结构分析时。
  4. ANISOU 与 ATOM 的对应:ANISOU 行的 serial 必须与同一条链上的 ATOM/HETATM 匹配,但并非所有原子都有 ANISOU。我通常用 serial 做字典映射,没有对应项就置零。
  5. 续行问题:旧版 PDB 格式中,ATOM 行若坐标过长会折行(比如旧版 2.0 之前的写法),但现代 PDB 已经废弃,不过我在一些老旧结构文件(如 1BNA)里见过。处理办法:如果行首为 "ATOM " 且长度不足 80 列,直接跳过。

我的配置文件:每次新建项目时,我都会从源代码仓库拷贝一个 PDB 列偏移常量表,用字典存起来。这样不同语言(Python、Rust、Julia)的项目都能保持一致的列定义,避免手写数字偏移出错。

记录类型起始列终止列字段示例值
ATOM1316atom name CA
ATOM2222chainIDA
ATOM3154x y z 12.345 67.890 1.234
HETATM(与ATOM相同)HOH
ANISOU2970U11..U231234 5678 9101 1121 3141 5161
CONECT711serial 123
CONECT1216bonded serial 1 124

啰嗦了这么多,其实核心就一句话:PDB 是固定列宽的纯文本,用对偏移就能安稳解析。我自己写过三版解析库,每次发现新坑就在测试集中加一个错误案例。最后那版连“第 13 列是空格还是字母”都做了分支处理。

嗯,掌握这些记录,你基本就能拆开任何 PDB 文件了。下一步就是把数据清洗干净,把那些不规范的烂文件变成能直接用的数据。别急,后面几节咱们专门聊清洗的硬功夫。