Página 1 de 3

Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 10:59 @499
por asegurac
Hola,

Estoy haciendo un script para contar la aparición de una lista de caracteres sobre uno o más bloques más grandes.

A continuación coloco un fragmento del archivo que contiene mi lista de caracteres a buscar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AA
AT
AG
AC
TA
TT
TC
TG
GA
GT
GG
GC
CA
CT
CG
CC
AAAA
AAAT
AAAC
AAAG
TTTA
TTTT
TTTC
TTTG
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y este es un fragmento del bloque sobre el cual se realiza la búsqueda (pueden ser varios; por eso utilizo el bucle de abajo para leerlo):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGGAGTCTTTTAGAGAGTTTATCCAACAATTCAAAAAAAATAAGGCAGCGGTCGTTGGGGCTTGGATTGTGCT.......
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Para realizar esto he escrito el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2.  
  3. my $file="../seq_pba.fasta"; #secuencias sobre las cuales se realiza la bósqueda
  4. my $rep="../2y4ntdb.txt"; #repeticiones a buscar sobre las secuencias
  5. chomp $rep;
  6. open (FILE, $file);
  7. open (REPE, $rep);
  8. my @array= <FILE>;
  9. my @arrep= <REPE>;
  10. close FILE;
  11. close REPE;
  12.  
  13.  
  14. for($i=1;$i<scalar(@array);$i++){
  15.         chomp $array[$i];
  16.        
  17.        
  18.         foreach $j (@arrep){
  19.         chomp $j;
  20.                 while ($array[$i] =~ /$j/g){
  21.  
  22.                
  23.                 print "$j\n";
  24.                 }
  25.         }
  26.  
  27.        
  28. }
  29.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Este código encuentra las apariciones, sin embargo no he logrado hacer que cuente el número de veces que aparece cada una de las palabra o caracteres de lista. Por ejemplo, la primer palabra del fragmento de lista que coloque anteriormente es "AA", así el script debería reportar "AA = 5 apariciones", "CC = 1 apariciones", etc. Ya he mirado varios mensajes en el foro solo que no he logrado introducir los contadores de manera adecuada. Espero puedan ayudarme,

Saludos.

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 11:40 @528
por explorer
En Perl, los índices de los array comienzan por 0, así que en la línea 14, $i debería empezar a contar en 0.

Y en el bucle más interno, en las líneas 21 y 22, es donde debes incrementar el contador de apariciones. Por ejemplo: $veces++;. Naturalmente, antes lo has inicializado a 0, en la línea 16: $veces=0;. El print de la línea 23, debes llevarlo después de la llave del while, antes de la 25, y cambiarlo por print "$j = $veces apariciones\n";. Creo que eso es todo.

De todas formas, hay una duda...

En la secuencia de ejemplo que nos has puesto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGGAGTCTTTTAGAGAGTTTATCCAACAATTCAAAAAAAATAAGGCAGCGGTCGTTGGGGCTTGGATTGTGCT
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿cuántas veces aparece la secuencia AAAA?

Según tu programa, usando esa expresión regular, aparece solo dos veces:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGGAGTCTTTTAGAGAGTTTATCCAACAATTCAAAAAAAATAAGGCAGCGGTCGTTGGGGCTTGGATTGTGCT
                                 1--/2--/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Ese es el resultado correcto? ¿No debería ser 5?
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ATGGAGTCTTTTAGAGAGTTTATCCAACAATTCAAAAAAAATAAGGCAGCGGTCGTTGGGGCTTGGATTGTGCT
                                 1--/||||
                                  2--/|||
                                   3--/||
                                    4--/|
                                     5--/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 11:56 @539
por asegurac
Hola, gracias por tu ayuda. Sí, claro, el resultado correcto es 5, una disculpa si no me expliqué bien.
Ya logré resolver el problema; solo modifiqué lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($array[$i] =~ /$j/g){
               
                $hash{$j}++;
                }

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y en %hash tengo el resultado que buscaba.

Ahora solo tengo una duda: quisiera saber cuál es la localización de cada una de las palabras a lo largo de la secuencia. Por ejemplo, tomando los fragmentos que puse en el mensaje anterior si buscamos "AA" su primera aparición sería después de los primeros 25 caracteres de la secuencia (comenzando de izquierda a derecha). ¿Crees que sería posible hacer esto?

Saludos

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 12:33 @564
por explorer
Para ver las posiciones de las repeticiones, te vale con consultar la función pos(), que devuelve la posición siguiente a la última repetición encontrada.

Y malas noticias: tu programa no da los resultados correctos. Sigue diciendo que 'AAAA' solo sale dos veces. Necesitas hacer un cambio importante en la forma de trabajar con la expresión regular, para que tenga en cuenta esos casos. Tienes dos opciones: o recorres la secuencia base por base, o modificas la posición de inicio de búsqueda en la siguiente vuelta del bucle, una base más allá del inicio de la última repetición encontrada.

El siguiente programa sí que da el resultado correcto (para la secuencia de ejemplo mostrada antes):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use File::Read;
  4.  
  5. my @repeticiones = read_file({ aggregate => 0 }, '2y4ntdb.txt');
  6. my $secuencia    = read_file('seq_pba.fasta');
  7.  
  8. chomp @repeticiones;    # no nos interesan
  9. $secuencia =~ s/\n//g;  #   los finales de línea
  10.  
  11. for my $repetición (@repeticiones) {
  12.  
  13.     my $veces = 0;
  14.     my @posiciones; # basadas en 1
  15.  
  16.     while ($secuencia =~ /$repetición/g) {                             # buscar $repetición en $secuencia
  17.         $veces++;                                                      # ¡encontrada!
  18.  
  19.         pos($secuencia) = pos($secuencia) - length($repetición) + 1;   # ajustamos posición de búsqueda
  20.                                                                        # de la exp. reg. para que esté
  21.                                                                        # una base más a la derecha del
  22.                                                                        # inicio de la última $rep encontrada
  23.  
  24.         push @posiciones, pos($secuencia);                             # que justamente es la posición,
  25.                                                                        # en base 1, de la $rep encontrada
  26.     }
  27.  
  28.     say "$repetición = $veces apariciones: ", join q[-], @posiciones;
  29. }
  30. __END__
  31. AA = 10 apariciones: 26-29-34-35-36-37-38-39-40-43
  32. AT = 5 apariciones: 1-22-30-41-67
  33. AG = 6 apariciones: 5-13-15-17-44-48
  34. AC = 1 apariciones: 27
  35. TA = 3 apariciones: 12-21-42
  36. TT = 9 apariciones: 9-10-11-19-20-31-56-63-68
  37. TC = 4 apariciones: 7-23-32-53
  38. TG = 5 apariciones: 2-57-64-69-71
  39. GA = 4 apariciones: 4-14-16-66
  40. GT = 5 apariciones: 6-18-52-55-70
  41. GG = 7 apariciones: 3-45-51-58-59-60-65
  42. GC = 4 apariciones: 46-49-61-72
  43. CA = 4 apariciones: 25-28-33-47
  44. CT = 3 apariciones: 8-62-73
  45. CG = 2 apariciones: 50-54
  46. CC = 1 apariciones: 24
  47. AAAA = 5 apariciones: 34-35-36-37-38
  48. AAAT = 1 apariciones: 39
  49. AAAC = 0 apariciones:
  50. AAAG = 0 apariciones:
  51. TTTA = 2 apariciones: 10-19
  52. TTTT = 1 apariciones: 9
  53. TTTC = 0 apariciones:
  54. TTTG = 0 apariciones:
  55.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 12:53 @579
por asegurac
Hola,

Ya caigo en cuenta. Tienes razón, no estaba considerando las múltiples formas de poder leer la secuencia y como eso alteraba los resultados.

Una última duda: ¿sería posible modificar la parte donde se hace la comparación, para así poder contar las veces que las apariciones son contiguas?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($secuencia =~ /$rep/g) {

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Saludos

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 13:11 @591
por explorer
Si te refieres a contar apariciones contemplando el caso de que se solapen unas con otras, la solución ya te la he puesto arriba, al modificar el valor de pos().

En cuanto a modificar la expresión regular... no creo que se pueda hacer.

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 13:35 @608
por asegurac
Hola,

A lo que refiero es a contar cuántas veces las apariciones son contiguas. Por ejemplo, en el caso de la palabra "AA" el resultado dice que hay 10 apariciones en la secuencia, pero de estas 10, en 7 "AA" aparece contigua en las posiciones 34-35-36-37-38-39-40. ¿Crees que sea posible introducir una nueva condición que permita contar esto para cada una de las palabras de la lista?

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 16:43 @738
por explorer
¿Y cuál debería ser la salida?

Con la siguiente modificación se puede reducir la salida de posiciones contiguas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use File::Read;
  4. use Number::Range;
  5.  
  6. my @repeticiones = read_file({ aggregate => 0 }, '2y4ntdb.txt');
  7. my $secuencia    = read_file('seq_pba.fasta');
  8.  
  9. chomp @repeticiones;    # no nos interesan
  10. $secuencia =~ s/\n//g;  #   los finales de línea
  11.  
  12. for my $repetición (@repeticiones) {
  13.  
  14.     my $veces = 0;
  15.     my @posiciones;     # basadas en 1
  16.  
  17.     while ($secuencia =~ /$repetición/g) {
  18.         $veces++;
  19.         pos($secuencia) = pos($secuencia) - length($repetición) + 1;
  20.         push @posiciones, pos($secuencia);
  21.     }
  22.  
  23.     if (@posiciones) {
  24.         my $rango = Number::Range->new(@posiciones);
  25.  
  26.         say "$repetición = $veces apariciones: ", scalar $rango->range();
  27.     }
  28.     else {
  29.         say "$repetición = $veces apariciones";
  30.     }
  31. }
  32.  
  33. __END__
  34. AA = 10 apariciones: 26,29,34..40,43
  35. AT = 5 apariciones: 1,22,30,41,67
  36. AG = 6 apariciones: 5,13,15,17,44,48
  37. AC = 1 apariciones: 27
  38. TA = 3 apariciones: 12,21,42
  39. TT = 9 apariciones: 9..11,19..20,31,56,63,68
  40. TC = 4 apariciones: 7,23,32,53
  41. TG = 5 apariciones: 2,57,64,69,71
  42. GA = 4 apariciones: 4,14,16,66
  43. GT = 5 apariciones: 6,18,52,55,70
  44. GG = 7 apariciones: 3,45,51,58..60,65
  45. GC = 4 apariciones: 46,49,61,72
  46. CA = 4 apariciones: 25,28,33,47
  47. CT = 3 apariciones: 8,62,73
  48. CG = 2 apariciones: 50,54
  49. CC = 1 apariciones: 24
  50. AAAA = 5 apariciones: 34..38
  51. AAAT = 1 apariciones: 39
  52. AAAC = 0 apariciones
  53. AAAG = 0 apariciones
  54. TTTA = 2 apariciones: 10,19
  55. TTTT = 1 apariciones: 9
  56. TTTC = 0 apariciones
  57. TTTG = 0 apariciones
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ahora, se podría hacer un análisis del número de apariciones, por medio de los números separados por comas, si no quieres tener en cuenta a los rangos de apariciones consecutivas... pero todo depende de, exactamente, qué es lo que quieres obtener.

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 17:58 @790
por asegurac
Hola,

Con respecto a la salida que esperaría sería la siguiente.

Volviendo con el ejemplo anterior:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AA = 10 apariciones totales: 26,29,34..40,43 y 7 apariciones en tándem.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ya intenté modificar el código pero no he tenido éxito, en verdad se me dificulta visualizarlo con las funciones que utilizas, necesito revisar su uso.

¿Cuál sería la modificación necesaria para obtener la salida que coloqué anteriormente?

Saludos

Re: Contar repeticiones secuencias de bases

NotaPublicado: 2010-04-29 18:19 @805
por explorer
Bueno, consiste en analizar la cadena del rango, para echar cuentas de cuántas apariciones en tándem existen.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use File::Read;
  4. use Number::Range;
  5.  
  6. use open 'locale';
  7.  
  8. my @repeticiones = read_file({ aggregate => 0 }, '2y4ntdb.txt');
  9. my $secuencia    = read_file('seq_pba.fasta');
  10.  
  11. chomp @repeticiones;    # no nos interesan
  12. $secuencia =~ s/\n//g;  #   los finales de línea
  13.  
  14. for my $repetición (@repeticiones) {
  15.  
  16.     my $veces = 0;
  17.     my @posiciones;     # basadas en 1
  18.  
  19.     while ($secuencia =~ /$repetición/g) {
  20.         $veces++;
  21.         pos($secuencia) = pos($secuencia) - length($repetición) + 1;
  22.         push @posiciones, pos($secuencia);
  23.     }
  24.  
  25.     print "$repetición = $veces apariciones totales";
  26.  
  27.     if (@posiciones) {
  28.         my $rango = Number::Range->new(@posiciones)->range();
  29.  
  30.         print ":  $rango";
  31.  
  32.         my $tándem = 0;
  33.  
  34.         while ($rango =~ /(\d+)\.\.(\d+)/g) {
  35.             $tándem += $2 - $1 + 1;
  36.         }
  37.  
  38.         print " y $tándem apariciones en tándem" if $tándem;
  39.     }
  40.  
  41.     say q[.];
  42. }
  43. __END__
  44. AA = 10 apariciones totales:  26,29,34..40,43 y 7 apariciones en tándem.
  45. AT = 5 apariciones totales:  1,22,30,41,67.
  46. AG = 6 apariciones totales:  5,13,15,17,44,48.
  47. AC = 1 apariciones totales:  27.
  48. TA = 3 apariciones totales:  12,21,42.
  49. TT = 9 apariciones totales:  9..11,19..20,31,56,63,68 y 5 apariciones en tándem.
  50. TC = 4 apariciones totales:  7,23,32,53.
  51. TG = 5 apariciones totales:  2,57,64,69,71.
  52. GA = 4 apariciones totales:  4,14,16,66.
  53. GT = 5 apariciones totales:  6,18,52,55,70.
  54. GG = 7 apariciones totales:  3,45,51,58..60,65 y 3 apariciones en tándem.
  55. GC = 4 apariciones totales:  46,49,61,72.
  56. CA = 4 apariciones totales:  25,28,33,47.
  57. CT = 3 apariciones totales:  8,62,73.
  58. CG = 2 apariciones totales:  50,54.
  59. CC = 1 apariciones totales:  24.
  60. AAAA = 5 apariciones totales:  34..38 y 5 apariciones en tándem.
  61. AAAT = 1 apariciones totales:  39.
  62. AAAC = 0 apariciones totales.
  63. AAAG = 0 apariciones totales.
  64. TTTA = 2 apariciones totales:  10,19.
  65. TTTT = 1 apariciones totales:  9.
  66. TTTC = 0 apariciones totales.
  67. TTTG = 0 apariciones totales.
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Si no entiendes algo del código, dímelo.