La finalité initiale du paquetage buildez.pdb est de fournir des outils pour préparer de manière robuste et automatisée des structures d’enzymes. Quand on parle de préparation il s’agit pour une grande part d’éclater la structure en ses différentes chaines (A, B, ..) pour constituer une liste de monomères, pour un type protéique donné (plusieurs entrées PDB correspondant à une enzyme, par exemple). Sans oublier les molécules connexes (eau, les substrats, inhibiteurs, cofacteurs … ) et de faciliter l’identification des vrais ligands (euligands) par rapport aux artefacts liés à la mixture de cristallisation. Ces monomères (éventuellement ligandés) seront ensuite alignés et comparés, de manière à faire ressortir les variations structurales.
Ce processus doit permettre aussi d’avoir des structures prêtes pour d’autres étapes: explorations (relations structure – fonction) ou modélisations moléculaires. La préparation des protéines permet aussi de détecter les chaines qui ne sont pas complètes et ne pourront pas être utilisées par certains calculs. Disposer d’un outil de ce type est stratégique dans le contexte d’une automatisation en masse, car selon la collection on peut avoir jusqu’à 90% de structures qui ne pourront pas être (1) utilisées dans les calculs.
D’après un article publié en 2012 sur buildez.net – Revu en Avril 2025.
Navigation dans le guide
Guide [ Composants : buildez.pdb ]
1. Principe de conservation des informations
Nous partons sur l’idée qu’il faut conserver le maximum d’informations, en particulier s’il s’agit d’un processus de préparation. Par exemple, si on parse un fichier PDB, en ne conservant que les coordonnées moléculaires, nous perdons de l’information, notamment ce qui était contenu dans l’entête. Donc un choix est fait par les programmeurs, au niveau des lignes qui vont être intégrées. Dans un processus de préparation il est souhaitable de rester le plus près possible des données brutes (RAW data) car nous pourrons avoir besoin de ces informations originales ultérieurement.
Nous allons illustrer cette idée avec la matrice pdbm qui embarque les coordonnées moléculaires d’une protéine et de ses ligands (et molécules d’eau). Le terme ‘matrice’ est un abus de langage, ils ne s’agit pas d’une matrice au sens strict. Nous aurons un nombre de colonnes qui est différent selon le type de ligne. Nous aurons tous les champs de la PDB (+ 1 colonne) pour les lignes de coordonnées, et deux colonnes pour les autres. En fait, la matrice pdbm inclue en dernière colonne un pointeur (empreinte de lignes) qui nous permets à la ligne correspondante dans le fichier PDB initial.
En utilisant cette approche, l’information est conservée, d’une manière assez légère, qui ne gêne pas l’exploitation (en général basée sur les coordonnées) de la ‘matrice’
pdbm.
2. Matrice pdbm et empreintes de lignes
Il est plus facile de comprendre par l’exemple, prenons le cas de la structure 1HXD [Weaver_2001] et faisons afficher les lignes 450 à 470 du ficher, dans la zone ou l’entête se termine et les blocs de coordonnées commencent:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
SHEET 2 F 5 LEU B 298 GLN B 302 -1 N LEU B 298 O TRP B 309 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 ATOM 1 N ASN A 4 66.039 30.785 50.117 1.00 88.31 N ATOM 2 CA ASN A 4 66.049 29.799 51.200 1.00 85.31 C ATOM 3 C ASN A 4 67.440 29.525 51.712 1.00 73.80 C ATOM 4 O ASN A 4 67.713 28.613 52.474 1.00 78.35 O ATOM 5 CB ASN A 4 65.401 28.459 50.827 1.00 85.69 C ATOM 6 CG ASN A 4 64.012 28.337 51.410 1.00100.00 C ATOM 7 OD1 ASN A 4 63.343 27.285 51.281 1.00100.00 O ATOM 8 ND2 ASN A 4 63.571 29.431 52.045 1.00100.00 N |
Nous constatons la présence de lignes correspondant aux mots clés SHEET, CISPEP, CRYST, ORIGX, SCALE pour l’entête et ATOM pour les coordonnées moléculaires. Si on affiche les lignes correspondantes (d’indice 449 à 469) dans la matrice pdbm, nous aurons:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
['-', 450] ['-', 451] ['-', 452] ['-', 453] ['-', 454] ['-', 455] ['-', 456] ['-', 457] ['-', 458] ['-', 459] ['-', 460] ['-', 461] ['-', 462] ['ATOM', 1, 'N', '', 'ASN', 'A', 4, '', 66.039, 30.785, 50.117, 1.0, 88.31, '', 'N', '', 463] ['ATOM', 2, 'CA', '', 'ASN', 'A', 4, '', 66.049, 29.799, 51.2, 1.0, 85.31, '', 'C', '', 464] ['ATOM', 3, 'C', '', 'ASN', 'A', 4, '', 67.44, 29.525, 51.712, 1.0, 73.8, '', 'C', '', 465] ['ATOM', 4, 'O', '', 'ASN', 'A', 4, '', 67.713, 28.613, 52.474, 1.0, 78.35, '', 'O', '', 466] ['ATOM', 5, 'CB', '', 'ASN', 'A', 4, '', 65.401, 28.459, 50.827, 1.0, 85.69, '', 'C', '', 467] ['ATOM', 6, 'CG', '', 'ASN', 'A', 4, '', 64.012, 28.337, 51.41, 1.0, 100.0, '', 'C', '', 468] ['ATOM', 7, 'OD1', '', 'ASN', 'A', 4, '', 63.343, 27.285, 51.281, 1.0, 100.0, '', 'O', '', 469] ['ATOM', 8, 'ND2', '', 'ASN', 'A', 4, '', 63.571, 29.431, 52.045, 1.0, 100.0, '', 'N', '', 470] |
Nous constatons que la matrice pdbm ne conserve pas seulement les coordonnées, elle conserve aussi une trace de toutes les lignes du fichier PDB original. Les lignes qui ne correspondent pas à des coordonnées moléculaires sont masquées et remplacées par un symbole au choix (ici le caractère ‘-‘). Toutes les lignes de la matrice conservent en dernière colonne le numéro correspondant de la ligne du fichier PDB (450 à 470) quelque soit le type de ligne.
Si nous voulons transformer cette matrice en un nouveau fichier PDB, nous pourrions sauver uniquement les coordonnées moléculaires en transformant chaque ligne pdbm en chaine de caractères puis en concaténant ces chaines intermédiaires. Mais nous pouvons faire plus, sachant que nous avons les pointeurs vers les lignes initiales, nous éviter de convertir la pdbm, il nous suffit de s’en servir pour aller cherche les lignes correspondantes du fichier PDB original.
Il ne s’agit pas de se compliquer inutilement la vie mais de complexifier un tout petit peu la structure de données pour qu’elle soit plus facile à utiliser à la suite et qu’elle amène plus de potentialités.
3. Sauvegarde de la structure
Nous allons donc recruter les lignes correspondantes du fichier PDB grâce aux informations contenues dans la dernière colonne, en d’autres termes, nous n’interprétons pas les données de la matrice mais nous utilisons à nouveau les lignes du fichier PDB initial. Si des lignes d’une matrice sont supprimées (par exemple si nous ne gardons que la sous-unité A) l’ensemble du fichier (entête y compris) à l’exclusion des lignes de coordonnées supprimées, pourra être régénéré sans manipulations supplémentaires.
Il en est de même si la matrice est réordonnée par un quelconque tri. Il faut bien différencier ces cas de ceux ou il y a des modifications dans les colonnes d’un bloc de coordonnées (un changement de numérotation des atomes, un changement de la valeur des coordonnées, etc). Dans ce cas il faudra sauver les nouvelles coordonnées mais on peut utiliser la même stratégie pour les autres lignes de la matrice.
En mode standard
Le module pdbm.py fournit les fonctions pdb_pdbm2str_extended et pdb_pdbm2str pour réaliser ce type de travail. Comme leur nom l’indique, elles transforment une matrice pdbm (tag ‘pdbm2’) en une chaine de caractères (tag ‘str’). Elles utilisent comme ‘substrat’ la chaine de caractères (argument s dans l’exemple suivant) qui provient directement du fichier et a servi pour le calcul initial de la matrice pdbm. Si nous transformons le bloc (lignes d’indices 449 à 469) de la section précédente en chaine de caractères au moyen de la fonction pdb_pdbm2str :
|
1 2 3 4 5 6 |
s = pdb_file2str(file_cleanpath(site_package + "/test/1hxd.pdb") pdbm = pdb_str2pdbm(s) ... print("start ------------ 449") print(pdb_pdbm2str(pdbm[449:470], s)) print("stop ------------ 470") |
Nous aurons le résultat suivant:
![]() |
Nous constatons que dans le contenu, les SHEET, CISPEP, CRYST, ORIGX, SCALE ont disparu, c’est normal la fonction pdbm_pdbm2str ne réimplante que les coordonnées moléculaires présentes dans le fichier initial (la chaine s). Mais elle laisse des caractères de fin de ligne à la place des lignes qu’elle n’a pas intégré dans la chaine de caractères qu’elle renvoie. Cela ne gêne pas (en général) l’interprétation de fichiers PDB par des outils de visualisation moléculaire, et cela indique au préparateur qu’il y avait quelque chose à cet endroit précis dans le fichiers PDB initial.
Si des données dans les colonnes des lignes
ATOMouHETATMont changé, elles ne sont pas injectées dans la chaine PDB produite, car la fonction se borne à recruter des lignes du fichier initial.
Normalisation et annotation de structures
Deux fonctions pdb_str_clean et pdb_str_addspacedr du module pdb.str se chargeront si nécessaire de ‘normaliser’ la chaine PDB produite. La première va éliminer ces fameuses lignes vides, mais aussi ne garder que les lignes commençant par des clés PDB valides, soit: HEADER, OBSLTE, TITLE, CAVEAT, COMPND, SOURCE, KEYWDS, EXPDTA, AUTHOR, REVDAT, SPRSDE, JRNL, REMARK, SSBOND, DBREF, SEQADV, SEQRES, MODRES, HET, HETNAM, FORMUL, HELIX, SHEET, TURN, LINK, HYDBND, SLTBRG , CISPEP, CRYST1, ORIGX1, ORIGX2, ORIGX3, SCALE1, SCALE2, SCALE3, MTRIX1, MTRIX2, MTRIX3, TVECT, MODEL, ATOM, HETATM, SIGATM, ANISOU, SIGUIJ, ENDMDL, CONECT, MASTER, END, TER.
Fonction stupide ? non … Car cela veut dire que vous pouvez placer n’importe qu’elle ligne dans un fichier PDB maître, des commentaires avec de nouveaux mots clés ou de simples #, des blocs à d’autre formats (par exemple un ligand au format MDL Mol ou SMILES) … il n’y a pas de limites à l’annotation et cela peut être très utile. Une fois de plus il faut arrêter de penser conforme et penser pratique. Au moment de générer la matrice pdbm (après utilisation de la fonction pdb_file2str) un passage par cette fonction permettra de réaliser un retour au ‘vrai’ format PDB. Après génération de la nouvelle chaine PDB par pdb_pdbm2str_extended ou pdb_pdbm2str, un autre passage par cette fonction permettra d’éliminer toutes les lignes vides.
La fonction pdb_str_addspacedr élimine aussi les lignes vides, mais ne valide pas par mots clés, par contre elle ajoute des espaces en fin de ligne jusqu’à la colonne 78, ce qui peut encore être demandé par certains logiciels.
En mode étendu
Dans ce cas on fait appel à la fonction pdb_pdbm2str_extended qui permet d’injecter à nouveau les lignes du fichier PDB initial correspondant à des mots clés différent de ATOM ou HETATM :
|
1 2 3 |
print("start ------------ 449") print(pdb_pdbm2str_extended(pdbm[449:470], s, ['ATOM', 'HETATM', 'SHEET'])) print("stop ------------ 470") |
Dans ce cas, nous avons demandé 3 mots clés ATOM, HETATM et SHEET, nous aurons comme résultat:
![]() |
Nous constatons que les lignes SHEET sont apparues, nous pouvons donc faire ressortir toutes les informations du PDB originel, ou n’en sélectionner que certaines (ce qui est en général le cas pour un fichier de production). Il est recommandé d’utiliser le set minimal ATOM, HETATM, TER, END, CONECT pour produire un fichier PDB valide. C’est la ou nous faisons plus fort qu’un filtre ou un GREP qui va souvent oublier les mots clés qui complètent les lignes de coordonnées.
Exemple d’utilisation – Ce type de fonction est très pratique après un éclatement de structure, elle permet de dupliquer dans chaque chaine sauvée des éléments de l’entête PDB, si on souhaite garder ces informations dans la suite du processus.
Si des éléments externes ont été ajoutés a l’entête, de nouveaux mots clés qui ne sont pas dans le dictionnaire PDB mais vous servent à annoter des fichiers (cf. sous section précédente) il suffira de les ajouter dans la liste donnée en argument à la fonction, et les informations correspondantes seront propagées de fichier en fichier. Il faudra néanmoins faire attention de ne pas utiliser pdb_str_clean mais plutôt pdb_str_addspacedr pour éliminer les lignes vides si on ne veut pas perdre les annotations.
Cette fonction prends en compte tout changement dans les colonnes des blocs de coordonnées moléculaires car elle effectue la conversion de chaque ligne de coordonnées de la matrice pdbm au moyen de la fonction
pdb_pdbm_row2strdu même modulepdbm.py(la fonctionpdb_pdbm_rows2strest aussi présente dans le module). Les lignes qui ne correspondent pas à des coordonnées sont recrutés dans la chaine PDB initiale s de la même manière qu’avec la fonctionpdb_pdbm2str.
4. Conclusion
Dans ce contexte, la manière dont on sauve les structures est importante, c’est la possibilité d’annoter, de perdre ou de conserver les données et les métadonnées initiales. A titre d’exemple, les 6 premières lignes du fichier 1hxd.pdb original, sauvées après une manipulation sous DSV, l’entête a disparu :
|
1 2 3 4 5 6 |
REMARK Accelrys Discovery Studio PDB file REMARK Created: Sun Dec 19 21:24:23 Paris, Madrid 2013 CRYST1 104.900 108.900 143.200 90.00 90.00 90.00 C2221 ATOM 1 N ASN A 4 66.039 30.785 50.117 1.00 88.31 N1+ ATOM 2 CA ASN A 4 66.049 29.799 51.200 1.00 85.31 C ATOM 3 C ASN A 4 67.440 29.525 51.712 1.00 73.80 C |
La plupart du temps ce type de simplification n’impacte pas, sauf justement quand il s’agit d’entrer dans un processus de préparation à grande échelle. En effet, le manque d’annotation (donc de possibilités d’indexation) peut être limitant pour la suite des étapes. Ce que l’on peut éviter grâce à des petites idées simples à implémenter sur le plan informatique mais issues d’une vraie réflexion en amont, qui nous simplifieront les tâche en aval.
Liens et lectures
- Remarque (1) – En effet des structures peuvent présenter des discontinuités (pseudo délétions) dans la chaine polypeptidiques (par exemple une boucle hyper mobile qui ne se structure pas et n’apparaît pas dans la cristallographie), des résidus incomplets, ou encore des résidus avec des conformations alternatives.
- Structure 1HXD [ https://www.rcsb.org/structure/1HXD ].

