You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Biopython选取PDB文件特定原子时出现KeyError问题求助

问题:将PDB文件中C2原子设为坐标原点时触发KeyError错误

运行代码尝试将PDB文件的C2原子设为坐标原点时,出现报错:KeyError: (' ', 1, ' ')(中文翻译:键错误:(' ', 1, ' '))。

相关PDB片段

HETATM    1  C1  UNL A  1      -2.791  -1.310   0.787  1.00  0.00           C
HETATM    2  C2  UNL A  1      -3.711  -0.441   0.007  1.00  0.00           C
HETATM    3  C3  UNL A  1      -3.059   0.725  -0.664  1.00  0.00           C
HETATM    4  C4  UNL A  1      -2.098   1.359   0.308  1.00  0.00           C
HETATM    5  C5  UNL A  1      -1.114   0.285   0.724  1.00  0.00           C
HETATM    6  O1  UNL A  1      -1.813  -0.636   1.488  1.00  0.00           O
HETATM    7  O2  UNL A  1      -0.433  -0.261  -0.324  1.00  0.00           O
HETATM    8  C6  UNL A  1       0.922  -0.022  -0.191  1.00  0.00           C
HETATM    9  C7  UNL A  1       1.725  -1.297  -0.057  1.00  0.00           C
HETATM   10  C8  UNL A  1       3.160  -0.900   0.201  1.00  0.00           C

原报错代码

import numpy as np
import residue as residue
from Bio.PDB.PDBParser import PDBParser

parser = PDBParser()
structure = parser.get_structure('CEL', 'cel.pdb')
origin = structure[0]['A'][1]

错误原因

原代码structure[0]['A'][1]试图用数字1直接索引残基,但你的PDB条目都是HETATM非标准残基,Bio.PDB对这类残基的索引依赖于完整的残基ID元组(格式为(插入码, 残基序号, 空格)),而非单独的数字。更关键的是,你需要定位的是C2原子,而非整个残基,原代码的索引逻辑完全偏离目标。

修正方案

遍历结构层级精准定位C2原子,通过坐标减法将所有原子坐标迁移至以C2为原点的坐标系:

import numpy as np
from Bio.PDB.PDBParser import PDBParser

# 初始化解析器,关闭无关警告
parser = PDBParser(QUIET=True)
structure = parser.get_structure('CEL', 'cel.pdb')

# 遍历所有结构层级,找到C2原子
c2_atom = None
for model in structure:
    for chain in model:
        for residue in chain:
            for atom in residue:
                if atom.get_name().strip() == 'C2':  # 加strip避免空格干扰
                    c2_atom = atom
                    break
            if c2_atom:
                break
        if c2_atom:
            break

if not c2_atom:
    raise ValueError("PDB文件中未找到C2原子")

# 获取C2原子的原始坐标作为基准
c2_coord = c2_atom.get_coord()

# 将所有原子坐标减去C2坐标,完成原点迁移
for model in structure:
    for chain in model:
        for residue in chain:
            for atom in residue:
                new_coord = atom.get_coord() - c2_coord
                atom.set_coord(new_coord)

# 验证:C2原子的新坐标应为[0, 0, 0]
print("C2原子新坐标:", c2_atom.get_coord())

关键修正点

  1. 使用QUIET=True关闭Bio.PDB的冗余警告信息
  2. 通过逐层遍历精准定位C2原子,避免残基索引错误
  3. 用坐标向量减法实现全局原点迁移,确保所有原子坐标相对C2重新计算

内容的提问来源于stack exchange,提问作者jiafeng chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:07:17