Le bloc de connectivité à la fin d’un fichier PDB définit la topologie des ligands mais échappe à la matrice pdbm, par définition. Pour autant, il doit être mis à jour lorsque l’on fait des manipulations sur les hétéro atomes (ligands, euligands) d’une structure, par exemple une délétion. Ces blocs ne sont pas marqués par un identifiant de chaîne, ils sont perdus si nous faisons une recherche de type GREP, par exemple pour éclater automatiquement une structure en chaines. De même ils ne peuvent pas être simplement ajoutés car les numéros d’atomes dans le bloc risquent de pointer vers des atomes inexistants. Néanmoins, sans reconnaissance chimique, il est possible de s’en sortir. En effet, le module connect.py fournit quelques fonctions qui permettent de mettre en liaison un bloc de coordonnées moléculaires (typiquement un résidu) avec un groupes de lignes du bloc CONECT.
Pour lire cet article il sera utile de consulter [ Comprendre un fichier PDB ] sur ce blog.
Publication initiale en 2021, révisé en Avril 2025.
Navigation dans le guide
Guide [ Composants : buildez.pdb ]
1. Position du problème
Dans un fichier PDB le bloc marqué par la clé 'CONECT' correspond à la topologie des résidus définis par des lignes de coordonnées atomiques 'HETATM'. En d’autres termes ce type de bloc liste les atomes qui partagent une liaison covalente. La plupart des outils de visualisation moléculaire sont basés sur une reconnaissance des distances-angles pour les résidus qui ne correspondent pas à de l’eau, des ions mono-atomiques ou des acides aminés. Il en résulte que on peut tout à fait se passer de ce bloc, mais … dans certains cas, il y a indétermination et l’affichage échoue, par exemple:
![]() |
Nous voyons, à droite de la structure, que deux cycles aromatiques plans manquent, les atomes (croix roses) correspondants sont bien positionnés mais le logiciel ne sait pas les connecter, le cas des atomes à gauche est un peu plus compliqué. Dans certains cas, l’affichage est carrément inutilisable avec des liaisons qui partent dans tout les sens (donnant l’aspect d’un filet de pêche froissé).
Dans ces cas, le bloc CONECT (avec un seul N) du fichier PDB, s’il est écrit correctement permettra souvent de retrouver un affichage non dégradé. Dans le module pdb.connect (avec 2 n) quelques fonctions sont à disposition pour traiter ces blocs de connectivité. Il ne s’agit pas ici de réaliser une reconnaissance chimique mais de gérer l’information contenue dans le bloc, donc le module reste assez simple. Dans le paquetage buildez.pdb d’autres modules sont chargés de la reconnaissance chimique soit par l’utilisation de dictionnaires, soit par une interface avec des paquetages basés sur OpenBabel ou RDKit.
2. Extraction du bloc de connectivité
Prenons un exemple avec la structure 2P15 [Nettles_2007 – https://doi.org/10.1038/sj.embor.7400963] qui correspond à un domaine de liaison pour le récepteur nucléaire ERα. La fonction pdb_str2connect est capable de traiter une chaine PDB issue directement d’un fichier (fonction pdb_file2str) et d’en extraire le bloc, de manière simple:
|
1 2 3 4 5 6 7 |
print("\n-> reading structure {%s}" % (test[i])) s = pdb_file2str(file_cleanpath(site_package + test[i])) (connect_table, connect_lines) = pdb_str2connect(s) if (connect_table == None): connect_table = [] print("found %d 'CONECT' lines" % (len(connect_table))) for j in range (0, len(connect_table), 1): print(connect_table[j]) |
La fonction pdb_str2connect renvoie donc une connect_table (la table de connexion précédente ) et une liste connect_lines. Nous remarquons que cette fonction n’utilise pas une matrice pdbm, car par définition la matrice pdbm ne contient que 1) les lignes de coordonnées atomiques et 2) les empreintes des autres lignes correspondant à d’autres mots clés que ATOM ou HETATM.
Ce qui donne comme résultat si test[i] correspond à la structure 2P15a (soit la chaine A de la structure 2P15) pour la connect_table :
|
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 |
-> reading structure {/test/2p15a.pdb} found 32 'CONECT' lines ['CONECT', 2036, 2037] ['CONECT', 2037, 2036, 2038, 2051, 2054] ['CONECT', 2038, 2037, 2039] ['CONECT', 2039, 2038, 2040] ['CONECT', 2040, 2039, 2041, 2050] ['CONECT', 2041, 2040, 2042, 2047] ['CONECT', 2042, 2041, 2043] ['CONECT', 2043, 2042, 2044] ['CONECT', 2044, 2043, 2045, 2046] ['CONECT', 2045, 2044] ['CONECT', 2046, 2044, 2047] ['CONECT', 2047, 2041, 2046, 2048] ['CONECT', 2048, 2047, 2049] ['CONECT', 2049, 2048, 2050] ['CONECT', 2050, 2040, 2049, 2051] ['CONECT', 2051, 2037, 2050, 2052] ['CONECT', 2052, 2051, 2053] ['CONECT', 2053, 2052, 2054] ['CONECT', 2054, 2037, 2053, 2055, 2056] ['CONECT', 2055, 2054] ['CONECT', 2056, 2054, 2057] ['CONECT', 2057, 2056, 2058] ['CONECT', 2058, 2057, 2059, 2063] ['CONECT', 2059, 2058, 2060] ['CONECT', 2060, 2059, 2061] ['CONECT', 2061, 2060, 2062] ['CONECT', 2062, 2061, 2063] ['CONECT', 2063, 2058, 2062, 2064] ['CONECT', 2064, 2063, 2065, 2066, 2067] ['CONECT', 2065, 2064] ['CONECT', 2066, 2064] ['CONECT', 2067, 2064] |
Liste connect_lines
Dans le cas précédent nous aurions les valeurs suivantes pour la liste connect_lines :
|
1 2 3 |
[2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323] |
Si nous regardons le fichier PDB dans un éditeur de texte, on comprends immédiatement à quoi correspondent les numéros de cette liste connect_lines :
![]() |
Il s’agit de l’empreinte des numéros de ligne dans le fichier, de manière analogue à la colonne d’indice 16 (lignes de coordonnées) ou 1 (autres lignes) de la matrice pdbm, le fait de stocker des le départ cette information rend plus facile des opérations ultérieures.
3. Mise à jour après la suppression d’un résidu
Le bloc précédent correspondait à un dérivé fluoré de l’Estradiol connu sous le nom de code EZT dans la PDB et qui est un agoniste de ERα est qui est co cristallographié dans le site de liaison du récepteur :
![]() |
Ligand EZT |
Dans le fichier initial, ce résidu correspond au bloc (marqué en gris) de coordonnées hétéro atomiques suivantes :
![]() |
Nous constatons que les informations du bloc de connectivité précédent correspondaient à la seconde colonne (champ SERIAL) c’est à dire aux numéros des atomes (de 2036 à 2067).
Si ce résidu EZT est supprimé de la structure, il va falloir mettre à jour les lignes correspondantes du bloc de connectivité. Dans ce cas on va utiliser la nouvelle matrice pdbm qui ne contiendra plus ces atomes. On va tout simplement comparer les valeurs de numéros d’atomes dans la table de connectivité (connect_table) avec ceux de la matrice pdbm :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# on commence par calculer pdbm et resmap pdbm = pdb_str2pdbm(s) resmap = pdb_pdbm2resmap(pdbm) # puis on va supprimer le premier residu (i=0) d'une liste drop drop = [253, 1452, 269] ... print("drop residue %d %s" % (drop[i], resmap[drop[i]])) # grace a la resmap on definit les bornes du residu 253 beg = resmap[drop[i]][2]-1 end = resmap[drop[i]][3] # puis on le sort de la pdbm serials_out = [] for j in range (beg, end, 1): serials_out.append(pdbm[j][1]) line = pdbm[j][16] pdbm[j] = ['-',line] print("atoms destroyed", serials_out) # puis on met a jour connect_table et connect_lines (connect_table, connect_lines) = pdb_connect_clean_bypdbm(pdbm, connect_table, connect_lines) print("found now %d 'CONECT' lines" % (len(connect_table))) # il n'y avait qu'un seul ligand la connect_table doit etre vide print(pdb_connect2str(connect_table)) |
La fonction pdb_connect_clean_bypdbm réalise ce travail en produisant un nouveau couple (connect_table, connect_lines). Dans le cas précis on va constater qu’il ne reste plus rien dans la table de connectivité, car il n’y avait qu’un seul ligand (EZT) qui était impliqué.
|
1 2 3 4 |
drop residue 253 ['EZT', 600, 2039, 2070, -1, ''] atoms destroyed [2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067] found now 0 'CONECT' lines None |
Important ! Nous devons désigner le résidu par son indice dans la resmap. Dans l’exemple précédent, le résidu EZT est identifié en tant que résidu 600 dans le fichier PDB (RESSEQ) mais correspond à l’entrée d’indice 253 dans la resmap.
Un autre exemple
Nous utiliserons cette fois la protéine 1ADO [Blom_1997] correspond à une aldolase (D-fructose 1,6-bisphosphate aldolase) de lapin qui nous intéresse ici non pas pour son euligand 13P (1,3-dihydroxyacetonephosphate) mais pour les ions sulfates SO42-(code SO4) qui y sont associés.
Pour 1ADO nous avons 46 lignes (rows) dans la table de connectivité, qui correspond à plusieurs ligands, dont 13P et SO4 répartis sur plusieurs chaines, on le voit très bien avec Discovery Studio, en ce qui concerne C et D :
![]() |
Nous allons supprimer le résidu de SO4 avec le numéro 1326 dans la séquence, il apparaît à l’indice 1452 dans la resmap : ['SO4', 1326, 14573, 14577, -1, ''].
Les mêmes instructions donneront maintenant le résultat suivant :
-> reading structure {/test/1ado.pdb}found 46 'CONECT' lines['CONECT', 13597, 13598, 13599, 13600, 13601]['CONECT', 13598, 13597]...['CONECT', 13641, 13633]['CONECT', 13642, 13640]drop residue 1452 ['SO4', 1326, 14573, 14577, -1, '']atoms destroyed [13597, 13598, 13599, 13600, 13601]found now 41 'CONECT' linesCONECT1360213603136041360513606CONECT1360313602...CONECT1364113633CONECT1364213640 |
Nous constatons que cette fois, la table de connectivité n’est pas vide, il reste encore des ligands dans la pdbm. Nous avons éliminé les atomes 13597 (atome S) et 13598, 13599, 13600, 13601 (atomes O) de la pdbm et de la connect_table.
La table de connectivité correspondant à la structure initiale (46 lignes de connectivité) est affichée dans la colonne de gauche du tableau suivant. Le résultat (41 lignes de connectivité) est affiché dans la colonne de droite du tableau :
['CONECT', 13597, 13598, 13599, 13600, 13601]['CONECT', 13598, 13597]['CONECT', 13599, 13597]['CONECT', 13600, 13597]['CONECT', 13601, 13597]['CONECT', 13602, 13603, 13604, 13605, 13606]['CONECT', 13603, 13602]['CONECT', 13604, 13602]['CONECT', 13605, 13602]['CONECT', 13606, 13602]['CONECT', 13607, 13609, 13611, 13613, 13615]['CONECT', 13608, 13610, 13612, 13614, 13616]['CONECT', 13609, 13607]['CONECT', 13610, 13608]['CONECT', 13611, 13607, 13627]['CONECT', 13612, 13608, 13628]['CONECT', 13613, 13607]['CONECT', 13614, 13608]['CONECT', 13615, 13607, 13617]['CONECT', 13616, 13608, 13618]['CONECT', 13617, 13615, 13619]['CONECT', 13618, 13616, 13620]['CONECT', 13619, 13617, 13621, 13623]['CONECT', 13620, 13618, 13622, 13624]['CONECT', 13621, 13619]['CONECT', 13622, 13620]['CONECT', 13623, 13619, 13625]['CONECT', 13624, 13620, 13626]['CONECT', 13625, 13623, 13629]['CONECT', 13626, 13624, 13630]['CONECT', 13627, 13611]['CONECT', 13628, 13612]['CONECT', 13629, 13625]['CONECT', 13630, 13626]['CONECT', 13631, 13632, 13633, 13634, 13635]['CONECT', 13632, 13631]['CONECT', 13633, 13631, 13641]['CONECT', 13634, 13631]['CONECT', 13635, 13631, 13636]['CONECT', 13636, 13635, 13637]['CONECT', 13637, 13636, 13638, 13639]['CONECT', 13638, 13637]['CONECT', 13639, 13637, 13640]['CONECT', 13640, 13639, 13642]['CONECT', 13641, 13633]['CONECT', 13642, 13640] |
-----CONECT1360213603136041360513606CONECT1360313602CONECT1360413602CONECT1360513602CONECT1360613602CONECT1360713609136111361313615CONECT1360813610136121361413616CONECT1360913607CONECT1361013608CONECT136111360713627CONECT136121360813628CONECT1361313607CONECT1361413608CONECT136151360713617CONECT136161360813618CONECT136171361513619CONECT136181361613620CONECT13619136171362113623CONECT13620136181362213624CONECT1362113619CONECT1362213620CONECT136231361913625CONECT136241362013626CONECT136251362313629CONECT136261362413630CONECT1362713611CONECT1362813612CONECT1362913625CONECT1363013626CONECT1363113632136331363413635CONECT1363213631CONECT136331363113641CONECT1363413631CONECT136351363113636CONECT136361363513637CONECT13637136361363813639CONECT1363813637CONECT136391363713640CONECT136401363913642CONECT1364113633CONECT1364213640 |
Le sous bloc de connectivité correspondant à ce résidu SO4 concerne les atomes de numéro 13597 à 13601 qui auront disparu après la mise à jour (colonne de droite), alors que les autres ligands SO4 1261 (atomes 13602 à 13606), 13P 1104 (atomes 13607 à 13630) et 13P 1053 (atomes 13631 à 13642) restent dans la table.
Pour générer une chaine PDB valide, il suffit d’utiliser la fonction pdb_connect2str du module, elle prends comme argument la table de connectivité, le résultat correspondra à la colonne de droite du tableau précédent.
4. Référentiel
Fonctions du module connect.py en mode abrégé (avril 2025).
| Fonction | Utilisation |
pdb_str2connect |
La fonction lit le bloc CONECT dans une chaine PDB (string) et retourne deux matrices typées (3 à 5 colonnes) sous la forme d’un tupple (connect_table, connect_lines). |
pdb_connect2str |
A partir d’une connect_table, renvoie un bloc CONECT (string) au format PDB. |
pdb_connect_clean_bypdbm |
A partir d’une pdbm, connect_table, connect_lines, la fonction filtre les deux tables sur la base des numéros d’atomes. Utilisé pour mettre à jour les tables (éliminer les atomes inconnus) une fois que des résidus ont été supprimés dans la pdbm. Renvoie (connect_table, connect_lines). |
pdb_str_clean_byconnect |
La fonction un résultat (connect_lines) de pdb_connect_clean_bypdbm pour nettoyer une chaine (string) au format PDB. |
5. Conclusion
Nous nous sommes focalisés ici sur une suppression de résidu, c’est le cas le plus courant, car il concerne l’éclatement de fichiers PDB en sous unités. Il faut donc aussi éclater le bloc de connectivité en tous ses sous-composants. Ce cas peut concerner aussi des situations limites, par exemple celle de résidus (typiquement des ligands) ayant une conformation alternative et un bloc mixte de connectivité associé.
Si on devait au contraire construire une protéine, le cas serait plus simple, car il suffit d’intégrer le bloc PDB généré (bloc de coordonnées et bloc de connectivité) dans la nouvelle structure. Mais … il restera le problème de générer une nouvelle numérotation des atomes qui soit compatible avec cette juxtaposition de blocs si ce travail n’a pas été fait en amont.
Dans ce cas, l’approche la plus simple consiste à mettre à jour la table de connectivité en fonction de la matrice pdbm, mais cela ne peut se faire que résidu par résidu. Donc il faudra donc identifier, puis marquer le résidu, et enfin renuméroter, sinon il peut y avoir des recouvrement de numéros d’atomes entre différents résidus qui conduisent a des numérotations d’atomes aberrantes, problématiques pour les étapes (et logiciels) ultérieures.
Liens et lectures
- Structure PDB 2P15 [ https://www.rcsb.org/structure/2P15 ].
- Uniprot P03372 · ESR1_HUMAN [ https://www.uniprot.org/uniprotkb/P03372/entry ].
- Ligand expo
EZT[ https://www.rcsb.org/ligand/EZT ]. - Estrogen receptor [ https://en.wikipedia.org/wiki/Estrogen_receptor ].
- Agonist (receptor) [ https://en.wikipedia.org/wiki/Agonist ] et Antagonist [ https://en.wikipedia.org/wiki/Receptor_antagonist ].
- 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 ]. - Ligand expo
SO4[ https://www.rcsb.org/ligand/SO4 ]. - Fructose-bisphosphate aldolase [ https://en.wikipedia.org/wiki/Fructose-bisphosphate_aldolase ].




