2016-11-22 37 views
0

我試圖通過一個.pdb文件,計算來自蛋白質複合物的A和B鏈上不同殘基的α碳原子之間的距離,然後將距離與字典一起存儲鏈標識符和殘基編號。例如,如果在鏈A上的殘基100上發現第一個α碳(「CA」),並且它與鏈上的殘基123上的鏈結合,那麼會希望我的字典看起來像d = {( A,100):[B,123,distance_between_atoms]}來自pdb文件的字典鍵

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

請在決定使用它們之前閱讀標籤說明。 * pdb *的含義與您的想法完全不同,並且描述通知人們確切地使用哪個標籤(如果需要的話)。這裏的標籤有特定的含義和用途,所以請謹慎選擇。謝謝。 –

+0

謝謝,我下次會多加註意。 – Alexandra

回答

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.