Bioinformatique M1 - TD1 / TP1 : guide de survie avec Python (adoptez un serpent !) Jean-Baptiste Lamy / Table des matières 1 Introduction : pourquoi Python ? 1 2 Démarrer Python 2 3 Syntaxe 3.1 Commentaires . 3.2 Écrire à l’écran 3.3 Aide . . . . . . 3.4 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 2 2 4 Types de donnée 4.1 Les nombres entiers (integer en anglais, abrégé en int) . 4.2 Les nombres flottant (float en anglais) . . . . . . . . . . 4.3 Les chaı̂nes caractères (string en anglais, abrégé en str ) 4.4 Les listes (list en anglais) . . . . . . . . . . . . . . . . . 4.5 Les dictionnaires (dictionary en anglais, abrégé en dict) 4.6 Conversion entre types de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 4 5 5 5 Conditions 5.1 Opérateur logique ET et OU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Conditions imbriquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 6 Boucles 6.1 Programme-type n°1 : compter les éléments d’une liste satisfaisant certains critères . . . . . . . . . . 6.2 Programme-type n°2 : garder seulement les éléments d’une liste satisfaisant certains critères . . . . . 6.3 Programme-type n°3 : créer une nouvelle liste (ou chaı̂ne de caractères) à partir d’une liste existante 6.4 Boucler sur plusieurs listes avec zip() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Boucler sur plusieurs listes avec des boucles imbriquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7 7 7 7 8 7 Importer des modules Python 7.1 Module math . . . . . . . . . . . . . . 7.2 Module Bio : chargement de séquences 7.2.1 À partir d’un fichier FASTA . . 7.2.2 À partir du serveur Entrez . . 7.3 Installation des modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 8 9 9 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . biologique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Exercices 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Introduction : pourquoi Python ? Python est un langage de programmation facile et polyvalent. C’est un logiciel libre ; il est disponible gratuitement et tourne sur différent système (PC Linux, PC Windows, Mac). Vous pouvez le télécharger ici : http://python.org/ si vous voulez l’installer chez vous. Python est de plus en plus utilisé pour la bioinformatique et nous l’utiliserons au premier semestre pour le traitement des séquences biologiques et au second semestre pour l’analyse des résultats de séquençage à très haut débit (NGS). Il existe actuellement deux versions de Python : la version 2.x et la version 3.x. Pour la bioinformatique, nous utiliserons la version 2 car les modules nécessaire n’existent pas encore en version 3. Cependant, les différences entre les deux versions sont minimes. 1 2 Démarrer Python Pour démarrer Python sous Linux, commencez par lancer un terminal (en double-cliquant sur l’icône du terminal : icône avec un petit écran noir). Python peut s’utiliser de deux manières différentes : 1. en ligne de commande : le programmeur (c’est à dire vous !) donne des ordres en saisissant des commandes au clavier. Les ordres sont exécutés au fur et à mesure qu’ils sont saisis. Pour démarrer l’interpréteur en ligne de commande, exécuter la commande suivante dans un terminal : python2 Le signe >>> en début de ligne est “l’invite de commande” de Python : l’ordinateur vous demande d’entrer une commande. Astuce lorsque l’on utilise un terminal, il est possible de reprendre la ligne de commande saisie précédemment en appuyant sur la flèche du haut du clavier. Appuyer plusieurs fois permet de récupérer des lignes plus anciennes. 2. sous forme de programme : le programmeur saisit l’ensemble des ordres dans un fichier de code Python (fichier .py). L’ensemble du fichier est alors exécuté dans un terminal de la manière suivante : python2 nom_du_fichier.py Sous Windows, on pourra utiliser le logiciel IDLE. La fenêtre “Shell” ouverte par défaut correspond à une ligne de commande. Pour faire un programme, ouvrir un nouveau fichier avec le menu “File > New file”. On pourra l’exécuter avec le menu “Run > Run module”. 3 Syntaxe 3.1 Commentaires Dans Python, tout ce qui suit le caractère # (= dièse) est un commentaire et n’est pas pris en compte par Python : >>> # Ceci est du texte en français qui n’est pas pris en compte par Python ! 3.2 Écrire à l’écran La fonction print() permet d’écrire à l’écran : >>> print("Bonjour !") Bonjour ! 3.3 Aide Python définit un grand nombre de fonctions. La fonction help() permet d’obtenir de l’aide sur une fonction (par exemple la fonction len()) : help(len) 3.4 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). Le nom commence par une lettre, il peut contenir des lettres, des chiffres et des ; en revanche on évitera les accents et les espace ! L’opérateur = est utilisé pour définir (ou redéfinir) la valeur d’une variable ; il peut se lire “prend la valeur de” (NB attention ce n’est pas le sens usuel du = en mathématique). >>> age = 28 Pour écrire la valeur d’une variable à l’écran, on peut utiliser la fonction print() : >>> print(age) 28 Lorsque l’on utilise Python en ligne de commande, le print() peut être omis (mais pas dans un programme) : >>> age 28 Dans un calcul, les noms des variables sont remplacés par leur valeur : >>> age + 1 29 Le = peut aussi être utilisé pour redéfinir la valeur d’une variable : >>> age = age + 1 2 4 Types de donnée Python peut manipuler différents types de données : des nombres entiers (integer en anglais, abrégé en int), des nombres à virgule (souvent appelé flottants ou float en anglais), des chaı̂nes de caractère (string en anglais, abrégé en str ) et des booléens (valeur vraie ou fausse, bool ) : > > > > > > 4.1 age poids nom enseignant etudiant telephone = = = = = = 31 # Entier 64.5 # Flottant "Jean-Baptiste Lamy" # Cha^ ıne de caractère TRUE # Booléen FALSE # Booléen "01 48 38 73 34" # Cha^ ıne de caractère ! Les nombres entiers (integer en anglais, abrégé en int) Les nombres entiers sont les nombres sans virgule. > age = 31 4.2 Les nombres flottant (float en anglais) Les nombres flottant sont les nombres avec virgule. On utilise un point pour la virgule. > poids = 64.4 Attention, 10.0 est un flottant alors que 10 est un entier ! Opération numérique (entier ou flottant) Addition Soustraction Multiplication Division Exemples >>> 2 + 2 >>> 4 - 2 >>> 3 * 4 >>> 10 / 3 3 >>> 10.0 / 3.0 3.3333333333333 >>> 3 ** 2 9 >>> 10 % 3 1 Puissance Modulo (reste de la division entière) 4.3 Les chaı̂nes caractères (string en anglais, abrégé en str ) Les chaı̂nes de caractères correspondent à des textes ou des portions de texte. Il n’y a pas de limite sur le nombre de caractères (zéro, un ou plusieurs). Les chaı̂nes de caractères sont toujours placées entre guillemets. > nom = "Jean-Baptiste Lamy" > chaine_vide = "" > telephone = "01 48 38 73 34" # C’est une cha^ ıne car on ne fait pas d’opération # sur des numéros de téléphone ! 3 Opération sur les chaı̂nes Exemples >>> arn = "GCCUGCUUA" >>> len(arn) 9 >>> arn[0] "G" # Premier élément >>> arn[-1] "A" # Dernier élément >>> arn[0:3] "GCC" >>> "GCCUGCUUA".find("UGC") 3 # Trouvé en position 3 (-1 si pas trouvé) >>> "AttCgcG".lower() "attcgcg" >>> "AttCgcG".upper() "ATTCGCG" >>> saisie = raw_input("Entrez un nom : ") >>> """Il dit "Bonjour".""" >>> "Il dit ’Bonjour’." >>> "Il dit \"Bonjour\"." >>> "retour à la ligne : \n" >>> "tabulation : \t" >>> "antislash : \\" >>> "JB" + "LAMY" "JBLAMY" Obtenir la longueur d’une chaı̂ne (= le nombre de caractères) Obtenir un caractère de la chaı̂ne (attention, on compte à partir de zéro et non de un) Obtenir une partie de la chaı̂ne Rechercher si une chaı̂ne est incluse dans une autre Passer une chaı̂ne en minuscule ou en majuscule Demander à l’utilisateur de saisir une chaı̂ne Définir une chaı̂ne avec des guillemets à l’intérieur Définir une chaı̂ne avec des caractères spéciaux à l’aide d’un antislash (\) Concaténer deux chaı̂nes (= les mettre bout à bout) ; attention il faut ajouter un espace si vous en souhaitez un >>> nom = "LAMY" >>> prenom = "JB" >>> prénom + " " + nom "JB LAMY" >>> "A" * 3 "AAA" Répéter une chaı̂ne 4.4 Les listes (list en anglais) Les listes contiennent zéros, un ou plusieurs éléments (elles ressemblent aux tableaux d’autres langages de programmation). Les éléments peuvent être de types différents (entiers, chaı̂nes de caractère,...). 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 : >>> ma_liste = [0, "Lamy", True] >>> liste_vide = [ ] Pour une liste à n élément, les éléments sont numérotés de zéro à n - 1. Note les chaı̂nes de caractères peuvent souvent être considérées comme des listes de caractères. 4 Opération sur les listes Exemples >>> animaux = ["éléphant", "girafe", "rhinocéros", "gazelle"] >>> len(animaux) 4 >>> animaux[0] "éléphant" # Premier élément >>> animaux[-1] "gazelle" # Dernier élément >>> animaux[0:2] ["éléphant", "girafe"] >>> animaux.append("lion") >>> animaux.insert(0, "hippopotame") Obtenir la longueur d’une liste (= le nombre d’élément) Obtenir un élément de la liste (attention, on compte à partir de zéro et non de un) Obtenir une partie de la liste Ajouter un élément à la fin Ajouter un élément à une position donnée (0 : première position, etc) Ajouter deux listes Enlever un élément Enlever l’élément à une position donnée Rechercher si un élément est présent dans une liste Trier une liste (ordre croissant / alphabétique) Obtenir le plus grand élément d’une liste, ou le plus petit 4.5 >>> [1, 2] + [3, 4, 5] [1, 2, 3, 4, 5] >>> animaux.remove("gazelle") >>> del animaux[-2] >>> "lion" in animaux True >>> animaux.sort() >>> max([2, 1, 4, 3]) 4 >>> min([2, 1, 4, 3]) 1 Les dictionnaires (dictionary en anglais, abrégé en dict) Un dictionnaire (ou tableau associatif, ou hashtable ou hashmap en anglais) fait correspondre à chaque élément un autre élément. Par exemple, un dictionnaire peut faire correspondre à un mot sa définition (d’où le nom de dictionnaire). Un dictionnaire est créé avec des accolades, au sein desquelles sont placés zéro, un ou plusieurs couples “clef : valeur” séparés par “ :”. >>> dico = { "pomme" : "la pomme est le fruit du pommier", "pommier" : "le pommier est un arbre du genre botanique Malus", "fruit" : "un aliment végétal, à la saveur sucrée", } Dans l’exemple précédent les clefs sont ”pomme”, ”pommier” et ”fruit” et les valeurs sont les définitions. À chaque clef correspond une et une seule valeur. Opération sur les dictionnaires Exemples Obtenir le nombre de clef (ou de valeur) dans le >>> len(dico) dictionnaire 3 Obtenir la valeur associée à une clef >>> dico["pomme"] "la pomme est le fruit du pommier" Ajouter un couple clef : valeur >>> dico["clef"] = "valeur" Supprimer une clef (et la valeur associée) >>> del dico["clef"] Rechercher si une clef est présente dans le dictionnaire >>> "pomme" in dico True 4.6 Conversion entre types de données Il est parfois 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") 8 >>> str(8) "8" La fonction 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 ^ age : ")) >>> poids = float(raw_input("Entrez votre poids : ")) 5 5 Conditions Les conditions permettent d’exécuter des commandes seulement dans certaines situations (déterminée à l’exécution du programme). if condition1 : commande exécutée si la condition1 est vraie commande exécutée si la condition1 est vraie... elif condition2 : commande exécutée si la condition1 est fausse et la condition2 est vraie... else : commande exécutée si la condition1 et la condition2 sont fausses... suite du programme (exécutée que les conditions soient vraies ou fausses) Les parties “elif” et “else” sont optionnelles. Il faut faire attention à l’indentation (= les espaces blancs en début de ligne) car ce sont eux qui indiquent à quel endroit la condition se termine. Le nombre d’espace est au choix du programmeur mais doit resté constant. Une 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 : != Exemple de condition : age = int(raw_input("veuillez saisir votre ^ age : ")) if age >= 65 : print("Vous ^ etes une personne ^ agée.") print("L’année prochaine vous aurez " + str(age + 1) + " ans.") Lorsqu’il n’y a qu’une seule commande à exécuté si la condition est vraie, il est possible de tout mettre sur une seule ligne : if age >= 65 : print("Vous ^ etes une personne ^ agée.") 5.1 Opérateur logique ET et OU Les opérateurs and (ET logique) et or (OU logique) permettent de combiner plusieurs conditions entre elles : if (age < 18) or (age > 65) : print("Vous ne travaillez probablement pas.") 5.2 Conditions imbriquées Les conditions peuvent aussi être imbriquées (en utilisant plusieurs niveaux d’indentation) : age = int(raw_input("veuillez saisir votre ^ age : ")) poids = float(raw_input("veuillez saisir votre poids : ")) if age == 0 : print("Vous ^ etes un nouveau-né.") if poids > 10.0 : print("Je pense qu’il y a une erreur sur le poids !") 6 Boucles Une boucle permet d’exécuter plusieurs fois les mêmes commandes. La boucle parcourt une liste, et exécute une série de commande pour chaque élément de la liste. L’élément en cours est placé dans une variable de votre choix. for variable in liste : commande répétée plusieurs fois commande répétée plusieurs fois suite du programme (exécutée une seule fois) La liste parcourue peut être une variable, mais aussi une liste d’indice générée avec la fonction range() : >>> range(4) [0, 1, 2, 3] Exemples : afficher un animal par ligne : 6 animaux = ["éléphant", "biche", "rhinocéros", "brochet"] for animal in animaux : print(animal) print("C’est fini !") 6.1 Programme-type n°1 : compter les éléments d’une liste satisfaisant certains critères 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") On définit une variable “compteur” (appelé “nb aromatique” dans l’exemple ci-dessus) qui vaut zéro. Puis on parcourt la liste (ici, la chaı̂ne de caractères “proteine” est utilisée comme liste) et on augmente de 1 le compteur pour chaque élément satisfaisant les critères désirés. 6.2 Programme-type n°2 : garder seulement les éléments d’une liste satisfaisant certains critères Exemple : garder seulement les nombres pairs d’une liste : nombres = [1, 4, 7, 8, 12, 15] nombres_pairs = [ ] for nombre in nombres : if nombre % 2 == 0 : # Teste si le nombre est pair nombres_pairs.append(nombre) print(nombres_pairs) On définit une nouvelle liste (appelée “nombres pairs” dans l’exemple ci-dessus) qui est initialement vide. Puis on parcourt la liste et on ajoute les éléments satisfaisant les critères désirés dans la nouvelle liste. 6.3 Programme-type n°3 : créer une nouvelle liste (ou chaı̂ne de caractères) à partir d’une liste existante Exemple : calculer un ADN complémentaire : adn = "GCATTC" # Placer ici l’ADN dont on veut calculer le complément 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) On définit une nouvelle liste ou chaı̂ne de caractère (une chaı̂ne appelée “adn complémentaire” dans l’exemple ci-dessus) qui est initialement vide. Puis on parcourt la liste et on complète la nouvelle liste ou chaı̂ne au fur et à mesure. 6.4 Boucler sur plusieurs listes avec zip() La fonction zip() permet de boucler sur deux (ou plusieurs) listes, lorsque les listes sont appariées. Dans l’exemple suivant nous avons une liste d’animaux et une liste d’environnements appariées, c’est-à-dire que l’animal n°1 va avec l’environnement n°1, le n°2 avec le n°2, etc. animaux = ["éléphant", "biche", "rhinocéros", "brochet"] environnements = ["savane", "for^ et", "savane", "rivière"] for animal, envir in zip(animaux, environnements): print(animal + " vit dans " + envir) Ce qui donne : éléphant vit dans savane biche vit dans for^ et rhinocéros vit dans savane brochet vit dans rivière 7 6.5 Boucler sur plusieurs listes avec des boucles imbriquées Les boucles imbriquées permettent de parcourir tous les couples possibles issus de deux listes (couple (a,b) où les a proviennent d’une liste et les b d’une autre). Par exemple pour parcourir tous les couples (animal, environnement) possible : animaux = ["éléphant", "biche", "rhinocéros", "brochet"] environnements = ["savane", "for^ et", "rivière"] for animal in animaux: for envir in environnements: print(animal + " dans " + envir) Ce qui donne : éléphant dans savane éléphant dans for^ et éléphant dans rivière biche dans savane biche dans for^ et biche dans rivière rhinocéros dans savane rhinocéros dans for^ et rhinocéros dans rivière brochet dans savane brochet dans for^ et brochet dans rivière 7 Importer des modules Python Les modules Python définissent des fonctions additionnelles dans des domaines spécifiques (tels que les mathématiques, la bioinformatique,...). Ces fonctions ne sont pas disponibles par défaut, il est nécessaire “d’importer” le module correspondant pour y avoir accès. Il existe deux méthodes pour importer les modules, par exemple sur le module math : 1. Importation du module avec son nom : import math print(math.cos(0.0)) Avec cette méthode, il est nécessaire de taper le nom du module suivi d’un . devant chacune des fonctions du module. 2. Importation du contenu du module : from math import * print(cos(0.0)) Avec cette méthode, il n’est plus nécessaire de taper le nom du module devant chaque fonction ; en revanche si plusieurs modules définissent des fonctions ayant le même nom, cela peut poser problème ! Note si l’on utilise plusieurs fonctions du même module, on ne l’importe qu’une seule fois ! Les importations se mettent en général au tout début des programmes. 7.1 Module math Le module math contient des fonctions mathématiques de bases : >>> >>> >>> >>> >>> 7.2 import math math.sqrt(4) # Racine carrée math.cos(0.0), math.sin(0.0), math.tan(0.0) math.log(2.0) # ln math.log(2.0, 10) # log de base 10 Module Bio : chargement de séquences biologique Le module BioPython (abrégé en Bio) permet de charger des séquences biologiques à partir de fichiers FASTA ou de serveurs Internet. Bien d’autres fonctions sont disponibles, nous en verrons quelques-unes dans les prochains TP. 8 7.2.1 À partir d’un fichier FASTA from Bio.Seq import * from Bio.SeqIO import * seq = read("fichier.fasta", format = "fasta").seq Où l’on remplace ”fichier.fasta” par le nom du fichier FASTA à ouvrir. 7.2.2 À partir du serveur Entrez from Bio.Seq import * from Bio.SeqIO import * from Bio import Entrez Entrez.email = "[email protected]" seq = read(Entrez.efetch(db="<DB>", id="<ID>", rettype="gb", retmode="text"), "genbank").seq Où l’on remplace <DB> par le nom de la base à interrogée (par exemple ”nucleotide” ou ”protein”) et <ID> par l’identifiant de la séquence recherchée (par exemple ”CAA11404”). Note il est nécessaire de donner un email au serveur Entrez, afin de pouvoir être prévenu en cas de problème. 7.3 Installation des modules Tous les modules nécessaires aux TP sont installés à l’université. Pour les installer chez vous, sous Linux, exécuter la ligne de commande suivante dans un terminal : pip2 install biopython setuptools six numpy pandas scipy matplotlib graphviz seaborn fisher mygene pysam DGEclust mgkit goatools Ou en Python (souvent plus facile sous Windows, par exemple dans IDLE) : >>> import pip >>> pip.main(["biopython", "setuptools", "six", "numpy", "pandas", "scipy", "matplotlib", "graphviz", "seaborn", "fisher", "mygene", "pysam", "DGEclust", "mgkit", "goatools"]) 8 Exercices Exercice 1 (conditions) : identification des champignons On souhaite réaliser un programme Python permettant d’identifier des champignons. Afin de rester simple, nous nous limiterons au petit nombre d’espèces de champignon suivant : — Les Ascomycètes (sans chapeau), comprenant : — Les morilles (avec pied) — Les truffes (sans pied) — Les Basidiomycètes (avec chapeau), comprenant : — Les bolets (sans lamelle) — Les autres champignons (avec lamelles) Le programme posera à l’utilisateur des questions de la forme “Le champignon a-t-il un chapeau (o/n) ?”, via la fonction raw input(). On commencera par faire la distinction entre Ascomycètes et Basidiomycètes, puis entre morilles et truffes (pour les Ascomycètes) et enfin entre bolets et autres champignons (pour les Basidiomycètes). Exercice 2 (boucles) : calculer le pourcentage de GC Écrire un programme Python qui calcule le pourcentage de GC dans une séquence d’ADN (on testera le programme sur la séquence suivante : ACTTGCATGGCC). Exercice 3 : générer un Dotplot Nous allons écrire un programme Python pour effectuer le Dotplot entre deux séquences. Le Dotplot sera écrit avec la fonction print(), et chaque valeur sera séparée de la suivante par une virgule, par exemple : ,A,C,T,T,G,C,A,T,G,G,C,C, T, , ,X,X, , , ,X, , , , , T, , ,X,X, , , ,X, , , , , G, , , , ,X, , , ,X,X, , , 9 C, ,X, A,X, , A,X, , G, , , G, , , C, ,X, C, ,X, , , , , , , , , ,X, , , , ,X, , , ,X, ,X, , , ,X, , , , ,X, , , ,X, , , , ,X,X, , , , , , , , , , , ,X,X, , , ,X,X, , , , , ,X,X, , , ,X,X, Cela correspond au format CSV (column-separated value, valeur séparée par des virgules), ce qui permettra ensuite de charger le fichier dans un tableur pour l’observer plus facilement. On utilisera dans un premier temps les séquences suivantes : seq1 = "TTGCAAGGCC" seq2 = "ACTTGCATGGCC" 1. Écrire un programme qui affiche la première ligne du Dotplot ci-dessous (qui compare la séquence 2 à la première base de la séquence 1 : T). Pour l’instant, nous laisserons de côté l’affichage des séquences pour afficher seulement : , ,X,X, , , ,X, , , , , Conseil : on utilisera une boucle sur la séquence 2. On commencera avec une ligne vide (ligne = ””) que l’on remplira progressivement. Lorsque la ligne est terminée, on l’écrit avec print(). 2. Modifier le programme précédent pour qu’il écrive toutes les lignes (on ajoutera une seconde boucle). 3. Modifier le programme précédent pour faire apparaı̂tre les séquences en haut et à gauche du Dotplot. 4. Modifier le programme pour effectuer un Dotplot comparant les séquences peptidiques de la thiorédoxine provenant des organismes Staphylococcus aureus (identifiants Entrez : CAA11404) et Helicobacter pylori 51 (ACX97712). On enregistrera la sortie du programme dans un fichier .csv de la manière suivante : python2 dotplot.py > dotplot_thioredoxine.csv 5. Ouvrir le fichier .csv obtenu (dans OpenOffice) et interpréter le Dotplot. 6. Modifier le programme pour effectuer un Dotplot comparant la séquence “minisatellite” de la drosophile (Drosophila mauritiana) à elle-même (identifiants Entrez : M62837). 7. Interpréter le Dotplot obtenu. Exercice 4 : mettre une séquence en couleur Écrire un programme qui met en couleur une séquence d’ADN, avec les couleurs suivantes : A : vert, T : rouge, C : bleu, G : jaune. Pour cela, le programme écrira (avec print()) une page HTML avec la séquence colorisée. On pourra s’aider de la page HTML minimaliste suivante : <html><head></head><body> Texte <font color=’red’>en couleur</font> </body></html> On “redirigera” ensuite la sortie du programme vers un fichier .html puis on ouvrira ce fichier dans un navigateur web. 10