Secuencias sinónimas de una proteina
Publicado: 2011-10-31 15:33 @690
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 '>'.
La salida del programa es:
Y el fichero generado es:
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í:
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:
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.
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
Using text Syntax Highlighting
Generando sinónimas...
Número de sinónimas: 1327104
Grabando...
Número de sinónimas: 1327104
Grabando...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Using text Syntax Highlighting
MALVSREGPT
ATGGCACTAGTAAGCAGAGAAGGACCAACATAA
ATGGCACTAGTAAGCAGAGAAGGACCAACATAG
ATGGCACTAGTAAGCAGAGAAGGACCAACATGA
ATGGCACTAGTAAGCAGAGAAGGACCAACCTAA
ATGGCACTAGTAAGCAGAGAAGGACCAACCTAG
ATGGCACTAGTAAGCAGAGAAGGACCAACCTGA
ATGGCACTAGTAAGCAGAGAAGGACCAACGTAA
...
ATGGCACTAGTAAGCAGAGAAGGACCAACATAA
ATGGCACTAGTAAGCAGAGAAGGACCAACATAG
ATGGCACTAGTAAGCAGAGAAGGACCAACATGA
ATGGCACTAGTAAGCAGAGAAGGACCAACCTAA
ATGGCACTAGTAAGCAGAGAAGGACCAACCTAG
ATGGCACTAGTAAGCAGAGAAGGACCAACCTGA
ATGGCACTAGTAAGCAGAGAAGGACCAACGTAA
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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'
], ...
[
'ATG'
],
[
'GCC',
'GCA',
'GCG',
'GCT'
],
[
'CTG',
'CTC',
'TTG',
'CTT',
'TTA',
'CTA'
], ...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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)) {
...
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
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.