我正在尝试浏览.pdb文件,计算蛋白质复合物链A和B上不同残基的α碳原子之间的距离,然后将该距离与链标识符和残基编号一起存储在字典中。
例如,如果第一个α碳(“CA”)在链A上的残基100上找到,而它与之结合的那个在链上的残基123上就会希望我的字典看起来像d = {(A ,100):[B,123,distance_between_atoms]}
from Bio.PDB.PDBParser import PDBParser
parser=PDBParser()
struct = parser.get_structure("1trk", "1trk.pdb")
def getAlphaCarbons(chain):
vec = []
for residue in chain:
for atom in residue:
if atom.get_name() == "CA":
vec = vec + [atom.get_vector()]
return vec
def dist(a,b):
return (a-b).norm()
chainA = struct[0]['A']
chainB = struct[0]['B']
vecA = getAlphaCarbons(chainA)
vecB = getAlphaCarbons(chainB)
t={}
model=struct[0]
for model in struct:
for chain in model:
for residue in chain:
for a in vecA:
for b in vecB:
if dist(a,b)<=8:
t={(chain,residue):[(a, b, dist(a, b))]}
break
print t
它已经运行了多年的程序,我不得不中止运行(我在哪里做了无限循环?)
我也试图这样做:
t = {i:[((a, b, dist(a,b)) for a in vecA) for b in vecB if dist(a, b) <= 8] for i in chainA}
print t
但它以下列格式打印有关残留物的信息:
<Residue PHE het= resseq=591 icode= >: []
它不打印与距离有关的任何内容。
非常感谢,我希望一切都清楚。
答案 0 :(得分:0)
强烈建议在计算距离时使用C库。我使用mdtraj来做这种事情,它比BioPython中的所有for循环都快得多。
获得所有α-碳的对:
import mdtraj as md
def get_CA_pairs(self,pdbfile):
traj = md.load_pdb(pdbfile)
topology = traj.topology
CA_index = ([atom.index for atom in topology.atoms if (atom.name == 'CA')])
pairs=list(itertools.combinations(CA_index,2))
return pairs
然后,为了快速计算距离:
def get_distances(self,pdbfile,pairs):
#returns list of resid1, resid2,distances between CA-CA
traj = md.load_pdb(pdbfile)
pairs=self.get_CA_pairs(pdbfile)
dist=md.compute_distances(traj,pairs)
#make dictionary you desire.
dict=dict(zip(CA, pairs))
return dict
这包括所有α-碳。 mdtraj中也应该有一个链标识符,用于从每个链中选择CA.