Cómo encontrar un marco de lectura abierto en Python

Estoy usando Python y una expresión regular para encontrar un ORF (marco de lectura abierto).

Encuentre una ATGC una cadena que se compone SOLO de las letras ATGC (sin espacios ni líneas nuevas) que:

Comienza con ATG , termina con TAG o TAA o TGA y debe considerar la secuencia del primer carácter, luego el segundo y luego el tercero:

 Seq= "CCTCAGCGAGGACAGCAAGGGACTAGCCAGGAGGGAGAACAGAAACTCCAGAACATCTTGGAAATAGCTCCCAGAAAAGC AAGCAGCCAACCAGGCAGGTTCTGTCCCTTTCACTCACTGGCCCAAGGCGCCACATCTCCCTCCAGAAAAGACACCATGA GCACAGAAAGCATGATCCGCGACGTGGAACTGGCAGAAGAGGCACTCCCCCAAAAGATGGGGGGCTTCCAGAACTCCAGG CGGTGCCTATGTCTCAGCCTCTTCTCATTCCTGCTTGTGGCAGGGGCCACCACGCTCTTCTGTCTACTGAACTTCGGGGT GATCGGTCCCCAAAGGGATGAGAAGTTCCCAAATGGCCTCCCTCTCATCAGTTCTATGGCCCAGACCCTCACACTCAGAT CATCTTCTCAAAATTCGAGTGACAAGCCTGTAGCCCACGTCGTAGCAAACCACCAAGTGGAGGAGCAGCTGGAGTGGCTG AGCCAGCGCGCCAACGCCCTCCTGGCCAACGGCATGGATCTCAAAGACAACCAACTAGTGGTGCCAGCCGATGGGTTGTA CCTTGTCTACTCCCAGGTTCTCTTCAAGGGACAAGGCTGCCCCGACTACGTGCTCCTCACCCACACCGTCAGCCGATTTG CTATCTCATACCAGGAGAAAGTCAACCTCCTCTCTGCCGTCAAGAGCCCCTGCCCCAAGGACACCCCTGAGGGGGCTGAG CTCAAACCCTGGTATGAGCCCATATACCTGGGAGGAGTCTTCCAGCTGGAGAAGGGGGACCAACTCAGCGCTGAGGTCAA TCTGCCCAAGTACTTAGACTTTGCGGAGTCCGGGCAGGTCTACTTTGGAGTCATTGCTCTGTGAAGGGAATGGGTGTTCA TCCATTCTCTACCCAGCCCCCACTCTGACCCCTTTACTCTGACCCCTTTATTGTCTACTCCTCAGAGCCCCCAGTCTGTA TCCTTCTAACTTAGAAAGGGGATTATGGCTCAGGGTCCAACTCTGTGCTCAGAGCTTTCAACAACTACTCAGAAACACAA GATGCTGGGACAGTGACCTGGACTGTGGGCCTCTCATGCACCACCATCAAGGACTCAAATGGGCTTTCCGAATTCACTGG AGCCTCGAATGTCCATTCCTGAGTTCTGCAAAGGGAGAGTGGTCAGGTTGCCTCTGTCTCAGAATGAGGCTGGATAAGAT CTCAGGCCTTCCTACCTTCAGACCTTTCCAGATTCTTCCCTGAGGTGCAATGCACAGCCTTCCTCACAGAGCCAGCCCCC CTCTATTTATATTTGCACTTATTATTTATTATTTATTTATTATTTATTTATTTGCTTATGAATGTATTTATTTGGAAGGC CGGGGTGTCCTGGAGGACCCAGTGTGGGAAGCTGTCTTCAGACAGACATGTTTTCTGTGAAAACGGAGCTGAGCTGTCCC CACCTGGCCTCTCTACCTTGTTGCCTCCTCTTTTGCTTATGTTTAAAACAAAATATTTATCTAACCCAATTGTCTTAATA ACGCTGATTTGGTGACCAGGCTGTCGCTACATCACTGAACCTCTGCTCCCCACGGGAGCCGTGACTGTAATCGCCCTACG GGTCATTGAGAGAAATAA" 

Lo que he intentado:

 # finding the stop codon here def stop_codon(seq_0): for i in range(0,len(seq_0),3): if (seq_0[i:i+3]== "TAA" and i%3==0) or (seq_0[i:i+3]== "TAG" and i%3==0) or (seq_0[i:i+3]== "TGA" and i%3==0) : a =i+3 break else: a = None # finding the start codon here startcodon_find =[m.start() for m in re.finditer('ATG', seq_0)] 

¿Cómo puedo encontrar una manera de verificar el codón de inicio y luego encontrar el primer codón de parada? A continuación, busque el siguiente codón de inicio y el siguiente codón de parada.

Deseo ejecutar esto por tres cuadros. Como se mencionó anteriormente, los tres cuadros estarían considerando el primer, segundo y tercer carácter de la secuencia como el inicio.

Además, la secuencia debe dividirse en partes pequeñas de 3. Para eso debería haber algo como esto:

 ATG TTT AAA ACA AAA TAT TTA TCT AAC CCA ATT GTC TTA ATA ACG CTG ATT TGA 

Cualquier ayuda será apreciada.

Mi respuesta final:

 def orf_find(st0): seq_0="" for i in range(0,len(st0),3): if len(st0[i:i+3])==3: seq_0 = seq_0 + st0[i:i+3]+ " " ms_1 =[m.start() for m in re.finditer('ATG', seq_0)] ms_2 =[m.start() for m in re.finditer('(TAA)|(TAG)|(TGA)', seq_0)] def get_next(arr,value): for a in arr: if a > value: return a return -1 codons = [] start_codon=ms_1[0] while (True): stop_codon = get_next(ms_2,start_codon) if stop_codon == -1: break codons.append((start_codon,stop_codon)) start_codon = get_next(ms_1,stop_codon) if start_codon==-1: break max_val = 0 selected_tupple = () for i in codons: k=i[1]-i[0] if k > max_val: max_val = k selected_tupple = i print "selected tupple is ", selected_tupple final_seq=seq_0[selected_tupple[0]:selected_tupple[1]+3] print final_seq print "The longest orf length is " + str(max_val) output_file = open('Longorf.txt','w') output_file.write(str(orf_find(st0))) output_file.close() 

La función de escritura anterior no me ayuda a escribir el contenido en un archivo de texto. Todo lo que recibo es NINGUNO … ¿Por qué este error … ¿Alguien puede ayudar?

Como lo has etiquetado como Biopython, supongo que conoces Biopython. ¿Ya revisaste el docu? http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc231 podría ayudar.

Ajusté un poco el código del enlace anterior para trabajar en tu secuencia:

 from Bio.Seq import Seq seq = Seq("") table = 1 min_pro_len = 100 for strand, nuc in [(+1, seq), (-1, seq.reverse_complement())]: for frame in range(3): for pro in nuc[frame:].translate(table).split("*"): if len(pro) >= min_pro_len: print "%s...%s - length %i, strand %i, frame %i" % (pro[:30], pro[-3:], len(pro), strand, frame) 

El ORF también está traducido. Puedes elegir una tabla de traducción diferente. Echa un vistazo a http://biopython.org/DIST/docs/tutorial/Tutorial.html#sec:translation

EDITAR: Explicación del código:

Justo en la parte superior, creo un objeto de secuencia a partir de tu cadena. Observe la seq = Seq("ACGT") . Los dos bucles for crean 6 cuadros diferentes. El bucle for interno traduce cada cuadro según la tabla de traducción elegida y devuelve una cadena de aminoácidos donde cada codón de parada se codifica como * . La función split divide esta cadena eliminando estos marcadores de posición, lo que da como resultado una lista de posibles secuencias de proteínas. Al establecer min_pro_len, puede definir la longitud mínima de la cadena de aminoácidos para que se detecte una proteína. 1 es la tabla estándar. Visite http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi#SG1 Aquí puede ver que el codón de inicio es AUG (es igual a ATG ) y los codones finales (* en la secuencia de nucleótidos) son TAA , TAG y TGA , como tú querías. También puede utilizar una tabla de traducción diferente.

Cuando agregues

 print nuc[frame:].translate(table) 

Justo dentro del segundo bucle for obtienes algo como:

 PQRGQQGTSQEGEQKLQNILEIAPRKASSQPGRFCPFHSLAQGATSPSRKDTMSTESMIRDVELAEEALPQKMGGFQNSRRCLCLSLFSFLLVAGATTLFCLLNFGVIGPQRDEKFPNGLPLISSMAQTLTLRSSSQNSSDKPVAHVVANHQVEEQLEWLSQRANALLANGMDLKDNQLVVPADGLYLVYSQVLFKGQGCPDYVLLTHTVSRFAISYQEKVNLLSAVKSPCPKDTPEGAELKPWYEPIYLGGVFQLEKGDQLSAEVNLPKYLDFAESGQVYFGVIAL*REWVFIHSLPSPHSDPFTLTPLLSTPQSPQSVSF*LRKGIMAQGPTLCSELSTTTQKHKMLGQ*PGLWASHAPPSRTQMGFPNSLEPRMSIPEFCKGRVVRLPLSQNEAG*DLRPSYLQTFPDSSLRCNAQPSSQSQPPSIYICTYYLLFIYYLFICL*MYLFGRPGCPGGPSVGSCLQTDMFSVKTELSCPHLASLPCCLLFCLCLKQNIYLTQLS**R*FGDQAVATSLNLCSPREP*L*SPYGSLREI 

(note que los asteriscos están en las posiciones del codón de parada)

EDITAR: Responde a tu segunda pregunta:

Debe devolver una cadena que desea escribir en un archivo. Cree una cadena de salida y devuélvala al final de la función:

 output = "selected tupple is " + str(selected_tupple) + "\n" output += final_seq + "\n" output += "The longest orf length is " + str(max_val) + "\n" return output 

Si quieres codificarlo a mano:

 import re from string import maketrans pattern = re.compile(r'(?=(ATG(?:...)*?)(?=TAG|TGA|TAA))') def revcomp(dna_seq): return dna_seq[::-1].translate(maketrans("ATGC","TACG")) def orfs(dna): return set(pattern.findall(dna) + pattern.findall(revcomp(dna))) print orfs(Seq)