J’ai déjà décrit des fonctionnalités du module pdb.altloc en ce qui concerne les résidus (acides aminés) standards de protéines. Sauf que d’autres résidus peuvent avoir des conformations alternatives, par exemple des résidus incomplets (chaine latérale), des ligands ou même des molécules d’eau ! Il s’agit de cas que nous devons être capables de traiter, si on veut que le module soit complet.
Les exemples seront basés sur les structures (1ADO et 1OIM) de deux enzymes que nous avons utilisé au laboratoire. La structure 1ADO [Blom_1997] correspond à une aldolase (D-fructose 1,6-bisphosphate aldolase) de lapin qui nous intéresse ici pour son ligand 13P (1,3-dihydroxyacetonephosphate). La structure 1OIM [Zechel_2003] correspond à une ß-glucosidase de Thermotoga maritima et qui ligande un iminosucre, le NOJ (1-deoxynojirimycin). Cette structure nous intéresse ici par quelques exceptions qui vont nous permettre de tester d’autres types d’atomes désordonnés.
Publication initiale en 2021, révisé en Avril 2025.
Navigation dans le guide
Guide [ Composants : buildez.pdb ]
1. Ligands alternatifs
Les composés co cristallisés intéressent particulièrement les chimistes médicinaux, et il se trouve que certains sont en conformation alternative. C’est le cas du ligand 13P de la structure 1ADO que l’on peut détecter et afficher, la fonction pdb_altloc_pdbmcheck et pdb_altloc_resmapcheck produiront des résultats classiques, que l’on peut afficher :
|
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 |
> checking structure {test/1ado.pdb} check atoms: altloc=24 occupancy=36 counts found 1 alt residues ['13P', 1104, 14583, 14606, -1, ''] found 2 conformers conformer 'A' selected 0 ['HETATM', 13607, 'P', '', '13P', 'A', 1104, '', 23.058, 27.232, 23.781, 0.5, 57.86, '', 'P', '', 14583] 0 ['HETATM', 13609, 'O1P', '', '13P', 'A', 1104, '', 23.274, 25.761, 24.431, 0.5, 55.99, '', 'O', '', 14585] 0 ['HETATM', 13611, 'O2P', '', '13P', 'A', 1104, '', 21.673, 26.972, 23.065, 0.5, 55.21, '', 'O', '', 14587] 0 ['HETATM', 13613, 'O3P', '', '13P', 'A', 1104, '', 24.079, 27.541, 22.652, 0.5, 56.78, '', 'O', '', 14589] 0 ['HETATM', 13615, 'O1', '', '13P', 'A', 1104, '', 22.889, 28.51, 24.771, 0.5, 55.72, '', 'O', '', 14591] 0 ['HETATM', 13617, 'C1', '', '13P', 'A', 1104, '', 23.417, 29.822, 24.436, 0.5, 51.45, '', 'C', '', 14593] 0 ['HETATM', 13619, 'C2', '', '13P', 'A', 1104, '', 24.575, 30.28, 25.301, 0.5, 50.5, '', 'C', '', 14595] 0 ['HETATM', 13621, 'O2', '', '13P', 'A', 1104, '', 24.625, 29.961, 26.486, 0.5, 50.99, '', 'O', '', 14597] 0 ['HETATM', 13623, 'C3', '', '13P', 'A', 1104, '', 25.662, 31.146, 24.694, 0.5, 48.96, '', 'C', '', 14599] 0 ['HETATM', 13625, 'O3', '', '13P', 'A', 1104, '', 25.875, 30.777, 23.343, 0.5, 47.88, '', 'O', '', 14601] 0 ['HETATM', 13627, 'HOP2', '', '13P', 'A', 1104, '', 21.552, 25.966, 23.097, 0.5, 56.06, '', 'H', '', 14603] 0 ['HETATM', 13629, 'HO3', '', '13P', 'A', 1104, '', 26.172, 29.853, 23.315, 0.5, 47.28, '', 'H', '', 14605] 1 ['-', 14584] 1 ['-', 14586] 1 ['-', 14588] 1 ['-', 14590] 1 ['-', 14592] 1 ['-', 14594] 1 ['-', 14596] 1 ['-', 14598] 1 ['-', 14600] 1 ['-', 14602] 1 ['-', 14604] 1 ['-', 14606] |
Le cas d’un ligand se traite systématiquement de la même manière et par le même code, dans un premier temps, il faut choisir la conformation. Dans l’exemple précédent, c’est la conformation 0/A qui a été sélectionnée. Puis il faut mettre à jour la matrice pdbm, pour masquer la seconde conformation, ce qui nous donne :
|
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 |
update pdbm for the residue ['HETATM', 13607, 'P', '', '13P', 'A', 1104, '', 23.058, 27.232, 23.781, 0.5, 57.86, '', 'P', '', 14583] ['-', 14584] ['HETATM', 13609, 'O1P', '', '13P', 'A', 1104, '', 23.274, 25.761, 24.431, 0.5, 55.99, '', 'O', '', 14585] ['-', 14586] ['HETATM', 13611, 'O2P', '', '13P', 'A', 1104, '', 21.673, 26.972, 23.065, 0.5, 55.21, '', 'O', '', 14587] ['-', 14588] ['HETATM', 13613, 'O3P', '', '13P', 'A', 1104, '', 24.079, 27.541, 22.652, 0.5, 56.78, '', 'O', '', 14589] ['-', 14590] ['HETATM', 13615, 'O1', '', '13P', 'A', 1104, '', 22.889, 28.51, 24.771, 0.5, 55.72, '', 'O', '', 14591] ['-', 14592] ['HETATM', 13617, 'C1', '', '13P', 'A', 1104, '', 23.417, 29.822, 24.436, 0.5, 51.45, '', 'C', '', 14593] ['-', 14594] ['HETATM', 13619, 'C2', '', '13P', 'A', 1104, '', 24.575, 30.28, 25.301, 0.5, 50.5, '', 'C', '', 14595] ['-', 14596] ['HETATM', 13621, 'O2', '', '13P', 'A', 1104, '', 24.625, 29.961, 26.486, 0.5, 50.99, '', 'O', '', 14597] ['-', 14598] ['HETATM', 13623, 'C3', '', '13P', 'A', 1104, '', 25.662, 31.146, 24.694, 0.5, 48.96, '', 'C', '', 14599] ['-', 14600] ['HETATM', 13625, 'O3', '', '13P', 'A', 1104, '', 25.875, 30.777, 23.343, 0.5, 47.88, '', 'O', '', 14601] ['-', 14602] ['HETATM', 13627, 'HOP2', '', '13P', 'A', 1104, '', 21.552, 25.966, 23.097, 0.5, 56.06, '', 'H', '', 14603] ['-', 14604] ['HETATM', 13629, 'HO3', '', '13P', 'A', 1104, '', 26.172, 29.853, 23.315, 0.5, 47.28, '', 'H', '', 14605] ['-', 14606] |
Il faut maintenant nettoyer le bloc de connexion des atomes qui n’ont pas été retenus dans la seconde conformation. Autrement dit, d’après la sortie précédente, les atomes (HETATM) intercalaires : 13608, 13610, 13612, 13614, 13616, 13618, 13620, 13622, 13625, 13626, 13628, 13630.
Atomes qui n’apparaissent pas toujours dans certains outils de visualisation. Par exemple Discovery Studio (DSV) a bien reconnu les deux conformations, mais propose une approche ‘conformère’: les IDs d’atomes (impairs) sont similaires dans les deux conformations :
![]() |
Puis nous ajoutons la séquence d’instructions, à la fin du bloc de traitement de la structure protéique :
|
1 2 3 4 5 6 |
print("update connection block") ... pdbm = pdb_str2pdbm(s) print("="*80) print(pdb_pdbm2str_extended(pdbm, s, keywords=['TER','CONECT','END'], blank="-")) print("="*80) |
Ces lignes supplémentaires vont nous permettre de voir le résultat après le recalcul d’une matrice pdbm à partir de la chaine s mise à jour lorsque on a sélectionné la conformation alternatives A et nettoyé les blocs de connectivité. Dans la sortie les ‘…’ sont utilisés pour simplifier l’affichage, le 13P est affiché en bleu avec des espaces ajoutés pour faciliter la lisibilité et les connectivités sont attribuées.
update connection block...CONECT 13607 13609 13611 13613 13615 -> PCONECT 13609 13607 -> P=OCONECT 13611 13607 13627 -> P-OHCONECT 13613 13607 -> P=OCONECT 13615 13607 13617 -> P-O-CCONECT 13617 13615 13619 -> O-C-CCONECT 13619 13617 13621 13623 -> C-(C=O)-CCONECT 13621 13619 -> C=OCONECT 13623 13619 13625 -> C-C-OHCONECT 13625 13623 13629 -> C-OHCONECT 13627 13611 -> OHCONECT 13629 13625 -> OH… CONECT13637136361363813639CONECT1363813637CONECT136391363713640CONECT136401363913642CONECT1364113633CONECT1364213640END |
Nous constatons, dans le bloc de connectivité, la disparition des atomes (valeur du champ Serial, colonne d’indice 1 d’une matrice pdbm) pairs de 13608 à 13630, dans ce cas, les deux conformations du ligand ne partagent pas d’atomes en commun.
La fonction pdb_pdbm2str_extended est très utile car elle permet de combiner l’affichage de la matrice pdbm (donc de coordonnées) avec d’autres informations du fichier qui sont accessibles en mode texte. Il suffit de spécifier l’intitulé des champs du fichier PDB dans la liste keywords donnée en argument. Cela permet de générer rapidement des systèmes de vérification du bon déroulement du traitement ou de générer des fichiers PDB simplifiés.
La fonction pdb_str_clean n’étant pas appliquée, les lignes du fichier PDB initial qui ne sont pas sélectionnées pour la sortie, apparaissent néanmoins sous forme de lignes vides. On peut dire que la fonction pdb_pdbm2str_extended agit comme un masque.
2. Résidus standard incomplets
Ils sont traités de la même manière que les résidus standards. D’un point de vue algorithmique, il n’y a aucune nécessité de les différentier.
3. Quelques exceptions
Prenons maintenant le cas de la structure 1OIM, que nous traitons ave le code standard :
|
1 2 3 4 5 6 7 8 9 10 11 |
print("\n-> checking structure {%s}" % (test[i])) s = pdb_file2str(test[i]) pdbm = pdb_str2pdbm(s) resmap = pdb_pdbm2resmap(pdbm) (hit_altloc, hit_occupancy) = pdb_altloc_pdbmcheck(pdbm) print("check atoms: altloc=%d occupancy=%d counts" % (hit_altloc, hit_occupancy)) altres = pdb_altloc_resmapcheck(pdbm, resmap) if (altres == None): altres = [] print("found %d alt residues" % (len(altres))) for j in range (0, len(altres), 1): print(altres[j]) |
Ce qui va nous donner le résultat :
check atoms: altloc=12 occupancy=28 countsfound 1 alt residues['ARG', 203, 2289, 2305, -1, ''] found 2 conformers |
Nous avons donc détecté un résidu ARG 203 de la chaine A qui présente deux conformations alternatives. Si on examine le bloc correspondant dans le fichier PDB, on retrouvera les 12 atomes désordonnés (2x 6 lignes de couleurs différentes) avec un taux d’occupation de 50%. Les taux à 100% concernent les atomes du backbone et le Cβ, la torsion de l’angle χ1 n’affecte pas la fluctuation de cet atome.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
ATOM 1610 N ARG A 203 17.032 22.380 19.829 1.00 27.10 N ATOM 1611 CA ARG A 203 17.921 23.326 19.118 1.00 28.28 C ATOM 1612 C ARG A 203 17.200 24.265 18.138 1.00 28.64 C ATOM 1613 O ARG A 203 17.554 25.433 18.042 1.00 28.71 O ATOM 1614 CB ARG A 203 19.124 22.625 18.482 1.00 27.48 C <span style="color: #008000;">ATOM 1615 CG AARG A 203 20.223 23.562 18.029 0.50 25.93 C </span> <span style="color: #ff0000;">ATOM 1616 CD AARG A 203 21.506 23.498 18.810 0.50 21.65 C </span> <span style="color: #0000ff;">ATOM 1617 NE AARG A 203 22.632 23.573 17.882 0.50 22.59 N </span> <span style="color: #ff00ff;">ATOM 1618 CZ AARG A 203 23.399 22.543 17.548 0.50 20.62 C</span> <span style="color: #ff6600;">ATOM 1619 NH1AARG A 203 23.186 21.353 18.078 0.50 21.62 N </span> <span style="color: #800080;">ATOM 1620 NH2AARG A 203 24.406 22.709 16.698 0.50 24.64 N </span> <span style="color: #008000;">ATOM 1621 CG BARG A 203 20.041 22.122 19.557 0.50 28.14 C </span> <span style="color: #ff0000;">ATOM 1622 CD BARG A 203 21.490 22.371 19.357 0.50 28.52 C </span> <span style="color: #0000ff;">ATOM 1623 NE BARG A 203 22.194 21.160 19.767 0.50 30.72 N </span> <span style="color: #ff00ff;">ATOM 1624 CZ BARG A 203 23.452 20.913 19.514 0.50 31.29 C </span> <span style="color: #ff6600;">ATOM 1625 NH1BARG A 203 24.186 21.799 18.860 0.50 33.78 N </span> <span style="color: #800080;">ATOM 1626 NH2BARG A 203 23.988 19.781 19.917 0.50 34.68 N</span> |
C’est bien trouvé, et la valeur de hit_altloc est bien égale à 12. Mais la valeur hit_occupancy est égale à 28 (nombre d’atomes qui ne sont pas similaires dans leur position et qui ont un taux d’occupation < 100%). Il s’agit d’un contrôle de cohérence effectué par la fonction, cela veut dire qu’il existe ailleurs des atomes désordonnés mais qui ne sont pas pris en compte dans des résidus à conformation alternatives.
La fonction pdb_altloc_atomcheck va nous permettre de les trouver, elle renvoie les lignes de la matrice pdbm correspondantes à une valeur de occupancy inférieure à 1.0 :
|
1 2 3 4 |
disordered = pdb_altloc_atomcheck(pdbm) if (disordered == None): disordered = [] for j in range (0, len(disordered), 1): print(disordered[j]) |
Ce qui va nous donner plusieurs lignes, ou nous retrouvons, le résidu ARG203 :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
['ATOM', 1615, 'CG', 'A', 'ARG', 'A', 203, '', 20.223, 23.562, 18.029, 0.5, 25.93, '', 'C', '', 2294] ['ATOM', 1616, 'CD', 'A', 'ARG', 'A', 203, '', 21.506, 23.498, 18.81, 0.5, 21.65, '', 'C', '', 2295] ['ATOM', 1617, 'NE', 'A', 'ARG', 'A', 203, '', 22.632, 23.573, 17.882, 0.5, 22.59, '', 'N', '', 2296] ['ATOM', 1618, 'CZ', 'A', 'ARG', 'A', 203, '', 23.399, 22.543, 17.548, 0.5, 20.62, '', 'C', '', 2297] ['ATOM', 1619, 'NH1', 'A', 'ARG', 'A', 203, '', 23.186, 21.353, 18.078, 0.5, 21.62, '', 'N', '', 2298] ['ATOM', 1620, 'NH2', 'A', 'ARG', 'A', 203, '', 24.406, 22.709, 16.698, 0.5, 24.64, '', 'N', '', 2299] ['ATOM', 1621, 'CG', 'B', 'ARG', 'A', 203, '', 20.041, 22.122, 19.557, 0.5, 28.14, '', 'C', '', 2300] ['ATOM', 1622, 'CD', 'B', 'ARG', 'A', 203, '', 21.49, 22.371, 19.357, 0.5, 28.52, '', 'C', '', 2301] ['ATOM', 1623, 'NE', 'B', 'ARG', 'A', 203, '', 22.194, 21.16, 19.767, 0.5, 30.72, '', 'N', '', 2302] ['ATOM', 1624, 'CZ', 'B', 'ARG', 'A', 203, '', 23.452, 20.913, 19.514, 0.5, 31.29, '', 'C', '', 2303] ['ATOM', 1625, 'NH1', 'B', 'ARG', 'A', 203, '', 24.186, 21.799, 18.86, 0.5, 33.78, '', 'N', '', 2304] ['ATOM', 1626, 'NH2', 'B', 'ARG', 'A', 203, '', 23.988, 19.781, 19.917, 0.5, 34.68, '', 'N', '', 2305] |
Résidus désordonnés
Mais nous trouvons aussi un résidu ASP141 dont les atomes de la chaine latérale ont un taux d’occupation de 50%, sans pour autant que le résidu présente une conformation alternative. On constate donc que la présence d’atomes désordonnés ne signifie pas obligatoirement la présence de résidus alternatifs.
|
1 2 3 4 |
['ATOM', 1103, 'CB', '', 'ASP', 'A', 141, '', 24.645, 20.572, 13.899, 0.5, 25.15, '', 'C', '', 1782] ['ATOM', 1104, 'CG', '', 'ASP', 'A', 141, '', 25.45, 20.46, 15.166, 0.5, 25.41, '', 'C', '', 1783] ['ATOM', 1105, 'OD1', '', 'ASP', 'A', 141, '', 25.065, 21.035, 16.198, 0.5, 22.05, '', 'O', '', 1784] ['ATOM', 1106, 'OD2', '', 'ASP', 'A', 141, '', 26.525, 19.819, 15.211, 0.5, 28.38, '', 'O', '', 1785]<br> |
Pour mémoire le bloc PDB correspondant à ce résidu était :
|
1 2 3 4 5 6 7 8 |
ATOM 1099 N ASP A 141 22.559 19.643 14.933 1.00 25.89 N ATOM 1100 CA ASP A 141 23.139 20.755 14.148 1.00 26.68 C ATOM 1101 C ASP A 141 22.474 20.934 12.801 1.00 26.33 C ATOM 1102 O ASP A 141 22.111 22.053 12.444 1.00 26.36 O ATOM 1103 CB ASP A 141 24.645 20.572 13.899 0.50 25.15 C ATOM 1104 CG ASP A 141 25.450 20.460 15.166 0.50 25.41 C ATOM 1105 OD1 ASP A 141 25.065 21.035 16.198 0.50 22.05 O ATOM 1106 OD2 ASP A 141 26.525 19.819 15.211 0.50 28.38 O |
La fonction pdb_altloc_atomcheck ne nous renvoie que les lignes correspondant au taux d’occupation non standard, il faudra faire une autre opération (par exemple une extraction à partir de la resmap) si nous voulons le résidu en entier.
Molécules d’eau désordonnées
Nous avons aussi des molécules d’eau à 50% de taux d’occupation, sans être alternatives également, je n’affiche pas le bloc PDB correspondant, juste la sortie de la fonction pdb_altloc_atomcheck :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
['HETATM', 7180, 'O', '', 'HOH', 'A', 2030, '', -0.578, 28.603, -10.216, 0.5, 24.91, '', 'O', '', 7859] ['HETATM', 7196, 'O', '', 'HOH', 'A', 2046, '', -3.999, 6.041, 31.83, 0.5, 38.09, '', 'O', '', 7875] ['HETATM', 7217, 'O', '', 'HOH', 'A', 2067, '', -1.204, 26.553, -9.372, 0.5, 15.78, '', 'O', '', 7896] ['HETATM', 7245, 'O', '', 'HOH', 'A', 2095, '', -1.966, 6.848, 32.205, 0.5, 31.16, '', 'O', '', 7924] ['HETATM', 7279, 'O', '', 'HOH', 'A', 2129, '', -21.08, 19.255, -6.748, 0.5, 26.61, '', 'O', '', 7958] ['HETATM', 7385, 'O', '', 'HOH', 'A', 2235, '', -19.759, 17.686, -6.804, 0.5, 20.32, '', 'O', '', 8064] ['HETATM', 7456, 'O', '', 'HOH', 'B', 2032, '', -19.996, -55.682, 1.951, 0.5, 20.29, '', 'O', '', 8135] ['HETATM', 7515, 'O', '', 'HOH', 'B', 2091, '', -19.755, -54.654, 0.198, 0.5, 11.99, '', 'O', '', 8194] ['HETATM', 7565, 'O', '', 'HOH', 'B', 2141, '', -8.07, -38.822, 17.732, 0.5, 21.48, '', 'O', '', 8244] ['HETATM', 7585, 'O', '', 'HOH', 'B', 2161, '', -7.881, -56.337, 10.745, 0.5, 15.91, '', 'O', '', 8264] ['HETATM', 7591, 'O', '', 'HOH', 'B', 2167, '', -7.971, -56.868, 8.948, 0.5, 6.65, '', 'O', '', 8270] ['HETATM', 7622, 'O', '', 'HOH', 'B', 2198, '', -7.039, -38.162, 16.24, 0.5, 28.73, '', 'O', '', 8301] |
Donc 12 atomes désordonnées dans deux conformations alternatives (ARG203), 4 atomes désordonnés dans un résidu (ASP141) et 12 molécules d’eau désordonnées, nous retrouvons la valeur de hit_occupancy à 28.
4. Conclusion
Nous disposons donc d’un outil pour sélectionner et extraire tout type de résidu dont les atomes n’ont pas un taux d’occupation égal à 1, ce qui englobe des résidus se présentant sous des conformations alternatives.
Liens et lectures
- Structure PDB 1ADO [ https://www.rcsb.org/structure/1ADO ].
- UniProt P00883 · ALDOA_RABIT [ https://www.uniprot.org/uniprotkb/P00883/entry ].
- Ligand expo 13P [ https://www.rcsb.org/ligand/13P ].
- Thermotoga maritima [ https://fr.wikipedia.org/wiki/Thermotoga_maritima ].
- Structure PDB 1OIM [ https://www.rcsb.org/structure/1OIM ].
- UniProt Q08638 · BGLA_THEMA [ https://www.uniprot.org/uniprotkb/Q08638/entry ].
- Ligand expo NOJ [ https://www.rcsb.org/ligand/NOJ ].
