2. PDB 文件格式详解:原子记录、链与残基编号
PDB 文件,说白了就是一个文本文件。
但它不是随便写的文本。每一行都有严格规定。我刚开始接触结构生物学时,总以为格式无所谓,能读就行。直到有一次,一个解析脚本因为某条记录的原子名少了个空格,直接崩了。嗯,从那以后,我再也不敢小看格式。
2.1 原子记录(ATOM / HETATM)—— 骨架中的骨架
原子记录是整个 PDB 文件的核心。它描述每个原子的三维坐标和属性。
我个人习惯把 ATOM 记录拆成两段看:认证信息段和坐标段。
COLUMNS DATA FIELD DEFINITION
-------------------------------------------------------------------
1 - 6 Record "ATOM " 或 "HETATM"
7 - 11 Integer serial 原子序号
13 - 16 Atom name 原子名称(如 CA、CB)
17 Character altLoc 可选的定位标识(A/B)
18 - 20 Residue resName 残基名称(如 ALA)
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 占有率
61 - 66 Real(6.2) tempFactor B 因子 / 温度因子
77 - 78 LString(2) element 元素符号
79 - 80 LString(2) charge 电荷
注意看——列宽是硬性规定的。比如原子序号必须从第 7 列开始,占 5 列。你要是少算一个字符,整个解析器就会错位。
2.2 A、B、C 字段 —— 那些被忽略的细节
PDB 文件里,除了 ATOM 记录,还有几个字段经常被忽略,但它们其实非常关键。
| 字段 | 出现在哪 | 干什么用的 |
|---|---|---|
| A | ANISOU 记录 | 各向异性温度因子的 U 值(6 个分量) |
| B | ATOM / HETATM | B 因子(温度因子),表示原子位置的不确定性 |
| C | ATOM / HETATM | 占有率(Occupancy),表示该构象出现的概率 |
你想想看:如果某个原子的 B 因子是 80 甚至更高,那这个坐标基本上不可信。我在做结构修复时,第一件事就是检查 B 因子异常值。通常我会把 B > 80 的原子标记为「待修正」。
2.3 链标识(Chain ID)—— 别让链乱掉
链标识是一个单字符。A、B、C… 最多到 Z。但在现实项目中,你可能会见到数字或特殊字符。
我记得有一次处理一个多聚体结构,原 PDB 链标识是数字,而我的对接软件只认字母。不得不写脚本批量替换。
- 单一字符,通常大写字母 A–Z
- 对称体用相同链名(如 A 链和 B 链可能是一样的序列)
- 水分子链通常标记为 W 或不标注
- 非标准残基(如配体、修饰残基)出现在 HETATM 记录中,链标识与所在链一致
另外,同一条链可以包含连续或非连续的残基编号。比如 A 链有残基 1–100,但中间缺了 50–55 是常见的。这不是错误,是结构里的无序区域。
2.4 残基编号(Residue Number)—— 看似简单,实则大坑
残基编号由两部分组成:序列号(resSeq) 和 插入码(iCode)。
插入码是什么?说白了就是一个字母后缀。比如某个残基的编号是 100A,100B——这在同源建模里很常见,表示在标准编号基础上插入的新残基。
另外,残基编号不一定是连续的。结构中缺失的部分通常不写记录,而不是补 0。解析时要注意:你的脚本能否处理跳号?
2.5 小结:一张图看懂 PDB 原子记录
下面这张图总结了我刚才讲的核心内容。你一看就明白了。
这张图帮你理清了:记录类型 告诉你怎么读,标识字段 告诉你是哪个原子,坐标与属性 则是数据本体。三部分缺一不可。
PDB.PDBParser。它能自动处理列宽对齐、链标识、插入码等细节。最好不要自己手写正则去匹配。
2.6 避坑清单
我把这些年踩过的坑总结一下,你以后遇到了直接对号入座:
- 列宽问题:永远不要用空格分割,用固定列宽读取。
- 插入码:残基编号一定是字符串(整数+字母),别当成纯整数。
- B 因子异常:超过 80 的原子,坐标基本不可信,修复时要做标记。
- 链标识不一致:同一个结构的链名,在不同记录中(如 ATOM 和 HETATM)要保持一致。
- 占有率小于 1:不代表坐标错,可能是多构象。保留所有构象,用 altLoc 区分。
嗯,这些规则背下来不难。但真正用的时候,记得我前面说的——所有脚本的第一步,永远是做格式校验。别问我为什么知道。