获取一组 Residue 的所有邻居

Rey*_*neh 3 python biopython

我保存了一个残基编号列表, centerResidueList = [100, 140, 170, 53]我正在尝试从这组残基中获取所有相邻的残基。
目前我正在使用下面的脚本,我是否处理了整个 PDB 文件并生成了一个距离为 10.0 的原子对列表,然后遍历列表并检查列表中的残基编号是否all_neighbors对应于centerResidueList.

from Bio.PDB import *

centerResidueList = [100, 140, 170, 53]
neighbours_resi_number = []
structure = PDBParser().get_structure('X', "1xxx.pdb") 
atom_list = Selection.unfold_entities(structure, 'A') 
ns = NeighborSearch(atom_list)
all_neighbors = ns.search_all(10.0, "R") 
for residuepair in all_neighbors:
    resi_number = residuepair[0].id[1]
    if resi_number in centerResidueList:
        resi_number_partner = residuepair[1].id[1]
        neighbours_resi_number.append(resi_number_partner)
Run Code Online (Sandbox Code Playgroud)

首先,我如何只创建atom_listusing CA 原子?

其次,residuepair[0].id[1]生成残差数的方法是否正确(它有效,但有没有办法得到它)?

最后,有没有更好的解决方案来实现这一目标?

Dav*_*ain 5

使用NeighborSearch绝对是正确的想法 - 它构建了一个kd 树,它在最近的邻居上执行非常快速的查找。

如果您只有几个残基要搜索,我会search()在这些残基的原子上使用该方法(也许只是为了速度而使用它们的 CA 原子)。这将比使用search_all()then 过滤更有效。我会回答你的两个问题,然后在底部提供完整的解决方案。


如何仅使用 CA 原子创建 atom_list?

您可以使用filter, 或列表理解(我认为列表理解更具可读性):

atom_list = [atom for atom in structure.get_atoms() if atom.name == 'CA']
Run Code Online (Sandbox Code Playgroud)

其次,residuepair[0].id[1]生成残差数的方法是否正确(它有效,但有没有办法得到它)?

这绝对是正确的方法。但是(这是一个重要的警告),请注意这不会处理带有插入代码的残基。为什么不Residue自己处理对象呢?


我的代码:

from Bio.PDB import NeighborSearch, PDBParser, Selection


structure = PDBParser().get_structure('X', "1xxx.pdb")

chain = structure[0]['A']  # Supply chain name for "center residues"
center_residues = [chain[resi] for resi in [100, 140, 170, 53]]
center_atoms = Selection.unfold_entities(center_residues, 'A')

atom_list = [atom for atom in structure.get_atoms() if atom.name == 'CA']
ns = NeighborSearch(atom_list)

# Set comprehension (Python 2.7+, use `set()` on a generator/list for < 2.7)
nearby_residues = {res for center_atom in center_atoms
                   for res in ns.search(center_atom.coord, 10, 'R')}

# Print just the residue number (WARNING: does not account for icodes)
print sorted(res.id[1] for res in nearby_residues)
Run Code Online (Sandbox Code Playgroud)