buildez.pdb: travaux en mode string (str, strfilter)

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 :

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 :

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 :

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 :

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:

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.

Retour en haut