• Publicidad

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

Perl aplicado a la bioinformática

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

Notapor Kreator69 » 2011-12-01 00:18 @054

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.
Kreator69
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-11-30 23:42 @029

Publicidad

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

Notapor explorer » 2011-12-01 10:41 @486

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.
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: Cómo contar y buscar cadenas en secuencias nucleótidas

Notapor Kreator69 » 2011-12-01 17:12 @758

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.
Kreator69
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-11-30 23:42 @029


Volver a Bioinformática

¿Quién está conectado?

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