2017-08-02 3 views
2

J'ai un fichier PDB, et j'ai besoin d'extraire ses numéros de séquence de résidus (resseq s). Basé sur l'inspection manuelle des premières lignes du fichier PDB (collé ci-dessous), je pense que resseq s devrait être [22, 23, ...]. Cependant, le module Bio.PDB de Biopython suggère le contraire (la sortie est également jointe ci-dessous). Je me demande s'il s'agit d'un bug Biopython ou si j'ai de la difficulté à comprendre le format PDB.Biopython: resseq ne correspond pas au fichier pdb

ATOM  1 N GLY A 22  78.171 89.858 59.231 1.00 21.24   N 
ATOM  2 CA GLY A 22  79.174 88.827 58.999 1.00 20.87   C 
ATOM  3 C GLY A 22  80.438 89.415 58.391 1.00 21.89   C 
ATOM  4 O GLY A 22  80.362 90.202 57.440 1.00 23.18   O 
ATOM  5 N LEU A 23  81.588 89.069 58.972 1.00 21.51   N 
ATOM  6 CA LEU A 23  82.895 89.555 58.527 1.00 20.80   C 
ATOM  7 C LEU A 23  83.288 89.020 57.162 1.00 22.41   C 
ATOM  8 O LEU A 23  82.889 87.923 56.788 1.00 22.93   O 
ATOM  9 CB LEU A 23  83.973 89.232 59.560 1.00 20.97   C 
ATOM  10 CG LEU A 23  84.225 87.818 60.062 1.00 13.32   C 
ATOM  11 CD1 LEU A 23  85.448 87.888 60.939 1.00 15.24   C 
ATOM  12 CD2 LEU A 23  83.035 87.258 60.829 1.00 12.21   C 

Le code que je utilise pour extraire resseq:

... 
for i in chain: 
    print i.get_full_id() 

OUT:('pdb', 0, 'A', (' ', 2, ' ')) 
    ('pdb', 0, 'A', (' ', 3, ' ')) 
... 
+0

Pourriez-vous s'il vous plaît fournir le code entier que vous utilisez pour reproduire cette sortie? Comment obtenez-vous 'chaîne'? – fsimkovic

Répondre

3

De la documentation de Bio.PDB.Entity.get_full_id

def get_full_id(self): 
    """Return the full id. 

    The full id is a tuple containing all id's starting from 
    the top object (Structure) down to the current object. A full id for 
    a Residue object e.g. is something like: 

    ("1abc", 0, "A", (" ", 10, "A")) 

    This corresponds to: 

    Structure with id "1abc" 
    Model with id 0 
    Chain with id "A" 
    Residue with id (" ", 10, "A") 

    The Residue id indicates that the residue is not a hetero-residue 
    (or a water) because it has a blank hetero field, that its sequence 
    identifier is 10 and its insertion code "A". 
    """ 
    # The function implementation below here ... 

Je suppose que vous itérez les atomes de votre chaîne plutôt que la résidus, ce qui vous donne le plein id de chaque Atom pas Residue.

Si vous sauvegardez des exemples de résidus dans un fichier appelé struct.pdb et que vous exécutez le code ci-dessous, vous obtiendrez le bon id s.

>>> structure = PDBParser().get_structure('test', 'struct.pdb') 
>>> for residue in structure.get_residues(): 
... print(residue.get_full_id()) 
('test', 0, 'A', (' ', 22, ' ')) 
('test', 0, 'A', (' ', 23, ' ')) 
>>> resseqs = [residue.id[1] for residue in structure.get_residues()] 
>>> print(resseqs) 
[22, 23] 
+0

Merci! Je suis tellement désolé, j'ai trouvé un bug dans mon code après 2 jours de recherche, et tout fonctionne maintenant (j'ai oublié que j'ai passé une PDB pré-traitée à mon programme plutôt que l'original). Merci pour votre temps et désolé que ce n'est pas une question très utile! Pensez-vous que je devrais le supprimer? –

+0

@AlexMayorov Laissez la question au cas où d'autres personnes auraient un problème similaire. – fsimkovic