• Publicidad

Contar tripletes

Perl aplicado a la bioinformática

Contar tripletes

Notapor principiante » 2009-08-18 03:41 @195

Necesito hacer un programa que a partir de una secuencia de letras, la separe en tripletes (grupo de 3 letras) e indique el número de veces que aparece cada triplete a lo largo de la secuencia.

He escrito el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $sec = 'CGACGATCTTCGTACGGGACTAGCTCGTGTCGGTCGC';
  2.  
  3.    for($i=0; $i < (length($sec) - 2) ; $i += 3) {
  4.       $tres = substr($sec,$i,3);
  5.    
  6.       # Contamos los tripletes                
  7.       $contador = 0;
  8.       $contador++ while $sec =~ /$tres/g;
  9.        
  10.    
  11.       # Declaramos un hash en el cual las claves son los tripletes y el
  12.       # valor asociado las veces que aparecen
  13.       %hash = (
  14.       $tres => $contador,
  15.       );
  16.       print "$tres => $hash{$tres}";
  17.      
  18.     }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Con este programa obtengo lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
CGA => 2
CGA => 2
TCT => 1
TCG => 4
TAC => 1
GGG => 1
ACT => 1
AGC => 1
TCG => 4
TGT => 1
CGG => 2
TCG => 4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El problema es que obtengo los tripletes repetidos ¿Cómo podría solucionarlo para que la salida fuera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
CGA => 2
TCT => 1
TCG => 4
TAC => 1
GGG => 1
ACT => 1
AGC => 1
TGT => 1
CGG => 2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
principiante
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2009-08-16 12:11 @549

Publicidad

Re: Contar tripletes

Notapor explorer » 2009-08-18 04:39 @235

Tienes todas las cosas, pero desordenadas.

Te salen repetidos los tripletes porque no estás usando la facilidad de memoria del diccionario (hash): simplemente, estás imprimiendo todos los que encuentras, porque el print() está dentro del bucle de localización.

Debes primero hacer la estadística y luego sacar los resultados:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $sec = 'CGACGATCTTCGTACGGGACTAGCTCGTGTCGGTCGC';
  7.  
  8. # Declaramos un hash en el cual las claves son los tripletes y el
  9. # valor asociado las veces que aparecen
  10. my %hash;
  11. my $contador = 0;
  12.  
  13. for (my $i=0; $i < length($sec); $i += 3) {
  14.     my $triplete = substr($sec, $i, 3);
  15.  
  16.     last if 3 != length $triplete;  # si estamos al final, no obtendremos un triplete completo,
  17.                                     # así que terminamos el bucle
  18.  
  19.     # Contamos los tripletes
  20.     $hash{$triplete}++;
  21. }
  22.  
  23. # salida de los datos
  24. for my $triplete (sort keys %hash) {
  25.     print "$triplete => $hash{$triplete}\n";
  26. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ACT => 1
AGC => 1
CGA => 2
CGG => 1
GGG => 1
TAC => 1
TCG => 3
TCT => 1
TGT => 1
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar tripletes

Notapor explorer » 2009-08-18 04:51 @243

Ahora me surge una duda...

En mi programa yo recorro los tripletes y cuento las veces que aparecen. Pero en el tuyo, lo que haces es, por cada triplete, ver cuántas veces aparece a lo largo de la secuencia sin tener en cuanta si el triplete encontrado está dentro de las posiciones múltiplo de 3.

Es decir... que recorres la secuencia sacando tripletes, y por cada uno, busca ese triplete a lo largo de la misma secuencia pero sin tener en cuenta la posición.

Esta forma de proceder es distinta de la presentada por mí. Deberás decidir cuál es la correcta: si considerar la secuencia como una ristra continua de nucleótidos o como una ristra de tripletes.

El ejemplo lo tienes con el triplete TCG: en mi solución salen 3 veces, pero en tu pregunta solicitas que salgan 4 veces (el triplete aparece una vez más en posición no múltiplo de 3).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar tripletes

Notapor principiante » 2009-08-18 05:13 @259

No me había percatado de eso. Pero la solución a lo que busco es la obtenida por tu programa. Muchas gracias.
principiante
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2009-08-16 12:11 @549


Volver a Bioinformática

¿Quién está conectado?

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