IFT3295 Démonstration 28 septembre 2011 Shift-And (avec erreurs)
Plan Présentation en détail de l'algorithme Shift-And (avec erreurs) Présentation de PROSITE
Shift-And (avec erreurs) Wu et Manber (1992) Base du logiciel agrep de Unix Recherche approximative d'un mot dans un texte Permet les insertions, les délétions et les substitutions de caractères
Shift-And (avec erreurs) Exemple : –Texte : aabaacaabacab –Mot : aabac (|mot| = m) –Alphabet : {a, b, c} Pré-traitement : –Pour chaque caractère x de l'alphabet, on construit un tableau de bits S x tel que S x [pos] = 1 si mot pos = x (pour 1 <= pos <= m)
Shift-And (avec erreurs) Pré-traitement : –Pour chaque caractère x de l'alphabet, on construit un tableau de bits S x tel que S x [pos] = 1 si mot pos = x (pour 1 <= pos <= m) aabacaabac Mot : SaSa SbSb ScSc
Shift-And (avec erreurs) Soit k, le nombre d'erreurs que l'on veut permettre On doit construire (k+1) tableaux de bits R de taille m * (n+1) (où n = |texte|) (quoique la plupart des colonnes pourront être oubliées) : –R 0, R 1, …, R k
Shift-And (avec erreurs) Les tableaux R doivent être construits dans l'ordre croissant du nombre d'erreurs Regardons d'abord la construction de R 0, qui est l'équivalent de Shift-Or (recherche exacte)
Shift-And (avec erreurs) Au départ : aabaacaabacab a0 a0 b0 a0 c0 R0R0
Shift-And (avec erreurs) Objectif : trouver 1 sur la ligne m match aabaacaabacab a0 a0 b0 a0 c0 R0R0
Shift-And (avec erreurs) R 0 j+1 [i] = aabaacaabacab a0 a0 b0 a0 c0 R0R0 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon j+1j i i-1
Shift-And (avec erreurs) aabaacaabacab a0 a0 b0 a0 c0 R0R0 R 0 j+1 [i] = 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon j+1j i i-1
Shift-And (avec erreurs) aabaacaabacab a01 a0 b0 a0 c0 R0R0 R 0 j+1 [i] = 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon j+1j i i-1
Shift-And (avec erreurs) aabaacaabacab a01 a0 b0 a0 c0 R0R0 R 0 j+1 [i] = 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon j+1j i i-1
Shift-And (avec erreurs) aabaacaabacab a01 a0 b0 a0 c0 R0R0 R 0 j+1 [i] = 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon j+1j i i-1
Shift-And (avec erreurs) aabaacaabacab a01 a00 b0 a0 c0 R0R0 R 0 j+1 [i] = 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon j+1j i i-1
Shift-And (avec erreurs) aabaacaabacab a01 a00 b00 a00 c00 R0R0 R 0 j+1 [i] = 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon
Shift-And (avec erreurs) aabaacaabacab a011 a001 b000 a000 c000 R0R0 R 0 j+1 [i] = 1 si R 0 j [i-1] = 1 et mot i = texte j+1 0 sinon
Shift-And (avec erreurs) Qu'est-ce que ça représente? aabaacaabacab a011 a001 b000 a000 c000 R0R0 j+1j i i-1
Shift-And (avec erreurs) Qu'est-ce que ça représente? aabaacaabacab a011 a001 b000 a000 c000 R0R0 j+1j i i-1
Shift-And (avec erreurs) Qu'est-ce que ça représente? aabaacaabacab a011 a001 b000 a000 c000 R0R0 j+1j i i-1
Shift-And (avec erreurs) Qu'est-ce que ça représente? aabaacaabacab a0110 a0010 b0001 a0000 c0000 R0R0 j+1j i i-1
Shift-And (avec erreurs) Qu'est-ce que ça représente? aabaacaabacab a0110 a0010 b0001 a0000 c0000 R0R0 j+1j i i-1
Shift-And (avec erreurs) Qu'est-ce que ça représente? aabaacaabacab a0110 a0010 b0001 a0000 c0000 R0R0 j+1j i i-1
Shift-And (avec erreurs) Cette transition peut être calculée bien plus efficacement R 0 j+1 = Rshift[R 0 j ] AND S j+1 où S j+1 est la table de pré- traitement du caractère qui est à la position j+1 dans le texte SaSa SbSb ScSc
Shift-And (avec erreurs) Rshift : –On décale les bits à droite d'une position, on élimine le dernier bit et on insère 1 à gauche Rshift[00000] = Rshift[10001] = 11000
Shift-And (avec erreurs) R 0 j+1 = Rshift[R 0 j ] AND S j+1 aabaacaabacab a0 a0 b0 a0 c0 R0R SaSa SbSb ScSc
Shift-And (avec erreurs) aabaacaabacab a0 a0 b0 a0 c0 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a01 a00 b00 a00 c00 R0R SaSa SbSb ScSc j+1 j 0 R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a01 a00 b00 a00 c00 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a01 a00 b00 a00 c00 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a01 a00 b00 a00 c00 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a011 a001 b000 a000 c000 R0R SaSa SbSb ScSc j+1 j 0 R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a011 a001 b000 a000 c000 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a011 a001 b000 a000 c000 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a011 a001 b000 a000 c000 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a0111 a0011 b0001 a0000 c0000 R0R SaSa SbSb ScSc j+1 j 0 R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a0111 a0011 b0001 a0000 c0000 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a0110 a0010 b0001 a0000 c0000 R0R SaSa SbSb ScSc j+1 j R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) aabaacaabacab a a b a c R0R SaSa SbSb ScSc R 0 j+1 = Rshift[R 0 j ] AND S j+1
Shift-And (avec erreurs) Nous venons de voir la construction de R 0, qui est l'équivalent de Shift-Or (recherche exacte) Que fait-on pour R 1, R 2, …, R k ? Trois types d'erreurs sont permises : insertions, délétions et substitutions
Shift-And (avec erreurs) Insertion (1er cas) : a a b a a c a a b a c a b a j+1 i = 2 R 0 j+1 [2] = 0
Shift-And (avec erreurs) Insertion (1er cas) : a a b a a c a a b a c a b a a b j+1 i = 2 R 1 j+1 [2] = 1 R 0 j+1 [2] = 0
Shift-And (avec erreurs) Insertion (2e cas) : a a b a a c a a b a c a b a j+1 i = 2 R 0 j+1 [2] = 0
Shift-And (avec erreurs) Insertion (2e cas) : a a b a a c a a b a c a b a b a j+1 i = 2 R 0 j+1 [2] = 0 R 1 j+1 [2] = 1
Shift-And (avec erreurs) Délétion (1er cas) : a a b a a c a a b a c a b a b a a b j+1 i = 5 R 0 j+1 [5] = 0
Shift-And (avec erreurs) Délétion (1er cas) : a a b a a c a a b a c a b a b a a b j+1 i = 5 R 0 j+1 [5] = 0 R 1 j+1 [5] = 1
Shift-And (avec erreurs) Délétion (2e cas) : a a b a a c a a b a c a b a b a a b c j+1 i = 6 R 0 j+1 [6] = 0 R 1 j+1 [6] = 1
Shift-And (avec erreurs) Substitution (1er cas) : a a b a a c a a b a c a b a a b a c j+1 i = 5 R 0 j+1 [5] = 0
Shift-And (avec erreurs) Substitution (1er cas) : a a b a a c a a b a c a b a a b a c j+1 i = 5 R 0 j+1 [5] = 0 R 1 j+1 [5] = 1
Shift-And (avec erreurs) Substitution (2e cas) : a a b a a c a a b a c a b a a b c a j+1 i = 5 R 0 j+1 [5] = 0 R 1 j+1 [5] = 1
Shift-And (avec erreurs) On peut résumer tous ces cas dans la formule de transition suivante : R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j ] OR Rshift[R d-1 j+1 ] OR R d-1 j
Shift-And (avec erreurs) On peut résumer tous ces cas dans la formule de transition suivante : R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j
Shift-And (avec erreurs) R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j aabaacaabacab a0 a0 b0 a0 c0 R1R1
Shift-And (avec erreurs) R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j aabaacaabacab a0 a0 b0 a0 c0 R1R1
Shift-And (avec erreurs) R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j R 1 j+1 = Rshift[00000] AND OR Rshift[00000 OR 10000] OR = AND OR Rshift[10000] = OR = aabaacaabacab a0 a0 b0 a0 c0 R1R1 j+1 j
Shift-And (avec erreurs) aabaacaabacab a a b a c R0R SaSa SbSb ScSc
R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j R 1 j+1 = Rshift[00000] AND OR Rshift[00000 OR 10000] OR = AND OR Rshift[10000] = OR = aabaacaabacab a01 a01 b00 a00 c00 R1R1 j+1 j
Shift-And (avec erreurs) R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j aabaacaabacab a01 a01 b00 a00 c00 R1R1 j+1 j
Shift-And (avec erreurs) R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j R 1 j+1 = Rshift[11000] AND OR Rshift[10000 OR 11000] OR = AND OR Rshift[11000] OR = OR OR = aabaacaabacab a01 a01 b00 a00 c00 R1R1 j+1 j
Shift-And (avec erreurs) aabaacaabacab a a b a c R0R SaSa SbSb ScSc
R d j+1 = Rshift[R d j ] AND S j+1 OR Rshift[R d-1 j OR R d-1 j+1 ] OR R d-1 j R 1 j+1 = Rshift[11000] AND OR Rshift[10000 OR 11000] OR = AND OR Rshift[11000] OR = OR OR = aabaacaabacab a011 a011 b001 a000 c000 R1R1 j+1 j
Shift-And (avec erreurs) Il est inutile de garder toutes les colonnes des (k+1) tableaux en mémoire L'idée est de calculer la colonne (j+1) pour R 0, ensuite pour R 1, … et enfin pour R k Ensuite, on pourra oublier la colonne j de tous les tableaux lorsqu'on calculera la colonne (j+2)
Shift-And (avec erreurs) Complexité : –O(kn) lorsque le mot n'est pas trop grand avec k = nombre d'erreurs permises n = longueur du texte - O(kn * nbMotsMachine) sinon
PROSITE Base de données dédiée à l'identification de familles de protéines et de domaines Collection de motifs décrits en tant que patterns ou profils, reliés à la documentation décrivant les familles de protéines ou les domaines en question
PROSITE Pattern = expression régulière Les patterns sont identifiés à partir des alignements multiples des protéines d'une même famille
PROSITE Les patterns choisis représentent des motifs importants dans la séquence (10 à 20 acides aminés) –régions conservées qui ont une signification biologique importante (site catalytique, site de liaison, etc.) On peut identifier la fonction d'une protéine dont la séquence diffère beaucoup avec celles de la base de données si on y retrouve un certain pattern
PROSITE Syntaxe des patterns : –Chaque élément est séparé par - –x : n'importe quel –x(2) : x-x –x(2,4) : x-x, x-x-x ou x-x-x-x –[ALT] : Ala, Leu ou Thr –{AM} : n'importe quel sauf Ala, Met –< (au début) : doit être dans la partie N-terminale –> (à la fin) : doit être dans la partie C-terminale
PROSITE Exemples : –[AC]-x-V-x(4)-{ED} = [Ala or Cys]-any-Val-any-any-any-any-{any but Glu or Asp} –< A-x-[ST](2)-x(0,1)-V = Ala-any-[Ser or Thr]-[Ser or Thr]-(any or none)-Val qui doit être dans la partie N-terminale de la séquence