buildez.pdb : intersection de requêtes 3D

Cet article montre comment croiser deux requêtes simples de proximité issues des fonctions du module pdb.distance pour créer une requête de plus haut niveau. Il s’agit de requêtes concernant les résidus et qui produisent des resmap. Cette matrice peut aussi être considérée comme un ensemble, il est alors possible de faire des opérations d’intersection ou d’union pour aller plus loin dans une fouille structurale.  Donc nous avons un outil pour combiner 2 requêtes (ou plusieurs requêtes successives) structurales en quelques lignes de code et de manière très flexible, plusieurs modalités étant utilisables (chaînes, matrices pdbm etc). Ce qui ouvre la possibilité de construire des requêtes de proximité beaucoup plus fines ou complexes, tout en restant dans le même espace conceptuel qui nous a permis de lire un fichier PDB.

Pour les besoin de ce test nous utilisons la même structure 1HXD [Weaver_2001] que dans l’article lié [ buildez.pdb : module distance ]. Cette structure est composée de deux chaînes polypeptidiques (libellées A et B) et qui sont chacune complexées avec une molécule de Biotine (BTN500 pour la chaîne A et BTN501 pour la chaîne B). Les deux chaines sont associées à des molécules d’eau.

Publication initiale sur buidez.net (2014) – Article mis à jour en Avril 2025.

Navigation dans le guide

Guide [ Composants : buildez.pdb ]




1. Préparation des données

A noter que dans 1HXD, les résidus BTN et les molécules d’eau de la structure n’ont pas d’affectation de chaine, comme le montre la fin de la chaine B et les lignes correspondant aux hétéro atomes. Pour l’exemple, j’ai fait simple, j’ai utilisé les numéros de résidus (500 et 501) que l’on connait déjà pour les biotines ainsi que l’identifiant (A) de chaîne pour la partie polypeptidique.

Mais dans un processus complètement automatisé, nous ne pourrions pas utiliser ces données, il faudrait les obtenir à partir d’une reconnaissance des chaines et des ligands.

Nous allons utiliser un combo des fonctions  pdb_str_coordsblock_get (filtre) et pdb_str2pdbm (production d’une matrice pdbm).  Ce qui va nous permettre de filtrer le fichier PDB et de produire des chaines de caractères et des matrices pdbm pour les groupes d’atomes d’intérêt :

  • Lecture du fichier PDB dans une chaine de caractères s.
  • Réduction de s aux lignes de coordonnées ATOM et HETATM, puis calcul d’une matrice pdbm m0 pour l’ensemble.
  • Extraction du polypeptide correspondant à la chaine A (équivalent : select in ATOM where CHAINID=’A’) et génération de la matrice pdbm m1 correspondante.
  • Extraction des atomes du ligand BTN 500 de la chaine A (équivalent : select in HETATM where RESSEQ=’500′) et production de la matrice pdbm m2.
  • Extraction des atomes d’eau (select in HETATM where RESNAME=’HOH’) pour obtenir s4.

Un exemple de code pour réaliser ces opérations :

Donc le fichier PDB est chargé et nous avons extrait: la chaîne A, le ligand BTN500, toutes les molécules d’eau (chaîne A et B) que l’on a sauvé dans les chaînes de caractères s1, s2 et s4. Par exemple, pour s4 :

2. Requête : résidus à proximité de BTN500 ?

Pour répondre à cette question, nous extrayons dans une resmap r1 les résidus de la chaîne A qui sont à moins de 5 Å du ligand :

Ce qui va nous donner :

On constate (ce qui est normal) que cette resmap est plus importante que celle qui était obtenue par une requête a 3 Å du ligand.

3. Requête : résidus près de molécules d’eau ?

Dans une troisième partie on extrait tous les résidus qui sont à moins de 2.5 Å d’une molécule d’eau dans une resmap r0.

Comme la chaine de caractères s1 est utilisée en recherche (query), on n’extrait en fait que des résidus faisant partie de la chaîne polypeptidique A, ce qui donne :

Nous avons donc 7 résidus proches de molécules d’eau dans la structure et pour la chaîne A. Si on fait afficher dans un logiciel de visualisation moléculaire toutes les liaisons hydrogènes, on va retrouver beaucoup plus que ces résidus, mais il faut prendre en compte que les distances prises en compte pour des liaisons hydrogènes peuvent être supérieures à une valeur de 2.5 Å.

4. Intersection : résidus proches de BTN500 et de HOH

L’intersection entre les deux requêtes précédentes est triviale, car nous avons obtenu deux resmap. Les resmaps sont des listes de listes, que l’on peut transformer en ensembles (sets) et que l’on peut combiner (union ou intersection).

La fonction pdb_resmap2resmap du module residue.py va se charger de ce travail :

Au final, les structures de données intermédiaires montrent toute leur utilité, la programmation s’est simplifiée, ce qui va donner :

Donc nous n’avons qu’une glycine, la GLY115 qui soit proche à la fois du ligand et d’une molécule d’eau, dans les conditions de distances que nous avons imposées.

Vérification

On peut essayer de visualiser ce résultat avec Discovery Studio. Pour simplifier l’affichage les proximités protéine-ligand (traits verts continus) sont affichés à 4 Å, les liaisons hydrogènes sont affichées en traits verts discontinus, les molécules d’eau sont affichées en rose et que j’ai libellées avec un X (rappel: le bloc HETATM n’a pas d’identifiants des chaine).

Les molécules d’eau susceptibles d’être proches d’un résidu au voisinage du ligand sont les résidus X604, X641, X626. La molécule X626 peut être éliminée car elle est à 3.029 Å d’un atome de la protéine. La X641 est à 3.066 Å d’un atome de la protéine et le résidu correspondant ARG121 ne rentre pas dans la contrainte de distance de 5 Å. Il reste donc la X604 qui est à 2.437 Å d’un atome du résidu GLY115, dont un atome est à 3.933 Å de distance d’un atome du ligand : le résultat final correspond bien à GLY115.

5. Bonus : production d’une chaine PDB par intersection

Nous pouvons avoir envie de générer une chaine PDB correspondant à ce résultat. Nous allons pouvoir le faire en exploitant les propriétés des resmap et en aveugle (sans connaître ou identifier les résidus issus de la première intersection) et en respectant les numéros d’atomes du fichier initial.

Nous sommes partis des chaînes de caractères s1, s2 et s4 pour faire les calculs. Or ces chaînes n’ont pas le même nombre de lignes que le fichier PDB initial, puisqu’il s’agit de blocs qui en sont extraits, donc les numéros de lignes ne correspondront pas à ceux du fichier initial dans les matrices pdbm et resmaps intermédiaires (r1, r0, r2).

La solution à ce problème est très simple, il suffit de d’utiliser la pdbm m0 et de générer une resmap r3 correspondant au fichier initial. Nous avons dans ces structures de données une trace des lignes et numéros d’atomes initiaux.

Puis on réalise l’intersection de r2 (la resmap résultant de la première intersection) avec r3. Comme r3 englobe r2, on obtiendra une resmap (que l’on appellera r4) similaire à r2 mais avec la bonne numérotation de lignes. Du coup, nous sommes raccord, il ne reste plus qu’à régénérer la chaîne PDB originale avec la fonction pdb_resmap2str, soit:

Ce bloc est maintenant utilisable par d’autres composants logiciels et reste parfaitement cohérent avec les données de la structure PDB initiale.

6. Conclusion

Nous disposons donc d’outils puissants et faciles à exploiter pour sortir de manière robuste et automatisée beaucoup de données de proximité (inter ou intramoléculaires) dans des fichiers PDB. Une application évidente est la détection en aveugle de l’association d’un ligand ou de molécules d’eau à une chaîne polypeptidique donnée, même lorsque les informations d’affectation sont manquantes. C’est un peu le cas ici puisque le bloc HETATM (eau, ligands) ne comporte pas de lettres pour identifier la chaîne polypeptidique correspondante. Ce qui n’a pas d’importance car les outils du paquetage buildez.pdb permettent de s’en affranchir.

Une variation du cas d’étude de cet article pourrait être la détection de molécules d’eau qui font un relais d’interaction hydrogène dans un site actif. Ce qui n’est pas si facile à chercher d’une manière manuelle, via desfiltres type GREP, ou via un arbre car celui ci sera bâti sur une hiérarchie de résidus. Dans le paradigme pdbm/resmap il suffira de prendre le problème à l’envers : est ce qu’il y a une molécule d’eau qui soit à la fois ‘proche’ d’un résidu et d’un ligand ? On pourra aussi citer la recherche automatisée de résidus d’intérêt dans des sites de liaison ou des sites actifs, sans être dépendant de l’utilisation d’une API associée à un autre programme et parfois difficile à intégrer dans des pipes applicatifs. En fait, les applications sont multiples.

Liens et lectures
Retour en haut