我有一个保存在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)


首先,如何仅使用CA原子创建atom_list

其次,residuepair[0].id[1]是生成残基数的正确方法吗(它可以工作,但是有一种方法可以得到这个)?

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

最佳答案

使用NeighborSearch绝对是正确的想法-它构造了一个k-d tree,该aa对最近的邻居执行非常快速的查找。

如果您只需要搜索几个残基,则可以对这些残基的原子(可能只是速度的CA原子)使用search()方法。这将比先使用search_all()然后进行过滤更有效。我将回答您的两个问题,然后在底部提供完整的解决方案。




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


您可以使用filter或列表推导(我认为列表推导更易读):

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





  其次,residuepair[0].id[1]是生成残基数的正确方法吗(它可以工作,但是有一种方法可以得到这个)?


这绝对是正确的方法。但是,(这是一个重要的警告),请注意,这将无法处理insertion codes的残基。为什么不处理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)

10-04 19:03