• Publicidad

Buscar ORF

Perl aplicado a la bioinformática

Buscar ORF

Notapor infor_v » 2011-01-14 12:02 @543

Estoy haciendo un programa con Perl para buscar ORF en una secuencia de ADN. Mi problema es que para buscar los codones que necesito he utilizado muchos bucles for() que me dan problemas. He intentado sustituirlos por bucles while() o do-until() pero dan bucles infinitos, por lo que creo que debería utilizar los bucles for(), pero tengo que encontrar la manera de solucionar los errores.

En concreto el problema con los bucles for() es que la última llave que utilizo para cerrar el bucle me la interpreta mal y me sale la siguiente frase al ejecutar:
useless use of private variable in void context at...

¿Alguien sabe cómo puedo solucionar esto?

A continuación pongo unos de los bucles for() que me dan error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for ($posicion; $posicion < length($secuencia)-2; $posicion += 3) {
  2.  
  3.     $codones2 = substr($secuencia, $posicion, 3);
  4.     if (($codones2 =~ /ta[ag]|tga/i) and ($posicion-$inicio > $ARGV[1])) {
  5.         push ( @$pos_inicio, $inicio);
  6.         push ( @$pos_paro , $posicion);
  7.         last;
  8.     }
  9.     else {
  10.         next;
  11.     }
  12. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Agradecería cualquier ayuda.
infor_v
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-01-14 11:42 @529

Publicidad

Re: Buscar ORF

Notapor explorer » 2011-01-14 12:14 @552

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

Por lo pronto, yo veo que $inicio no cambia en ninguna parte, así que en la línea 5 estás guardando siempre el mismo valor. Y la segunda parte de la condición de la línea 4, juraría que es '<' en lugar de '>', pero como no sé lo que es $ARGV[1], pues nada...
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: Buscar ORF

Notapor infor_v » 2011-01-14 15:13 @675

Gracias por la respuesta, pero el problema no era con ninguna de esas variables, y el signo de $ARG[1] es correcto, ya que se refiere a longitudes mayores de la que entro por teclado.
Ahora pongo la subrutina entera para que se vea mejor.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub posiciones {
  2. my ($secuencia, $posicion, $pos_inicio, $pos_paro) = @_;
  3.  
  4. my $inicio = 0;
  5. my $codones2 = '';
  6.  
  7. $inicio = $posicion;
  8. for ($posicion; $posicion < length($secuencia)-2; $posicion+=3){
  9.                
  10.                                 $codones2 = substr($secuencia, $posicion, 3);
  11.                                
  12.                                 if (($codones2 =~ /ta[ag]|tga/i) and ($posicion-$inicio > $ARGV[1])){
  13.                                
  14.                                 push ( @$pos_inicio, $inicio);
  15.                                 push ( @$pos_paro , $posicion);
  16.                                
  17.                                 last;
  18.                                
  19.                         } else {
  20.                         next;
  21.                         }
  22.                        
  23.                        
  24.         }
  25. return $posicion;
  26. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


pero el problema sin duda está en la última llave, que la toma como una variable.
infor_v
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-01-14 11:42 @529

Re: Buscar ORF

Notapor wanako » 2011-01-14 21:15 @927

Es complicado entender tu código, muchas variables que no se reutilizan y el valor de retorno es también un valor como argumento, es más claro usar constantes 'use constant => tal cosa', pero para evitar el warning es simple, a Perl no le gusta que escribas variables que no varían:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ###for ($posicion; $posicion < length($secuencia)-2; $posicion+=3)
  2. for ($posicion=0; $posicion < length($secuencia)-2; $posicion+=3)
  3. ### o tal vez
  4. for ($inicio=$posicion; $posicion < length($secuencia)-2; $posicion+=3)
  5. ### etc
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Buscar ORF

Notapor explorer » 2011-01-15 08:54 @412

Sigues sin variar la posición inicial.

El resumen de tu código es:
* Estoy buscando por las secuencias finales de los ORF,
* y cuando los encuentro,
* guardo un 0 (la posición inicial), y
* guardo la posición final.

Como ves, algo falla en ese razonamiento.

Debería ser:
* Busca por una secuencia inicial de ORF
* Si lo he encontrado, comienzo a buscar la secuencia final del ORF (es decir, necesito tener aquí otro bucle)
* Si lo he encontrado,
* guardo la posición inicial, y
* guardo la posición final.

En el hilo Más problemas con los ORF tienes una solución así.
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: Buscar ORF

Notapor infor_v » 2011-01-15 11:33 @523

Las variables sí que varían, pero la culpa ha sido mía ya que no he puesto la subrutina que me da las posiciones de inicio. A continuación voy a poner todo el código que busca inicio y paro, y dentro de las de paro invoca otra subrutina "proteinas" que será la que me traduzca si la longitud entre inicio y paro es mayor de lo que le meto por teclado.

He conseguido que me imprima las posiciones de inicio y paro para un marco de lectura, pero no son las correctas, son valores bastante más bajos.

Y sigo sin solucionar mis problemas con los bucles for(): cada vez que hago uno de estos bucles me da problemas en la última línea (la llave de cierre del bucle).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $posicion = 0;
  2.  
  3. for ( $posicion; $posicion < length($secuencia) - 2; $posicion += 3 ) {
  4.  
  5.     $codones1 = substr( $secuencia, $posicion, 3 );
  6.  
  7.     if ( $codones1 =~ /atg/i ) {
  8.  
  9.         @proteinas1
  10.             = posiciones( $secuencia, $posicion, \@pos_inicio1, \@pos_paro1 );
  11.  
  12.         next;
  13.  
  14.     }
  15.  
  16. }
  17.  
  18. print ABRIR "estas son las posiciones de inicio @pos_inicio1\n";
  19. print ABRIR "estas son las posiciones de paro @pos_paro1\n";
  20.  
  21. sub posiciones {
  22.     my ( $secuencia, $posicion, $pos_inicio1, $pos_paro1 ) = @_;
  23.  
  24.     my $inicio    = 0;
  25.     my $codones2  = '';
  26.     my @proteinas = ();
  27.  
  28.     $inicio = $posicion;
  29.     my $longitud = 0;
  30.  
  31.     for ( $posicion; $posicion < length($secuencia) - 2; $posicion += 3 ) {
  32.  
  33.         $codones2 = substr( $secuencia, $posicion, 3 );
  34.  
  35.         $longitud = $posicion - $inicio;
  36.  
  37.         if ( $codones2 =~ /ta[ag]|tga/i ) {
  38.  
  39.             unless ( $longitud <= $ARGV[1] ) {
  40.  
  41.                 push( @$pos_inicio1, $inicio );
  42.                 push( @$pos_paro1,   $posicion );
  43.  
  44.                 @proteinas = traducir( $secuencia, $inicio, $posicion );
  45.  
  46.                 last;
  47.             }
  48.         }
  49.         next;
  50.     }
  51.  
  52.     return @proteinas;
  53. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-01-15 11:52 @536, editado 1 vez en total
Razón: Formateo del código con la ayuda de perltidy
infor_v
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-01-14 11:42 @529

Re: Buscar ORF

Notapor explorer » 2011-01-15 15:06 @671

El aviso Useless use of private variable in void context at ... es debido a lo que te comenta wanako: estás usando una variable en un sitio, pero sin hacer nada con ella. Se refiere a las expresiones

for ( $posicion; ...

Ahí, $posicion no hace nada, y Perl te da un aviso de que ha encontrado una variable que no hace nada, lo cual puede ser un síntoma de un error de escritura.

Reescribe el código así:

for ( ; ...

es decir, sin variable. O mejor aún, cuando tengas algo como

my $posicion = 0;
for ( $posicion; ...


si no vas a usar el valor de $posicion después del bucle for() (es decir, que solo vas a usar $posicion dentro del bucle for()), lo puedes dejar mejor así:

for ( my $posicion = 0; ...

Es decir: utilizas la primera parte de la expresión del for(), la de inicialización, para justamente hacer eso: declarar e inicializar la variable $posicion.

En cuanto al último código que has presentado...
* las líneas 12 y 49, sobran (un next al final del bucle no sirve para nada)
* en la línea 44 estás traduciendo @proteinas, pero eso lo haces cada vez que encuentras un ORF, así que el valor de @proteinas va cambiando, con lo que el return() de la línea 52 devuelve las @proteinas traducidas del último ORF encontrado.
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