BLAST : Basic Local Alignment Search Tool Paramètres à régler : La matrice utilisé pour calculer les scores d'alignements Les seuils de scores utilisés par la méthode Il existe des valeurs « par défaut » Lorsqu'elles ne conviennent pas, il est possible de changer ces valeurs BLAST est disponible sur Internet Équivalent de Google, mais pour rechercher des séquences d'ADN, d'ARN ou de protéines 140 BLAST sur Internet http://blast.ncbi.nlm.nih.gov/Blast.cgi Plusieurs programmes : Blast p : recherche d'une séquence protéique dans une banque de protéine (cf exemple précédent) Blast n : recherche d'une séquence nucléotidique dans une banque d'ADN Blast x : recherche d'une séquence nucléotidique dans une banque de protéine t Blast n : recherche d'une séquence protéique dans une banque d'ADN t Blast x : recherche d'une séquence nucléotidique dans une banque d'ADN (comme Blast n), mais compare les protéines produites par gène et pas les gènes eux-mêmes Deux séquences d'ADN différentes donnant la même protéine sont considérées comme identiques 141 BLAST sur Internet SEQUENCE BANQUE BLASTP Protéique TB LA ST N Protéique TX S A BL T T BLASTN Nucléique T TBLASTX Nucléique T 142 Séquence à rechercher Base de données où la recherche est effectuée Rechercher seulement chez certaines espèces Lancer le BLAST ! BLAST sur Internet Nombre maximum de séquences affichées Nombre d'erreur que l'on accepte (E-value) Longueur des mots Matrice de substitution protéique E-value = 10 => parmi les résultats, statistiquement en moyenne 10 alignement de séquence seront dus au hasard BLAST sur Internet Durée du BLAST : quelques secondes / minutes BLAST sur Internet Séquence requête 14 séquences retrouvées par BLAST La position des barres indique les alignements locaux La couleur indique le score d'alignement BLAST sur Internet BLAST sur Internet Quelle partie de cette protéine est la mieux conservée ? Exercice BLAST Blast p : recherche d'une séquence protéique dans une banque de protéine Blast n : recherche d'une séquence nucléotidique dans une banque d'ADN Blast x : recherche d'une séquence nucléotidique dans une banque de protéine t Blast n : recherche d'une séquence protéique dans une banque d'ADN t Blast x : recherche d'une séquence nucléotidique dans une banque d'ADN (comme Blast n), mais compare les protéines produites par gène et pas les gènes eux-mêmes Quel(s) BLAST utiliser dans les situations suivantes : Une molécule thérapeutique marquée a permis d'extraire la protéine cible de ce médicament, qui a ensuite été purifiée puis séquencée. On souhaite à présent savoir de quelle protéine il s'agit ? Un gène a été isolé chez E. Coli puis séquencé. On souhaite déterminer quelle(s) est(sont) la(les) protéine(s) codée(s) par ce gène ? L'enzyme de conversion de l'angiotensine est une protéase bien conservée au cours de l'évolution. Le gène de cette protéine chez l'homme a été récupéré dans la base EMBL, et on souhaite rechercher des gènes homologues chez d'autres espèces éloignées ? 150 Exercice BLAST Blast p : recherche d'une séquence protéique dans une banque de protéine Blast n : recherche d'une séquence nucléotidique dans une banque d'ADN Blast x : recherche d'une séquence nucléotidique dans une banque de protéine t Blast n : recherche d'une séquence protéique dans une banque d'ADN t Blast x : recherche d'une séquence nucléotidique dans une banque d'ADN (comme Blast n), mais compare les protéines produites par gène et pas les gènes eux-mêmes Quel(s) BLAST utiliser dans les situations suivantes : Une molécule thérapeutique marquée a permis d'extraire la protéine cible de ce médicament, qui a ensuite été purifiée puis séquencée. On souhaite à présent savoir de quelle protéine il s'agit ? => Blast p Un gène a été isolé chez E. Coli puis séquencé. On souhaite déterminer quelle(s) est(sont) la(les) protéine(s) codée(s) par ce gène ? => Blast x L'enzyme de conversion de l'angiotensine est une protéase bien conservée au cours de l'évolution. Le gène de cette protéine chez l'homme a été récupéré dans la base EMBL, et on souhaite rechercher des gènes homologues chez d'autres espèces éloignées ? => t Blast x 151 FASTA Un autre algorithme pour rechercher des alignements locaux S'utilise de manière similaire à BLAST Plus ancien Le format du logiciel FASTA est très utilisé pour représenter les séquences Ex : BLAST utilise ce format http://fasta.bioch.virginia.edu 152 Résumé des méthodes d'alignement de séquences 2 séquences : DotPlot, programmation dynamique < 500 séquences : Clustal W Au-delà : BLAST, FASTA 153 Programmation en langage Python Présentation de Python Python est un langage de programmation Facile à apprendre De plus en plus utilisé En général Et en bioinformatique en particulier Disponible en logiciel libre À télécharger ici : http://www.python.org Multiplateforme : Linux, Windows, Mac Un grand nombre de modules complémentaires sont disponibles Entre autre pour la bioinformatique 155 Présentation de Python Programmation impérative L'utilisateur donne des ordres à l'ordinateur 2 possibilités d'utilisation : ligne de commande / fichier Interface en ligne de commande Taper « python2 » dans un terminal La touche <entrée> valide les commandes En appuyant sur la touche <haut>, on peut récupérer la commande précédente pour la modifier On peut appuyer plusieurs fois sur <haut> Création de fichiers de code source Les commandes sont écrites dans un fichier « .py » Une fois le fichier terminé, on l'exécute dans un terminal : python nom_du_fichier.py 156 Le génie de la programmation Appelez-moi « ordinateur » ! 157 Le génie de la programmation Ordinateur, calcule 2 + 2 ! Ok, calcul effectué sans erreur. Tu ne m'as pas donné le résultat ? Tu ne m'as pas demandé de l'afficher. 158 Le génie de la programmation Ordinateur, calcule 2 + 2 et affiche le résultat ! 4. Ajoute encore 2 à ce résultat ! Tu ne m'a pas demandé de garder le résultat en mémoire. Je ne m'en souviens plus donc recommence de zéro ! 159 Le génie de la programmation Ordinateur, calcule 2 + 2 et appelle ce résultat « r » ! Affiche « r » ! 4. Ajoute 2 à « r » ! Affiche « r » ! 6. 160 Le génie de la programmation r=2+2 print(r) 4. r=r+2 print(r) 6. Ne jamais laisser le « génie » avoir le dernier mot ! 161 Présentation de Python Commentaires Les lignes qui commencent par # sont des commentaires et ne sont pas prises en compte par Python : # Ceci est un commentaire qui n'est pas pris # en compte par Python ! Les commentaires sont destinés aux humains, pas à l'ordinateur Ils facilitent la lecture et la compréhension du programme par d'autres personnes (ou par soi-même quelques années plus tard !) Affichage La fonction print() permet d'écrire à l'écran (dans le terminal) print(2 + 2) print("Bonjour") En ligne de commande, le print() peut être omis 2+2 162 Les variables Une variable est un nom auquel on associe une valeur La valeur est souvent connu seulement à l'exécution du programme (par exemple elle résulte d'un calcul) Chaque variable a un nom Le nom commence par une lettre, il peut contenir des lettres, des chiffres et des _ (éviter les accents), mais jamais d'espace ! On les remplace par _ Attention majuscules et minuscules sont différenciées ! Il est important de trouver des noms parlants On crée une variable en lui donnant une valeur, avec = age = 36 On obtient la valeur d'une variable en donnant son nom print(age) La valeur de la variable peut être modifiée avec = age = 37 age = age + 1 163 Les types de données Principaux types de données Nombre entier (int) : ex 8 Flottant (nombre à virgule, float) : 64.5 Chaîne de caractères (texte, string / str) : "Lamy" Booléen (bool) : True, False Liste de plusieurs valeurs (list) : [1, 2, 3] Dictionnaires (dict) Quel est le type de donnée de la variable suivante ? telephone = "01 48 38 73 34" 164 Opérations Python peut effectuer les opérations courantes : Addition : + Soustraction : Multiplication : * Division : / Puissance : ** Modulo : % Ces opérations peuvent s'appliquer sur différents types de donnée somme = 2 + 2 concatenation = "ACT" + "GCC" queue_poly_a = "A" * 20 165 Chaînes de caractères Caractères spéciaux Retour à la ligne : "\n" Tabulation : "\t" Antislash : "\\" Chaînes avec des guillemets à l'intérieur Tripler les guillemets extérieurs : """Il dit "Bonjour".""" Alterner guillemets doubles et simples : 'Il dit "Bonjour".' « Antislasher » les guillemets à l'intérieur de la chaîne : "Il dit \"Bonjour\"." 166 Chaînes de caractères Opérations sur les chaînes Exemples : arn = "GCCUGCUUA" Obtenir la longueur d'une chaîne (= le nombre de caractères) len(arn) => 9 Obtenir un caractère de la chaîne arn[0] => "G" Obtenir une partie de la chaîne arn[0:3] => "GCC" Rechercher si une chaîne est incluse dans une autre "GCCUGCUUA".find("UGC") => 3 # Trouvé en position 3 (-1 si pas trouvé) Passer une chaîne en minuscule ou en majuscule "AttCgcG".lower() "AttCgcG".upper() Demander à l'utilisateur de saisir une chaîne saisie = raw_input("Entrez un nom : ") 167 Conversions Il est souvent nécessaire de convertir d'un type de donnée vers une autre Les fonctions int(), float() et str() permettent de convertir une valeur vers un entier, un flottant et une chaîne de caractère int("8") str(8) => 8 => "8" raw_input() retourne toujours une chaîne de caractères ; il faut penser à la transformer en entier ou en flottant si l'on demande la saisie d'un nombre ! age = int(raw_input("Entrez votre âge : ")) poids = float(raw_input("Entrez votre poids : ")) 168 Listes Les listes contiennent zéros, un ou plusieurs éléments Les éléments peuvent être de types différents Les listes sont créées avec des crochets, les éléments sont donnés à l'intérieur des crochets et séparés par des virgules [0, "Lamy", True] [ ] # Exemple de liste vide (zéro élément) Pour obtenir un élément d'une liste, on utilise aussi des crochets animaux = ["éléphant", "girafe", "rhinocéros", "gazelle"] animaux[2] => "rhinocéros" Le premier élément est numéroté 0 Il est aussi possible de compter à partir de la fin : le dernier élément est alors numéroté -1, l'avant dernier -2, etc len() permet d'obtenir le nombre d'élément len(animaux) 169 Listes Les listes peuvent être modifiées Exemples animaux = ["éléphant", "girafe", "rhinocéros", "gazelle"] Ajouter un élément à la fin animaux.append("lion") Ajouter un élément à une position donnée animaux.insert(0, "hippopotame") Enlever un élément animaux.remove("gazelle") Enlever un élément à une position donnée del animaux[-2] Que contient alors la liste animaux ? 170 Algorithme Un algorithme est une série d'ordre que la machine accomplit Pour le dîner, mange les restes qui sont au frigo. Maman 171 Algorithme Un algorithme est une série d'ordre que la machine accomplit Pour le dîner, commande une pizza par téléphone. Maman 172 Algorithme On cherche un algorithme générique : qui convient à plusieurs situations Cela évite de réécrire un programme à chaque fois ! Pour le dîner, s'il y a des restes au frigo : mange ces restes. sinon : commande une pizza par téléphone. Maman 173 Algorithme On cherche un algorithme générique : qui convient à plusieurs situations Conditions (si...) et boucles (pour chaque...) Pour chaque jour de la semaine : Pour le dîner, s'il y a des restes au frigo : mange ces restes. sinon : commande une pizza par téléphone. Maman 174 Algorithme Bug ! 5 jours de restes avalés en un seul dîner... 175 Conditions Les conditions permettent d'exécuter des commandes seulement dans certaines situations if condition: commande exécuté si la condition est vraie commande exécuté si la condition est vraie… suite du programme (exécuté que la condition soit vraie ou fausse) Attention à l'indentation (= les espaces blancs en début de ligne) La condition est une comparaison utilisant l'un des opérateurs suivants : Inférieur à : < Supérieur à : > Inférieur ou égal à : <= Supérieur ou égal à : >= Égal à : == (ne pas confondre avec le = simple qui définit les variables) Différent de : != 176 Conditions Exemple de condition : age = int(raw_input("veuillez saisir votre âge : ")) if age >= 65 : print("Vous êtes une personne âgée.") print("L'année prochaine vous aurez " + str(age + 1) + " ans.") Ici il n'y a qu'une seule commande à exécuté si la condition est vraie, dans ce cas il est possible de tout mettre sur une seule ligne : if age >= 65 : print("Vous êtes une personne âgée.") 177 Conditions Il est possible d'ajouter plusieurs conditions successives, et un bloc par défaut (else = sinon) if condition1: commande exécuté si condition1 est vraie commande exécuté si condition1 est vraie… elif condition2: commande exécuté si condition1 est fausse et condition2 est vraie... else: commande exécuté si condition1 et condition2 sont fausses… suite du programme (exécuté que les conditions soient vraies ou fausses) 178 Conditions Exemple de condition : age = int(raw_input("veuillez saisir votre âge : ")) if age == 0 : print("Vous êtes un nouveau-né.") elif age < 18 : print("Vous êtes un enfant.") elif age >= 65 : print("Vous êtes une personne âgée.") else : print("Vous êtes un adulte.") print("L'année prochaine vous aurez " + str(age + 1) + " ans.") 179 Conditions Les conditions peuvent être imbriquées : age = int(raw_input("veuillez saisir votre âge : ")) poids = float(raw_input("veuillez saisir votre poids : ")) if age == 0 : print("Vous êtes un nouveau-né.") if poids > 10.0 : print("Je pense qu'il y a une erreur sur le poids !") Les opérateurs and et or permettent de combiner plusieurs conditions entre elles if (age < 18) or (age > 65) : print("Vous ne travaillez probablement pas.") 180 Boucles Une boucle permet d'exécuter plusieurs fois les mêmes commandes La boucle parcourt une liste for variable in liste : commande répétée plusieurs fois commande répétée plusieurs fois suite du programme (exécuté une seule fois) La liste peut être une variable, ou bien une liste d'indice générée avec la fonction range() range(4) => [0, 1, 2, 3] 181 Boucles Exemples animaux = ["éléphant", "biche", "rhinocéros", "brochet"] environnements = ["savane", "forêt", "savane", "rivière"] Afficher un animal par ligne for animal in animaux : print(animal) print("C'est fini !") Afficher un animal par ligne avec son numéro for i in range(len(animaux)) : print("Numéro " + str(i) + " : " + animaux[i]) print("C'est fini !") Afficher un animal par ligne avec son environnement for i in range(len(animaux)) : print(animaux[i] + " dans la " + environnements[i]) 182 Boucles Boucles et conditions Il est possible de mélanger boucles et conditions La commande break permet d'interrompre la boucle Que fait le programme suivant ? À quoi sert le break dans ce programme ? sequence_nucléotidique = "ACGAC…" for base in sequence_nucléotidique : if base == "T" : print("C'est un ADN !") break elif base == "U" : print("C'est un ARN !") break 183 Boucles Programme-type n°1 : compter les éléments d'une liste satisfaisant certains critères compteur = 0 for élément in liste : if élément satisfait la condition : compteur = compteur + 1 print(str(compteur) + " éléments trouvés") Exemple : compter les acides aminés aromatiques d'une protéine proteine = "MIWRAVHRF..." nb_aromatique = 0 for aa in proteine : if (aa == "F") or (aa == "Y") or (aa == "W") or (aa == "H"): nb_aromatique = nb_aromatique + 1 print(str(nb_aromatique) + " acides aminés aromatiques dans la protéine") 184 Boucles Programme-type n°2 : garder seulement les éléments d'une liste satisfaisant certains critères nouvelle_liste = [ ] for élément in liste : if élément satisfait la condition : nouvelle_liste.append(élément) print(nouvelle_liste) Exemple : garder seulement les nombres pairs nombres = [1, 4, 7, 8, 12, 15] nombres_pairs = [ ] for nombre in nombres : if nombre % 2 == 0 : nombres_pairs.append(nombre) print(nombres_pairs) 185 Boucles Programme-type n°3 : créer une nouvelle liste à partir d'une liste existante nouvelle_liste = [ ] for élément in liste : calculer nouvel_élément à partir de élément nouvelle_liste.append(nouvel_élément) print(nouvelle_liste) Exemple : mettre les noms d'animaux au pluriel animaux = ["girafe", "lion", "éléphant"] couples_danimaux = [ ] for animal in animaux : couples_danimaux.append("deux " + animal + "s") print(couples_danimaux) 186 Boucles Les programmes-types n°2 et 3 peuvent aussi s'appliquer à des chaînes de caractère Exemple : calculer un ADN complémentaire adn = "GCATTC..." adn_complementaire = "" # Chaîne vide for base in adn : if base == "A" : base_complementaire = "T" elif base == "T" : base_complementaire = "A" elif base == "C" : base_complementaire = "G" elif base == "G" : base_complementaire = "C" adn_complementaire = adn_complementaire + base_complementaire print(adn_complementaire) 187 Séquences biologiques en Python Le module BioPython permet de gérer les séquences biologiques Charger des séquences Depuis des fichiers FASTA Depuis Internet Effectuer la transcription et la traduction Effectuer des alignements Rechercher des motifs dans des séquences Etc. http://biopython.org 188 Séquences biologiques en Python Deux types de donnée pour les séquences en Python : Seq : une séquence anonyme (une suite de base / d'acide aminé) SeqRecord : une séquence nommé, incluant : La séquence proprement dite (un « Seq ») Le nom du gène / de la protéine Le nom de l'espèce auquel cette séquence appartient L'identifiant de la séquence,… SeqRecord : séquence nommée >sp|P05231|IL6_HUMAN Interleukin-6 precursor (IL-6) - Homo sapiens (Human). MNSFSTSAFGPVAFSLGLLLVLPAAFPAPVPPGEDSKDVAAPHRQPLTSSERIDKQIRYI LDGISALRKETCNKSNMCESSKEALAENNLNLPKMAEKDGCFQSGFNEETCLVKIITGLL EFEVYLEYLQNRFESSEEQARAVQMSTKVLIQFLQKKAKNLDAITTPDPTTNASLLTKLQ AQNQWLQDMTTHLILRSFKEFLQSSLRALRQM Seq : séquence anonyme Un fichier FASTA correspond à un (ou plusieurs) SeqRecord 189 Séquences biologiques en Python Chaque séquence est associée à un alphabet Il y a des alphabets différents pour les ADN, les ARN et les protéines ADN : ATCG ARN : AUCG… De plus, plusieurs alphabets sont disponibles pour un même type de séquence : ADN non-ambigu : ATCG ADN ambigu : ATCGRYWSMKHBVDN R = A ou G H = A, C ou T,... En général on travaille sur des séquences en alphabet non-ambigu Ces alphabets ont été standardisés par l'IUPAC (International Union of Pure and Applied Chemistry) 190 Séquences biologiques en Python Les alphabets IUPAC sont disponibles : IUPAC.unambiguous_dna IUPAC.unambiguous_rna IUPAC.ambiguous_dna IUPAC.ambiguous_rna IUPAC.protein Pour créer une séquence (anonyme) d'ADN : adn = Seq("ATGC", IUPAC.unambiguous_dna) Pour charger une séquence (nommé) d'ADN depuis un fichier FASTA : adn = read("fichier.fasta", format="fasta") (note : l'alphabet est déduit automatiquement en général) Pour obtenir la séquence anonyme (Seq) : adn_anonyme = adn.seq 191