Comment trouver un motif dans une séquence ?
Un motif est un court morceau de séquence que l’on cherche, comme un mot dans un texte. Trouver les motifs qui reviennent souvent aide à repérer ce qui se répète dans une séquence.
Vous allez découper une séquence en morceaux de longueur k, appelés k-mers, et les compter avec un dictionnaire.
À la fin de cette leçon
Remarque
Je peux compter les k-mers d’une séquence pour trouver le motif le plus fréquent.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Motif | un court morceau de séquence que l’on cherche | |
| k-mer | un morceau de k bases à la suite | ATG |
| Fenêtre | la zone de k bases que l’on lit à une position | |
| Chevauchement | deux morceaux qui partagent des bases | |
| Fréquence | le nombre de fois qu’un motif apparaît |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un k-mer est un morceau de k bases
Un k-mer est un morceau de k bases à la suite. Pour k égal à 3, on parle de 3-mers. On les lit avec une fenêtre de 3 bases que l’on décale d’une base à chaque fois.
En Python, sequence[debut:debut + 3] donne la fenêtre qui commence à debut.
Exemple travaillé : les 3-mers de ATGATGCATGAT
| Début | 3-mer | Début | 3-mer |
|---|---|---|---|
| 0 | ATG | 5 | GCA |
| 1 | TGA | 6 | CAT |
| 2 | GAT | 7 | ATG |
| 3 | ATG | 8 | TGA |
| 4 | TGC | 9 | GAT |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un dictionnaire compte les k-mers
On parcourt toutes les positions de départ. Pour chaque k-mer lu, on ajoute 1 à son compteur dans un dictionnaire. S’il n’y est pas encore, on le crée avec le compte 1.
À la fin, le k-mer le plus fréquent est celui qui a le plus grand compteur.
Compter les k-mers avec un dictionnaire
sequence = "ATGATGCATGAT"
k = 3
comptes = {}
# Il y a len(sequence) - k + 1 positions de départ possibles.
for debut in range(len(sequence) - k + 1):
motif = sequence[debut:debut + k]
if motif in comptes:
comptes[motif] = comptes[motif] + 1
else:
comptes[motif] = 1
for motif in comptes:
print(motif, comptes[motif])
# Mettez k = 2 puis relancez.
Exemple travaillé : les comptes des 3-mers
| 3-mer | Compte | Positions de début |
|---|---|---|
| ATG | 3 | 0, 3 et 7 |
| TGA | 2 | 1 et 8 |
| GAT | 2 | 2 et 9 |
| TGC, GCA, CAT | 1 chacun | 4, 5 et 6 |
| Total | 10 | 3 + 2 + 2 + 1 + 1 + 1 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup croient que count compte tous les motifs. La méthode count ne compte que ceux qui ne se chevauchent pas : dans AAAAC, elle voit 2 fois AA, alors qu’il y en a 3. Pour compter avec chevauchement, utilisez une fenêtre.
Compter avec et sans chevauchement
docker exec jupyter python3 -c "s='AAAAC'; print(s.count('AA'), sum(1 for i in range(len(s)-1) if s[i:i+2]=='AA'))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lister les 3-mers différents
docker exec jupyter python3 -c "s='ATGATGCATGAT'; print(sorted(set(s[i:i+3] for i in range(len(s)-2))))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Dans votre carnet, comptez les 2-mers puis les 4-mers de ATGATGCATGAT. Notez le motif le plus fréquent pour chaque k.
Dites ce qui arrive au nombre de k-mers différents quand k grandit.