3. 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的原子作为“稳定核心区域”。
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因子是负数(极端情况)。
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。
3.5 一张图看懂ATOM与HETATM的核心逻辑
关于这一章的知识点,我总结了一个框架图。你看一眼就能理解ATOM与HETATM在PDB结构中的角色定位:
通过这个图你可以看出,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化学组分库里有严格定义,如果你做分子对接,必须拿着这个命名去匹配参数文件。