Página 1 de 1

Contar y agrupar aminoácidos de diferentes TF

NotaPublicado: 2012-02-04 16:51 @744
por zipetardix
Hola a todos.

Tengo un problema con un script que tengo que hacer en Perl. Llevo muchos días intentando solucionarlo pero no hay manera. Ahí va:

Tengo una lista en .txt formada por una columna de tipo de factor de transcripción (TF) y otra formada por sus aminoácidos. ej:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
TF1     ATLHLSNIPPSVTMDDLKNLFEAGCSVKAFKFFQKDRKMALIQLGSVEEAIQALIELHNHDLGENHHLRVSFSKS
TF1     ATLHLSNIPPSVTVDDLKNLFEAGCSVKAFKFFQKDRKMALIQLGSVEEAIQALIELHNHDLGENHHLRVSFSKS
TF1     ATLHLSNIPQNVTEDDLRLLFNTGGTVKAFKFFQDRKMALIQMSTVEEAIQALIDLHNYNMGGNQHLRVSFSKS
TF2     GKMFVGGLSWDTSKKDLKDYFTKFGDVSDCTIKFDSDSGRSRGFGFVLFKDPSSVEKVLQQKEHRLDGRLIDPKRAMAMKKEPV
TF2     GKMFVGGLSWDTSKKDLKDYFTKFGEVSDCTIKFDSDSGRSRGFGFVLFKDPSSVKKVLEQKEHRLDGRLIDPQRAMAMKKEPV
TF3     GKMFVGGLSWDTSKKDLKDYFTKFGEVTDCTIKMDPNTGRSRGFGFILFKEPGSVEKVLEQKEHRLDGRLIDPKKAMAMKKDPVKK
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

[etc]

Lo que necesito es simple: tengo que conseguir que me lea los aminoácidos de cada TF, distinga qué TF es y me los agrupe en ese TF cada a.a. con su frecuencia. Para ello sé que tengo que trabajar con hashes y eso. Mi problema es que de Perl controlo más bien poco, pero bueno, ahí va lo que llevo escrito hasta ahora:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4.  
  5.  
  6. my $arg0 = $ARGV[0];
  7. if ( !$arg0 ){
  8.    print STDERR "Usage: $0 file_name\n";
  9.    exit(0);
  10. }
  11.  
  12.  
  13. open(FILE,"<$arg0") or die("cannot open $arg0");
  14.  
  15. while (<FILE>){
  16.     chomp;
  17.    
  18.     my ($id, $seq) = split("\t", $_);
  19.     my $i=0;
  20.     my %TF1;
  21.     if ( $id eq 'TF1') {
  22.          
  23.        
  24.         my @TF1_aa = split(//,$seq);
  25.  
  26. #       for(my $i=0; $i < scalar(@TF1_aa); $i++){
  27. #        $TF1{$TF1_aa[$i]}++;    
  28. # esto es lo que nos han dado como ejemplo para trabajar pero con esto el hash se llena con TODOS los aminoácidos de la lista sin distinguir el tipo de TF. Así pues, cambié a if/elsif pero dentro de estas condiciones veo que no puedo declarar un for y por ello pasé a while
  29.  
  30.         while ($i < scalar(@TF1_aa)){ $i++;                            
  31.         $TF1{$TF1_aa[$i]}++};
  32.  
  33.                         my @aa  = keys( %TF1 );
  34.                         my @aa_count  = values( %TF1 );
  35.                         print "@aa\n";
  36.                         print "@aa_count\n";
  37. # estos print los pongo para poder ver cómo está trabajando el script y si está haciendo lo que quiero o no
  38.  
  39.  
  40.     } elsif ($id eq 'TF2') {
  41.  # aquí repito lo anterior pero cambiándolo por $TF2 y así elsif con todos los tipos que tengo en la lista
  42.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Vale, pues ejecutando este script me da el siguiente output:


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 1.
 S F T N K E Y V Q M C L A P D R I G
1 6 6 4 2 5 5 4 6 2 1 1 6 5 2 7 7 3 6
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 2.
 F S T N K E Y V Q L A W P D R I G
1 4 3 2 4 2 7 3 7 1 4 8 1 3 5 8 2 9
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 3.
 F S T K E Y V Q C L A W P D R I G
1 4 4 2 2 6 2 9 1 1 4 7 1 3 7 10 3 7
Use of uninitialized value within @TF1_aa in hash element at test.pl line 31, <FILE> line 4.
 F S T N K E Y V Q L A P H D I R G
1 5 3 1 2 5 6 3 5 1 6 2 1 2 8 5 7 8
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

[...]

y así hasta que termina con todas las líneas en las que $id eq 'TF1'.

Pues eso, quiero que me las agrupe todas dentro del hash %TFn y no me vaya dando el resultado una a una sin almacenarlas.

Muchas gracias por adelantado.

Re: Contar y agrupar aminoácidos de diferentes TF

NotaPublicado: 2012-02-04 20:59 @916
por explorer
Bienvenido a los foros de Perl en español, zipetardix.

Pues... la pista que te han dado es muy buena... es más: es justo lo que puedes usar para resolver el problema:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. @ARGV == 1  or  die "Usage: $0 <archivo TF>\n";
  6.  
  7. my $archivo = $ARGV[0];
  8.  
  9.  
  10. # Estructura donde guardaremos la información
  11. # Cada clave de %TF corresponde a un TF
  12. # y su valor correspondiente es una referencia a un hash,
  13. # cuyas claves serán los aminoácidos, y sus valores, las veces que aparecen.
  14. my %TF;
  15.  
  16. open(my $FILE, '<', $archivo) or die "cannot open $archivo: $!\n";
  17.  
  18. while (<$FILE>) {
  19.     chomp;
  20.    
  21.     my ($id, $seq) = split;                             # (¡magia!)
  22.    
  23.     my @TF_aa = split(//, $seq);
  24.  
  25.     for my $aa (@TF_aa) {
  26.         $TF{$id}{$aa}++;                                # ¡Ta chán!
  27.     }
  28. }
  29.  
  30. close $FILE;
  31.  
  32. for my $id (sort keys %TF) {
  33.     for my $aa (sort keys %{$TF{$id}}) {
  34.         print "[$id][$aa][$TF{$id}{$aa}]\n";
  35.     }
  36. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[TF1][A][17]
[TF1][C][2]
[TF1][D][12]
[TF1][E][13]
[TF1][F][15]
[TF1][G][10]
[TF1][H][13]
[TF1][I][12]
[TF1][K][16]
[TF1][L][29]
[TF1][M][6]
[TF1][N][14]
[TF1][P][5]
[TF1][Q][11]
[TF1][R][7]
[TF1][S][19]
[TF1][T][9]
[TF1][V][13]
[TF1][Y][1]
[TF2][A][4]
[TF2][C][2]
[TF2][D][19]
[TF2][E][7]
[TF2][F][14]
[TF2][G][16]
[TF2][H][2]
[TF2][I][4]
[TF2][K][24]
[TF2][L][12]
[TF2][M][6]
[TF2][P][6]
[TF2][Q][4]
[TF2][R][10]
[TF2][S][16]
[TF2][T][6]
[TF2][V][12]
[TF2][W][2]
[TF2][Y][2]
[TF3][A][2]
[TF3][C][1]
[TF3][D][8]
[TF3][E][5]
[TF3][F][6]
[TF3][G][9]
[TF3][H][1]
[TF3][I][3]
[TF3][K][15]
[TF3][L][6]
[TF3][M][4]
[TF3][N][1]
[TF3][P][4]
[TF3][Q][1]
[TF3][R][4]
[TF3][S][4]
[TF3][T][5]
[TF3][V][5]
[TF3][W][1]
[TF3][Y][1]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Es decir: usamos una estructura bidimensional para guardar toda la información. En las "filas" de esa estructura están los TF, mientras que las "columnas" son los aminoácidos.

Re: Contar y agrupar aminoácidos de diferentes TF

NotaPublicado: 2012-02-05 05:03 @252
por zipetardix
Pues muchísimas gracias. A veces uno empieza a complicarse él solo y acaba con un cacao importante.

Ahora para el siguiente paso mi pregunta es muy sencilla pero no me sale la respuesta por mi mismo: ¿Cómo puedo hacer para sacar la frecuencia relativa de cada aminoácido dentro de cada TF? Algo tal que así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         print STDOUT $TF{$id}{$aa}/ $totaldeaadelTF;
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


EDITO:

¿Sería posible asignar como valores dichas frecuencias relativas? Esto es debido a que en realidad esos son los datos con los que he de trabajar después y entonces si pudiera acceder a cada uno de ellos como una "coordenada" del hash para posteriores operaciones me sería totalmente salvador...

Entiendo que tal vez sea ya pedir demasiado, pero lo pregunto porque quizá sea más sencillo de lo que me parece....

Re: Contar y agrupar aminoácidos de diferentes TF

NotaPublicado: 2012-02-05 06:52 @327
por explorer
El número total de aminoácidos por cada TF, es, justamente, scalar(@TF_aa), así que te vale con tener un a variable sumatorio antes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %totales_aa;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y luego ir sumando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     $totales_aa{$id} += @TF_aa;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y para guardar las frecuencias, puedes hacerlo en el mismo lugar en que guardas el número de aminoácidos. Pero esto hay que hacerlo una vez leídos todos los TF, así que, por ejemplo, puedes hacerlo todo en el último bucle:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $id (sort keys %TF) {
  2.     my $n = $totales_aa{$id};
  3.     for my $aa (sort keys %{$TF{$id}}) {
  4.         my $a = $TF{$id}{$aa};
  5.         my $m = $a/$n;
  6.         print "[$id][$aa][$a][$n][$m]\n";
  7.         $TF{$id}{$aa} = $m;
  8.     }
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
De forma más abreviada,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $id (sort keys %TF) {
  2.     my $n = $totales_aa{$id};
  3.     for my $aa (sort keys %{$TF{$id}}) {
  4.         $TF{$id}{$aa} /= $n;
  5.     }
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Contar y agrupar aminoácidos de diferentes TF

NotaPublicado: 2012-02-05 08:13 @384
por zipetardix
Pues muchísimas gracias por todo, me funciona perfectamente. Voy a ver si puedo seguir yo solo desde aquí... Ahora tengo que, de diferentes secuencias prueba de aminoácidos, predecir a qué grupo de TF pertenecería multiplicando cada aminoácido que aparezca por la frecuencia obtenida en cada uno de los distintos tipos de TF, obteniendo un valor diferente para uno y quedándome con el más alto. ¡A ver si hay suerte!

De todas formas insisto en agradecer toda la ayuda obtenida hasta ahora, me ha salvado.