使用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())
关键修正点
- 使用
QUIET=True关闭Bio.PDB的冗余警告信息 - 通过逐层遍历精准定位C2原子,避免残基索引错误
- 用坐标向量减法实现全局原点迁移,确保所有原子坐标相对C2重新计算
内容的提问来源于stack exchange,提问作者jiafeng chen
相关产品推荐
相关产品推荐

