• Publicidad

Contar repeticiones secuencias de bases

Perl aplicado a la bioinformática

Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-29 10:59 @499

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.
Última edición por explorer el 2010-04-29 13:33 @606, editado 2 veces en total
Razón: Ortografía
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Publicidad

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-29 11:40 @528

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-29 11:56 @539

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
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-29 12:33 @564

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-29 12:53 @579

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
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-29 13:11 @591

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-29 13:35 @608

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?
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-29 16:43 @738

¿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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-29 17:58 @790

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
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-29 18:19 @805

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
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 4 invitados