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)