来自pdb文件的字典键

时间:2016-11-22 00:04:28

标签: dictionary protein-database

我正在尝试浏览.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= >: []    

它不打印与距离有关的任何内容。

非常感谢,我希望一切都清楚。

1 个答案:

答案 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.