• Publicidad

Más problemas con los ORF

Perl aplicado a la bioinformática

Más problemas con los ORF

Notapor beafm » 2010-12-31 07:23 @349

¡Hola!

Necesito ayuda urgente :cry: . Tengo que hacer el mismo trabajo que la otra perldesesperada, de hecho, creo que es compañera de clase :D

Tenemos que conseguir sacar de una cadena de ADN varios genes. Los genes tienen que empezar por ATG y acabar por TGA, TAA o TAG, y tenemos que indicar las posiciones en las que se encuentran el inicio y la terminación.

La subrutina que he hecho se encuentra al final del mensaje. La explicación de lo que hago o lo que quiero conseguir que haga está a continuación.

Yo he hecho una subrutina en la que paso la cadena de la que sacaremos los genes. También paso por referencia un array en el que recogeré las posiciones de inicio y otro array que paso por referencia que recogerá las posiciones de terminación. También paso la longitud mínima que tienen que tener los genes. En total, pasamos la cadena, dos array y la longitud mínima.

Dentro de la subrutina inicializo todas las variables que necesito. Después hago un for() que haga una serie de instrucciones desde la $posicion = 0, mientras la $posicion sea menor que la longitud de la cadena menos 2, y que después de hacer el bucle le sume a $posicion 3.

Las instrucciones del interior del bucle for() son:

Primero hago un substr() para extraer de la cadena las tres primeras letras a partir de $posicion.

Luego hago un if() con la condición de que las tres letras extraídas sean ATG. Dentro del if() hago un bucle do - until. Este bucle do-until me tiene que concatenar a una variable las letras de tres en tres hasta que un triplete de letras coincida con TGA, TAA o TAG. También dentro del bucle hago que me recoja la posición de las últimas tres letras que se concatenan en una variable (para tener así la posición de la terminación).

A continuación, fuera ya del bucle do-until pero dentro del if() hago otro if(). La condición es que si la longitud de la variable donde he ido concatenando las letras es mayor que la longitud mínima, quiero que en la primera línea de un array me recoja el gen, es decir, las letras concatenadas (se supone que en cada línea del array quiero recoger un gen). También dentro de este if() quiero que en el array de las posiciones de inicio me recoja la posición de inicio y en el array de las posiciones de terminación me recoja la posición de terminación. Después, para que todo funcione, borro la información recogida en la variable donde se concatenaban las letras, y sumo uno a otra variable que indicará la linea de los arrays en la que se deben imprimir los datos.

Si el if() es falso, hago un elsif() en el cual borro la variable con las letras concatenadas.

Salgo del primer if. Hago un else{} para que si las tres letras que extraje no coinciden con ATG, sume 3 a la posición del for() y continúe ejecutando hasta que se acabe la cadena.

La subrutina me tiene que devolver el array con los genes, ya que los otros arrays han sido modificados directamente en la subrutina.

Al mandarle imprimirme el array de los genes, me imprime lo que serían las tres líneas del array, con el mismo gen en las tres. He usado el depurador, pero no sé que es lo que está mal. Es como si hiciera tres veces lo mismo, sin avanzar posiciones en la cadena.

Creo que la subrutina que he hecho está bien planteada, pero no sé qué ocurre.

Por favor, ¡¡necesito ayuda!! De este trabajo depende que apruebe la asignatura, y aunque tenga todo bien planteado, si el resultado no es idéntico al que tiene que dar, todo el trabajo no cuenta para nada.

La subrutina es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my(@genes) = seleccionar_secuencias ($DNA, \@posinicio, \@posfinal, $longitudmin);
  2.  
  3. sub seleccionar_secuencias {
  4.  
  5.   my($secuencia, $posinicio, $posfinal, $longitudmin) = @_;
  6.  
  7.   my($posicion) = 0;
  8.   my($codoninicio);
  9.   my($codon);
  10.   my($gen);
  11.   my($i) = 0;
  12.   my(@genes);
  13.  
  14.   for ($posicion, $posicion < length $secuencia - 2, $posicion = $posicion + 3) {
  15.     $codoninicio = substr ($secuencia, $posicion, 3);
  16.  
  17.     if ($codoninicio =~ /ATG/i) {
  18.       my($pos2) = $posicion;
  19.       my($pos3) = $posicion;
  20.  
  21.       do{
  22.         $codon = substr ($secuencia, $pos2, 3);
  23.                    
  24.         $gen .= $codon;
  25.  
  26.         $final = $pos2 + 1;
  27.  
  28.         $pos2= $pos2 + 3;
  29.  
  30.       } until ($codon =~ /TA[AG]/i or $codon =~ /TGA/i);
  31.  
  32.       if ($longitudmin < length $gen) {
  33.  
  34.         $genes[$i] = $gen;
  35.        
  36.         $$posinicio[$i] = $pos3 + 1;
  37.        
  38.         $$posfinal[$i] = $final;
  39.  
  40.         $i = $i + 1;
  41.                
  42.         $gen = "";
  43.                
  44.       }
  45.        
  46.       elsif ($longitudmin > length $gen) {  
  47.         $gen = "";
  48.                        
  49.       }
  50.  
  51.       else {
  52.         next;
  53.       }
  54.     }
  55.   }
  56.  
  57.   return @genes;
  58. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



El resultado que me da es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGTGTTTATGA ATGTGTTTATGA ATGTGTTTATGA
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me debería dar:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGTGTTTATGA ATGCCAACAGTATTTCCAAAGAGCGTTGAATTAATAG
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La cadena que le paso es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
CACATGTGTTTATGAGTGTGAGTTTAATCAACATGAATTTTTGAGACTGACGGTGCACGAGATGTTGTCATAAGTTCCCATGCCAACAGTATTTCCAAAGAGCGTTGAATTATAGC
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



¡¡¡MUCHÍSIMAS GRACIAS!!!
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Publicidad

Re: Más problemas con los ORF

Notapor explorer » 2010-12-31 12:01 @542

Bienvenida a los foros de Perl en Español, beafm.

Por favor, no colorees tu código con marcas de color. Usa el resaltado de sintaxis Perl, que encontrarás en el botón Perl que hay justo encima de la caja de escritura de cada mensaje.

Esta es la lista de errores que hay en tu código:

* La línea 10, my($gen); debería estar justo cuando se la necesita, en la línea 20

* en la línea 14, has usado comas en lugar de punto y comas, para separar los tres componentes del for(). Además, a length() le faltan por poner los paréntesis. Sin ellos, la condición se evalúa a algo muy distinto a lo que esperas.

* las líneas 42 y de la 46 a la 53, incluidas, sobran :)

Nunca puede darte
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGTGTTTATGA ATGCCAACAGTATTTCCAAAGAGCGTTGAATTAATAG
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
porque, el segundo tramo, no es múltiplo de 3.
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: Más problemas con los ORF

Notapor beafm » 2010-12-31 13:35 @607

Vale, ya me salió. Muchísimas gracias por la ayuda.

Si me vuelvo a atascar, me volveré a pasar por aquí, seguro :D
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Más problemas con los ORF

Notapor beafm » 2010-12-31 13:53 @620

¡¡Y feliz año!! ¡je,je,je,je!
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Subrutinas de ORF

Notapor beafm » 2011-01-02 03:50 @201

Hola,

me ha surgido un nuevo problema. Sigo con la subrutina para sacar los genes. La modifiqué levemente para que también le pasará por valor la posición en la que quería que empezara a ejecutar los bucles. Cuando paso el valor 0, es decir, a partir de la primera posición, me lo ejecuta sin problemas. Pero es que tengo que hacer lo mismo a partir de la posición 2, con el valor 1, y a partir de la posición 3, con el valor 2.

He probado a cambiar el 0 que le paso por valor por el 1, pero cuando le doy a que lo ejecute, no me sale nada, en blanco, y no entiendo por qué, debería hacerlo igual.

Dejo la subrutina que estoy utilizando para que lo vean y a ver si alguien me puede decir qué hago mal y qué tengo que modificar.

¡Muchísimas gracias!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my(@posinicio);
  2. my(@posfinal);
  3. my($posinicio);
  4. my($posfinal);
  5.  
  6. my(@genes) = seleccionar_secuencias (0 ,$DNA, \@posinicio, \@posfinal, $longitudmin);
  7.  
  8. sub seleccionar_secuencias {
  9.  
  10.   my($posicion, $secuencia, $posinicio, $posfinal, $longitudmin) = @_;
  11.  
  12.    
  13.   my($codoninicio);
  14.   my($codon);
  15.   my($i) = 0;
  16.   my(@genes);
  17.  
  18.    
  19. for ($posicion; $posicion < (length $secuencia) - 2; $posicion = $posicion + 3) {
  20.    
  21.   $codoninicio = substr ($secuencia, $posicion, 3);
  22.  
  23.    if ($codoninicio =~ /ATG/i) {
  24.                
  25.         my($pos2) = $posicion;
  26.         my($pos3) = $posicion;
  27.         my($gen);
  28.  
  29.         do{
  30.     $codon = substr ($secuencia, $pos2, 3);
  31.                    
  32.             $gen .= $codon;
  33.  
  34.             $final = $pos2 + 1;
  35.  
  36.             $pos2 = $pos2 + 3;
  37.  
  38.   }until ($codon =~ /TA[AG]/i or $codon =~ /TGA/i);
  39.  
  40.  
  41.    if ($longitudmin < length ($gen)) { 
  42.  
  43.                                     $genes[$i] = $gen;
  44.        
  45.                                     $$posinicio[$i] = $pos3 + 1;
  46.        
  47.                                     $$posfinal[$i] = $final;
  48.  
  49.                                     $i = $i + 1;
  50.                           }
  51.                 }
  52.   }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Más problemas con los ORF

Notapor explorer » 2011-01-02 11:24 @517

Viendo el ejemplo de la secuencia de entrada que estás usando, es normal que no salga ningún resultado: no hay ningún codón en posiciones múltiplo de 3 más un desplazamiento de una base, que sea igual a ATG.
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: Más problemas con los ORF

Notapor beafm » 2011-01-02 14:42 @654

¿Pero la subrutina así está bien escrita?

La secuencia que escribí era un ejemplo, para ver si me funcionaba la subrutina; creé esa cadena de nucleótidos, pero en realidad lo que tiene que leer la subrutina es un fichero FASTA. En $DNA recojo todo el fichero en una sola línea sin espacios, y esa es la línea que tiene que leerme.

Entonces me extraña que no encuentre ATG, porque es una secuencia enorme.

No sé por qué no funciona, porque si fuera problema de capacidad ¿me saldría un mensaje que dijera que no hay memoria, no? Y es que no me sale nada, sale en blanco.
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Más problemas con los ORF

Notapor explorer » 2011-01-02 15:11 @674

Pues no, no está bien escrita. Estás devolviendo los valores de las posiciones inicial y final en los array correspondientes pues fueron pasados por referencia, pero el valor de @genes no es devuelto (que es la salida de la subrutina).

Te falta un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     return @genes;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y luego, el programa debe hacer algo con @genes.

Si fuese un problema de memoria, sí, Perl avisaría con ese error.
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: Más problemas con los ORF

Notapor beafm » 2011-01-02 15:29 @687

:oops: ¡¡¡¡Ay!!!! perdón, sí, que tengo puesto return @genes, me lo comí al pegarlo en el mensaje. Por eso, creo que lo tengo puesto todo, y sigue sin darme :cry:
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Más problemas con los ORF

Notapor explorer » 2011-01-02 16:40 @736

Pues a mí sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $DNA
  4.     = 'CACATGTATGTATGAGTGTGAGTTTAATCAACATGAATTTTTGAGACTGACGGTGCACGAGATGTTGTCATAAGTTCCCATGCCAACAGTATTTCCAAAGAGCGTTGAATTATAGC';
  5.  
  6. my ( @posinicio, @posfinal );
  7.  
  8. my $longitudmin = 9;
  9.  
  10. my ($posinicio);
  11. my ($posfinal);
  12.  
  13. my (@genes)
  14.     = seleccionar_secuencias( 2, $DNA, \@posinicio, \@posfinal,
  15.     $longitudmin );
  16.  
  17. print "@genes\n";
  18. print "@posinicio\n";
  19. print "@posfinal\n";
  20.  
  21.  
  22. sub seleccionar_secuencias {
  23.  
  24.     my ( $posicion, $secuencia, $posinicio_ref, $posfinal_ref, $longitudmin ) = @_;
  25.  
  26.     my ($codoninicio);
  27.     my ($codon);
  28.     my ($i) = 0;
  29.     my (@genes);
  30.  
  31.     for (
  32.         $posicion;
  33.         $posicion < ( length $secuencia ) - 2;
  34.         $posicion = $posicion + 3
  35.         )
  36.     {
  37.  
  38.         $codoninicio = substr( $secuencia, $posicion, 3 );
  39.  
  40.         if ( $codoninicio =~ /ATG/i ) {
  41.  
  42.             my ($pos2) = $posicion;
  43.             my ($pos3) = $posicion;
  44.             my ($gen);
  45.  
  46.             do {
  47.                 $codon = substr( $secuencia, $pos2, 3 );
  48.  
  49.                 $gen .= $codon;
  50.  
  51.                 $final = $pos2 + 1;
  52.  
  53.                 $pos2 = $pos2 + 3;
  54.  
  55.             } until ( $codon =~ /TA[AG]/i or $codon =~ /TGA/i );
  56.  
  57.             if ( $longitudmin < length($gen) ) {
  58.  
  59.                 $genes[$i] = $gen;
  60.  
  61.                 $posinicio_ref->[$i] = $pos3 + 1;
  62.  
  63.                 $posfinal_ref->[$i]  = $final;
  64.  
  65.                 $i = $i + 1;
  66.             }
  67.         }
  68.     }
  69.     return @genes;
  70. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGAGTGTGAGTTTAATCAACATGAATTTTTGA ATGAATTTTTGA
12 33
42 42
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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

Siguiente

Volver a Bioinformática

¿Quién está conectado?

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

cron