我很难与biopython斗争。我成功地从结构对象中获取所有原子的列表,以及获取/设置坐标和检索序列号:
from Bio import PDB
pdb = "file.pdb"
name = "file"
p = PDB.PDBParser()
struct_in = p.get_structure(name, pdb)
for atom in PDB.Selection.unfold_entities(struct_in, target_level='A'):
atom.set_coord(np.array((1,2,3)))
atom.transform(unity3,(2,-2,1))
print atom.get_serial_number()
但是,我无法通过序列号引用某个原子(索引23)来更改其坐标。我正在寻找类似于虚构的东西" get_atom_by_index()"函数在下面的第二行(它没有那样工作):
atomList = PDB.Selection.unfold_entities(struct_in, target_level='A')
atomList.get_atom_by_index(23).set_coord(newCoord)
当然,我可以做类似
的事情for i in atomList:
if atomList[i].get_serial_number() == 23:
atomList[i].set_coord(newCoord)
但我宁愿避免这个额外的循环。必须有一种更方便的方式!
提前谢谢 fred的答案 0 :(得分:0)
如果您知道具体的索引号,那么为什么不这么做呢:
atomList[23].set_coord(newCoord)
答案 1 :(得分:0)
您可以将PDB放入dict,从原子序列号创建键:
selection = PDB.Selection.unfold_entities(struct_in, target_level='A')
serial_numbers = [atom.serial_number for atom in selection]
selection_dict = dict(zip(serial_numbers, selection))
# selection_dict is now something like:
# {1: <Atom N>, 2: <Atom CA>, 3: <Atom C>, ...}
现在您可以使用键访问dict,而无需循环:
selection_dict[23].set_coord(np.array((1,2,3)))