• Publicidad

Encontrar codón de inicio y trabajar a partir de él

Perl aplicado a la bioinformática

Encontrar codón de inicio y trabajar a partir de él

Notapor JJShadow » 2013-02-21 18:35 @815

Hola a todos. Estoy empezando en el mundillo éste del Perl, y haciendo uno de mis primeros programas me ha surgido una duda.

Estoy haciendo un programa bastante básico: a partir de un archivo FASTA, tengo que abrirlo y a partir de él hacer que aparezcan por pantalla las siguientes informaciones

- Nombre del organismo
- AC del producto génico
- Longitud de la cadena de nucleótidos
- Secuencia Proteica
- Longitud de la cadena de aminoácidos

Los 3 primeros puntos ya los he conseguido, pero a partir del 4 me quedo trabado. El archivo FASTA es el siguiente:

Sintáxis: (fasta.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>gi|624185|gb|U18423.1|OS=Homo sapiens|Human spinal muscular atrophy gene product mRNA, complete cds
CGGGGCCCCACGCTGCGCATCCGCGGGTTTGCTATGGCGATGAGCAGCGGCGGCAGTGGTGGCGGCGTCCCGGAGCAGGAGGATTCCGTGCTGTTCCGGCGCGGCACAGGCCAGAGCGATGATTCTGACATTTGGGATGATACAGCACTGATAAAAGCATATGATAAAGCTGTGGCTTCATTTAAGCATGCTCTAAAGAATGGTGACATTTGTGAAACTTCGGGTAAACCAAAAACCACACCTAAAAGAAAACCTGCTAAGAAGAATAAAAGCCAAAAGAAGAATACTGCAGCTTCCTTACAACAGTGGAAAGTTGGGGACAAATGTTCTGCCATTTGGTCAGAAGACGGTTGCATTTACCCAGCTACCATTGCTTCAATTGATTTTAAGAGAGAAACCTGTGTTGTGGTTTACACTGGATATGGAAATAGAGAGGAGCAAAATCTGTCCGATCTACTTTCCCCAATCTGTGAAGTAGCTAATAATATAGAACAGAATGCTCAAGAGAATGAAAATGAAAGCCAAGTTTCAACAGATGAAAGTGAGAACTCCAGGTCTCCTGGAAATAAATCAGATAACATCAAGCCCAAATCTGCTCCATGGAACTCTTTTCTCCCTCCACCACCCCCCATGCCAGGGCCAAGACTGGGACCAGGAAAGCCAGGTCTAAAATTCAATGGCCCACCACCGCCACCGCCACCACCACCACCCCACTTACTATCATGCTGGCTGCCTCCATTTCCTTCTGGACCACCAATAATTCCCCCACCACCTCCCATATGTCCAGATTCTCTTGATGATGCTGATGCTTTGGGAAGTATGTTAATTTCATGGTACATGAGTGGCTATCATACTGGCTATTATATGGGTTTCAGACAAAATCAAAAAGAAGGAAGGTGCTCACATTCCTTAAATTAAGGAGAAATGCTGGCATAGAGCAGCACTAAATGACACCACTAAAGAAACGATCAGACAGATCTGGAATGTGAAGCGTTATAGAAGATAACTGGCCTCATTTCTTCAAAATATCAAGTGTTGGGAAAGAAAAAAGGAAGTGGAATGGGTAACTCTTCTTGATTAAAAGTTATGTAATAACCAAATGCAATGTGAAATATTTTACTGGACTCTTTTGAAAAACCATCTGTAAAAGACTGGGGTGGGGGTGGGAGGCCAGCACGGTGGTGAGGCAGTTGAGAAAATTTGAATGTGGATTAGATTTTGAATGATATTGGATAATTATTGGTAATTTTATGGCCTGTGAGAAGGGTGTTGTAGTTTATAAAAGACTGTCTTAATTTGCATACTTAAGCATTTAGGAATGAAGTGTTAGAGTGTCTTAAAATGTTTCAAATGGTTTAACAAAATGTATGTGAGGCGTATGTGGCAAAATGTTACAGAATCTAACTGGTGGACATGGCTGTTCATTGTACTGTTTTTTTCTATCTTCTATATGTTTAAAAGTATATAATAAAAATATTTAATTTTTTTTTA
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En el paso 4 me indica que muestre por pantalla la secuencia de dicha proteína. Mi problema viene a la hora de que no sé cómo hacer para que el programa sólo empiece a procesarme los codones a partir del primer codón ATG, que no está al principio de la secuencia génica, sino algo después: es decir, necesito alguna función que me permita "desechar" todo lo que va antes del codón de inicio, y empezar a traducir a partir de ahí (y lo mismo para el primer codón de parada, pero desechando todo lo que venga después).

¿Alguien me podría iluminar sobre cómo hacer esto?

¡Muchísimas gracias!
JJShadow
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2013-02-21 18:26 @809

Publicidad

Re: Encontrar codón de inicio y trabajar a partir de él

Notapor explorer » 2013-02-21 21:40 @945

Bienvenido a los foros de Perl en Español, JJShadow.

Puedes usar la función index() para buscar una cadena dentro de otra.

Por ejemplo:

my $posicion = index $secuencia, 'ATG';

index() devuelve la posición (comenzando en 0) del carácter que comienza con la subcadena encontrada dentro la $secuencia mayor. Si no lo encuentra, devuelve -1.

Más información, en perldoc -f index.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Encontrar codón de inicio y trabajar a partir de él

Notapor JJShadow » 2013-02-24 14:44 @655

Muchísimas gracias, explorer. Gracias a la función que me has dicho ya he conseguido que me traduzca a partir del 'ATG' y mi programa funciona a las mil maravillas.

Ahora me ha surgido otra duda, a ver si me puedes iluminar: en un principio, el código que he hecho lo he escrito para trabajar con archivos FASTA en los que la secuencia de nucleótidos vengan en una línea, no en varias líneas diferentes. Sin embargo, he estado pensando a ver qué modificación podría hacerle para que me haga lo mismo pero para secuencias que vengan en varias líneas sucesivas.

Había pensado en sacar todas las líneas de nucleótidos en diferentes variables, luego unirlas todas y por último trabajar con esa unión como si fuese la secuencia normal de nucleótidos, aunque no sé si es demasiado para lo poco que sé de Perl por ahora.

Dejo por aquí el código que tengo ahora mismo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. print "Introduce el nombre de tu archivo FASTA que contiene la secuencia:\n";
  4. chomp (my $nomsec = <STDIN>);
  5.  
  6. print "Introduce el nombre de tu archivo de salida:\n";
  7. chomp (my $salida = <STDIN>);
  8.  
  9. open (file1, $nomsec) || die "\nNo se pudo abrir el archivo $nomsec\n";
  10. open (file2, ">$salida") || die "\nNo se pudo abrir el archivo $salida\n";
  11.  
  12. while (<file1>) {
  13.         chomp $_;
  14.         if ($_ =~ /^>/) {
  15.                 @info = split (/\|/, $_); #por qué hay que poner \|
  16.                 foreach my $info(@info){
  17.                         if($info =~ /^OS=/) {
  18.                                 print "\n$info\n";
  19.                                 print file2 "\n$info\n"; #preguntar por qué no funciona el \n
  20.                                 }
  21.                         }
  22.                 print "\nAC producto genico = $info[3]\n"; #preguntar como identifico AC
  23.                 print file2 "\nAC producto genico = $info[3]\n";
  24.         } else {
  25.                 $numeronuc = length ($_); #cuenta el numero de nucleótidos
  26.                 print "\nNumero de nucleotidos = $numeronuc\n";
  27.                 print file2 "\nNumero de nucleotidos = $numeronuc\n";
  28.                
  29.                 my $numeroaa = -1; #-1 ya que si no cuenta el del stop
  30.                 my $stop = 0;
  31.                 my $comienzo = index ($_, "ATG"); #mira en que posición está el primer ATG (cuenta desde 0)
  32.                
  33.                 print "\nEl primer ATG esta en la posicion $comienzo\n";
  34.                 print file2 "\nEl primer ATG esta en la posicion $comienzo\n";
  35.                 print "\nSecuencia proteica: \n\n";
  36.                 print file2 "\nSecuencia proteica: \n\n";
  37.        
  38.                 for ($comienzo; $stop != 1; $comienzo += 3){ #preguntar si para la condición puedo hacerlo con letras directamente
  39.                         my $codon = substr($_, $comienzo, 3); #recorre de tres en tres los nucleótidos
  40.                         if ($codon =~ /GC[ATGC]/){ #preguntar si en lugar de hacer todos los elsif uso un hash superlargo
  41.                                 print "A";
  42.                                 print file2 "A";
  43.                         } elsif ($codon =~ /CG[ATGC]|AG[AG]/) {
  44.                                 print "R";
  45.                                 print file2 "R";
  46.                         } elsif ($codon =~ /AA[TC]/) {
  47.                                 print "N";
  48.                                 print file2 "N";
  49.                         } elsif ($codon =~ /GA[TC]/) {
  50.                                 print "D";
  51.                                 print file2 "D";
  52.                         } elsif ($codon =~ /TG[TC]/) {
  53.                                 print "C";
  54.                                 print file2 "C";
  55.                         } elsif ($codon =~ /CA[AG]/) {
  56.                                 print "Q";
  57.                                 print file2 "Q";
  58.                         } elsif ($codon =~ /GA[AG]/) {
  59.                                 print "E";
  60.                                 print file2 "E";
  61.                         } elsif ($codon =~ /GG[ATGC]/) {
  62.                                 print "G";
  63.                                 print file2 "G";
  64.                         } elsif ($codon =~ /CA[TC]/) {
  65.                                 print "H";
  66.                                 print file2 "H";
  67.                         } elsif ($codon =~ /AT[TCA]/) {
  68.                                 print "I";
  69.                                 print file2 "I";
  70.                         } elsif ($codon =~ /TT[AG]|CT[ATGC]/) {
  71.                                 print "L";
  72.                                 print file2 "L";
  73.                         } elsif ($codon =~ /ATG/) {
  74.                                 print "M";
  75.                                 print file2 "M";
  76.                         } elsif ($codon =~ /AA[AG]/) {
  77.                                 print "K";
  78.                                 print file2 "K";
  79.                         } elsif ($codon =~ /TT[TC]/) {
  80.                                 print "F";
  81.                                 print file2 "F";
  82.                         } elsif ($codon =~ /CC[ATGC]/) {
  83.                                 print "P";
  84.                                 print file2 "P";
  85.                         } elsif ($codon =~ /TC[ATGC]|AG[TC]/) {
  86.                                 print "S";
  87.                                 print file2 "S";
  88.                         } elsif ($codon =~ /AC[ATGC]/) {
  89.                                 print "T";
  90.                                 print file2 "T";
  91.                         } elsif ($codon =~ /TGG/) {
  92.                                 print "W";
  93.                                 print file2 "W";
  94.                         } elsif ($codon =~ /TA[TC]/) {
  95.                                 print "Y";
  96.                                 print file2 "Y";
  97.                         } elsif ($codon =~ /GT[ATGC]/) {
  98.                                 print "V";
  99.                                 print file2 "V";
  100.                         } elsif ($codon =~ /TA[GA]|TGA/) {
  101.                                 $stop = 1;
  102.                         } else {
  103.                                 print "X";
  104.                                 print file2 "X";
  105.                         }
  106.                         $numeroaa++;
  107.                 }
  108.                 print "\n\nNumero de aminoacidos = $numeroaa\n";
  109.                 print file2 "\n\nNumero de aminoacidos = $numeroaa\n";
  110.         }
  111. }
  112.  
  113. print "\nNumero de nucleotidos = $numeronuc\n";
  114.  
  115. close file1;
  116. close file2;
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


¡Gracias de nuevo!
JJShadow
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2013-02-21 18:26 @809

Re: Encontrar codón de inicio y trabajar a partir de él

Notapor explorer » 2013-02-24 16:14 @718

La solución es ir leyendo por líneas, e ir acumulando la secuencia en una variable, y cuando se llega al final de la secuencia (o final del archivo), se procesa esa secuencia.

Mira las líneas 39 a 63 de mi mensaje en este hilo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron