buildez.pdb: travaux en mode string (str, strfilter)

6. Eclatement de structures

C’est une fonction dont on a très souvent besoin en drug design. Donc nous éclatons une structure en chaines (A, B …) puis nous alignons les chaines entre elles pour les comparer, puis nous classifions. Une fois le processus répété et croisé sur plusieurs structures PDB, nous pouvons définir des chaines canoniques, représentatives d’un état structural, puis nous allons en choisir une, qui va être utilisée pour des processus in silico. Mais à la base, il faut éclater (split) les structures en chaînes, avec plusieurs modalités opératoires :

  • Avec un éditeur de texte, en supprimant les lignes correspondant aux autres chaînes et en répétant le processus sur toutes les chaines.
  • Avec du logiciel, j’utilise DSV de Discovery Studio à cause de sa présentation hiérarchisée de la structure et de ses possibilités étendues de couper-copier-coller.
  • En mode automatique, avec un protocole naïf, par exemple un programme type GREP qui va filtrer les lignes avec la colonne ‘ A’ (pour la chaine A). Mais nous allons arriver rapidement aux limite de la méthode, car il y aura des exceptions non gérées, liées à l’écriture du fichier PDB.

Quel est le problème ?

En général les ligands sont affectés de la même lettre s’ils sont dans la même chaine, une lettre qui apparaît à la colonne 5 (index) des lignes ATOM ou HETATM. Sauf que … les ligands (ni même les molécules d’eau) n’ont pas toujours cette affectation (colonne CHAINID) de la chaine. C’est un problème de qualité au niveau des fichiers PDB, qui a tendance à  s’atténuer mais qui existe. Pour vous en convaincre, il suffit de regarder dans les exemples précédents et de cherche l’identifiant A ou B, pour les lignes (par exemple HETATM) correspondant à la biotine (ligand BTN).

Contournement

D’autres approches (parser based) plus robustes et permettant plus de possibilités sont intégrées dans le paquetage buildez.pdb mais en mode chaine nous pouvons quand même faire quelque chose … car nous disposons de fonctions d’extraction de blocs.

Le principe est simple, imaginons que nous avons une structure avec ceux chaines A et B, un ligand dans chaque chaine, non identifié. Il suffira d’extraire le premier bloc protéine et le premier bloc ligand, pour avoir la première chaine complète, protéine + ligand. Même si ces blocs ne sont pas consécutifs dans un fichier PDB.

D’où l’intérêt d’une fonction pour compter les blocs comme pdb_coordsblock_count qui n’apparaissait pas évidente à première vue, mais qui va nous permettre de diriger le calcul.
La séquence suivante montre comment on peut extraire de manière automatisée la chaine A de la structure protéique incluant ou non le ligand correspondant, sans que le ligand soit affecté d’un identifiant de chaine. Avec une petite gymnastique pour extraire les données, sinon il aurait suffi de sortir directement les lignes HETATM et A qui ne correspondent pas à  de l’eau (HOH ici) ou qui correspondent à  BTN.

Ce qui va nous donner un joli bloc protéine + ligand que nous n’aurions pas pu atteindre avec une approche basée sur un GREP externe + identifiant de chaine.

A noter qu’il nous manque quelque chose : les blocs CONECT à la fin du fichier, qui sont indispensables pour identifier quels atomes de ligand sont liés entre eux. En effet, sur ces lignes, il n’y a pas d’information de chaîne, ni de marqueur de terminaison pour chaque ligand. C’est un bloc unique à numérotation souvent contiguë et qui nécessite une analyse sur la base des numéros d’atomes (de ligand) que l’on va récupérer dans les lignes HETATM, donc au delà d’un filtre texte.

Retour en haut