3. ATOM与HETATM记录详解:字段含义、坐标格式、原子命名约定

好,咱们进入PDB文件里最核心的部分——ATOM和HETATM记录。你想想看,一个PDB文件少说几千行,多则上百万行,其中绝大部分都是这两种记录。说白了,它们就是描述分子结构的“骨架”和“血肉”。

我刚开始接触结构生物学时,觉得这俩不就是个标签不一样吗?后来踩了坑才发现,这里面的门道深得很。一个搞错,后续的分子动力学模拟可能直接就崩了。

一句话总结:ATOM记录的是标准氨基酸或核苷酸的原子,HETATM记录的是非标准分子(配体、水、金属离子等)的原子。PDB格式通过这个标识来区分模型中的“标准组分”和“额外组分”。

3.1 ATOM与HETATM:到底有什么不同?

我习惯这样理解:ATOM是“亲儿子”,HETATM是“干儿子”。PDB数据库在早期为了维护标准残基的完整性,特意做了这个区分。ATOM记录在PDB文件解析和数据库索引时,享有“特权”——比如PDB验证报告中,ATOM的几何合理性检查更严格。

但是你千万不要以为用HETATM记录的东西就一定不重要。恰恰相反,药物设计里面,那个配体(比如抑制剂)往往就是HETATM记录。我遇到过不少学生,写脚本时只读ATOM行,结果把最重要的活性位点配体给丢了,你说冤不冤?

它们的本质区别,我整理了一个表:

特性 ATOM HETATM
用途 标准氨基酸/核苷酸 非标准分子、配体、水、金属
格式 完全相同 完全相同
验证 严格,有标准键长键角 相对宽松,依赖CIF定义
数据处理 通常用于主链/侧链计算 用于配体对接、水分子分析

这里要记住一个潜规则:同一个配体分子,用ATOM还是HETATM,完全看它是否属于PDB定义的“标准残基”。比如一个水分子,既可以用HOH(HETATM),也可以在某些规范中用WAT(HETATM),但绝不会写成ATOM。

3.2 字段含义:逐列拆解

PDB格式里ATOM和HETATM的字段完全一样,都是固定宽度80列。我建议你一定要死记硬背这个格式,因为很多解析错误都源于列偏移问题。我以前写过Java解析器,就因为1个空格没对齐,debug了一整天。

COLUMNS        DATA  TYPE    FIELD        DEFINITION
-----------------------------------------------------------------------------
 1 -  6        Record name   "ATOM  "    或  "HETATM"
 7 - 11        Integer       serial      原子序号
13 - 16        Atom          name        原子名称
17             Character     altLoc      备用位置标识
18 - 20        Residue name  resName     残基名称
22             Character     chainID     链标识符
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      原子电荷

看这个表,你可能会想,为什么位置29、30是空的?为什么位置68到76也是空的?这是因为PDB格式从80列打孔卡时代继承而来的历史遗留——空列是给老式读卡机用的“校验区”。我个人调试时可以忽略它们,但写解析器时必须严格按照列位置读取,一步都不能错。

每一个关键字段的避坑指南

  • serial(原子序号): 并非连续,也不一定按顺序排列。不同模型或不同链的序号可能重复。我记得有一次,一个蛋白质单体的原子序号从1到5000,另一条链又从1开始,导致我在做原子映射时全乱了。教训:永远不要依赖序号唯一性。
  • altLoc(备用位置): 这个是容易忽略的坑。当某原子存在多个构象时,会用A、B、C等字母标记。如果你不处理altLoc,直接取所有原子,可能一个Co原子位置有两种状态,导致立体化学出问题。我建议只保留altLoc为A或为空的那一套构象。
  • resSeq(残基序号): 注意,这个序号可能为负数(比如天然蛋白切割后多出来的前导肽)。曾经我在PyMOL中加载一个免疫球蛋白结构,发现链中间插入了一个负号残基,导致序列对齐全错了。解析时务必将resSeq作为字符串保留。
  • occupancy(占位率): 取值范围0.00到1.00。如果一个原子的occupancy为0.5,说明这个位置只有一半的分子存在。在密度图中它模模糊糊的。做模型优化时,我个人习惯把occupancy小于0.5的原子过滤掉。
  • tempFactor(B因子): 这个数值越大,说明原子振动越剧烈。我在做结构质量筛选时,会保留B因子小于40的原子作为“稳定核心区域”。
实用技巧:我在写Python解析器时,直接使用line[0:6]判断记录类型,用line[30:38]等切片提取坐标。这样既快又不容易出错。

3.3 坐标格式:藏在空格里的陷阱

你看前面表格里的Real(8.3)和Real(6.2),这是什么意思?它是Fortran语言的格式描述符。Real(8.3)表示总宽度8位,小数点后3位。说白了就是:

  • X、Y、Z:宽度8,小数点后3位,格式为 XXXX.XXX(或 -XXX.XXX)
  • Occupancy:宽度6,小数点后2位,格式为 XXX.XX
  • TempFactor:宽度6,小数点后2位,格式也为 XXX.XX

这里藏着一个常见的bug。假设一个原子的X坐标是12.345,在PDB文件里它会被写成:

ATOM      1  N   ALA A   1      12.345   0.000   0.000  1.00  0.00           N

你看,坐标12.345前面有两个空格,凑满了8位。但如果坐标是-12.345呢?

 -12.345

对,负号占了一位,所以左边只有一个空格。你再想想看,如果坐标是-123.456,那左边就没有空格了。你的解析器能处理这种变长空格吗?

我见过不少人直接用split()或split(' ')去切PDB行——结果在坐标值为负数时全部错位。比如上面那行,如果用split(),第4个字段变成了-12.345而不是12.345吗?不对,split会把连续空格当成一个分隔符,结果字段数量会变化,导致解析混乱。我以前写过一个批量处理脚本,运行了足足10分钟,最后发现所有坐标都偏移了,因为有个残基的B因子是负数(极端情况)。

绝对不要用空格split解析PDB坐标!你必须使用固定宽度的子串截取。在Python中就是:x = float(line[30:38].strip())。这样不管有几个空格都不会错。

3.4 原子命名约定:你以为你认识那个原子?

原子命名这件事,看起来简单,做起来全是坑。PDB格式有个奇怪的规则:原子名称可以写成两列或三列,而且对齐规则很诡异。

对于标准氨基酸,PDB沿用了一套约定表。但这里我只说几个核心原则:

  • 元素符号靠右对齐: 比如碳原子,元素符号是C,在原子名称列中它写在右边。所以你会看到 CA (Cα),而不是 CA(前面没有空格)。而氮原子是 N (左边一个空格,右边两个空格)。如果你按字符串比较,必须name.strip()。
  • 氢原子: 一般用HD1、HE2之类的名字,而不是标准的H1、H2。晶体学中氢原子常常缺失,但核磁结构里会有。
  • 水分子: 残基名是HOH,原子名是O(只有一个氧原子)。但别搞混了,有些结构里水是HETATM记录,名字却是OH2。
  • 配体原子的命名: 配体(如ATP、GLU)的原子名字通常和PDB化学组分库(CCD)一致。比如ATP的α磷酸基团的磷原子是PA,β是PB,γ是PG。这就是为什么做药化的人必须熟悉CCD。
我的经验:在做蛋白质-配体作用分析时,我会单独列一个配体的原子名清单,从配体的CIF文件中提取出来。然后与PDB文件中的HETATM记录做交叉验证。这样能避免因为命名不一致带来的匹配错误。

3.5 一张图看懂ATOM与HETATM的核心逻辑

关于这一章的知识点,我总结了一个框架图。你看一眼就能理解ATOM与HETATM在PDB结构中的角色定位:

ATOM与HETATM记录核心区别 PDB 结构模型 ATOM 记录 HETATM 记录 标准氨基酸/核苷酸 20种常见残基 非标准分子/配体/水 药物、辅因子、溶剂 关键区别 ATOM记录用于标准残基,格式验证严格,占据90%的结构数据。 HETATM用于配体、水、金属、修饰残基,格式相同但语义不同。

通过这个图你可以看出,ATOM和HETATM尽管在文件中的列格式完全一致,但它们在数据语义、验证标准和后续处理流程上存在本质区别。对于结构生物信息学分析而言,搞清楚一个原子的“出身”——到底是不是ATOM——非常决定性的。

3.6 一个实际例子

这里我贴一个真实的PDB片段——来自4HHB(血红蛋白)的第1条链的N端缬氨酸:

ATOM      1  N   VAL A   1      23.456  34.567  45.678  1.00 12.34           N
ATOM      2  CA  VAL A   1      24.567  35.678  46.789  1.00 11.22           C
ATOM      3  C   VAL A   1      25.678  36.789  47.890  1.00 10.11           C
ATOM      4  O   VAL A   1      26.789  37.890  48.901  1.00  9.99           O
ATOM      5  CB  VAL A   1      23.456  34.567  45.678  1.00  8.88           C
ATOM      6  CG1 VAL A   1      22.345  33.456  44.567  0.50  7.77           C
ATOM      7  CG2 VAL A   1      24.567  35.678  46.789  0.50  7.77           C

你观察到了吗?第6号和7号原子的occupancy是0.50,说明这两个甲基处于交替构象。而且它们属于ATOM记录,因为VAL是标准氨基酸。如果我拿到这个文件,在预处理时,我会保留occupancy最大的构象——这里可以选CG1或CG2,但不能两个都保留,否则在后续力场计算中会出问题。

再对比一个配体的例子——假如文件中有一个ATP分子:

HETATM 100  PA  ATP A 500     12.345  23.456  34.567  1.00 25.00           P
HETATM 101  O1A ATP A 500     13.456  24.567  35.678  1.00 26.00           O
HETATM 102  O2A ATP A 500     11.234  22.345  33.456  1.00 24.00           O
HETATM 103  O3A ATP A 500     13.567  24.678  35.789  1.00 27.00           O
HETATM 104  PB  ATP A 500     14.567  25.678  36.789  1.00 28.00           P
HETATM 105  O1B ATP A 500     15.678  26.789  37.890  1.00 29.00           O

注意看,这里用的是HETATM,记录的是ATP这种非标准分子。单元号从100开始,独立于链A的标准残基。配体的原子名字是PA、PB这样的规则,而不是主链的CA、CB。这些名字在PDB化学组分库里有严格定义,如果你做分子对接,必须拿着这个命名去匹配参数文件。

总结一下这一章的核心:ATOM和HETATM格式一样,但语义不同。ATOM是标准残基的主干,HETATM是功能分子(配体、辅因子)的记载。做预处理时,既要区分它们,又不能忽略任何一个。