Localiser un motif dans une séquence ADN

a marqué ce sujet comme résolu.

Salut les amis !

Alors voilà, je suis en deuxième année à la fac de bio, et voila, on commence à étudier la programmation via Python. Mon prof nous a donné un devoir noté pour demain, et avec des amis on bloque totalement sur 2 question.

Si l'un d'entre vous peut me sauver la vie en me donnant le code, ou même un indisce, ou même une explication de ce qu'il faut faire, ça me serait grandement utile, parce la, nous bloquons complètement dessus.

Bref, voila les 2 programmes à réaliser :

1) localiserMotifXXXX() : une fonction qui localise un motif dans une séquence d'ADN.

  • a. localiserMotifSimple() : recherche d'un motif simple : AATTGC, dans la séquence
  • b. localiserMotifRE() : recherche d'un motif plus complexe qui est défini par une "expression régulière" (le module re de python) : [AT][GC]..AT* (A ou T, puis G ou C, 2 caractère quelconque, puis un A , puis 0 ou plusieurs T) les deux fonctions prennent comme argument une séquence d'ADN, un motif, la position de début de la recherche.

2)

signature() : une fonction qui dénombre tous les motifs de taille "m" (m pouvant prendre des valeur de 1 à 10 et erreur si au-delà). L'ensemble de ces motifs représentent la signature génomique d'une séquence d'ADN génomique. Ces motifs peuvent être visualisés graphiquement. On observe des différences significatives entre espèces.

Une figure est donnée avec de deuxieme exercice :

https://scontent-lhr3-1.xx.fbcdn.net/v/t34.0-12/13231077_1031858580195960_19937661_n.png?oh=af76fea46ce0303742582ffa680c86e9&oe=5736787C

Si qqn peut éclairer ma lanterne, un tout petit peut, ou énormement, ça me sauverais la vie. Merci

Edit Arius : pour titre plus explicite, mise en forme.

+0 -0

Salut,

Personne ne te donnera de codes tout fait ici, ça ne t'aidera pas à progresser. Montre déjà ce que vous avez fait et les membres pourront partir de cette base pour te donner des éléments de réponse.

Tu sais que tu dois trouver 1) a) un motif simple AATTGC dans la séquence et b) en utilisant les expressions régulières, A ou T, puis G ou C, puis 2 caractères quelconques puis 0 ou plusieurs T.

+6 -0

Bonjour, pour la question

1a) et 1b), nous venons de réussir à les faire.

sequence = input("Entrez la séquence :\n") motif = input("Quel motif voulez-vous rechercher ?\n")

sequence_split = sequence.split(motif)

for i in range(len(sequence_split)): try: if i == len(sequence_split) - 1: print(sequence_split[i]) else: print(sequence_split[i] + "[" + motif + "]", end="") except IndexError: break

et

b)

import re sequence = input("Entrez la séquence :\n")

[A ou T] suivi de [G ou C] suivi de 2 caractères quelconque parmis [ATCG] puis d'un nombre optionel de T:

re.sub(r"([AT][GC][ATGC]{2}T*)",r"[\1]",sequence)

Par contre, nous n'arrivons même pas à comprendre la question 1.8… Est-ce que vous y comprenez quelque chose ?

+0 -1

Vous avez trouvé, vraiment ?

J'ai pourtant été assez catégorique dans mon premier post : "Personne ne te donnera de codes tout fait ici, ça ne t'aidera pas à progresser". Le but du jeu, c'est de vous permettre de comprendre ce qui est demandé, de décortiquer l'énoncé et d'appliquer ce que vous avez appris. En l'occurence, j'ai donné un lien vous menant sur la bonne piste. Reprendre le code des autres, ça ne vous aidera pas. D'autant que vous pouvez vous faire griller par votre professeur et sincèrement, vous méritez la bulle.

Bref, poster partout et puis venir ici prétendre que vous avez trouvé c'est non seulement malhonnête mais ça ne vous aidera pas à vous préparer pour les exercices bien plus complexes qui suivront à terme ou à réussir votre examen…

+7 -1

J'avoue , désolé , nous sommes quelque peut désespéré ^^.

Sans vouloir être méchant, ça sens l'étudiant qui n'a rien fait du semestre et qui se réveille la veille au soir en panique. Un étudiant un minimum sérieux ne viendrait pas demander de l'aide la veille au soir en n'ayant pas la moindre ligne de code à proposer pour attester de sa tentative de réflexion. Et il ne ferait pas semblant d'avoir trouvé les réponses lui même si ce n'est pas le cas.

nous devenons fou.

Peut être qu'un zéro bien mérité vous aidera à avoir l'esprit plus clair la prochaine fois. ;)

+2 -4

Pas d'inquiétude, les gars. Sur les solutions pompées sur le site orange, aucune des réponses ne respecte l'énoncé, et celle donnée pour le second exo est tellement inefficace que le prof arrêtera sûrement le programme en voyant qu'elle n'aura toujours pas donné de résultat après une ou deux heures à mouliner sur un exemple réel.

Je proposerai une correction demain soir ou la semaine prochaine.

+7 -0

Yep, j'ai remarqué, c'est bien pour cela que j'essaie de créer un déclic en insistant sur la compréhension de l'énoncé (le comprendre, c'est déjà 50% du travail). Mais bref, repartons sur de bonnes bases.

+0 -0

Alors d'abord, localiser un motif dans une chaîne de caractères, ça se fait en utilisant bêtement les méthodes de la classe str. Il y en a deux qui font ça (find et index), celle que tu cherches, ironiquement, est find. Celle-ci retourne la position de la première occurrence du motif (optionnellement à partir d'une position de début donnée).

1
2
def find_pattern(seq, pattern, start=0): 
    return seq.find(pattern, start)

Cherchez pas à être plus malins que Python, l'algo utilisé en interne est basé sur la méthode de Boyer-Moore, vous ne ferez pas plus rapide que ça.

Pour les expressions régulières, le module re vous donne une fonction search qui fait exactement ça.

La difficulté, c'est qu'elle ne fait la recherche que sur des chaînes complètes. Pour chercher à partir d'une position donnée, il faut isoler la sous-chaîne de caractères (de la position voulue jusqu'à la fin de la séquence) qui vous intéresse en récupérant une slice avec seq[start:].

La fonction search vous retourne None si ce pattern n'est pas dans la chaîne, ou bien un objet match. Lisez la doc pour conprendre comment on s'en sert.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from re import search

def find_pattern_re(seq, pattern, start=0): 
    if 0 < start < len(seq):
        seq = seq[start:]  
    match = search(pattern, seq)
    if not match: 
        return -1
    else: 
        return match.start()

Enfin la dernière question est la cerise sur le gâteau. On attend probablement de vous que vous retourniez un dictionnaire qui à chaque motif de taille m possible associe le nombre de fois qu'il apparait dans la chaîne.

Il faut commencer par isoler ces motifs, ce qui peut se faire en bouclant sur toutes les sous-chaînes de taille m de la séquence :

1
2
for i, j in enumerate(range(m, len(seq)+1)): 
    print(seq[i:j])

Maintenant pour les compter dans un dictionnaire, la classe collections.Counter est tout indiquée (lisez la doc…):

1
2
3
4
5
6
from collections import Counter

def signature(seq, m=10):
    return Counter(
        seq[i:j] for i, j in enumerate(range(m, len(seq)+1))
    )

Voilà. Il ne vous reste plus qu'à étudier ces exemples, sinon ce post ne vous servira jamais à rien.

+5 -0

La difficulté, c'est qu'elle ne fait la recherche que sur des chaînes complètes. Pour chercher à partir d'une position donnée, il faut isoler la sous-chaîne de caractères (de la position voulue jusqu'à la fin de la séquence) qui vous intéresse en récupérant une slice avec seq[start:].

nohar

C'est vrai pour la méthode search du module re, mais ce n'est pas le cas pour la méthode search d'un objet de type regex, ce qui peut donc être plus simple ici.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte