Bioinformatique - TP2 : recherche de cadres de lecture ouverts (ORF)
Transcription
Bioinformatique - TP2 : recherche de cadres de lecture ouverts (ORF)
Bioinformatique - TP2 : recherche de cadres de lecture ouverts (ORF) Jean-Baptiste Lamy / Manipuler des séquences biologiques en Python Importation des modules nécessaires : from Bio.Seq import * from Bio.SeqIO import * Les séquences chargées avec BioPython peuvent être manipulée comme des chaı̂nes de caractère Python, et possèdent en plus des fonctions spécifiques aux séquences (transcription, etc). Il existe deux manières de traiter les séquences en Python : les séquences anonymes (Seq) et les séquences nommées (SeqRecord, incluant le nom du gène, de l’espèce, etc, en plus de la séquence proprement dite). Opérations Code Python adn = Seq("ATGC...", IUPAC.unambiguous_dna) arn = Seq("AUGC...", IUPAC.unambiguous_rna) prot = Seq("MLVA...", IUPAC.protein) adn = read("fichier.fasta", format="fasta") arn = read("fichier.fasta", format="fasta") prot = read("fichier.fasta", format="fasta") Créer une séquence anonyme d’ADN, d’ARN ou une séquence protéique (d’acides aminés) Charger à partir d’un fichier FASTA une séquence (nommée) d’ADN, d’ARN ou d’acides aminés Transformer une séquence anonyme en séquence nommée (ADN ou autre) Transformer une séquence nommée en séquence anonyme SeqRecord(adn, name="nom") adn.seq Compter le nombre de paire de base / d’acide aminé dans une séquence (ADN, ARN ou protéine) len(adn) str(adn) # Séquence anonyme (Seq) str(adn.seq) # Séquence nommée (SeqRecord) adn[i] adn[i : j] for base in adn: print(base) for i in range(len(adn)): print(adn[i]) Afficher la totalité d’une séquence Obtenir la base n°i d’une séquence Extraire une partie d’une séquence de la base i à la base j Parcourir toutes les bases d’une séquence Les opérations suivantes sont disponibles uniquement sur Calcule le complément d’une séquence d’ADN ou d’ARN Inverse une séquence d’ADN, d’ARN ou d’AA et prend son complément Transcrire une séquence d’ADN (brin codant) en ARN (transcription brute ne prenant pas en compte les sites promoteurs) Traduire une séquence d’ADN (brin codant) ou d’ARN en AA (traduction brute ne prenant pas en compte les codons start et stop, le cadre de lecture, etc) les séquences anonymes (sinon, remplacer adn par adn.seq) adn.complement() adn.reverse_complement() adn.transcribe() adn.translate() arn.translate() Rechercher des motifs en Python Importation des modules nécessaires : import Bio.motifs as motifs Créer un motif à partir d’une ou plusieurs séquences (ADN, ARN ou protéique) Recherche exacte (dans une séquence anonyme uniquement) Recherche approximative (matrice PSSM, dans une séquence d’ADN anonyme uniquement) motif = motifs.create([adn1, adn2,...]) for position, sequence in motif.instances.search(adn): print(position) for position, score in motif.pssm.search(adn): print(position) 1 Exercice : L’objectif du TP est de rechercher des cadres de lecture ouverts (ORF) dans un génome. Pour cela nous allons travailler sur le génome d’Escherichia coli K-12 ; le début de ce génome est dans le fichier “genome e coli debut.fasta” (NB c’est le brin codant qui est représenté). 1. Importer les modules BioPython pour la manipulation des séquences et des motifs. 2. Charger le fichier “genome e coli debut.fasta” dans une variable que l’on appellera “adn”. 3. Afficher la séquence d’ADN. Combien a-t-elle de paires de base ? 4. Transcrire la séquence d’ADN en ARN, et mettre le résultat dans la variable “arn”. 5. Créer un motif appelé “motif start” correspondant à la séquence du codon start (AUG). 6. Rechercher toutes les positions sur l’ARN correspondants à des codons starts à l’aide du motif “motif start”. Mettre les résultats dans la variable “tous les start” (astuce : on utilisera une boucle pour ne garder que les positions, et pas les séquences des motifs trouvés). 7. De la même manière, rechercher toutes les positions correspondants à des codons stop (UAA, UAG et UGA). 8. À quelle position commence le premier ORF ? à quelle position se trouve le codon stop correspondant (attention question piège) ? 9. Combien y a-t-il de phases de lecture possibles sur ce brin d’ADN ? 10. Rechercher (automatiquement) le stop du premier ORF (qui commence sur le premier start en 29). Astuce : le stop correspondant au premier start doit : — être situé après le start — être sur la même phase de lecture On utilisera une boucle pour passer en revue les stops, lorsque le bon stop est trouvé on gardera sa position et on interrompra la boucle avec un “break”. 11. Créer une liste “toutes les fins” contenant les stops de chaque start. Astuce : on partira d’une liste vide et on effectuera une boucle sur les starts. Dans cette boucle, on déterminera le stop de chaque start en utilisant la même méthode qu’à la question précédente. 12. Créer une liste appelée “toutes les longueurs” contenant la longueur de chaque ORF sur la première phase de lecture (en paires de base). 13. Afficher les ORF (1 ORF par ligne, avec son début, sa fin et sa longueur). 14. Avons-nous trouver tous les ORF présents sur ce morceau de génome ? Pourquoi ? 15. Pourrait-on utiliser la même méthode pour rechercher des ORF chez l’homme ? 16. Les ORF de notre tableau correspondent-ils tous à des protéines présentes dans la bactérie ? pourquoi ? 17. Quelle est la probabilité d’avoir un codon stop “par hasard” dans l’ADN, si la distribution des bases était aléatoire ? Quelle est la probabilité d’avoir un codon autre que le codon stop ? 18. Pour une suite de 10 codons aléatoires, quelle est la probabilité de ne pas avoir de stop ? (Astuce : utiliser l’opérateur puissance, qui se note ** en Python). Pour une suite de 70 codons ? Que peut-on en déduire pour les ORF de longueur supérieure à 70 codons ? 19. Extraire l’ARN du premier ORF codant pour plus de 70 acides aminés, puis le traduire en protéine. 20. Rechercher avec BLAST cette séquence protéique. L’ORF correspond-il bien à une séquence codante ? 2