Словарь ключ из файла pdb

Я пытаюсь просмотреть файл.pdb, вычислить расстояние между альфа-атомами углерода из разных остатков в цепочках A и B белкового комплекса, а затем сохранить расстояние в словаре вместе с идентификатором цепи и номером остатка.

Например, если первый альфа-углерод ("CA") найден в остатке 100 в цепи A, а тот, к которому он привязан, находится в остатке 123 в цепи B I, то мой словарь должен выглядеть примерно так: 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 ответ

Настоятельно рекомендую использовать библиотеки C при расчете расстояний. Я использую mdtraj для такого рода вещей, и он работает намного быстрее, чем все циклы for в BioPython.

Чтобы получить все пары альфа-углеродов:

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 из каждой цепочки.

Другие вопросы по тегам