Página 1 de 1

Cómo contar y buscar cadenas en secuencias nucleótidas

NotaPublicado: 2011-12-01 00:18 @054
por Kreator69
Hola. Soy estudiante de bioinformática. Tengo una duda en cómo busco y cuento una cadena en un secuencia. Está basado sobre el siguiente problema:

Tengo una secuencia...
GAGTTTTATCGCTTCCATGACGCAGAAGTTAACACTTTCGGATATTTCTAATGAGTCGAAAAATTATCTT

y deseo buscar cuántas veces se repite una cadena de dos letras, vale decir, cuántas veces AT, TA, CG, GC, GT, AC.... (en fin, todas las posibilidades en dos letras de espacio), se encuentran en la secuencia.

Ejemplo:
SECUENCIA= GGGTAGGCTAGGATCGGGTACGTCACGGGTATGCA
STRING=GG
RESULTADO: SE HAN ENCONTRADO 8 VECES ESTE STRING (GG) EN LA SECUENCIA.


Me decían que con match se solucionaba, pero aún no lo entiendo del todo.

Re: Cómo contar y buscar cadenas en secuencias nucleótidas

NotaPublicado: 2011-12-01 10:41 @486
por explorer
Bienvenido a los foros de Perl en español, Kreator69.

Para buscar cadenas literales, mejor y más rápido usar index() (o rindex()).

Aquí tienes un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use utf8;
  7. use open qw(:utf8 :std);    # Terminal en modo utf8
  8.  
  9. my $seq = 'GGGTAGGCTAGGATCGGGTACGTCACGGGTATGCA';
  10. my $s   = 'GG';
  11. my $pos = 0;
  12. my $n   = 0;
  13.  
  14. while (($pos = index($seq, $s, $pos)) != -1) {  # Buscamos $s en $seq a partir de $pos
  15. #    print "Encontrado en posición $pos\n";
  16.     $n++;                   # Contador de veces
  17.     $pos++;                 # Avanzamos a la siguiente letra
  18. }
  19.  
  20. print "SE HAN ENCONTRADO $n VECES ESTE STRING ($s) EN LA SECUENCIA.\n";
  21.  
  22. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El programa inicia un bucle, ejecutando index() en la secuencia, buscando por $s, la cadena que queremos buscar, y desde la posición $pos (inicialmente, 0, la primera letra). El resultado de index() es la posición donde se encuentra la cadena encontrada, o -1 si no ha encontrado nada. Ese resultado lo almacenamos en $pos, para la siguiente vuelta (comenzar a buscar desde el sitio donde se encontró la última cadena). Además, aprovechamos para comprobar si es un -1 lo que nos ha devuelto index(), marcando que no ha encontrado ninguna más.

Dentro del bucle, contamos una aparición más, y movemos $pos una posición más allá, ya que sino, index() buscaría la cadena en la misma posición en la que encontró la última, por lo que estaríamos en un bucle sin fin (siempre nos devolvería el mismo resultado).

Otra forma, más abreviada, después de un poco de matemáticas, es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $seq = 'GGGTAGGCTAGGATCGGGTACGTCACGGGTATGCA';
  3. my $s   = 'GG';
  4. my $pos = 0;
  5. my $n   = 0;
  6.  
  7. $n++ while $pos = 1 + index($seq, $s, $pos);
  8.  
  9. print "SE HAN ENCONTRADO $n VECES ESTE STRING ($s) EN LA SECUENCIA.\n";
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en perldoc -f index.

Re: Cómo contar y buscar cadenas en secuencias nucleótidas

NotaPublicado: 2011-12-01 17:12 @758
por Kreator69
Muchas gracias, fue de gran ayuda. :D Desconocía por completo el index()... Llevo 3 días de aprender este lenguaje y todavía no agarro los conceptos bien.