3. Extraction de lignes
La fonction pdb_str_key_get est une première approche pour faire ce type de travail. Il s’agit d’extraire des lignes qui sont identifiées par le premier champ PDB qui correspond à un mot clé, par exemple le code suivant :
|
1 |
s = pdb_str_key_get(s,"REMARK 280§MASTER") |
Donnera le résultat suivant :
REMARK 280 REMARK 280 CRYSTAL REMARK 280 SOLVENT CONTENT, VS (%): 57.46 REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 2.89 REMARK 280 REMARK 280 CRYSTALLIZATION CONDITIONS: NULL MASTER 322 0 2 20 30 0 0 6 4803 2 32 50 |
Les lignes avec les mots clés REMARK 280 et MASTER sont extraites et retournées sous forme de chaines de caractères, qui contiennent encore les caractères de fin de lignes du fichier initial. On notera le caractère § que j’utilise souvent en tant que délimiteur pour spécifier plusieurs mots clés (ici au nombre de deux). Le fait de pouvoir inclure des espaces permet d’allonger le filtre, par exemple REMARK est le vrai mot clé au sens PDB (et non REMARK 280) mais il est souvent associé à des valeurs (ici 280) ou d’autres mots clés. L’ensemble avec des décalages (ajouts d’espaces) peut devenir rapidement compliqué, sachant que chaque fichier PDB est plus ou moins unique et qu’il ne suit qu’un niveau de normalisation minimal.
4. Commandes grep-like
Deux succédanés simplifiés du filtre GREP sont implémentées sous la forme des fonctions pdb_str_grep_get et pdb_str_pgrep_get. La première fonctionne avec une seule clé de recherche, la seconde fonctionne avec plusieurs clés sous la forme d’une chaine incluant des délimiteurs (de la même manière que pdb_str_key_get). Par exemple, la combinaison de deux filtres :
|
1 2 |
s = pdb_str_grep_get(s, " CYS ") s = pdb_str_pgrep_get(s, "HELIX§SHEET") |
La première ligne va renvoyer le résultat suivant, de manière évidente on cherche à faire ressortir toutes les lignes du fichier PDB qui incluent le terme CYS correspondant à un résidu cystéine :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
=> grep of ' CYS ' expression (perl-grep, destructive) SEQRES 9 A 321 ASP ALA CYS ILE ALA GLU TYR GLN GLN ALA GLY ARG GLY SEQRES 9 B 321 ASP ALA CYS ILE ALA GLU TYR GLN GLN ALA GLY ARG GLY SHEET 3 B 7 LEU A 131 LEU A 139 -1 O SER A 134 N CYS A 107 ATOM 776 N CYS A 107 68.426 10.898 44.564 1.00 23.80 N ATOM 777 CA CYS A 107 68.395 12.119 45.334 1.00 31.14 C ATOM 778 C CYS A 107 67.846 11.931 46.750 1.00 25.28 C ATOM 779 O CYS A 107 67.038 11.063 47.014 1.00 28.34 O ATOM 780 CB CYS A 107 67.669 13.250 44.639 1.00 38.29 C ATOM 781 SG CYS A 107 65.895 12.971 44.672 1.00 43.54 S ATOM 3133 N CYS B 107 9.979 16.273 63.176 1.00 27.13 N ATOM 3134 CA CYS B 107 11.239 15.979 62.556 1.00 27.05 C ATOM 3135 C CYS B 107 11.023 15.815 61.073 1.00 20.80 C ATOM 3136 O CYS B 107 10.086 15.162 60.622 1.00 24.11 O ATOM 3137 CB CYS B 107 11.754 14.699 63.278 1.00 34.51 C ATOM 3138 SG CYS B 107 13.299 13.975 62.659 1.00 42.17 S |
Nous pouvons alors refiltrer cette chaine, par exemple nous pourrions utiliser un pdb_str_key_get sur les lignes ATOM et sélectionner les carbones alpha (lignes incluant un CA) ou les atomes correspondant aux chaines latérales.
Mais la seconde commande (ligne 02) de l’exemple ne renverra rien (une chaine vide). Car nous avons demandé des lignes qui contiennent à la fois les valeurs HELIX et SHEET et ce type de lignes (structure secondaire de la protéine) sont en général séparées dans le fichier (une ligne par hélice et une ligne par feuillet bêta). En effet, la fonction pdb_str_pgrep_get fonctionne en mode AND ce qui correspond à une intersection (pgrep pour piped grep) pour l’ensemble des mots clefs fournis sous forme d’argument.
En négatif
Le module comporte deux fonction supplémentaires pdb_str_nogrep_get et pdb_str_nopgrep_get qui fonctionnent comme les deux précédentes mais en négatif. Par exemple, les lignes suivantes :
|
1 2 |
s1 = pdb_str_nogrep_get(pdb_str_nogrep_get(s, "ATOM"), "REMARK") s2 = pdb_str_nopgrep_get(s,"ATOM§HETATM§REMARK§CONECT") |
Vont donner comme résultat pour la chaine s1, des lignes ont été éliminées et remplacées par les ‘…’ pour limiter un peu la sortie, avec différentes couleurs: séquence, structures secondaires (hélices ou feuillets), biotine, eau (nb: les espaces du fichier PDB ne sont pas reproduits).
=> piped nogreps of 'ATOM' and 'REMARK' (perl-grep){hope we have not HETATM in this structure ...}HEADER LIGASE 12-JAN-01 1HXD TITLE CRYSTAL STRUCTURE OF E. COLI BIOTIN REPRESSOR WITH BOUND TITLE 2 BIOTIN COMPND MOL_ID: 1; COMPND 2 MOLECULE: BIRA BIFUNCTIONAL PROTEIN; COMPND 3 CHAIN: A, B; COMPND 4 SYNONYM: BIOTIN REPRESSOR; COMPND 5 EC: 6.3.4.15; COMPND 6 ENGINEERED: YES SOURCE MOL_ID: 1; SOURCE 2 ORGANISM_SCIENTIFIC: ESCHERICHIA COLI; SOURCE 3 ORGANISM_COMMON: BACTERIA; SOURCE 4 EXPRESSION_SYSTEM: ESCHERICHIA COLI; SOURCE 5 EXPRESSION_SYSTEM_COMMON: BACTERIA KEYWDS LIGASE, REPRESSOR, BIOTIN, DNA-BINDING EXPDTA X-RAY DIFFRACTION AUTHOR K.KWON,E.D.STREAKER,S.RUPARELIA,D.BECKETT REVDAT 1 30-MAY-01 1HXD 0 JRNL AUTH L.H.WEAVER,K.KWON,D.BECKETT,B.W.MATTHEWS JRNL TITL COREPRESSOR-INDUCED ORGANIZATION AND ASSEMBLY OF JRNL TITL 2 THE BIOTIN REPRESSOR: A MODEL FOR ALLOSTERIC JRNL TITL 3 ACTIVATION OF A TRANSCRIPTIONAL REGULATOR. JRNL REF PROC.NATL.ACAD.SCI.USA V. 98 6045 2001 JRNL REFN ASTM PNASA6 US ISSN 0027-8424 DBREF 1HXD A 1 321 UNP P06709 BIRA_ECOLI 1 321 DBREF 1HXD B 1 321 UNP P06709 BIRA_ECOLI 1 321 SEQRES 1 A 321 MET LYS ASP ASN THR VAL PRO LEU LYS LEU ILE ALA LEU SEQRES 2 A 321 LEU ALA ASN GLY GLU PHE HIS SER GLY GLU GLN LEU GLY SEQRES 3 A 321 GLU THR LEU GLY MET SER ARG ALA ALA ILE ASN LYS HIS ...SEQRES 23 B 321 GLY ILE SER ARG GLY ILE ASP LYS GLN GLY ALA LEU LEU SEQRES 24 B 321 LEU GLU GLN ASP GLY ILE ILE LYS PRO TRP MET GLY GLY SEQRES 25 B 321 GLU ILE SER LEU ARG SER ALA GLU LYS HET BTN 500 16 HET BTN 501 16 HETNAM BTN BIOTIN FORMUL 3 BTN 2(C10 H16 N2 O3 S) FORMUL 5 HOH *59(H2 O) HELIX 1 1 ASN A 4 ALA A 15 1 12 HELIX 2 2 GLY A 22 LEU A 29 1 8 HELIX 3 3 SER A 32 ASP A 45 1 14 ...HELIX 18 18 ASP B 234 GLN B 255 1 22 HELIX 19 19 LEU B 258 PRO B 260 5 3 HELIX 20 20 TYR B 261 ASP B 269 1 9 SHEET 1 A 3 HIS A 20 SER A 21 0 SHEET 2 A 3 GLY A 57 SER A 59 -1 N TYR A 58 O HIS A 20 SHEET 3 A 3 PHE A 51 VAL A 53 -1 N PHE A 51 O SER A 59 ...SHEET 3 F 5 LYS B 283 ILE B 292 -1 O ILE B 288 N GLU B 301 SHEET 4 F 5 PRO B 275 ILE B 280 -1 N VAL B 276 O GLY B 287 SHEET 5 F 5 SER B 315 LEU B 316 -1 O SER B 315 N LYS B 277 CISPEP 1 TRP A 173 PRO A 174 0 6.58 CISPEP 2 TRP B 173 PRO B 174 0 1.86 CRYST1 104.900 108.900 143.200 90.00 90.00 90.00 C 2 2 21 16 ORIGX1 1.000000 0.000000 0.000000 0.00000 ORIGX2 0.000000 1.000000 0.000000 0.00000 ORIGX3 0.000000 0.000000 1.000000 0.00000 SCALE1 0.009533 0.000000 0.000000 0.00000 SCALE2 0.000000 0.009183 0.000000 0.00000 SCALE3 0.000000 0.000000 0.006983 0.00000 TER 2357 ARG A 317 TER 4714 ARG B 317 HETATM 4715 C11 BTN 500 55.016 4.107 53.277 1.00 24.55 C HETATM 4716 O11 BTN 500 53.849 4.252 52.886 1.00 21.58 O HETATM 4717 O12 BTN 500 55.291 3.685 54.427 1.00 19.36 O ...HETATM 4744 O3 BTN 501 11.222 5.768 57.924 1.00 24.60 O HETATM 4745 N2 BTN 501 8.951 5.997 57.619 1.00 26.91 N HETATM 4746 C4 BTN 501 8.042 7.170 57.549 1.00 16.77 C HETATM 4747 O HOH 601 72.040 7.563 37.095 1.00 50.46 O HETATM 4748 O HOH 602 67.470 13.053 54.435 1.00 23.36 O HETATM 4749 O HOH 603 62.404 8.599 57.729 1.00 35.02 O ...HETATM 4803 O HOH 1637 -4.593 1.588 80.043 1.00 41.56 O HETATM 4804 O HOH 1638 16.808 21.878 63.229 1.00 44.45 O HETATM 4805 O HOH 1640 -3.419 17.599 37.939 1.00 48.30 O CONECT 4715 4716 4717 4718 CONECT 4716 4715 CONECT 4717 4715 ...CONECT 4742 4741 4743 CONECT 4743 4742 4744 4745 CONECT 4744 4743 CONECT 4745 4743 4746 CONECT 4746 4738 4741 4745 MASTER 322 0 2 20 30 0 0 6 4803 2 32 50 END |
En clair, on élimine toutes les lignes ATOM de la protéine, et à l’intérieur du nouvel ensemble on élimine toutes les lignes REMARK. Il nous reste une partie de l’entête du fichier PDB avec des blocs correspondant à des données de classification, bibliographiques, la séquence primaire (SEQRES), des données de structures secondaire (HELIX, SHEET), informations cristallographiques, les fins de chaines (TER), les hétéroatomes (HETATM): ligand BTN (Biotine) et eau, information de connectivité (CONNECT) pour le ligand …
Dans le cas de la chaine s2 on aura le même résultat mais amputé des lignes HETATM et CONNECT avec une autre manière de passer les arguments.
Mode non destructif (mgrep)
En général avec de multiples GREP on procède à des intersections, mais on peut imaginer des actions non destructives qui combinent une liste de filtres, qui additionnent leurs retours dans le résultat. Le module comporte donc un succédané de GREP fonctionnant en mode additif (mgrep pour multiple grep) avec la fonction pdb_str_mgrep_get. Par exemple:
|
1 |
s = pdb_str_mgrep_get(s, "HELIX§SHEET") |
Donnera comme résultat (contenu de la chaine s après opération) à la fois les lignes HELIX et SHEET:
=> additive grep of 'HELIX' and 'SHEET'HELIX 1 1 ASN A 4 ALA A 15 1 12 HELIX 2 2 GLY A 22 LEU A 29 1 8 HELIX 3 3 SER A 32 ASP A 45 1 14 ...SHEET 3 F 5 LYS B 283 ILE B 292 -1 O ILE B 288 N GLU B 301 SHEET 4 F 5 PRO B 275 ILE B 280 -1 N VAL B 276 O GLY B 287 SHEET 5 F 5 SER B 315 LEU B 316 -1 O SER B 315 N LYS B 277 |
Le principe que nous suivons est toujours d’avoir des fonctions simples et compréhensibles que l’on va pouvoir combiner entre elles, un peu comme les étages d’une fusée, plutôt que des fonction complexes et ‘intelligentes’ qui se révèleront tôt ou tard trop spécialisées.
Donc nous disposons d’une panoplie de filtres permettant d’extraire beaucoup d’informations de fichiers PDB, informations contenues dans les lignes qui peuvent servir de substrat à des filtres plus évolués (par exemple récupération de données sur des colonnes).
Mais il nous faut plus, car dans un fichier PDB nous avons des blocs d’information, mal délimités mais bien réels et qui peuvent s’étendre sur plusieurs mots clés, à plusieurs positions dans le fichier. A noter qu’il y avait eu une tentative de PDB-XML, mais qui était un simple reformatage, donc sensible à toutes les erreurs, la PDB n’avait visiblement pas travaillé sur une refonte dirigée par une analyse systématique des coordonnées. Nous allons donc nous intéresser à l’extraction de blocs en mode chaine de caractères.