PDB 文件格式详解:ATOM、HETATM、CONECT 和 ANISOU
PDB 文件格式,说白了就是蛋白质结构的“身份证”。每个原子、每个残基、每条链,都得按固定列宽写进去。我刚开始接触时,对着 80 列宽的纯文本看了半天——这玩意儿怎么读?后来拆过几千个 PDB 文件才摸熟。
嗯,先看整体结构。PDB 文件是固定列宽的纯文本,每行 80 字符,开头有记录类型关键字。类型大概有十几种,但核心就四个:ATOM、HETATM、CONECT、ANISOU。其他像 TER、END、HEADER 是辅助行。咱们一个一个拆。
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. 避坑指南
- 列偏移必须精确到字符:PDB 格式是列固定的,不是空格分隔。比如第 13-16 列原子名,如果原子名是 "CA "(CA 后跟一个空格),用 split() 拆出来的长度可能会乱。
- 区分 altLoc:如果 ATOM 和 HETATM 的 altLoc 不为空(空格),那么同一个 serial 会对应多个副本。通常只取 altLoc='A' 或第一个出现的,除非你需要多构象分析。
- CONECT 缺失时的补救:我建议始终运行一个基于距离的键重建步骤,特别是做分子动力学或结构分析时。
- ANISOU 与 ATOM 的对应:ANISOU 行的 serial 必须与同一条链上的 ATOM/HETATM 匹配,但并非所有原子都有 ANISOU。我通常用
serial做字典映射,没有对应项就置零。 - 续行问题:旧版 PDB 格式中,ATOM 行若坐标过长会折行(比如旧版 2.0 之前的写法),但现代 PDB 已经废弃,不过我在一些老旧结构文件(如 1BNA)里见过。处理办法:如果行首为 "ATOM " 且长度不足 80 列,直接跳过。
我的配置文件:每次新建项目时,我都会从源代码仓库拷贝一个 PDB 列偏移常量表,用字典存起来。这样不同语言(Python、Rust、Julia)的项目都能保持一致的列定义,避免手写数字偏移出错。
| 记录类型 | 起始列 | 终止列 | 字段 | 示例值 |
|---|---|---|---|---|
| ATOM | 13 | 16 | atom name | CA |
| ATOM | 22 | 22 | chainID | A |
| ATOM | 31 | 54 | x y z | 12.345 67.890 1.234 |
| HETATM | (与ATOM相同) | HOH | ||
| ANISOU | 29 | 70 | U11..U23 | 1234 5678 9101 1121 3141 5161 |
| CONECT | 7 | 11 | serial | 123 |
| CONECT | 12 | 16 | bonded serial 1 | 124 |
啰嗦了这么多,其实核心就一句话:PDB 是固定列宽的纯文本,用对偏移就能安稳解析。我自己写过三版解析库,每次发现新坑就在测试集中加一个错误案例。最后那版连“第 13 列是空格还是字母”都做了分支处理。
嗯,掌握这些记录,你基本就能拆开任何 PDB 文件了。下一步就是把数据清洗干净,把那些不规范的烂文件变成能直接用的数据。别急,后面几节咱们专门聊清洗的硬功夫。