Archive

Source python pour recherche codons stop et start

padrian

Bonjour, j’ai repris les sources de vos compléments. Dans ceux-ci, lorsque la distance entre l’index de départ et le codon trouvé n’est pas multiple de 3, vous incrémentez l’index de recherche de 3. Il me semble qu’ainsi vous maintenez le décalage indésirable. Dans mon code, je n’incrémente que de 1 et donc je pense qu’ainsi je trouve les codons valides pour la phase demandée. Qu’en pensez vous ? :

import re
#variables globales
global dna
dna=“CGGAATATGCGAAGGTTATGGAATTAAAGGGGGAATATGTGGGGAAGAGCCCAGGTAATATGAAAA”
#definition du codon start
global startCodon
startCodon =“ATG”
global stopCodon
stopCodon=re.compile(“TAA|TAG|TGA”)
#recherche d’un codon start dans la chaine dna a partir de la position start
def nextStart(dna,start):
#initialisation index recherche
Idx=start
#boucle infinie
while True:
#index = 1iere position codon start trouve
Idx=dna.find(startCodon,Idx)
#si non trouve dans chaine
if Idx == -1:
return None
#si ecart entre debut et position trouvee non multiple de 3 on se deplace de 1 bases
if(Idx-start)%3 != 0:
Idx+=1
continue
#si deplacement multiple de 3 on est OK
return Idx

def nextStop(dna,start):
#initialisation index recherche
Idx=start
#boucle infinie
while True:
#recherche codon stop depuis position depart
match=stopCodon.search(dna,Idx)
#si non trouve dans chaine
if match == None:
return None
#index = position depart codon sstop trouve
Idx =match.start()
#si distance depart codon trouve pas multiple de 3 on incremente index recherche
if (Idx-start)%3 != 0:
Idx+=1
continue
return Idx
return None

#recherche des codons start pour chaque phase
def scanStart():
for phase in 0,1,2:
print("Phase: ",str(phase))
next=phase
while next != None:
next=nextStart(dna,next)
if next != None:
print("START trouve a l’indice: ",next,dna[next:next+3])
next+=3

#recherche des codons stop pour chaque phase
def scanStop():
for phase in 0,1,2:
print("Phase: ",str(phase))
next=phase
while next != None:
next=nextStop(dna,next)
if next != None:
print("STOP trouve a l’indice: ",next,dna[next:next+3])
next+=3

scanStart()
scanStop()

IsabellePoirier

Bonjour padrian,

Le but de cette incrémentation par 3 n’est pas de forcer find à chercher un codon start sur la même phase que celui précédemment trouvé, car find va chercher la première occurrence de la chaîne, quel que soit son indice, mais juste d’optimiser un peu cette recherche.
Si la chaîne “ATG” a été trouvée à l’indice index, on ne pourra pas la trouver à l’indice index + 1, ni à l’indice index + 2, donc autant redémarrer la rechercher à partir de index + 3.
Mais peut-être qu’on pourrait effectivement la faire démarrer à index + 4.

padrian

Merci pour cette précision, cela m’a permis de relire plus attentivement l’algo.

Larmenius

Bonjour,

je profile du thread pour élargir la question.

Vu qu’il va falloir vérifier les 3 phases sur les 2 brins, n’est-il pas plus efficace justement de chercher les 2 stops sans tenir compte de la phase, vérifier que les positions sont espacées d’un multiple de 3, puis le start potentiel et vérifier là aussi que les positions du start et du 2eme stop sont bien espacées d’un multiple de 3 ?
Ce cette manière on ne parcourt la chaîne qu’une seule fois, sur des chaînes longues cela peux devenir sensible. Non ?