buildez.pdb : module altloc, atomes désordonnés, rotamères

3. Détection de conformères

La première opération est de détecter la présence de conformères, soit par atomes avec la fonction pdb_altloc_pdbmcheck, soit par résidu avec la fonction pdb_altloc_resmapcheck. Ces deux fonctions tirent profit du calcul des matrices pdbm et resmap. 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α :

Ce qui nous donne (test[i]="test/2p15a.pdb") le résultat suivant:

-> checking structure {test/2p15a.pdb}
check atoms: altloc=60 occupancy=83 counts
found 6 alt residues

La fonction pdb_altloc_pdbmcheck n’utilise que la matrice pdbm et renvoie le nombre d’atomes qui n’ont pas une valeur des champs altLoc ou occupancy standard sous la forme d’un couple (hit_altloc, hit_occupancy). Il est donc très facile de détecter s’il y a des atomes désordonnés. Coté résidus, la fonction pdb_altloc_resmapcheck utilise les matrices pdbm et resmap et renvoie une liste de résidus qui comportent des conformères, sous la forme d’une nouvelle resmap altres :

[['ASP', 321, 112, 124, -1, ''], ['ARG', 363, 426, 444, -1, ''],
['CYS', 381, 581, 589, -1, ''], ['SER', 432, 981, 989, -1, ''],
['MET', 437, 1029, 1041, -1, ''], ['GLU', 542, 1872, 1886, -1, '']]

Nous avons donc 6 résidus qui comportent des atomes désordonnés et probablement des conformations alternatives.

4. Extraction des conformères

Une fois que l’on a détecté la présence de résidus qui ont des conformations alternatives, il faut pouvoir les extraire, ce qui est réalisé par la fonction pdb_altloc_res2conformers. Celle ci extrait les résidus alternatifs à partir de altres (donc une resmap standard, utiliser altres permet uniquement d’accélérer si on l’a déjà calculé) et construit une liste intermédiaire conformers qui correspond à la liste des matrices pdbm correspondant aux 6 résidus alternatifs et dans le même ordre que la resmap altres.

On affiche ici le premier bloc pdbm de cette liste intermédiaire conformers, qui correspond au résidu ASP 321:

Au vu de cette structure de données, nous disposons de toutes les données pour analyser les résidus car on a hiérarchisé les deux conformères et dupliqué les atomes qui ne sont pas désordonnés dans l’un et dans l’autre. Il ne reste plus qu’à choisir le conformère que l’on veut retenir.

Ce type de travail est effectué par les fonctions pdb_altloc_conformers_byindice et pdb_altloc_conformers_byaltloc qui vont extraire les conformères en se servant d’un numéro ou d’une lettre. En général le formalisme PDB utilise les lettres A ou B, mais d’autres programmes ont pu utiliser des chiffres par le passe (ex:  Scientific/MMTK). Si nous reprenons un exemple plus général d’analyse de la matrice altres , résidu par résidu, dans une boucle nous pouvons proposer le code suivant:

Ce qui va nous donner le résultat suivant pour le premier résidu (l’ASP 321) de altres:

Nous constatons que la fonction pdb_altloc_conformers_byaltloc a extrait le conformère A de ASP 321 (lignes marquées par l’indice zéro et à 17 colonnes). Mais l’extraction procède d’une manière particulière: les coordonnées correspondant au conformère B (lignes d’indice 1 et à 2 colonnes) ont simplement été effacées du bloc pdbm présent dans la liste conformers, mais les lignes correspondantes du bloc pdbm restent en place. Il s’agit donc plus d’un marquage que d’une délétion proprement dite. La délétion impliquera à la fois les coordonnées et le bloc de connectivité, cet aspect n’intervient pas dans le cas de résidus standard, mais il peut y avoir des résidus non standards dans les chaines et définis par des lignes HETATM ou des ligands (hors chaine polypeptidique).

Les fonctions pdb_altloc_conformers_byindice et pdb_altloc_conformers_byaltloc comportent une option rem_altloc (par défaut positionné sur False) qui permet d’enlever la lettre du champ altLoc (colonne d’indice 3) dans les lignes de coordonnées précédentes.

On remarquera également que le bloc pdbm affiché est structuré par conformère: en premier le conformère sélectionné, puis les atomes résiduels (la chaine latérale principalement) de l’autre conformère. Les numéros d’atomes (ou les lignes du fichier PDB initial) ne sont pas consécutifs. La fonction pdb_altloc_conformers2pdbm renvoie un ‘vrai’ bloc pdbm (pour l’ensemble des résidus de la liste conformers) trié qui va servir à mettre à jour la matrice pdbm originale. C’est ce que réalise la fonction pdb_altloc_pdbm_update qui s’utilise d’une manière simple dans la boucle précédente:

Ce qui va donner pour le premier résidu alternatif, avec sélection du conformère A:

Les lignes avec les variables beg et end sont utilisées pour afficher les lignes de la matrice pdbm originale en se servant des informations de la resmap altres. Il s’agit d’un exemple d’utilisation des colonnes d’indice 2 et 3 d’une resmap qui contiennent l’information pour borner un résidu dans la resmap sous réserve que le bloc de coordonnées PDB soit homogène (les résidus ont leurs atomes dans des lignes contigües, si ce n’est pas le cas le paquetage buildez.pdb dispose de fonctions en mode string qui permettent d’ordonner le fichier PDB avant la transformation en matrice pdbm).

5. Mise à jour du bloc de connectivité

Suite à la sélection d’un conformère qui correspondait à des hétéroatomes, il faut mettre a jour le bloc de connectivité pour éliminer la topologie de la conformation que l’on a fait disparaitre. La séquence d’instruction est la suivante:

Cette séquence fait intervenir des fonctions du module pdb.connect.py et du module pdb.str.py (fonction pdb_str_clean).

Elle s’applique au niveau de chaque structure et pas au niveau de chaque résidu. Dans un premier temps on génère la table de connectivité à partir de la chaine PDB (valeur de s calculée au début de la première section de cet article) avec la fonction pdb_str2connect. Entre temps l’analyse/sélection des conformères a été faite, il en résulte que la matrice pdbm ne correspond plus à celle qui avait été calculée à partir de la chaine s. Cela tombe bien, on se sert du différentiel pour mettre à jour la table de connectivité avec la fonction pdb_connect_clean_bypdbm. Cette fonction génère également une table des lignes (connect_lines) qui doivent rester dans la structure PDB. Cette table est exploitée par la fonction pdb_str_clean_byconnect pour éliminer les lignes inutiles du bloc de connectivité. La fonction pdb_str_clean sert uniquement à nettoyer le fichier des lignes vides, il suffit après de sauver la chaine de caractères s dans un fichier

L’intérêt de cette approche est de ne pas perdre les données initiales du fichier PDB, que cela soit dans l’entête ou dans d’autres parties.

Retour en haut