Module 1 · Section 1.1
Représentations computationnelles du dogme central
55 min · niveau debutant · dernière révision : 2026-11-01
Objectifs d'apprentissage
- Distinguer les alphabets de l'ADN, de l'ARN et des protéines et choisir un encodage adapté
- Calculer à la main un complément inverse et un contenu en GC
- Identifier les six cadres de lecture et délimiter un ORF
- Expliquer pourquoi l'orientation 5'→3' et la version d'une accession sont des informations critiques
- Écrire un premier script Python qui manipule une séquence sans dépendance externe
Prérequis : 0.1 Introduction et reproductibilité
Python 3.11+
Prérequis
Cette première section suppose seulement une familiarité avec l'ADN comme molécule porteuse de l'information génétique et avec la notion de protéine. Les conventions d'écriture du cours sont rappelées dans la section 0.1 : une séquence est notée , sa longueur , et les positions sont numérotées à partir de 1 dans le texte. Aucune connaissance de Biopython n'est requise : nous commençons volontairement avec les opérations de base, que tout programme sérieux doit maîtriser avant d'appeler une bibliothèque.
Introduction
L'ADN porte l'information héréditaire sous la forme d'une séquence de nucléotides. Chez les bactéries, cette information est organisée en un chromosome circulaire ; chez les eucaryotes, elle est répartie entre plusieurs chromosomes et associée à des protéines. La transcription produit un ARN messager, puis la traduction convertit celui-ci en une chaîne d'acides aminés. Ce flux d'information, souvent résumé par l'expression « dogme central », n'est pas une simple linéarité : l'épissage, les modifications chimiques et la régulation ajoutent de nombreuses couches. Pour un programme, cependant, le point de départ est d'une simplicité trompeuse : une chaîne de caractères.
Le défi computationnel commence dès que l'on quitte cette chaîne idéalisée. Une séquence biologique possère une orientation chimique : les nucléotides sont lus de 5' vers 3', et le brin complémentaire est lu en sens inverse. Une même région peut donc être décrite par deux séquences différentes selon le brin de référence. Les génomes contiennent des caractères ambiguus, des séquences répétées, des régions non assemblées et parfois plusieurs versions d'une même accession. Le fichier que l'on télécharge aujourd'hui peut être une révision différente de celui utilisé dans un article. Enfin, une séquence n'est pas seulement une suite de lettres : sa segmentation en codons, ses cadres de lecture et ses ORFs dépendent de conventions qu'il faut expliciter.
Cette section construit les fondations nécessaires à tout le reste du cours. Nous partons des alphabets et des encodages, puis nous définissons le complément inverse, le contenu en GC et la traduction. Nous montrons ensuite comment un ordinateur représente les six cadres de lecture et comment un ORF peut être délimité sans se tromper d'orientation. Chaque notion est reliée à une question biologique concrète et à un piège de programmation fréquent. Le fil rouge est le génome d'Escherichia coli K-12 MG1655, accession NC_000913.3, que nous retrouverons dans les modules de génomique et de transcriptomique.
Théorie
Alphabets, alphabets étendus et encodages
Un alphabet est un ensemble fini de symboles. Pour l'ADN, l'alphabet canonique est . Pour l'ARN, l'uracile remplace la thymine : . Pour les protéines, l'alphabet standard contient vingt acides aminés, notés par leur code à une lettre : . Le code génétique peut en outre produire la sélénocystéine et la pyrrolysine dans des contextes particuliers, et certaines protéines contiennent des acides aminés modifiés.
En pratique, les fichiers utilisent un alphabet étendu. La notation IUPAC introduit des symboles d'ambiguïté : pour une base quelconque, pour une purine (A ou G), pour une pyrimidine (C ou T), pour G ou C, pour A ou T, pour G ou T, pour A ou C, pour C, G ou T, pour A, G ou T, pour A, C ou T, et pour A, C ou G. Ces symboles ne sont pas des détails : un génome nouvellement séquencé contient souvent des aux extrémités de contigs ou dans les régions difficiles à assembler.
Un ordinateur peut stocker une séquence de plusieurs manières. La plus simple est une chaîne ASCII : un octet par caractère. Une séquence de 5 millions de bases occupe alors environ 5 Mo, sans compression. On peut aussi utiliser un encodage à deux bits par base pour l'ADN non ambigu, ce qui réduit la taille d'un facteur quatre, au prix d'une conversion à chaque accès. Les formats compressés comme gzip réduisent encore la taille sur disque, souvent d'un facteur trois à dix selon la redondance. Le choix dépend de l'usage : lisibilité et simplicité pour l'enseignement, compression et indexation pour les grands génomes.
Une séquence peut être écrite en majuscules ou en minuscules. Les minuscules signalent parfois des régions non codantes ou des caractères « soft-masked » dans les génomes eucaryotes. Cette convention n'est pas universelle : un programme robuste normalise la casse avant de comparer, tout en conservant la forme originale s'il doit la restituer. Les espaces, tabulations et retours à la ligne sont également à traiter : un fichier FASTA peut couper une séquence sur plusieurs lignes de 60 ou 80 caractères. Compter les caractères sans concaténer les lignes donne alors une longueur fausse.
Complémentarité, orientation et complément inverse
Les deux brins de l'ADN sont antiparallèles. Si le brin de référence est lu de 5' vers 3', le brin complémentaire est lu de 3' vers 5' dans la même direction physique. Pour obtenir la séquence du brin complémentaire dans le sens 5'→3', on remplace chaque base par sa complémentaire, puis on inverse l'ordre des bases. C'est le complément inverse (reverse complement), noté .
Les règles de complémentarité de l'ADN sont et . Pour l'ARN, et . Si l'on applique deux fois le complément inverse à une séquence d'ADN, on retrouve la séquence initiale : . Cette involution est une propriété utile pour tester un programme.
Un site de restriction est souvent palindromique : sa séquence est égale à son complément inverse. Par exemple, le site d'EcoRI est GAATTC. Son complément inverse est aussi GAATTC. Cette propriété explique pourquoi une enzyme de restriction reconnaît le même site sur les deux brins et peut couper l'ADN à cet endroit. Tous les sites ne sont pas palindromiques, et certaines enzymes coupent à distance du site de reconnaissance ; le calcul du site ne suffit donc pas à prédire la position exacte de la coupure.
La formule du contenu en GC est simple :
Elle se calcule en temps linéaire, , puisqu'il suffit de parcourir la séquence une fois. Le contenu en GC est souvent corrélé à la stabilité thermique de l'hybridation et varie entre espèces et entre régions d'un même génome. Il ne faut pas le confondre avec le contenu en GC des troisième positions de codons, qui a une signification évolutive différente.
Du gène à la protéine : codons, cadres et ORFs
La traduction lit les codons trois par trois à partir d'un codon d'initiation, généralement ATG chez les bactéries, et s'arrête à un codon stop (TAA, TAG ou TGA dans le code standard). Un cadre de lecture (reading frame) est défini par la position de départ de la lecture. Pour une séquence linéaire, il existe trois cadres sur le brin direct, décalés de 0, 1 ou 2 nucléotides, et trois cadres sur le brin complémentaire inverse. On parle donc de six cadres de lecture.
Un cadre de lecture ouvert, ou ORF (open reading frame), est une région sans codon stop entre un codon d'initiation et un codon stop. La définition exacte varie selon les annotations : certains outils autorisent un ORF sans ATG initial, d'autres exigent un codon stop final, et la longueur minimale est un paramètre. Il faut donc toujours préciser la définition utilisée. Un ORF n'est pas nécessairement un gène : il peut être fortuit, chevaucher un autre gène sur un autre cadre, ou correspondre à un ARN non codant.
La dégénérescence du code génétique signifie que plusieurs codons codent le même acide aminé. Ainsi, la troisième position d'un codon est souvent moins contrainte, ce qui influence le contenu en GC et l'usage des codons. Les préférences d'usage varient entre organismes et entre gènes ; nous les étudierons en section 1.5 avec l'indice d'adaptation des codons.
Complexité et choix de représentation
Les opérations élémentaires sur une séquence — longueur, comptage, complément, traduction, recherche d'un motif exact — s'effectuent en avec une mémoire si l'on construit une nouvelle chaîne. La recherche d'un motif avec un algorithme naïf peut coûter dans le pire des cas, mais les bibliothèques utilisent des algorithmes plus efficaces. Les expressions régulières sont pratiques pour les motifs simples, mais elles deviennent difficiles à maintenir pour des structures imbriquées ou des répétitions approximatives.
Le choix de la représentation a des conséquences pratiques. Si l'on doit effectuer des millions de recherches de motifs sur un génome, il vaut mieux indexer la séquence qu'utiliser une regex naïve à chaque requête. Si l'on doit afficher la séquence à l'utilisateur, on conserve les caractères originaux. Si l'on doit comparer des séquences, on normalise la casse et l'alphabet. Ces décisions doivent être documentées, car elles conditionnent la reproductibilité des résultats.
Exemple travaillé à la main
Prenons la séquence ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG, de longueur . Comptons les bases : A = 9, C = 8, G = 14, T = 8. Le contenu en GC vaut donc .
Le complément base à base est TACCGGTAACATTACCCGGCGACTTTCCCACGGGCTATC. En inversant l'ordre, on obtient CTATCGGGCACCCTTTCAGCGGCCCATTACAATGGCCAT. Vérifions le début : la séquence commence par ATG, donc son complément inverse se termine par CAT, ce qui est cohérent.
En cadre +1, les codons sont ATG GCC ATT GTA ATG GGC CGC TGA AAG GGT GCC CGA TAG. La traduction du code standard donne M A I V M G R * K G A R *. Le premier codon stop apparaît au huitième codon. Le premier ORF commence donc à la position 1 et se termine à la position 24 (huit codons de trois bases), soit une protéine de 7 acides aminés avant le stop. Les positions suivantes ne forment pas un nouvel ORF dans ce cadre, car il n'y a pas de ATG avant le stop final.
Implémentation
Commençons par une implémentation sans dépendance, qui servira de référence pour comprendre les bibliothèques. Le code ci-dessous est exécutable dans le navigateur : il ne fait aucun accès réseau et n'utilise que la bibliothèque standard de Python.
Aucune sortie. Exécutez le code pour voir le résultat.
Le code s'exécute dans votre navigateur (Web Worker isolé). Il n'a pas accès au serveur ; l'accès réseau est désactivé pendant l'exécution. Le premier clic sur « Exécuter » télécharge Pyodide depuis jsDelivr (plusieurs mégaoctets, version 0.26.4 épinglée) ; rien n'est chargé avant ce clic.
La sortie attendue est :
Longueur : 39
GC : 56.41 %
Complément inverse : CTATCGGGCACCCTTTCAGCGGCCCATTACAATGGCCAT
Protéine : MAIVMGR*KGAR*Trois points méritent attention. D'abord, str.maketrans et translate opèrent caractère par caractère ; l'inversion [::-1] vient après la complémentation. Ensuite, le dictionnaire de codons ne couvre que l'ADN en majuscules ; les minuscules sont normalisées, et les codons ambigus renvoient X plutôt que de faire planter le programme. Enfin, la fonction translate s'arrête à len(seq) - 2 pour éviter un codon incomplet. Une séquence dont la longueur n'est pas multiple de trois produit donc une protéine tronquée, ce qui est souvent le signe d'un cadre ou d'une annotation incorrecte.
Pour rechercher des ORFs, on peut parcourir chaque cadre et suivre l'état « dans un ORF ». Le code suivant illustre l'idée sur une petite séquence. Il renvoie les intervalles 1-based, ce qui facilite la comparaison avec les annotations génomiques.
def find_orfs(seq, min_aa=10):
stop_codons = {"TAA", "TAG", "TGA"}
results = []
seq = seq.upper()
for strand, subseq in (("+", seq), ("-", reverse_complement(seq))):
for frame in range(3):
i = frame
while i + 3 <= len(subseq):
if subseq[i:i+3] != "ATG":
i += 3
continue
start = i
j = i
while j + 3 <= len(subseq):
if subseq[j:j+3] in stop_codons:
if (j - start) // 3 >= min_aa:
results.append((strand, frame + 1, start + 1, j + 3))
break
j += 3
i = j + 3
return results
print(find_orfs("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG", min_aa=3))Cette implémentation est volontairement simple. Elle ne gère pas les ORFs chevauchants, les codons d'initiation alternatifs, ni les cadres qui se prolongent au-delà de la fin de la séquence (séquences circulaires). Elle illustre néanmoins la logique de base et permet de discuter les choix de définition. Dans un vrai projet, on préfère souvent un outil annoté ou une bibliothèque testée, et l'on documente les paramètres.
Étude de cas
Nous utilisons une région réelle du génome d'E. coli K-12 MG1655, accession NC_000913.3, positions 1 à 3000. Cette région est facile à télécharger et suffisamment petite pour être analysée en quelques secondes. Elle ne représente qu'une infime partie du chromosome, mais elle permet de mettre en pratique les notions de longueur, de GC, d'orientation et de cadre de lecture.
La question biologique est la suivante : cette région est-elle atypique en composition, et contient-elle un grand ORF susceptible de correspondre à un gène ? Nous procédons en quatre étapes.
- Télécharger la région avec EFetch en demandant les positions 1 à 3000.
- Compter les bases et calculer le GC.
- Rechercher les ORFs d'au moins 100 acides aminés dans les six cadres.
- Comparer les résultats à l'annotation et discuter les limites.
La commande suivante utilise l'API E-utilities de NCBI. Elle nécessite un accès réseau et doit être exécutée avec un courriel de contact dans un vrai projet.
efetch -db nuccore -id NC_000913.3 -seq_start 1 -seq_stop 3000 -format fasta > ecoli_1_3000.fastaUne sortie vérifiée localement le 2026-11-01 donne une longueur de 3 000 pb, avec 818 G, 740 C, 732 T et 710 A, soit un GC de 51,93 %. Ce chiffre est proche du GC global attendu pour E. coli K-12, de l'ordre de 50 %, mais une région de 3 kb ne permet pas de conclure sur le génome entier. La recherche d'ORFs d'au moins 100 acides aminés détecte deux candidats : un ORF de 820 codons sur le brin direct (cadre +1, positions 337 à 2799) et un ORF de 130 codons sur le brin complémentaire (cadre −2, positions 2501 à 2893 de la séquence inverse). Le premier est long et probablement associé à un gène ; le second mérite une vérification dans l'annotation, car un ORF n'est pas nécessairement traduit.
Ces résultats sont des mesures réelles sur une séquence publique, mais ils ne constituent pas une annotation. Pour aller plus loin, on croiserait ces coordonnées avec un fichier GTF/GFF, on vérifierait la présence d'un ribosome binding site, et on comparerait avec les protéines annotées. La leçon importante est méthodologique : un ORF est une hypothèse computationnelle, pas une preuve d'expression.
Erreurs fréquentes
Quiz
Exercices
Énoncé
Écrire deux fonctions Python : reverse_complement(seq) qui renvoie le complément inverse d'une séquence d'ADN, et gc_content(seq) qui renvoie le pourcentage de G et C. Les deux fonctions doivent accepter les minuscules, ignorer les caractères non ACGT en les conservant comme N pour le complément, et renvoyer 0.0 pour une séquence vide plutôt que de provoquer une division par zéro.
Comment vérifier votre travail
Les tests se trouvent dans exercises/module-1/1.1-representations-dogme-central/test_1_1.py. Depuis la racine du dépôt :
python -m pytest exercises/module-1/1.1-representations-dogme-central -qCorrigé verrouillé
Le corrigé est chargé uniquement après confirmation. Il n'est pas présent dans la page avant cette action.
Énoncé
Écrire find_orfs(seq, min_aa=30) qui renvoie la liste des ORFs des six cadres de lecture. Chaque ORF est un dictionnaire avec les clés strand ("+" ou "-"), frame (1 à 3), start et end (coordonnées 1-based sur la séquence d'entrée, brin compris), length_aa et protein. La fonction doit ignorer les codons incomplets et les ORFs plus courts que min_aa. Elle doit normaliser la casse et traiter les caractères ambigus comme des codons non traduisibles.
Comment vérifier votre travail
Les tests se trouvent dans exercises/module-1/1.1-representations-dogme-central/test_1_1.py. Depuis la racine du dépôt :
python -m pytest exercises/module-1/1.1-representations-dogme-central -qCorrigé verrouillé
Le corrigé est chargé uniquement après confirmation. Il n'est pas présent dans la page avant cette action.
Énoncé
Mini-projet : rapport d'une séquence. Implémenter sequence_report(fasta_text) qui accepte le contenu texte d'un fichier FASTA contenant un ou plusieurs enregistrements, nettoie les lignes, calcule pour chaque enregistrement l'identifiant, la longueur, le GC, le nombre de bases ambiguës et les ORFs d'au moins 50 acides aminés, puis renvoie un dictionnaire structuré. Le rapport doit signaler explicitement les enregistrements vides et les séquences dont la longueur n'est pas multiple de trois. Un test de non-régression vérifie que deux appels sur les mêmes données produisent exactement le même résultat.
Comment vérifier votre travail
Les tests se trouvent dans exercises/module-1/1.1-representations-dogme-central/projet/test_projet_1_1.py. Depuis la racine du dépôt :
python -m pytest exercises/module-1/1.1-representations-dogme-central/projet -qCorrigé verrouillé
Le corrigé est chargé uniquement après confirmation. Il n'est pas présent dans la page avant cette action.
Résumé
- Une séquence est une chaîne sur un alphabet fini ; les alphabets étendus encodent l'ambiguïté.
- L'orientation 5'→3' et le complément inverse sont indispensables pour comparer des brins.
- Le contenu en GC se calcule en et ne résume pas à lui seul la biologie d'une région.
- Une séquence linéaire possède six cadres de lecture ; la définition d'un ORF doit être explicitée.
- Un ORF n'est pas une preuve de gène ni d'expression.
- Les coordonnées 1-based des formats biologiques ne sont pas les indices 0-based de Python.
- La version d'une accession (par exemple NC_000913.3) fait partie du résultat.
- Un petit script vérifié vaut mieux qu'un long pipeline non testé.
Références
- Alberts, B. et al. (2014). Molecular Biology of the Cell, 6e édition. Garland Science.
- Watson, J. D. et al. (2014). Molecular Biology of the Gene, 7e édition. Pearson.
- Cock, P. J. A. et al. (2009). Biopython: freely available Python tools for computational molecular biology and bioinformatics. Bioinformatics, 25(11), 1422–1423.
- NCBI. Genetic Codes et E-utilities. Documentation officielle : https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi et https://www.ncbi.nlm.nih.gov/books/NBK25501/
- NCBI RefSeq. Escherichia coli str. K-12 substr. MG1655, complete genome, accession NC_000913.3. https://www.ncbi.nlm.nih.gov/nuccore/NC_000913.3
- Documentation Python. str.translate, str.maketrans, collections.Counter. https://docs.python.org/3/library/stdtypes.html