Ejemplo de cómo generar todas las posibles combinaciones de secuencias sinónimas para la proteína MALVSREGPT más un codón de paro que es '>'.
Using perl Syntax Highlighting
#!/usr/bin/perl
use common::sense; # Hay que tener sentido común
#use Modern::Perl; # Somos modernos
#use utf8;
use open qw(:utf8 :std); # Terminal en modo utf8
use autodie; # Es mejor morir que regresar con deshonor (proverbio Klingon)
my %código_genético = (
'AAA' => 'K',
'AAC' => 'N',
'AAG' => 'K',
'AAT' => 'N',
'ACA' => 'T',
'ACC' => 'T',
'ACG' => 'T',
'ACT' => 'T',
'AGA' => 'R',
'AGC' => 'S',
'AGG' => 'R',
'AGT' => 'S',
'ATA' => 'I',
'ATC' => 'I',
'ATG' => 'M',
'ATT' => 'I',
'CAA' => 'Q',
'CAC' => 'H',
'CAG' => 'Q',
'CAT' => 'H',
'CCA' => 'P',
'CCC' => 'P',
'CCG' => 'P',
'CCT' => 'P',
'CGA' => 'R',
'CGC' => 'R',
'CGG' => 'R',
'CGT' => 'R',
'CTA' => 'L',
'CTC' => 'L',
'CTG' => 'L',
'CTT' => 'L',
'GAA' => 'E',
'GAC' => 'D',
'GAG' => 'E',
'GAT' => 'D',
'GCA' => 'A',
'GCC' => 'A',
'GCG' => 'A',
'GCT' => 'A',
'GGA' => 'G',
'GGC' => 'G',
'GGG' => 'G',
'GGT' => 'G',
'GTA' => 'V',
'GTC' => 'V',
'GTG' => 'V',
'GTT' => 'V',
'NNN' => 'X',
'TAA' => '>',
'TAC' => 'Y',
'TAG' => '>',
'TAT' => 'Y',
'TCA' => 'S',
'TCC' => 'S',
'TCG' => 'S',
'TCT' => 'S',
'TGA' => '>',
'TGC' => 'C',
'TGG' => 'W',
'TGT' => 'C',
'TTA' => 'L',
'TTC' => 'F',
'TTG' => 'L',
'TTT' => 'F',
);
my $secuencia = 'MALVSREGPT';
my $secuencia_original = $secuencia;
$secuencia = "$secuencia>"; # Le añadimos el codón de final
my @codones_secuencia; # Array de array de codones
## Análisis de la secuencia
for my $amino (split //, $secuencia) { # partimos la secuencia, letra a letra
# Buscamos los codones correspondientes
my @codones;
while (my($gen_codón, $amino_gen) = each %código_genético) {
push @codones, $gen_codón
if $amino_gen eq $amino;
}
# say "$amino => [ sort @codones ]";
push @codones_secuencia, [ sort @codones ];
}
## Creación del código
my @sinónimas;
my @constructor;
my $programa = '$" = "";' . "\n";
for my $i (0 .. $#codones_secuencia) {
$programa .= ("\t" x $i) . "for my \$a$i (qw(@{$codones_secuencia[$i]})) {\n";
$programa .= ("\t" x $i) . "\t\$constructor[$i] = \$a$i;\n";
}
$programa .= ("\t" x @codones_secuencia) . qq(push \@sinónimas, "\@constructor";\n);
$programa .= '}' x @codones_secuencia;
#say $programa;
#
say "Generando sinónimas...";
eval $programa;
say "Número de sinónimas: ", scalar @sinónimas;
#
say "Grabando...";
open my $fichero, '>', 'sinonimas';
say $fichero $secuencia_original;
for (@sinónimas) {
say $fichero " $_";
}
close $fichero;
Coloreado en 0.006 segundos, usando
GeSHi 1.0.8.4
La salida del programa es:
Using text Syntax Highlighting
Generando sinónimas...
Número de sinónimas: 1327104
Grabando...
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y el fichero generado es:
Using text Syntax Highlighting
MALVSREGPT
ATGGCACTAGTAAGCAGAGAAGGACCAACATAA
ATGGCACTAGTAAGCAGAGAAGGACCAACATAG
ATGGCACTAGTAAGCAGAGAAGGACCAACATGA
ATGGCACTAGTAAGCAGAGAAGGACCAACCTAA
ATGGCACTAGTAAGCAGAGAAGGACCAACCTAG
ATGGCACTAGTAAGCAGAGAAGGACCAACCTGA
ATGGCACTAGTAAGCAGAGAAGGACCAACGTAA
...
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
y así, 1.327.104 secuencias más.
La teoría de funcionamiento de este programa se basa en la capacidad que tiene Perl de generar más código Perl. En concreto, de la línea 85 a 98 extraemos los codones que intervienen, generando una estructura así:
Using text Syntax Highlighting
@codones_secuencia = (
[
'ATG'
],
[
'GCC',
'GCA',
'GCG',
'GCT'
],
[
'CTG',
'CTC',
'TTG',
'CTT',
'TTA',
'CTA'
], ...
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
que es la traducción de la $secuencia a sus correspondientes codones. En las líneas 100 a 116 generamos $programa, que tendrá este aspecto:
Using perl Syntax Highlighting
$" = "";
for my $a0 (qw(ATG
)) {
$constructor[0
] = $a0;
for my $a1 (qw(GCC GCA GCG GCT
)) {
$constructor[1
] = $a1;
for my $a2 (qw(CTG CTC TTG CTT TTA CTA
)) {
$constructor[2
] = $a2;
for my $a3 (qw(GTG GTT GTA GTC
)) {
...Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
que se encarga de generar todas las combinaciones.
En la 118 lo ejecutamos, y en las 122 a 128, las guardamos a un fichero.
Las secuencias salen ordenadas alfabéticamente, porque ya hicimos la ordenación en la línea 97.