• Publicidad

Puntuación errónea en alineamiento

Perl aplicado a la bioinformática

Re: Puntuación errónea en alineamiento

Notapor explorer » 2017-01-26 16:07 @713

perl junior escribiste:¿Por qué si viene de la derecha añades a @camino abajo?
Tienes razón. Hay que intercambiar las líneas 99 y 104.

perl junior escribiste:Además, si vemos el resultado, estaría mal, no debería salir "TGCTTA".
La secuencia sale al revés, pero no sé por qué. Quizás porque estás usando unshift en la línea 109, pero eso es lo que dicta la lógica. Voy a mirarlo con detalle.

perl junior escribiste:Y por otra parte, viendo ahora el código tanto en la línea 30 como en la 37 creo que lo tengo mal y que los índices empiecen por 1.
En la mayoría de los casos, la inicialización no es necesaria.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Puntuación errónea en alineamiento

Notapor perl junior » 2017-01-26 17:04 @753

Con las anteriores secuencias sí que lo hace bien... Quizás tenga que ver con el tamaño de las secuencias.
perl junior
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2017-01-03 11:13 @509

Re: Puntuación errónea en alineamiento

Notapor explorer » 2017-01-26 17:56 @789

Sí que lo he pensado, pero no.

Bueno, el caso es que he quitado la versión recursiva de construir_camino() y la he convertido en un simple bucle while(), mucho más simple. Ahora ya saca el valor correcto.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #
  3. use List::Util qw[min max];
  4.  
  5. sub programacion_dinamica{
  6.         my($secuencia1,$secuencia2) =@_;
  7.  
  8.         my $len1 =length ($secuencia1);
  9.         my $len2 =length($secuencia2);
  10.         my @secuencia1 = split("",$secuencia1);
  11.         my @secuencia2= split("",$secuencia2);
  12.  
  13.         #Construimos la tabla s y la inicializamos a 0
  14.         my @s=();
  15.         my @decisiones=();
  16.         for (my $i =0; $i <=$len1 ;$i++){
  17.  
  18.                 my @ fila_s=();
  19.                 my @fila_decision=();
  20.                 for (my $j=0;$j <=$len2;$j++){
  21.                         push @fila_s,0;
  22.                         push@fila_decision,'';
  23.                         print @fila_decision;
  24.                 }
  25.                 push @s,\@fila_s; #por referencia
  26.                 push @decisiones,\@fila_decision;
  27.         }
  28.  
  29.  
  30.         for (my $i =0;$i<$len1;$i++){
  31.                 $s[0][0]= 0;
  32.                 $s[$i][0] =$s[$i][0];
  33.  
  34.                 $decisiones[$i][0]="abajo";
  35.         }
  36.  
  37.         for (my $j=0;$j<=$len2;$j++){
  38.  
  39.                 $s[0][$j] =$s[0][$j];
  40.  
  41.                 $decisiones[0][$j]="derecha";
  42.         }
  43.  
  44.         for (my $j=1;$j<= $len2;$j++){
  45.                 for (my $i=1;$i<= $len1;$i++){
  46.  
  47.                         if ($secuencia1[$i-1] eq $secuencia2[$j-1]){
  48.                                 $suma=1;
  49.                         }
  50.                         else{
  51.                                 $suma=0;
  52.                         }
  53.  
  54.                         $s[$i][$j]=max(
  55.                                 $s[$i-1][$j]+0,
  56.                                 $s[$i][$j-1]+0,
  57.                                 $s[$i-1][$j-1]+$suma);
  58.  
  59.                         if($s[$i][$j]== $s[$i][$j-1]+0){
  60.                                 $decisiones[$i][$j] ="derecha";
  61.                         }
  62.                         elsif ($s[$i][$j]==$s[$i-1][$j-1]+$suma){
  63.                                 $decisiones[$i][$j] ="diagonal";
  64.                         }
  65.                         else{
  66.                                 $decisiones[$i][$j]="abajo";
  67.                     }
  68.                 }
  69.         }
  70.  
  71.         my ($camino_ref, $secuencia_ref) = construir_camino($len1,$len2,\@decisiones,\@secuencia1);
  72.  
  73.         return $s[$len1][$len2], $camino_ref, $secuencia_ref;
  74. }
  75.  
  76. sub construir_camino{
  77.     my ($i, $j, $decisiones_ref, $secuencia1_ref) = @_;
  78.     my @camino;
  79.     my @secuencia;
  80.  
  81.     while ($i > 0 or $j > 0) {
  82.  
  83.         my $sentido = $decisiones_ref->[$i][$j];
  84.         unshift @camino, $sentido;
  85.  
  86.         print "$i:$j: $sentido\n";
  87.  
  88.         if ($sentido eq "abajo") {
  89.  
  90.             $i--;
  91.         }
  92.         elsif ($sentido eq "derecha") {
  93.  
  94.             $j--;
  95.         }
  96.         else {
  97.             $i--; $j--;
  98.  
  99.             print "$secuencia1_ref->[$i] > @secuencia\n";
  100.             unshift @secuencia, $secuencia1_ref->[$i];
  101.         }
  102.     }
  103.  
  104.     return \@camino, \@secuencia;
  105. }
  106.  
  107.  
  108. $secuencia1="ATGCTTA";
  109. $secuencia2="TGCATTAA";
  110.  
  111.  
  112.  
  113. my ($resultado, $camino_ref, $secuencia_ref) = programacion_dinamica($secuencia1,$secuencia2);
  114. print "\n";
  115. print $resultado,"\n";
  116. print join(" ", @$camino_ref),   "\n";
  117. print join(" ", @$secuencia_ref), "\n";
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
7:8: derecha
7:7: diagonal
A >
6:6: diagonal
T > A
5:5: diagonal
T > T A
4:4: derecha
4:3: diagonal
C > T T A
3:2: diagonal
G > C T T A
2:1: diagonal
T > G C T T A
1:0: abajo

6
abajo diagonal diagonal diagonal derecha diagonal diagonal diagonal derecha
T G C T T A
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Observa también que he ajustado el paso de argumentos entre las dos funciones, para que los arrays pasen por referencia.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Puntuación errónea en alineamiento

Notapor explorer » 2017-01-27 15:56 @705

A propósito... hay otro hilo con el mismo algoritmo de este hilo: Alineamiento múltiple
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado