Module LV348 Version enseignant TD 1 page 1/7 TD 1 Biais de codons Revu dernièrement par Mathilde Carpentier, Cyril Gallut et Joël Pothier Version du 15 janvier 2014 L objectif de ce TP est de prendre en main le langage python et de revoir quelques notions fondamentales sur l ADN (complémentarité, phase de lecture, traduction et usage du code génétique. La question biologique posée porte sur l usage du code génétique. 1 Les données Nous allons travailler sur le génome complet de la bactérie Escherichia coli. Nous allons télécharger son génome complet sur le site ftp du NCBI ftp://ftp.ncbi.nlm.nih.gov/. Ce serveur propose les génomes de très nombreux organismes. Il y a en effet maintenant environ 1000 génomes complets séquencés, et des millions de séquences dispersées. Différents fichiers sont proposés pour chaque génome, ils correspondent à différents formats des données. Nous allons utiliser le fichier.fna, c est-à-dire la séquence nucléique du génome complet au format fasta. L adresse du fichier est : ftp://ftp.ncbi.nlm.nih.gov/genomes/bacteria/escherichia_coli_ K_12_substr MG1655/NC_000913.fna 1 Le format fasta est un format texte pour les séquences nucléiques (ADN) ou protéiques. Une séquence de ce format comporte une ligne de description commençant par un ">" puis les lignes de la séquence. La fin d une séquence est atteinte lorsque la fin du fichier est atteinte ou lorsqu une autre séquence commence, c est-à-dire que l on rencontre une ligne commençant par un ">". La ligne de description comporte un identifiant de la séquence dans la banque d où elle provient. Exemple de séquence au format fasta : >NC_010473 :163816-163951 small RNA [gene=tff] [locus_tag=ecdh10b_0148] CGGACTTCCGATCCATTTCGTATACACAGACTGGACGGAAGCGACAATCTCACTTTGTGTAACAACACAC ACGTATCGGCACATATTCCGGGGTGCCCTTTGGGGTCGGTAATATGGGATACGTGGAGGCATAACC 2 Exercices Tous les exercices sont à faire en python. 2.1 Lecture des fichiers Ecrivez une fonction python permettant de lire un fichier fasta ne contenant qu une séquence et qui retourne la séquence lue sous la forme d une chaî,e de caractères.. Présentation de python : fonction, for, ouverture, fermeture et lecture de fichier. 1. Il vaut mieux ne pas prendre...escherichia_coli_k_12_substr DH10B/NC_010473.fna car elle contient un Y
Module LV348 Version enseignant TD 1 page 2/7 1 # lecture d un fichier au format fasta 2 # version 1: la sequence est 3 #recuperee sous la forme d une chaine de caracteres 4 #------------------------------------------------------------------------ 5 def readfasta(file): 6 infile=open(file, r ) 7 seq="" 8 name = "" 9 tmp=infile.readlines() 10 infile.close() 11 12 #name =tmp[0][1:-1] # pour eliminer le > du debut et le \n de fin 13 for x in tmp[1:] : 14 seq=seq+x[:-1] 15 16 #return (name,seq) # la fonction retourne le nom et la sequence 17 return seq # la fonction retourne la sequence./code/lecture.py 2.2 Le brin complémentaire Comme vous l avez peut être remarqué, il n y a qu un seul des deux brins d ADN dans le fichier fasta. Ecrivez une fonction python retournant le brin complémentaire d une séquence nucléique donnée en argument. Python : while et dictionnaire Bio : complémentarité des brins 1 # donne le complementaire inverse de la sequence seq 2 def complement(seq): 3 compl = { A : T, C : G, G : C, T : A } 4 cseq= 5 i = len(seq) -1 6 while i >= 0 : 7 cseq = cseq + compl.get(seq[i], N ) 8 i -= 1 9 return cseq./code/complementaire.py 2.3 Détection des CDS Ecrivez une fonction python qui retourne la liste de toutes les sous séquences commençant par le codon "start" et se terminant par un codon "stop" en phase (n oubliez pas le brin complémentaire). Ces séquences sont nommées CDS (Coding sequences). Note : Si plusieurs start sont trouvés dans la même phase de lecture avant un stop, le CDS débute au premier start ; les CDS peuvent se chevaucher (sur différentes phases, et éventuellement sur le brin d ADN complémentaire),
Module LV348 Version enseignant TD 1 page 3/7 Encore des dico, introduction des autres types énumérés : liste et tuple. Question plus bio : les phases de lectures, détection des CDS. Pour info, les ORFs sont les séquences entre 2 STOP en phase et non un START et un STOP C est le premier algo un peu compliqué, bien y réfléchir. 1 # Retourne la liste des orf de la seq 2 # 3 def findorf(seq): 4 start = ("ATG") 5 stop = ("TAA","TAG","TGA") 6 startlist = [-1,-1,-1] 7 orflist = [] 8 for i in range(len(seq)-2): 9 if seq[i:i+3] in start: 10 if startlist[i%3] == -1: 11 startlist[i%3] = i 12 elif seq[i:i+3] in stop: 13 if startlist[i%3]!= -1: 14 # Attention n inclus pas le stop 15 orflist.append(seq[startlist[i%3]:i]) 16 startlist[i%3] = -1 17 return orflist./code/orf.py 2.4 Traduction Ecrivez une fonction python qui à partir d une séquence nucléique retourne la séquence protéique correspondante (en utilisant le code génétique à une lettre qui vous a été donné et qui se trouve au lien suivant : http://www.snv.jussieu.fr/bmedia/codegenet/codegenet.htm). Cette fonction ne nous servira pas vraiment mais elle permet d introduire le code génétique et de parler de redondance. 1 # effectue la traduction de la sequence seq 2 def traduction(seq): 3 code = {"TTT":"F","TTC":"F","TTA":"L","TTG":"L","TCT":"S","TCC":"S", 4 "TCA":"S","TCG":"S","TAT":"Y","TAC":"Y","TAA":"*","TAG":"*", 5 "TGT":"C","TGC":"C","TGA":"*","TGG":"W","CTT":"L","CTC":"L", 6 "CTA":"L","CTG":"L","CCT":"P","CCC":"P","CCA":"P","CCG":"P", 7 "CAT":"H","CAC":"H","CAA":"Q","CAG":"Q","CGT":"R","CGC":"R", 8 "CGA":"R","CGG":"R","ATT":"I","ATC":"I","ATA":"I","ATG":"M", 9 "ACT":"T","ACC":"T","ACA":"T","ACG":"T","AAT":"N","AAC":"N", 10 "AAA":"K","AAG":"K","AGT":"S","AGC":"S","AGA":"R","AGG":"R", 11 "GTT":"V","GTC":"V","GTA":"V","GTG":"V","GCT":"A","GCC":"A", 12 "GCA":"A","GCG":"A","GAT":"D","GAC":"D","GAA":"E","GAG":"E", 13 "GGT":"G","GGC":"G","GGA":"G","GGG":"G"} 14 tradseq = 15 for i in range(0,len(seq)-2,3): 16 tradseq += code.get(seq[i:i+3], X )
Module LV348 Version enseignant TD 1 page 4/7 17 return tradseq./code/traduction.py 2.5 Usage des codons Ecrivez un programme python qui calcule la fréquence d utilisation de chaque codon pour chaque acide aminé d une liste de séquences nucléiques donnée en argument. Appliquez là aux CDS détectées. Par exemple, l usage des codons pour les cds détectées sur le génome d E. coli que vous avez téléchargé est A GCA: 22.47% GCC: 26.81% GCG: 33.03% GCT: 17.70% 1 # calcul la frequence de chaque codon par acide amine 2 def calcul_freq_codon_aa(lesseq): 3 freq_par_aa = { 4 "A":{"GCT":0,"GCC":0,"GCA":0,"GCG":0}, 5 "C":{"TGT":0,"TGC":0}, 6 "D":{"GAT":0,"GAC":0}, 7 "E":{"GAA":0,"GAG":0}, 8 "F":{"TTT":0,"TTC":0}, 9 "G":{"GGT":0,"GGC":0,"GGA":0,"GGG":0}, 10 "H":{"CAT":0,"CAC":0}, 11 "I":{"ATT":0,"ATC":0,"ATA":0}, 12 "K":{"AAA":0,"AAG":0}, 13 "L":{"CTT":0,"CTC":0,"CTA":0,"CTG":0,"TTA":0,"TTG":0}, 14 "M":{"ATG":0}, 15 "N":{"AAT":0,"AAC":0}, 16 "P":{"CCT":0,"CCC":0,"CCA":0,"CCG":0}, 17 "Q":{"CAA":0,"CAG":0}, 18 "R":{"AGA":0,"AGG":0}, 19 "R":{"CGT":0,"CGC":0,"CGA":0,"CGG":0}, 20 "S":{"TCT":0,"TCC":0,"TCA":0,"TCG":0,"AGT":0,"AGC":0}, 21 "T":{"ACT":0,"ACC":0,"ACA":0,"ACG":0}, 22 "V":{"GTT":0,"GTC":0,"GTA":0,"GTG":0}, 23 "W":{"TGG":0}, 24 "Y":{"TAT":0,"TAC":0}} 25 #1) compter les codons 26 codon={} 27 for s in lesseq: 28 for i in range(0,len(s)-2,3): 29 if s[i:i+3] in codon : 30 codon[s[i:i+3]]+=1 31 else : 32 codon[s[i:i+3]]=1 33 #2) Calculer les frequences par aa 34 for aa in freq_par_aa :
Module LV348 Version enseignant TD 1 page 5/7 35 freqtotal = 0.0 36 # calcul la frequence cumulee des codon par aa pour normaliser 37 for cod in freq_par_aa[aa] : 38 freqtotal += codon[cod] 39 # calcul la frequence de chaque codon par acide amine 40 for cod in freq_par_aa[aa] : 41 freq_par_aa[aa][cod] = (codon[cod]/freqtotal)*100 42 return freq_par_aa./code/usage_codon.py 3 Bonus Ecrivez un programme python qui calcul le N c (effective number of codons) pour les CDS détectés. Ecrivez un programme python qui calcul le CAI (codon adaptation index) pour les CDS détectés. Comparez les valeurs. 3.1 Conclusion Observez la distribution globale des codons, la composition globale des séquences en acides aminés (faire des graphiques à l aide de gnuplot ou d un tableur). Sachant que le code génétique est redondant, nous voulons analyser si les codons codant pour un même acide aminé sont utilisés de manière aléatoire ou non. Calculez aussi l usage global des codons pour chaque acide aminé, c est-à-dire le pourcentage de chaque codon possible pour un acide aminé. L usage des codons vous semble-t-il uniforme pour chaque acides aminé? Question subsidiaire : comment vérifieriez-vous statistiquement cette hypothèse de non-uniformité? Faites le si possible. Pour conclure, il est conseillé de lire la page : http://fr.wikipedia.org/wiki/biais_ d usage_du_code Toutes les fonctions python sont dans TD1_Corrections.py dans le répertoire code 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import getopt 5 import sys # permet la lecture des arguments de la ligne de commande. 6 import math # permet d utiliser les fonctions math (pow) 7 8 from ORF import * 9 from complementaire import * 10 from compoaa import * 11 from compte_codon import * 12 from lecture import * 13 from traduction import * 14 from usage_codon import * 15
Module LV348 Version enseignant TD 1 page 6/7 16 # ############################################################################### 17 ################################### main ####################################### 18 def main(): 19 20 opt, args = getopt.getopt(sys.argv[1:], "h", ["help"]) 21 # for o, a in opt: 22 # if o in ( -h, --help ): 23 # print aide 24 # return 0 25 if len(sys.argv) <= 1: 26 print "Veuillez donner un fichier fasta en entree" 27 return 0 28 29 # if len(sys.argv) == 1: 30 # print "Bienvenue. Veuillez indiquer le nom d une banque de sã c quences au format FASTA (nom du fichier ) :" 31 # banque_nom = raw_input() 32 # else: 33 # banque_nom = sys.argv[1] 34 35 infile = sys.argv[1] # recupere le nom du fichier a partir de la ligne de commande 36 37 #QUESTION 1 38 ns = readfasta(infile) # lit la sequence dans le fichier fasta 39 #QUESTION 2 40 c_ns = complement(ns) # calcul la sequence inverse complementaire 41 #QUESTION 3 42 orfs = findorf(ns) # recherche les orfs dans la sequence 43 orfs.extend(findorf(c_ns)) # recherche les orfs dans la sequence inverse complementaire 44 print "Nombre d orfs : direct, inverse" 45 print len(orfs) 46 #print orfs 47 #QUESTION 4 48 print "Exemple d une orf traduite" 49 print traduction(orfs[1]) 50 #QUESTION 5 51 freq_codon_aa=calcul_freq_codon_aa(orfs) 52 print 53 54 55 print "Usage des codons par acide amine :" 56 for aa in sorted(freq_codon_aa.keys()): 57 tmp = 58 for codon in sorted(freq_codon_aa[aa]): 59 tmp = tmp + %s: %.2f%s % (codon, freq_codon_aa[aa][codon], % ) 60 print aa, tmp 61 print 62 63 64 if name == " main ":
Module LV348 Version enseignant TD 1 page 7/7 65 sys.exit(main())./code/td1_correctionexos.py Il y a aussi des calculs de CAI dans /code/cai.py.