我有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]
是生成残差数的正确方法(它有效,但有没有方法可以得到这个)?
最后,有没有更好的解决方案来实现这一目标?
答案 0 :(得分:2)
使用NeighborSearch
绝对是正确的想法 - 它构造了一个k-d tree,它可以对最近的邻居执行非常快速的查找。
如果你只有几个残留物来搜索,我会在这些残基的原子上使用search()
方法(也许只是它们的CA原子的速度)。这比使用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)