Muchos de vosotros ya sabréis de la importancia de los alineamientos de secuencias en bioinformática, puesto que tienen aplicaciones en cosas tan diferentes como la predicción de genes en genomas o la predicción de estructura secundaria en proteínas.
Los algoritmos de alineamiento de secuencias, como BLAST (Altschul et al., 1997), usan matrices de sustitución para dirigir el proceso de alineamiento. Para proteínas, una de las matrices más conocidas es BLOSUM62 (Henikoff & Henikoff, 1993).
|
En este ejemplo vamos a construir una matriz de sustitución de aminoácidos, como BLOSUM62, pero basada en el código genético. La hipótesis que vamos a manejar es que los aminoácidos cuyos codones se parecen más son más fácilmente intercambiables, olvidándonos por un momento de sus propiedades bioquímicas.
#!/usr/bin/perl -w # Ejercicio escrito por Bruno Contreras en Julio de 2005 # Programa que calcula una matriz de sustitución de aminoácidos basándose únicamente en el parecido de # sus codones de tRNA use strict; my %tripletes = ( 'F' => ['TTT','TTC'], 'L' => ['TTA','TTG','CTT','CTC','CTA','CTG'], 'S' => ['TCT','TCC','TCA','TCG','AGT','AGC'], 'Y' => ['TAT','TAC'], 'C' => ['TGT','TGC'], 'W' => ['TGG'], 'P' => ['CCT','CCC','CCA','CCG'], 'H' => ['CAT','CAC'], 'Q' => ['CAA','CAG'], 'R' => ['CGT','CGC','CGA','CGG','AGA','AGG'], 'I' => ['ATT','ATC','ATA'], 'M' => ['ATG'], 'T' => ['ACT','ACC','ACA','ACG'], 'N' => ['AAT','AAC'], 'K' => ['AAA','AAG'], 'V' => ['GTT','GTC','GTA','GTG'], 'A' => ['GCT','GCC','GCA','GCG'], 'D' => ['GAT','GAC'], 'E' => ['GAA','GAG'], 'G' => ['GGT','GGC','GGA','GGG'], 'X' => ['XXX'], ); my @aa = ('A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V','X'); my $MAXPUNTUACION = 0; # máximo valor de la matriz de sustitución # es una matriz de costes, con números negativos my ($aa1,$aa2,$cod1,$cod2,@codones1,@codones2); my ($dist,$distmedia); print "# Matriz de sustitución de aminoácidos basada en el código genético\n"; print " A R N D C Q E G H I L K M F P S T W Y V X\n"; foreach $aa1 (@aa) { @codones1 = @{ $tripletes{$aa1} }; # toma todos los codondes correspondientes a $aa1 print "$aa1 "; foreach $aa2 (@aa) { if($aa1 eq $aa2){ print " $MAXPUNTUACION "; } else { @codones2 = @{ $tripletes{$aa2} }; # toma todos los codondes correspondientes a $aa2 $distmedia = 0; foreach $cod1 (@codones1) { foreach $cod2 (@codones2) { # cuenta el número de cambios que hay que hacer para pasar de un codón a otro (máximo 3) $dist = 0; if(substr($cod1,0,1) ne substr($cod2,0,1)){ $dist++; } if(substr($cod1,1,1) ne substr($cod2,1,1)){ $dist++; } if(substr($cod1,2,1) ne substr($cod2,2,1)){ $dist++; } # recuerda la distancia entre estos dos codones para calcular la media entre aa1 y aa2 $distmedia += $dist; } } # calcula la distancia media entre aa1 y aa2 $distmedia /= (scalar(@codones1)*scalar(@codones2)); $distmedia = int($distmedia); # imprime el coste medio para pasar de aa1 a aa2 print "-$distmedia "; } } print "\n"; }
¿Se te ocurre cómo modificar el algoritmo?