biopython PDB:如何通过原子的序列号引用原子列表

时间:2014-05-26 12:58:06

标签: python biopython

我很难与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的

2 个答案:

答案 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)))