5. Recherche et extraction de blocs
Un premier exemple concerne le comptage de blocs, nous verrons plus loin que c’est une approche intéressante. Nous allons utiliser la fonction pdb_coordsblock_count pour compter les blocs de lignes PDB (lignes consécutives) correspondant à une requête particulière, sachant que le nombre de blocs peut être > 1 et que ces blocs ne seront pas contigus. Par exemple :
|
1 |
bn = pdb_coordsblock_count(s,"ATOM",pdb_field_coords_id("TEMP"),"5","<") |
Ce code va compter les les blocs correspondant aux lignes ATOM et dont les valeurs de la colonne température (TEMP correspondant à un facteur d’agitation moléculaire) sont inférieures (opérateur < à une valeur de 5 (opérande). Si aucune ligne n’est comptée, la valeur de bn sera égale à zéro. Le second argument ATOM peut également correspondre à une liste de clefs utilisant le séparateur espace (mots simples) ou § (mots composés, les fonctions détectent automatiquement les deux modalités). Les opérateurs possibles sont classiques: =, != (inégal), < et >.
Au lieu d’utiliser la fonction pdb_field_coords_id du module str.py, il est possible de fournir directement l’indice d’une colonne d’un fichier PDB, soit ATOM/HETATM (0), SERIAL (1), NAME (2), ALTLOC (3), RESNAME (4), CHAINID (5), RESSEQ (6), ICODE (7), X (8), Y (9), Z (10), OCCUPANCY (11), TEMPFACTOR/TEMP (12), SEGID (13), ELEMENT (14), CHARGE (15).
Extraction
Pour l’extraction nous allons utiliser la fonction pdb_str_coordsblock_get avec les mêmes arguments (pour extraire la même chose) que la fonction de comptage, par exemple:
|
1 2 3 4 5 |
if (bn > 0): print("=> first block") print(pdb_str_coordsblock_get(s,"ATOM",pdb_field_coords_id("TEMP"),"5","<", 1)) print("=> last block") print(pdb_str_coordsblock_get(s,"ATOM",pdb_field_coords_id("TEMP"),"5","<", bn)) |
Les mêmes arguments sont utilisés mais nous devons ajouter le numéro (index et non indice, les blocs sont numérotés de 1 à bn) du bloc à extraire en dernier argument. Ce qui va donner comme résultat:
=> block request with pdb_coordsblock_count and pdb_str_coordsblock_get{a block is consecutive lines on PDB string responding to the request}request : ATOM lines in which TEMP (column 12) is [< 5]number of blocks for this request 18=> first blockATOM 489 CD1 LEU A 67 70.827 14.400 53.215 1.00 4.09 C ATOM 490 CD2 LEU A 67 72.583 12.847 54.079 1.00 1.00 C => last blockATOM 3988 CD1 LEU B 226 2.906 16.991 46.023 1.00 4.84 C {block info is biased with piped requests} |
Le choix d’une valeur limite de 5 pour la colonne TEMP n’est pas anodin, la plupart des valeurs sont supérieures à 20-30, ce qui permet de limiter la sortie pour l’exemple. Nous récupérons donc deux ‘mini blocs’, dans deux chaines de caractères différentes, le premier et le dernier bloc. Il faut regarder la colonne correspondant à la chaine, nous avons un bloc pour la chaine A et un bloc pour la chaine B. Deux lignes dans le cas de la chaine A, car il y a deux positions atomiques pour LEU67 ou nous avons TEMP<5, et une seule (un atome) pour la chaine B, correspondant à une LEU226.
Si nous voulons obtenir une requête correspondant à un intervalle (ici 4<TEMP<5) il faudra combiner plusieurs appels à la fonction, en mode intersection (par passage d’une même chaine de caractères s1 en tant que résultat puis argument), par exemple:
|
1 2 |
s1 = pdb_str_coordsblock_get(s,"ATOM",pdb_field_coords_id("TEMP"),"5","<", 0) s1 = pdb_str_coordsblock_get(s1,"ATOM",pdb_field_coords_id("TEMP"),"4",">", 0) |
Ce qui donnera comme résultat:
=> ATOM lines in which TEMP (column 12) is [< 5] and [> 4]=> all blocksATOM 489 CD1 LEU A 67 70.827 14.400 53.215 1.00 4.09 C ATOM 3336 CA TYR B 132 9.796 12.444 55.116 1.00 4.60 C ATOM 3988 CD1 LEU B 226 2.906 16.991 46.023 1.00 4.84 C |
Il s’agit ici de l’ensemble des blocs qui sont retournés, ceci est possible en utilisant la valeur zéro comme numéro de bloc à sélectionner.
Ce type de recherche est classique si nous voulons détecter des position atomiques incohérentes ou hors normes en fonction d’une grandeur incluse dans la structure PDB.
Mais nous pouvons faire plus, par exemple l’extraction des chaines (A, B, C …) correspondant à des unités asymétriques dans la structure PDB. Dans ce cas, nous allons chercher à récupérer les coordonnées moléculaires d’une chaine protéique et des ligands qui sont associés à cette chaine, en profitant de cette fonctionnalité d’extraction de blocs.