Le paquetage buildez.pdb regroupe toute une série de fonctions qui permettent une manipulation approfondie de fichiers PDB, de manière à les utiliser dans des traitements automatisés, et sans risques d’erreurs d’exécution dus à des imperfections (courantes) dans les fichiers de coordonnées structurales. Cela veut dire qu’il est possible aussi de traiter des structures incomplètes ou dans lesquelles il peut manquer des informations, par exemple des numéros de résidus, des indicateurs de chaîne …
D’après un article publié en 2012 sur buildez.net – Revu en Mai 2025.
Navigation dans le guide
Guide [ Composants : buildez.pdb ]
1. Position du problème
Une structure de protéine est un objet hiérarchisé (modèle -> chaine -> résidu -> atome, par exemple). C’est ce qui correspond aussi à la perception biochimique, séquence primaire, structure secondaires, motifs structuraux et structures tertiaire, structure quaternaire. Il est donc tentant d’implémenter un parseur qui construit une hiérarchie d’objets, avec des arbres, sous-arbres, de la structure quaternaire (ou de l’unité asymétrique) jusqu’aux atomes.
Mais dès qu’il y a un problème qui perturbe cette construction, une exception est déclenchée qui évite l’interruption du programme, car il faut constituer cette hiérarchie, ce qui peut se traduire par des résidus manquants ou d’autres erreurs. Selon le code, ces exceptions ne seront pas signalées, nous n’aurons qu’une vision ‘positive’ de la structure. Pour s’en rendre compte il suffit de consulter l’article [ Parser un fichier PDB avec Biopython ] qui montre comment le parseur de Biopython agit (paquetage Bio.PDB). Si les fichiers sont traités en lot, il sera difficile de savoir quelles structures sont affectées par des erreur et la criticité de ces erreurs pour un processus en amont. Dans certains domaines ce n’est pas trop gênant, mais au niveau structure based drug design c’est embêtant, imaginons qu’il manque un résidu catalytique dans un site actif …
2. Contournement
En 2025, il est clair qu’il n’y aura pas changement de paradigme concernant les structures de la PDB, malgré tous les efforts de producteurs de structures pour l’améliorer. J’en reste sur la constat initial, c’est à nous coté modélisation à prendre cette problématique à notre charge. Un effort sur un parseur exigeant restera d’actualité. Mais dans ce cas, il faut l’implémenter, alors oublions le coté hiérarchique. Je préfère fonctionner différemment avec des structures de données (principalement des matrices) qui me donnent la possibilité de gérer les biais structuraux. Il est possible d’aller très loin avec ce type de stratégie, tout en maintenant des temps de traitement raisonnables. Dans le cas de buildez.pdb il s’agit avant tout d’avoir des outils robustes et adaptés à notre travail au quotidien qui est de jouer avec un ‘Lego’ de résidus, de chaînes, de ligands, de distances … de manière à préparer des structures pour des analyses structurales ou des calculs de modélisation moléculaire, en particulier de l’arrimage (docking) moléculaire.
Une manière qui peut sembler un peu rétrograde quand on dispose d’outils et de fonctions évolués orientés objet. Mais il se trouve que certaines opérations sont facilités ou simplifiées en travaillant directement sur le flot de données sérialisées plutôt que sur l’objet initial, que l’on pourra régénérer si nous avons pris quelques précautions. C’est le concept qui est à la base de buildez.pdb, disposer et générer des structures de données, finalisées ou intermédiaires. Et nous qui donnent directement une vue de certains aspects de la structure moléculaire, que l’on va pouvoir directement utiliser dans du code pour générer rapidement une application.
3. Test drive
Nous allons utiliser la structure 2CGP [Passner_1997] qui correspond à un complexe ADN-Protéine. La protéine récepteur d’AMPc (CRP en Anglais, ou Catabolite Activator Protein: CAP en Anglais) est capable de réguler la transcription chez les bactéries. Un cas d’étude intéressant, car on y trouve deux chaines protéiques, deux hélices d’ADN, deux ligands (AMP cyclique) dans chaque chaine, et des molécules d’eau.
![]() |
Comme nous le voyons avec Discovery Studio, chaque fragment d’acide nucléique est constituée de deux brins identifiés sous la forme de chaînes B (11 nucléotides, résidus de numéro 503 à 513) et C (15 nucléotides, résidus 534-548). La protéine est identifiée avec la chaîne A (résidus 8-207). Les deux molécules d’AMPc (adénosine monophosphate cyclique) qui sont visibles (sphères moléculaires) sont attribuées à la chaîne A et identifiées sous le code CMP (Adenosine -3′,5′-cyclic monophosphate) avec les numéros de résidus 621 et 622. Les molécules d’eau sont numérotées de 1 à 149 par le logiciel qui n’a pris en compte que les molécules affectées à la chaîne A et qui est de plus incohérent car ces numéros de résidus sont déjà pris par des acides aminés de la chaîne polypeptidique. En réalité, dans le fichier PDB la distribution des molécules d’eau est la suivante (les ‘…’ remplacent des lignes consécutives pour alléger la présentation):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
HETATM 2158 O HOH B 705 -12.181 22.568 17.768 1.00 13.59 O HETATM 2159 O HOH B 811 -14.120 36.388 -12.745 1.00 36.57 O HETATM 2160 O HOH C 721 -11.506 15.899 23.914 1.00 16.02 O HETATM 2161 O HOH C 727 -11.675 16.447 4.977 1.00 28.22 O HETATM 2162 O HOH C 729 -15.473 20.136 27.546 1.00 15.97 O HETATM 2163 O HOH C 743 -3.492 8.818 18.856 1.00 24.44 O HETATM 2164 O HOH C 748 -4.470 13.160 30.067 1.00 25.41 O HETATM 2165 O HOH C 764 -1.185 17.792 20.446 1.00 32.35 O HETATM 2166 O HOH C 768 1.199 9.229 19.391 1.00 39.70 O HETATM 2167 O HOH C 784 1.156 15.442 14.708 1.00 30.55 O HETATM 2168 O HOH C 804 6.336 13.720 15.040 1.00 33.44 O HETATM 2169 O HOH C 808 -3.966 26.545 -1.742 1.00 35.25 O HETATM 2170 O HOH C 809 -11.796 19.361 4.192 1.00 30.74 O HETATM 2171 O HOH C 812 1.074 12.657 24.158 1.00 39.11 O HETATM 2172 O HOH C 819 -8.573 12.319 8.146 1.00 34.15 O HETATM 2173 O HOH C 821 -12.127 9.895 3.535 1.00 38.01 O HETATM 2174 O HOH C 844 -10.406 10.583 9.641 1.00 24.88 O HETATM 2175 O HOH A 700 -21.430 28.011 17.390 1.00 10.77 O HETATM 2176 O HOH A 701 -12.817 25.766 19.436 1.00 7.74 O HETATM 2177 O HOH A 702 -26.349 38.377 15.387 1.00 17.74 O ... HETATM 2304 O HOH A 846 -37.607 47.797 16.528 1.00 33.92 O HETATM 2305 O HOH A 847 -30.150 16.824 11.592 1.00 28.47 O HETATM 2306 O HOH A 848 -12.218 50.040 4.433 1.00 30.37 O |
Un code minimal
Une fois le décor planté, nous allons charger le fichier PDB dans une chaîne de caractères s au moyen de la fonction pdb_file2str. Puis nous créons une matrice pdbm avec la fonction pdb_str2pdbm et une matrice resmap avec la fonction pdb_pdbm2resmap et la matrice pdbm précédente. Par exemple :
|
1 2 3 4 5 6 7 8 9 10 |
print("*** loading a PDB string") s = pdb_file2str("test/2cgp.pdb") # Sous Windows on utilise # s = pdb_file2str(file_cleanpath(site_package + "/test/2cgp.pdb") print("*** computing a pdbm matrix and a resmap") pdbm = pdb_str2pdbm(s) print(pdbm[0:1]) print(pdbm[362:382]) resmap = pdb_pdbm2resmap(pdbm) print(resmap[0:5]) |
Production d’une matrice pdbm
C’est la brique de base de buildez.pdb qui permet de stocker les coordonnées moléculaires et qui servira pour la plupart des recherches ou la production de données dérivées: matrices de résidus, chaines … La matrice pdbm permet de stocker les coordonnées moléculaires tout en gardant une empreinte ‘fossile’ de ce qui était présent dans le fichier initial.
Par exemple l’affichage de la première ligne, d’indice zéro (0 .. n-1) de cette matrice va donner: [['-', 1]]. Il s’agit de la trace d’une ligne de l’entête du fichier PDB qui ne contient pas de coordonnées moléculaires. Le dernier terme (valeur 1) réfère à la ligne correspondante dans le fichier PDB. Par contre l’affichage des lignes d’indice 362 à 382 va donner:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
['ATOM', 1, "O5'", '', 'DG', 'B', 503, '', -10.647, 21.093, 16.161, 1.0, 34.52, '', 'O', '', 363], ['ATOM', 2, "C5'", '', 'DG', 'B', 503, '', -9.565, 21.375, 15.254, 1.0, 34.57, '', 'C', '', 364], ['ATOM', 3, "C4'", '', 'DG', 'B', 503, '', -8.235, 21.705, 15.897, 1.0, 35.29, '', 'C', '', 365], ['ATOM', 4, "O4'", '', 'DG', 'B', 503, '', -7.822, 20.57, 16.708, 1.0, 35.72, '', 'O', '', 366], ['ATOM', 5, "C3'", '', 'DG', 'B', 503, '', -7.131, 21.863, 14.854, 1.0, 35.44, '', 'C', '', 367], ['ATOM', 6, "O3'", '', 'DG', 'B', 503, '', -6.12, 22.801, 15.175, 1.0, 34.24, '', 'O', '', 368], ['ATOM', 7, "C2'", '', 'DG', 'B', 503, '', -6.568, 20.471, 14.711, 1.0, 36.49, '', 'C', '', 369], ['ATOM', 8, "C1'", '', 'DG', 'B', 503, '', -6.737, 19.873, 16.094, 1.0, 37.07, '', 'C', '', 370], ['ATOM', 9, 'N9', '', 'DG', 'B', 503, '', -7.116, 18.472, 15.943, 1.0, 39.13, '', 'N', '', 371], ['ATOM', 10, 'C8', '', 'DG', 'B', 503, '', -8.368, 17.918, 16.058, 1.0, 39.57, '', 'C', '', 372], ['ATOM', 11, 'N7', '', 'DG', 'B', 503, '', -8.384, 16.635, 15.812, 1.0, 40.35, '', 'N', '', 373], ['ATOM', 12, 'C5', '', 'DG', 'B', 503, '', -7.06, 16.323, 15.527, 1.0, 41.47, '', 'C', '', 374], ['ATOM', 13, 'C6', '', 'DG', 'B', 503, '', -6.446, 15.075, 15.19, 1.0, 42.22, '', 'C', '', 375], ['ATOM', 14, 'O6', '', 'DG', 'B', 503, '', -6.971, 13.959, 15.071, 1.0, 42.97, '', 'O', '', 376], ['ATOM', 15, 'N1', '', 'DG', 'B', 503, '', -5.076, 15.216, 14.986, 1.0, 42.35, '', 'N', '', 377], ['ATOM', 16, 'C2', '', 'DG', 'B', 503, '', -4.381, 16.396, 15.091, 1.0, 42.4, '', 'C', '', 378], ['ATOM', 17, 'N2', '', 'DG', 'B', 503, '', -3.059, 16.331, 14.856, 1.0, 42.7, '', 'N', '', 379], ['ATOM', 18, 'N3', '', 'DG', 'B', 503, '', -4.936, 17.555, 15.402, 1.0, 41.96, '', 'N', '', 380], ['ATOM', 19, 'C4', '', 'DG', 'B', 503, '', -6.267, 17.446, 15.607, 1.0, 40.82, '', 'C', '', 381], ['ATOM', 20, 'P', '', 'DT', 'B', 504, '', -5.153, 23.32, 14.008, 1.0, 33.43, '', 'P', '', 382], ... |
Nous retrouvons les champs PDB classiques, ainsi qu’un pointeur vers la ligne du fichier PDB original en dernière position.
Production d’une resmap
La resmap correspond à une carte des résidus, plus simplifiée que les blocs de coordonnées de la PDB ou de la matrice pdbm. Par exemple, pour les 5 premiers résidus de la structure nous obtenons :
|
1 2 3 4 5 6 |
[['DG', 503, 363, 381, -1, ''], ['DT', 504, 382, 401, -1, ''], ['DC', 505, 402, 420, -1, ''], ['DA', 506, 421, 441, -1, ''], ['DC', 507, 442, 460, -1, ''], ... |
Les colonnes d’indice 2 et 3 (363, 381 pour la première ligne) correspondent à l’index (1 .. n) des lignes dans le fichier initial, on sait donc que ce résidu DG503 est défini par les lignes 363 à 381 (incluses) du fichier PDB. On retrouve d’ailleurs ces informations dans la dernière colonne de la matrice pdbm précédente.
Il s’agit de données qui paraissent sans intérêt pour un biologiste structural, mais qui deviennent importantes et facilitent le travail quand on veut restaurer le fichier texte initial. Il ne faut pas oublier non plus qu’une partie de notre travail est de jouer avec un Lego moléculaire en assemblant différents morceaux issus de différentes structures.
Un numéro de ligne c’est un tag comme un autre que l’on peut affecter à un atome et on comprend immédiatement que ce tag indépendant d’un numéro d’atome et dont on définit le contenu à volonté (pas seulement un numéro de ligne) peut être d’une grande utilité lors de reconstructions moléculaires automatisées.
4. Définition de chaines polypeptidiques
Maintenant que les données essentielles sont disponibles nous pouvons extraire les chaines de la structure en une opération avec la fonction pdb_pdbm2chain qui combine la pdbm et la resmap. Par exemple, ici on va faire sortir la première (indice 0) chaîne de la protéine:
|
1 2 3 4 5 |
print("*** output of the (first) polypeptidic chain starting at resmap[0]") chain, code, endres = pdb_pdbm2chain(pdbm, resmap, 0) print("=> code = %d ; last resmap indice = %d" % (code, endres)) print("=> chain length is %d residues (length of resmap indices list)" % (len(chain))) print("list of resmap indices corresponding to the residues of this chain:\n", chain) |
Ce qui va donner comme résultat:
*** output of the (first) polypeptidic chain starting at resmap[0]=> code = 1 ; last resmap indice = 225=> chain length is 200 residues (length of resmap indices list)list of resmap indices corresponding to the residues of this chain:[26, 27, 28, ..., 223, 224, 225] |
Les ... limitent l’affichage de la dernière liste qui correspond à une liste d’indices. Il s’agit des numéros d’indices dans la resmap qui correspondent aux résidus d’une même chaine. Ici il s’agit de la partie protéique de la structure qui est précédée par les deux nucléotides: 11+15 résidus = 26 résidus, soit des indices de 0 à 25, la chaîne polypeptidique démarre donc à l’indice 26 dans la resmap.
Affichons les bornes de cette chaîne A, par exemple l’impression de resmap[24:28] donnera comme résultat:
[['DA', 547, 853, 873, -1, ''], ['DT', 548, 874, 893, -1, ''], ['ASP', 8, 895, 902, -1, ''], ['PRO', 9, 903, 909, -1, '']] |
et resmap[224:228] donnera :
[['TYR', 206, 2459, 2470, -1, ''], ['GLY', 207, 2471, 2474, -1, ''], ['CMP', 621, 2476, 2497, -1, ''], ['CMP', 622, 2498, 2519, -1, '']] |
Dans le premier cas nous voyons la fin de la partie acide nucléique et le début de la protéine (résidu ASP8), dans le second cas on voit les résidus terminaux de la protéine (TYR206 et GLY207). On peut de cette manière obtenir très rapidement le nombre de polypeptides dans une structure, par exemple:
|
1 2 3 4 5 |
print("*** output of all polypeptidic chains") print("note: we don't use PDB chain letter info, because this field could not exists") chains = pdb_pdbm2chains(pdbm, resmap) chains_n = len(chains) print("number polypeptidic of chains = %d" % (chains_n)) |
Ce qui donnera comme résultat (chains[0] est équivalent à chain de l’exemple précédent) :
*** output of all polypeptidic chainsnote: we don't use PDB chain letter info, because this field could not existsnumber polypeptidic of chains = 1 |
Il y a ici une seule chaîne, ce système permet également de détecter très rapidement des peptides inhibiteurs complexés à une protéine, ces polypeptides étant comptés comme des chaines protéiques et non des ligands. On peut également être plus explicite dans l’affichage des informations, par exemple avec le code suivant:
|
1 2 3 4 5 6 7 8 9 10 |
print("*** fancy output of chains" print("converting resmap indices for all chains in residues indexes or names" print("notr: sometimes chains have not the same number of residues" print("note: we add an offset of 1000 last chains to differentiate" print("============" for i in range (0, chains_n, 1): print("chain indice = %d" % (i)) print("chain length = %d AA" % (len(chains[i]))) print("resname =", pdb_chain2rnames(resmap, chains, i)) print("resseq =", pdb_chain2rseqs(resmap, chains, i, i*1000)) |
Ce qui va donner le résultat (les ... toujours pour alléger):
*** fancy output of chainsconverting resmap indices for all chains in residues indexes or namesnotr: sometimes chains have not the same number of residuesnote: we add an offset of 1000 last chains to differentiate============chain indice = 0chain length = 200 AAresname = ['ASP', 'PRO', 'THR', ..., 'VAL', 'TYR', 'GLY']resseq = [8, 9, 10, ..., 205, 206, 207] |
Ici pas la peine d’ajouter un offset de 1000 (numéros de résidus) à chaque chaîne pour les différentier, mais c’est parfois bien utile, il suffit après de renuméroter de manière contigüe les atomes, et certains logiciels de modélisation moléculaire se mettent subitement à (re)fonctionner … magique !
Cette simplicité ne doit pas tromper. Le code analyse les coordonnées structurales pour définir un bloc (par exemple un résidu) et une chaine (une suite contigue de résidus) au moyen d’analyses de proximité atomique et des types d’atomes.
Ce n’est qu’après que les informations du fichier PDB (nom de résidu, numéro de résidu, identifiant de chaine …) sont reprises et utilisées. De cette manière le code peut gérer des résidus incomplets, des délétions dans les chaines, des chaines non identifiées … C’est pour cela que l’on gère les chaines via un indice et non via une lettre, car elles sont issues d’une reconstruction de la protéine, atome par atome et non d’une lecture primaire du fichier PDB. La fonction pdb_chains2letters permet d’attribuer une liste de lettres correspondant à la liste des chaines.
5. Une resmap annotée
Pour le moment nous sommes à 4 lignes de codes (appels des fonctions pdb_file2str, pdb_str2pdbm, pdb_pdbm2resmap, pdb_pdbm2chains) et nous avons déjà plusieurs sous-produits bien utiles sous forme de différentes structures de données (matrices pdbm, resmap, listes d’indices …) il ne reste qu’à obtenir une identification plus précise des résidus. On profite pour cela de la dernière colonne qui était inutilisée dans la resmap précédente pour produire une augmented resmap.
La fonction t11 (qui n’avait pas encore de nom bien stabilisée dans l’espace buildez.pdb) a depuis été renommée en pdb_chains2augresmap.
|
1 2 3 4 5 |
print("*** computing an augmented resmap") print("we compute ligand and water with a probe of 3.0 Angstrom") resmap = t11(pdbm, resmap, chains) for i in range (0, len(resmap), 1): print(resmap[i]) |
La structure de données resmap ainsi annotée va donner le résultat suivant :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
['DG', 503, 363, 381, 0, 'lig'] ['DT', 504, 382, 401, 0, 'lig'] ['DC', 505, 402, 420, 0, 'lig'] ... ['DT', 546, 833, 852, 0, 'lig'] ['DA', 547, 853, 873, 0, 'lig'] ['DT', 548, 874, 893, 0, 'lig'] ['ASP', 8, 895, 902, 0, 'aa'] ['PRO', 9, 903, 909, 0, 'aa'] ['THR', 10, 910, 916, 0, 'aa'] ... ['VAL', 205, 2452, 2458, 0, 'aa'] ['TYR', 206, 2459, 2470, 0, 'aa'] ['GLY', 207, 2471, 2474, 0, 'aa'] ['CMP', 621, 2476, 2497, 0, 'lig'] ['CMP', 622, 2498, 2519, 0, 'lig'] ['HOH', 705, 2520, 2520, 0, 'wat'] ['HOH', 811, 2521, 2521, 0, 'wat'] ['HOH', 721, 2522, 2522, 0, 'wat'] ... ['HOH', 846, 2666, 2666, 0, 'wat'] ['HOH', 847, 2667, 2667, 0, 'wat'] ['HOH', 848, 2668, 2668, 0, 'wat'] |
Nous constatons que dans la resmap il existe une information supplémentaire sur le type de résidus: wat pour l’eau, lig pour une molécule autre que de la protéine, aa pour un acide aminé faisant partie d’une chaîne polypeptidique … Ce qui nous donne la possibilité de combiner les informations pour réaliser des requêtes complexes (y compris des requêtes 3D de proximité) et extraire à peu près ce que l’on veut.
La resmap augmentée est ma structure préférée, celle qui offre une vision ‘tactique’ annotée par résidus de la protéine et que l’on peut étendre en fonction des besoins. La fonction pdb_chains2augresmap est une routine assez complexe au niveau du paramétrage 3D utilisé pour la reconnaissance des entités. Pour information, un extrait de la documentation Python :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
def pdb_chains2augresmap(pdbm, resmap, chains, water=True, update=True, radius_offset=2.9, radius=3.0, logfile='', loglevel='VERB'): """ The subroutine gathers all information found in pdbm, resmap and chains matrixes to return a new resmap (update=0) or a resmap updated (update=1) with full attribution of residues. The returned resmap is augmented, for each residue by a chain indice (column 4) and a residue type ('aa', 'lig', 'wat', in column 5). Firstly, the resmap indices corresponding to the different polypeptidic chains must be computed using the pdb_pdbm2chains(pdbm ...) subroutine and tagged in column 4 of resmap to the corresponding chain indice (0 .. n-1 chains). Residues not found in polypeptidic chains are tagged with -1 values. If chains are computed by pdb_pdbm2chains the chain attribution (indice of chain and not a PDB letter) will be done in buildez.pdb space. If chains are computed by the chain attribution (indice) will be done in PDB space. The order of chains is the same than computed by pdb_chains_pdb subroutine, so it will be easy (in PDB space) to convert chains indices in PDB letters. If water=True, ligand, ions and water molecules affectation are computed, if water=0, only ligands and ions are computed and residues 'wat' are let to chain of indice=-1. To affect a given residue to a polypeptidic chain, a calculation of neighbors is done. A radius value and a radius_offset of nearly the same value are set. The radius_offset is used as a basis in order to modify (increase or decrease with different scaling factors) the local value of radius for a given residue. Starting from a radius=3.0 Angstroms and a radius_offset of nearly the same values is good for ligands and waters molecules. For a precise attribution (i.e. compute the distributions of distances to the protein backbone) it is possible to work at better resolution (i.e. radius=1.0 and and radius_offset=0.5). It is better to use a value of radius_offset upper than 1.0 Angstrom (typically near 3.0) to find quickly the values of chains indices for water molecules. The full attribution including waters (water=1) is a time consuming process, for big structures (i.e. 1ADO) with a lot of water molecules. To get quickly a protein with water attribution of ligands and water shell around ligands, it is better to use fonctions from the buildez.pdb.ligands module. The 'lig' type is created for residues not 'wat', 'aa', 'alt', 'ion' but 'ion' and 'lig' (and 'wat' eventually) are taken in account by the procedure. Using this paradigm we drop hetero residues in chains, or dna, rna and we keep only small organic molecules. ... """ |
Forcément le paquetage est toujours en évolution car on rencontre tous les jours des cas particuliers dans les fichiers PDB, qui nécessitent des réajustement de code, mais l’intérêt de buildez.pdb, dans sa conception et son utilisation, est qu’il est toujours possible de le faire, car le code n’est pas monolithique et peut produire des structures de données intermédiaires redondantes.
6. Conclusion
Il ne s’agit ici que d’un aperçu du paquetage focalisé sur des structures de données et non les fonctionnalités ou les différents modules. On aura bien compris à la suite de cet exemple qu’on cherche avant tout à produire des structures de données sérialisées et simplifiées / spécialisées: une resmap ne contiendra pas le même type d’informations qu’une matrice pdbm. Mais la conception du paquetage fait que l’ensemble de ces structures de données sont cohérentes et ‘connectées’.
Par exemple, pour régénérer une chaîne de caractères PDB correspondant aux trois premiers résidus [ASP, PRO, THR] de la protéine, il suffira de récupérer les atomes marqués ‘895’ à ‘916’ dans la matrice pdbm (ou plus directement les lignes d’indice 894 à 915 si on n’a pas changé les tags en chemin). Plusieurs modalités étant disponibles: la chaîne de caractères originale qui peut contenir en plus des éléments de l’entête, ou une chaine de caractères produite à partir des coordonnées seules de la matrice pdbm et qui pourra être ‘corrigée’ des imperfections du texte PDB originel.
L’objectif de
buildez.pdbétant de manipuler des structures de protéines de manière automatisée, le paquetage est orienté vers des fonctionnalités qui permettent, avant tout de travailler en ‘aveugle’ et manière robuste: sans utiliser d’autres informations que le type d’atome, les coordonnées cartésiennes (x,y,z) et éventuellement le nom de résidu.
Liens et lectures
- Structure 2CGP [ https://www.rcsb.org/structure/2CGP ].
- cAMP receptor protein [ https://en.wikipedia.org/wiki/CAMP_receptor_protein ].
- Adénosine monophosphate cyclique [ https://fr.wikipedia.org/wiki/Ad%C3%A9nosine_monophosphate_cyclique ].
- P0ACJ8 · CRP_ECOLI [ https://www.uniprot.org/uniprotkb/P0ACJ8/entry ].
