• Publicidad

Enumerar codones adecuadamente

Perl aplicado a la bioinformática

Enumerar codones adecuadamente

Notapor entropia » 2012-10-17 16:53 @745

Hola a todos:

Estoy tratando de hacer un programa que me indique el número de codones y que me diga los que empiezan con la letra A, G, T y C. He hecho algo básico con expresiones regulares muy básicas. Obtengo el número de codones que hay en mi secuencia pero a la hora de contar los codones con A, G, T y C me los lee todos revueltos y yo quiero la lectura cada tres y en ese orden.

Les dejo mi código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my $secuencia = "ATGAAACGCATTAGCACC";
  4.  
  5. my $codon1 = 'A..';
  6. my $codon2 = 'G..';
  7. my $codon3 = 'T..';
  8. my $codon4 = 'C..';
  9. my $codon5 = '...';
  10.  
  11. my ( $res1, $res2, $res3, $res4, $res5 ) = ( 0, 0, 0, 0, 0 );
  12.  
  13. while ( $secuencia =~ /$codon1/g ) {
  14.     $res1++;
  15. }
  16. while ( $secuencia =~ /$codon2/g ) {
  17.     $res2++;
  18. }
  19. while ( $secuencia =~ /$codon3/g ) {
  20.     $res3++;
  21. }
  22. while ( $secuencia =~ /$codon4/g ) {
  23.     $res4++;
  24. }
  25. while ( $secuencia =~ /$codon5/g ) {
  26.     $res5++;
  27. }
  28. print "Los codones que empiezan con A son: $res1\n";
  29. print "Los codones que empiezan con G son: $res2\n";
  30. print "Los codones que empiezan con T son: $res3\n";
  31. print "Los codones que empiezan con C son: $res4\n";
  32. print "El numero total de codones es: $res5\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Gracias :D
Última edición por explorer el 2012-10-17 20:43 @904, editado 1 vez en total
Razón: Formateado de código con Perltidy
entropia
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-10-17 16:41 @737

Publicidad

Re: Enumerar codones adecuadamente

Notapor explorer » 2012-10-17 21:31 @938

Bienvenida a los foros de Perl en Español, entropia.

El problema está en las expresiones regulares, que no saben que deben buscar en múltiplos de tres posiciones.

Supongamos que estamos en la línea 19 donde el programa debe buscar por los codones que comienzan por timina.

Como la expresión regular solo sabe que debe buscar algo que comience por 'T' seguido de dos caracteres cualesquiera, empezará a buscar desde el principio de la cadena, y ya en la segunda posición encontrará la primera.

Nosotros sabemos que no es correcto: esa 'T' no está en múltiplo de tres.

Tienes varias soluciones:

1- Dividir la secuencia en codones (separarlos de tres en tres), y analizar cada codón por separado. Con la función substr() es fácil

2- Seguir con el mismo código que hasta ahora, pero antes de hacer el incremento del contador, comprobar que la posición es, efectivamente, múltiplo de tres. Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $pos = pos($secuencia);  # pos() nos devuelve la siguiente posición del patrón encontrado
  2.     $res3++ if not $pos % 3;    # calculamos el resto de la división entera de la posición, entre 3
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Lo que hacemos, dentro de cada while(), es ver la posición donde terminó el patrón que buscamos. Si esa posición es múltiplo de 3, entonces estamos seguros que lo que buscamos también comienza en una posición múltiplo de 3, ya que los patrones todos tienen 3 caracteres de ancho. Y por lo tanto, son posiciones de inicio de codón y es correcta la búsqueda

3- Modificar la expresión regular para que tenga en cuenta la posición de inicio de búsqueda de los patrones:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($secuencia =~ /\G(?:...)*?A../g) {
  2.    $res1++;
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
\G es la posición en la que quedó la última coincidencia -suponemos que fue un codón anterior o el inicio de la propia secuencia-. A partir de ahí buscamos por 0 o más conjuntos de tres letras ((?:...)*), y seguidos por nuestro patrón de codón. Si la expresión regular encuentra el codón, incrementa el contador, y repite el proceso.

4- Hacer un bucle for() por la longitud de la secuencia, saltando de tres en tres, y leyendo solo una letra. Según sea esa letra, incrementamos su contador correspondiente (más cómodo si usamos un hash)

5- ...

Por estos foros hay ejemplos de todos ellos. Busca por la palabra "codones".


A propósito, no necesitas un quinto patrón para saber cuántos codones hay... te basta con dividir la longitud de la secuencia entre 3: print length($secuencia) / 3;
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: Enumerar codones adecuadamente

Notapor entropia » 2012-10-18 12:23 @557

Muchas gracias por tus consejos.

He decidido quedarme con las expresiones regulares porque en un futuro voy a buscar algo más complejo y la tercera opción aunque la segunda opción también me funcionó muy bien.

Gracias :D
entropia
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-10-17 16:41 @737


Volver a Bioinformática

¿Quién está conectado?

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