2012-04-25 7 views
2

J'essaie d'écrire un analyseur rapide pour les fichiers .pdb (ils montrent la structure des protéines). Un exemple d'une protéine que je suis à la recherche est KRAS (commune dans le cancer) et est ici: http://www.rcsb.org/pdb/files/3GFT.pdbAnalyse d'un fichier .pdb en Python

Si vous faites défiler vers le bas assez loin, vous arriverez à une ligne qui ressemble à ceci: ATOM 1 N MET A 1 63,645 97,355 31,526 1,00 33,80 N

Le premier élément "atome" signifie qu'il s'agit d'un atome réel dans la protéine. Le 1 concerne un compte général, N concerne le type d'atome, "MET" est le nom du résidu, "A" concerne le type de chaîne, 1 (le second "1") est le nombre d'atomes et alors les 3 prochains numéros sont les positions xyz dans l'espace.

Ce que je besoin d'une sortie est quelque chose comme ça (où le « 1 » ci-dessous correspond au nombre d'atomes, et non le nombre général): MET A 1 63,645 97,355 31,526

Pour rendre les choses plus compliquées, parfois Le nombre d'atomes (le second "1" dans ce cas) est négatif. Dans ces cas, je veux sauter cette ligne et continuer jusqu'à ce que j'atteigne une entrée positive car ces éléments se rapportent à la biochimie nécessaire pour trouver les positions et non la protéine réelle. Pour rendre les choses encore pire, parfois, vous obtenez une ligne en tant que tel:

ATOM 139 CA AILE A 21 63,260 111,496 12,203 0,50 12,87 C
ATOM 140 CA BILE A 21 63,275 111,495 12,201 0,50 12,17 C

Alors qu'ils tous les deux se rapportent au résidu 21, la biochimie n'est pas assez précise pour obtenir une position exacte, ainsi ils donnent deux options. Idéalement, je spécifierais "1", "2" ou autre chose, mais si je prends juste la première option, ça irait. Enfin, pour le type d'atome ("N") dans mon exemple original, je veux seulement obtenir ces lignes avec un "CA". Je suis un novice de Python, et ma formation est dans les biostats, donc je me demandais quelle est la meilleure façon de le faire? Dois-je analyser cette ligne par ligne avec une boucle for? Y a-t-il un moyen de le faire plus rapidement en python? Comment gérer les doubles entrées pour certains atomes?

Je me rends compte que c'est un peu à demander, mais quelques conseils seraient une tonne d'aide! J'ai programmé tous les bits de statistiques en utilisant R, mais maintenant j'ai juste besoin d'obtenir mes fichiers dans le bon format!

Merci!

+0

Est-ce lié: http://code.google.com/ p/pdb-tools /? – miku

Répondre

2

C'est une description longue. Je ne suis pas sûr d'avoir tout compris correctement :-) Si les champs (pour les lignes commencent avec ATOM) sont corrigés, vous pouvez utiliser un split et quelques comaprisons. J'ai utilisé un hachage pour voir si l'entrée est déjà vue pour éliminer le doublon que vous vouliez. Espérons que cela vous donnera un bon départ,

visited = {} 
for line in open('3GFT.pdb'): 
    list = line.split() 
    id = list[0] 
    if id == 'ATOM': 
     type = list[2] 
     if type == 'CA': 
      residue = list[3] 
      type_of_chain = list[4] 
      atom_count = int(list[5]) 
      position = list[6:8] 
      if atom_count >= 0: 
       if type_of_chain not in visited: 
        visited[type_of_chain] = 1 
        print residue,type_of_chain,atom_count,' '.join(position) 

sortie Will,

MET A 1 62.935 97.579 
GLY B 0 39.524 105.916 
GLY C 0 67.295 110.376 
MET D 1 59.311 124.106 
GLY E 0 44.038 96.819 
GLY F 0 44.187 123.590 
+0

Salut, Merci pour ça! Ce n'était pas tout à fait ce dont j'avais besoin mais j'ai réussi à obtenir le bon résultat! Je vous remercie! – user1357015

+0

Légères corrections: 1) la liste [6: 8] devrait être la liste [6: 9] 2) le bloc final if doit être: if (atom_count> = 1): si atom_count n'est pas dans visited et type_of_chain == chain_required: – user1357015

1

Pour les grands pdb fichiers avec beaucoup d'atomes, il n'y a pas vide laissé entre les champs, de sorte que vous ne pouvez pas utiliser le split commander. Au lieu de cela, vous pouvez utiliser la définition du format de Protein Data Bank pour analyser le fichier pdb:

with open('min.pdb') as pdbfile: 
    for line in pdbfile: 
     if line[:4] == 'ATOM' or line[:6] == "HETATM": 
      print line 
      # Split the line 
      splitted_line = [line[:6], line[6:11], line[12:16], line[17:20], line[21], line[22:26], line[30:38], line[38:46], line[46:54]] 
      print splitted_line 
      # To format again the pdb file with the fields extracted 
      print "%-6s%5s %4s %3s %s%4s %8s%8s%8s\n"%tuple(splitted_line) 

Voici une exemple de sortie:

# Original line: 
HETATM10000 O HOH B3257  2.509 40.006 -4.097 1.00 0.00   O 

# Fields extracted: 
['HETATM', '10000', ' O ', 'HOH', 'B', '3257', ' 2.509', ' 40.006', ' -4.097'] 

# Reformatted line: 
HETATM10000 O HOH B3257  2.509 40.006 -4.097