• Publicidad

Más problemas con los ORF

Perl aplicado a la bioinformática

Ordenar arrays

Notapor beafm » 2011-01-04 01:33 @106

¡Hola de nuevo!
Ahora sí que estoy al borde de la desesperación :( . Tengo una serie de problemas en mi programa que no sé resolver.

Para empezar, la subrutina que me recoge los genes y las posiciones de los codones de inicio y terminación en los array no se ejecuta bien, y solo lo hace para la posición 0, no para la 1 ni la 2. He probado a ejecutarlo con otro fichero FASTA distinto, pero en ese caso se ejecuta para la posición 2 y no para la 0 y la 1. Pudiera ser que no hay ATG para esas posiciones, pero son ficheros inmensos, y es poco probable que no haya.

Mi otro problema, y creo que mucho más grave, es que tengo que ordenar los array. Supongamos que tengo:

@posicionesinicio:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
14
78
25
63
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
@posicionesfinal:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
84
120
85
100
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
@proteinas
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
MATSHSIEFD
ADIUHFUIEN
ASCIWAEUIJ
FWIEUOFHWS
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Habría alguna manera de hacer que me recogiera en un array todo y además ordenado? El resultado sería este:

@ordenado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
14 84 MATSHSIEFD
25 85 ASCIWAEUIJ
63 100 FWIEUOFHWS
78 120 ADIUHFUIEN
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Por favor, si hay alguna manera de hacerlo, explíquenmelo porque a mi no se me ocurre. Si no se puede hacer de esta forma ¿podrían orientarme y decirme qué puedo hacer?

¡Muchísimas gracias!
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Publicidad

Re: Ordenar arrays

Notapor explorer » 2011-01-04 07:55 @372

A la primera pregunta no podemos responderte, porque no has publicado el código que te falla.

A la segunda pregunta, tu compañera Perldesesperada encontró la solución metiendo toda la información en un solo hash. También se puede hacer con un array de array:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my @posicionesinicio = qw(14  78 25  63);
  7. my @posicionesfinal  = qw(84 120 85 100);
  8. my @proteinas        = qw(
  9.     MATSHSIEFD
  10.     ADIUHFUIEN
  11.     ASCIWAEUIJ
  12.     FWIEUOFHWS
  13. );
  14.  
  15. ## Creamos la estructura de array de array
  16. my @ORF_encontrados;
  17.  
  18. for ( my $i = 0; $i < @proteinas; $i++ ) {
  19.  
  20.     push @ORF_encontrados,
  21.     [
  22.         $posicionesinicio[$i],
  23.         $posicionesfinal[$i],
  24.         $proteinas[$i]
  25.     ];
  26. }
  27.  
  28. use Data::Dumper;
  29. print Dumper \@ORF_encontrados; # Comprobación de lo que hemos leído
  30.  
  31. ## Ordenamos por los primeros componentes de cada sub array
  32. my @ORF = sort { $a->[0] <=> $b->[0] } @ORF_encontrados;
  33.  
  34. print Dumper \@ORF;             # Comprobación de lo que tenemos al final
  35.  
  36. __END__
  37. $VAR1 = [
  38.           [
  39.             '14',
  40.             '84',
  41.             'MATSHSIEFD'
  42.           ],
  43.           [
  44.             '78',
  45.             '120',
  46.             'ADIUHFUIEN'
  47.           ],
  48.           [
  49.             '25',
  50.             '85',
  51.             'ASCIWAEUIJ'
  52.           ],
  53.           [
  54.             '63',
  55.             '100',
  56.             'FWIEUOFHWS'
  57.           ]
  58.         ];
  59. $VAR1 = [
  60.           [
  61.             14,
  62.             '84',
  63.             'MATSHSIEFD'
  64.           ],
  65.           [
  66.             25,
  67.             '85',
  68.             'ASCIWAEUIJ'
  69.           ],
  70.           [
  71.             63,
  72.             '100',
  73.             'FWIEUOFHWS'
  74.           ],
  75.           [
  76.             78,
  77.             '120',
  78.             'ADIUHFUIEN'
  79.           ]
Coloreado en 0.003 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

Re: Ordenar arrays

Notapor beafm » 2011-01-04 09:38 @443

Ok, pero hay una serie de cosas que no entiendo... sé que soy una cansina, pero es que tenemos que explicarle al profesor qué hacemos y por qué lo hacemos, y si no lo entiendo... mal voy.

Lo primero es que no entiendo lo que significa qw(). Seguramente sea una chorrada de pregunta, pero por si acaso.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @posicionesinicio = qw(14  78 25  63);
   
      my @posicionesfinal  = qw(84 120 85 100);

      my @proteinas        = qw(
   
          MATSHSIEFD
 
          ADIUHFUIEN
 
          ASCIWAEUIJ
 
          FWIEUOFHWS
 
      );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Otra duda es que cuando crea el array de array, en el bucle for() pone la condición de que $i sea menor @proteinas. ¿No sería necesario poner un scalar() delante del array? y ¿por qué < y no <= ?
Y a ver si me he enterado, lo que está haciendo es crear arrays más pequeños que están dentro de otro array, y esos subarrays se los indica al programa con las [], ¿verdad?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
## Creamos la estructura de array de array
 
      my @ORF_encontrados;
         
      for ( my $i = 0; $i < @proteinas; $i++ ) {
 
       
          push @ORF_encontrados,
 
          [
 
              $posicionesinicio[$i],
 
              $posicionesfinal[$i],
 
              $proteinas[$i]
 
          ];
 
      }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra pregunta... ¿Dumper es otra función o qué es?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper;
 
      print Dumper \@ORF_encontrados; # Comprobación de lo que hemos leído
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Había pensado lo del sort(), pero es que realmente no lo entiendo, el profesor lo comentó en clase por encima, y he buscado información pero apenas he encontrado. Creo que lo que está haciendo es comparar la primera línea de todos los subarray que están dentro de @ORF_encontrados y los ordena según el número que haya en esa línea, pero no estoy segura.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
## Ordenamos por los primeros componentes de cada sub array
 
      my @ORF = sort { $a->[0] <=> $b->[0] } @ORF_encontrados;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En cuanto a la subrutina que saca las posiciones, en cuanto pueda la subo para que me digan, porque yo la veo exactamente igual a la que me escribió en el otro mensaje.

De nuevo, muchísimas gracias, me está ayudando muchísimo, no sabe hasta que punto. :D
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Ordenar arrays

Notapor explorer » 2011-01-04 10:19 @471

beafm escribiste:Lo primero es que no entiendo lo que significa qw()
Es el operador que crea listas de valores, siendo los valores, "palabras" (algo que está separado por los espacios en blanco). Más información en la sección Quote-Like Operators de perlop.

beafm escribiste:Otra duda es que cuando crea el array de array, en el bucle for() pone la condición de que $i sea menor @proteinas. ¿No sería necesario poner un scalar() delante del array? y ¿por qué < y no <= ?
Un array evaluado en contexto escalar devuelve el número de elementos que contiene ese array, así que en la comparación estamos poniendo el límite del valor del contador $i. Y como los índices en los array comienzan en 0, pues es desde 0 hasta uno menos del número de elementos. Matemáticas simples :)

beafm escribiste:Y a ver si me he enterado, lo que está haciendo es crear arrays más pequeños que están dentro de otro array, y esos subarrays se los indica al programa con las [], ¿verdad?
Sí.

beafm escribiste:Otra pregunta... ¿Dumper es otra función o qué es?
Es una función importada desde el módulo Data::Dumper, que muestra el contenido de las variables. Así es fácil de ver qué aspecto tiene la estructura de datos que hemos construido. Lo he usado como comprobación, no para que forme parte del programa. Más información en Data::Dumper.

beafm escribiste:Había pensado lo del sort(), pero es que realmente no lo entiendo, el profesor lo comentó en clase por encima, y he buscado información pero apenas he encontrado. Creo que lo que está haciendo es comparar la primera línea de todos los subarray que están dentro de @ORF_encontrados y los ordena según el número que haya en esa línea, pero no estoy segura.
No. Lo que hace la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @ORF = sort { $a->[0] <=> $b->[0] } @ORF_encontrados;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
es "sacar" todos los elementos de @ORF_encontrados. Luego se los va pasando al mini-programa que está entre llaves a sort(). El mini-programa indica la forma de realizar la ordenación. $a y $b representan cada uno dos elementos cualesquiera que sort() va a ordenar. Y el operador <=> es el operador de comparación trinaria numérica (devuelve 1, 0 o -1 según los dos valores sean mayor que, igual que o menor que, entre sí). Como los elementos de @ORF_encontrados son referencias a arrays (los subarrays) necesitamos acceder a ellos con el operador ->. Y una vez que hemos accedido a ellos, indicamos a qué componente queremos acceder. En nuestro caso, [0], que es el primer elemento de cada subarray. sort() ordena según esos valores, y los entrega a @ORF.

Así que lo que hace es ordenar los elementos de @ORF_encontrados según el primer elemento de cada subarray (o dicho de otra manera: estamos ordenando las "filas" según los valores de la primera "columna").

Más información en perldoc perldata, perldoc perllol y perldoc -f sort.
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: Ordenar arrays

Notapor beafm » 2011-01-04 11:00 @500

Ok, tengo que mirarlo detenidamente y ver si me funciona, porque sigo teniendo algunas dudas, pero de momento me sirve.

La subrutina que no me sale es ésta, que no se por qué si le pongo la posición 0 sí me lo ejecuta, y si le pongo 1 o 2, me lo deja en blanco.

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.   my($codoninicio);
  13.   my($codon);
  14.   my($i) = 0;
  15.   my(@genes);
  16.  
  17.  
  18. for ($posicion; $posicion < (length $secuencia) - 2 ; $posicion = $posicion + 3) {
  19.    
  20.           $codoninicio = substr ( $secuencia, $posicion, 3 );
  21.  
  22.               if ($codoninicio =~ /ATG/i) {
  23.                
  24.                         my($pos2) = $posicion;
  25.                         my($pos3) = $posicion;
  26.                         my($gen);
  27.  
  28.                         do{
  29.                             $codon = substr ( $secuencia, $pos2, 3 );
  30.                    
  31.                             $gen .= $codon;
  32.  
  33.                             $final = $pos2 + 1;
  34.  
  35.                             $pos2 = $pos2 + 3;
  36.  
  37.                           }until ( $codon =~ /TA[AG]/i or $codon =~ /TGA/i);
  38.  
  39.                           if ( $longitudmin < length ($gen) ) {
  40.  
  41.                                     $genes[$i] = $gen;
  42.        
  43.                                     $$posinicio[$i] = $pos3 + 1;
  44.        
  45.                                     $$posfinal[$i] = $final;
  46.  
  47.                                     $i = $i + 1;
  48.                
  49.                           }
  50.                                                  
  51.                 }        
  52.              
  53.   }
  54.  
  55.   return @genes;
  56.  
  57. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Ordenar arrays

Notapor explorer » 2011-01-04 11:23 @516

¿Puedes poner un ejemplo de secuencia de $DNA, mínima, en la que sí debería tener una salida para 0, 1 y 2?
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: Ordenar arrays

Notapor beafm » 2011-01-04 19:53 @870

Sí. Por ejemplo, esto es una mínima parte de uno de los ficheros que tenemos de ejemplo para hacer el ejercicio:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>ref|NC_003423.2|:1-300000 Schizosaccharomyces pombe 972h- chromosome II, complete sequence
GATCTCGCAACTCTTAATAAAGCTAATTCCTGCTAATTCGCTATACACTAAATCTTAATAAACTTGCTTC
ATTATTTTCTCGATAAATATTTTATTTATAACAGTTTGTTAAATTGACAGGGTCCTTGCTAAGTTTCTAT
ATACAACATAAACATACTATACGAAATAACATTTTTCTCAAGGTATGTAGAGTATAAATGCTCCAACGTG
GCACAATTTCATTTCGTTTAGTTTACTAAAAACCCATATTCGCGTCGCACTCACACAGAATCTAGAGTTT
AGTACATTTTACCGGCTCAACAATTAACCATTCAAATTGTATTTCAAGTATGAGTAACAATCGAATAAAA
TATTGTATTCTTGCTTTCCTATAAAAGTATTTTGATAATCGTAAAGCTGGGAATACCATTTGCCTGTACT
TTGGCAGTTATGGTGCTGCCATGTTGCTCCTTTTATAGTTATATCCTGTATGTTAAAAACTTTTATGGAA
CTATCGTACTTCTGTTTAACAGCATCATAAGCCTTAAATGCTAAATTTCGATTATTAACTGGTATTCCTG
AACAATCACGTATACCGTTTTTGAAGTCTTGGACCATGAAATCGTCGCCTGAGCGTCTATCAAACGCACC
TAATTGCATCAGCTGAGTCATGTTCATATTATGTCTTGAACTGTCATCGAATTCAATACTCATAGTAGTC
AACGCAAAGAGAGATACTGAACATATTGGCACATCATCTAAATTGCCATTTCATAATGAAAAGCAACCCT
TCTGACATTCGTTTATTTAAAGAAACACTCGTCAATCAAACGTGTGTAATCACCATCATTAACTTCGACT
GTATTAAATAATACAAGTCTACCCAAACTCAGTTATCGTTCCGTTAGTCACATTACTATATGCATTAAAA
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Otra cosa. Supongamos que esta forma de ordenar los arrays me funciona.
Si quiero, por ejemplo, imprimir la primera línea del segundo subarray, ¿cómo lo haría?
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Ordenar arrays

Notapor explorer » 2011-01-04 21:05 @920

Con esa secuencia a mi me sale bien...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $DNA = '
  4. GATCTCGCAACTCTTAATAAAGCTAATTCCTGCTAATTCGCTATACACTAAATCTTAATAAACTTGCTTC
  5. ATTATTTTCTCGATAAATATTTTATTTATAACAGTTTGTTAAATTGACAGGGTCCTTGCTAAGTTTCTAT
  6. ATACAACATAAACATACTATACGAAATAACATTTTTCTCAAGGTATGTAGAGTATAAATGCTCCAACGTG
  7. GCACAATTTCATTTCGTTTAGTTTACTAAAAACCCATATTCGCGTCGCACTCACACAGAATCTAGAGTTT
  8. AGTACATTTTACCGGCTCAACAATTAACCATTCAAATTGTATTTCAAGTATGAGTAACAATCGAATAAAA
  9. TATTGTATTCTTGCTTTCCTATAAAAGTATTTTGATAATCGTAAAGCTGGGAATACCATTTGCCTGTACT
  10. TTGGCAGTTATGGTGCTGCCATGTTGCTCCTTTTATAGTTATATCCTGTATGTTAAAAACTTTTATGGAA
  11. CTATCGTACTTCTGTTTAACAGCATCATAAGCCTTAAATGCTAAATTTCGATTATTAACTGGTATTCCTG
  12. AACAATCACGTATACCGTTTTTGAAGTCTTGGACCATGAAATCGTCGCCTGAGCGTCTATCAAACGCACC
  13. TAATTGCATCAGCTGAGTCATGTTCATATTATGTCTTGAACTGTCATCGAATTCAATACTCATAGTAGTC
  14. AACGCAAAGAGAGATACTGAACATATTGGCACATCATCTAAATTGCCATTTCATAATGAAAAGCAACCCT
  15. TCTGACATTCGTTTATTTAAAGAAACACTCGTCAATCAAACGTGTGTAATCACCATCATTAACTTCGACT
  16. GTATTAAATAATACAAGTCTACCCAAACTCAGTTATCGTTCCGTTAGTCACATTACTATATGCATTAAAA
  17. ';
  18.  
  19. $DNA =~ s/\n//g;
  20.  
  21. for my $despl (0 .. 2) {
  22.     my (@posinicio, @posfinal);
  23.     my $longitudmin = 9;
  24.  
  25.     my @genes = seleccionar_secuencias( $despl, $DNA, \@posinicio, \@posfinal, $longitudmin );
  26.  
  27.     print join("\n", @genes), "\n";
  28.     print "@posinicio\n";
  29.     print "@posfinal\n";
  30.     print "=" x 40, "\n";
  31. }
  32.  
  33. sub seleccionar_secuencias {
  34.     my ($posicion, $secuencia, $posinicio_ref, $posfinal_ref, $longitudmin) = @_;
  35.     my ($codoninicio, $codon, @genes, $i);
  36.  
  37.     for ($i = 0; $posicion < length($secuencia) - 2; $posicion += 3) {
  38.         $codoninicio = substr($secuencia, $posicion, 3);
  39.  
  40.         if ($codoninicio =~ /ATG/i) {
  41.             my $pos2 = $posicion;
  42.             my $pos3 = $posicion;
  43.             my $gen;
  44.  
  45.             do {
  46.                 $codon = substr( $secuencia, $pos2, 3 );
  47.  
  48.                 $gen  .= $codon;
  49.                 $final = $pos2 + 1;
  50.                 $pos2 += 3;
  51.             } until ( $codon =~ /TA[AG]/i or $codon =~ /TGA/i );
  52.  
  53.             if ($longitudmin < length($gen)) {
  54.                 $genes[$i]      = $gen;
  55.                 $posinicio_ref->[$i] = $pos3 + 1;
  56.                 $posfinal_ref->[$i]  = $final;
  57.  
  58.                 $i++;
  59.             }
  60.         }
  61.     }
  62.  
  63.     return @genes;
  64. }
  65.  
  66. __END__
  67. ATGGTGCTGCCATGTTGCTCCTTTTATAGTTATATCCTGTATGTTAAAAACTTTTATGGAACTATCGTACTTCTGTTTAACAGCATCATAAGCCTTAAATGCTAA
  68. 430
  69. 532
  70. ========================================
  71. ATGTTAAAAACTTTTATGGAACTATCGTACTTCTGTTTAACAGCATCATAA
  72. ATGGAACTATCGTACTTCTGTTTAACAGCATCATAA
  73. ATGAAATCGTCGCCTGAGCGTCTATCAAACGCACCTAATTGCATCAGCTGA
  74. ATGTTCATATTATGTCTTGAACTGTCATCGAATTCAATACTCATAGTAGTCAACGCAAAGAGAGATACTGAACATATTGGCACATCATCTAAATTGCCATTTCATAATGAAAAGCAACCCTTCTGA
  75. 470 485 596 650
  76. 518 518 644 773
  77. ========================================
  78. ATGCTCCAACGTGGCACAATTTCATTTCGTTTAGTTTACTAA
  79. ATGAGTAACAATCGAATAAAATATTGTATTCTTGCTTTCCTATAA
  80. ATGTTGCTCCTTTTATAG
  81. ATGCTAAATTTCGATTATTAA
  82. ATGAAAAGCAACCCTTCTGACATTCGTTTATTTAAAGAAACACTCGTCAATCAAACGTGTGTAATCACCATCATTAACTTCGACTGTATTAAATAA
  83. 198 330 441 528 756
  84. 237 372 456 546 849
  85. ========================================
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Para imprimir la primera línea del segundo subarray:

print $ORF[1][0], "\n"; # 25

que es la forma corta de

print $ORF[1]->[0], "\n"; # 25


Recuerda que los índices empiezan en 0.
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: Ordenar arrays

Notapor beafm » 2011-01-05 21:13 @926

He conseguido arreglar la subrutina, pero para la posición 1 me lo deja en blanco. Será porque no encuentra codones, porque para las demás si me sale... y hago un copia y pega, así que no puede haber error... ¿a usted le daba algo?
beafm
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2010-12-31 06:26 @309

Re: Ordenar arrays

Notapor explorer » 2011-01-06 07:47 @366

A mi me sale lo que pone el programa anterior, después del __END__. Ves que hay 3 salidas: del 0 al 2.
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

AnteriorSiguiente

Volver a Bioinformática

¿Quién está conectado?

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