2. PDB 文件格式详解:原子记录、链与残基编号

PDB 文件,说白了就是一个文本文件。

但它不是随便写的文本。每一行都有严格规定。我刚开始接触结构生物学时,总以为格式无所谓,能读就行。直到有一次,一个解析脚本因为某条记录的原子名少了个空格,直接崩了。嗯,从那以后,我再也不敢小看格式。

2.1 原子记录(ATOM / HETATM)—— 骨架中的骨架

原子记录是整个 PDB 文件的核心。它描述每个原子的三维坐标和属性。

我个人习惯把 ATOM 记录拆成两段看:认证信息段和坐标段。

ATOM 记录的标准格式(固定列宽,不是 CSV!)
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 列。你要是少算一个字符,整个解析器就会错位。

一个常见坑: 原子名是右对齐的,且占 4 列。比如 Cα 写成 " CA "(前面有空格),而不是 "CA "。我曾见过一个新手写的脚本,因为多砍了一列空格,Cα 变成了 C,后面的残基名也跟着错位,整个结构全乱了。

2.2 A、B、C 字段 —— 那些被忽略的细节

PDB 文件里,除了 ATOM 记录,还有几个字段经常被忽略,但它们其实非常关键。

字段 出现在哪 干什么用的
A ANISOU 记录 各向异性温度因子的 U 值(6 个分量)
B ATOM / HETATM B 因子(温度因子),表示原子位置的不确定性
C ATOM / HETATM 占有率(Occupancy),表示该构象出现的概率

你想想看:如果某个原子的 B 因子是 80 甚至更高,那这个坐标基本上不可信。我在做结构修复时,第一件事就是检查 B 因子异常值。通常我会把 B > 80 的原子标记为「待修正」。

我的一个小技巧: 修复 B 因子过高时,不要直接删除原子。可以用周围残基的 B 因子做插值或平滑处理。我曾经写过一个小脚本,用滑动窗口平均法修正过一条 loop 区的 B 因子,后来那批结构的 R 值降低了 1.5%。很值。

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——这在同源建模里很常见,表示在标准编号基础上插入的新残基。

我曾经踩过的一个坑: 在处理一个抗体结构时,框架区用标准 Kabat 编号,CDR 区有插入码。我直接按整数编号读取,结果把 CDR 区删掉了 3 个残基,整个结构修复全错了。从那以后,我一直用的是「编号=字符串(resSeq + iCode)」的方式。

另外,残基编号不一定是连续的。结构中缺失的部分通常不写记录,而不是补 0。解析时要注意:你的脚本能否处理跳号?

2.5 小结:一张图看懂 PDB 原子记录

下面这张图总结了我刚才讲的核心内容。你一看就明白了。

PDB 原子记录结构图 PDB 原子记录核心结构 记录类型 ATOM:标准残基原子 HETATM:非标准原子 ANISOU:各向异性 B 因子 TER:链终止 END:文件结束 标识字段 serial:原子序号 name:原子名称 altLoc:可选定位 resName:残基名称 chainID:链标识 resSeq/iCode:残基编号 坐标与属性 x, y, z:三维坐标 occupancy:占有率 tempFactor:B 因子 element:元素符号 charge:电荷

这张图帮你理清了:记录类型 告诉你怎么读,标识字段 告诉你是哪个原子,坐标与属性 则是数据本体。三部分缺一不可。

实用建议: 如果你用 Python 解析 PDB,建议用 Biopython 的 PDB.PDBParser。它能自动处理列宽对齐、链标识、插入码等细节。最好不要自己手写正则去匹配。

2.6 避坑清单

我把这些年踩过的坑总结一下,你以后遇到了直接对号入座:

  1. 列宽问题:永远不要用空格分割,用固定列宽读取。
  2. 插入码:残基编号一定是字符串(整数+字母),别当成纯整数。
  3. B 因子异常:超过 80 的原子,坐标基本不可信,修复时要做标记。
  4. 链标识不一致:同一个结构的链名,在不同记录中(如 ATOM 和 HETATM)要保持一致。
  5. 占有率小于 1:不代表坐标错,可能是多构象。保留所有构象,用 altLoc 区分。

嗯,这些规则背下来不难。但真正用的时候,记得我前面说的——所有脚本的第一步,永远是做格式校验。别问我为什么知道。