获取一组残基的所有邻居

5 投票
1 回答
2614 浏览
提问于 2025-04-17 22:47

我有一个残基编号的列表,保存在 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] 是生成残基编号的正确方法吗?(它能工作,但有没有其他方法可以做到这一点?)

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

1 个回答

6

使用 NeighborSearch 绝对是个好主意——它会构建一个 k-d 树,这样可以非常快速地查找最近的邻居。

如果你只需要在少量残基周围进行搜索,我建议你对这些残基的原子(可能只用它们的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] 是生成残基编号的正确方法吗(虽然可以用,但有没有其他方法可以做到这一点)?

这个方法绝对是对的。不过需要注意的是,这种方式无法处理带有 插入代码 的残基。为什么不直接处理 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)

撰写回答