• Publicidad

Problema de bioinformática

Perl aplicado a la bioinformática

Problema de bioinformática

Notapor lopezperl » 2009-11-05 13:15 @593

Hola,

me gustaría que me ayudaseis con un problemilla.
Tengo que hacer el siguiente ejercicio y no sé muy bien cómo:

"Para cada codón, estudie el efecto que puede tener una mutación de un único nucleótido: ¿codificará el mismo o diferente aminoácido? Escribir una subrutina que dado un codón retorne una lista de todos los aminoácidos que podría codificar llevando a cabo una única modificación en el codón."

¡¡¡¡Muchas gracias!!!!
lopezperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-11-05 13:08 @589

Publicidad

Re: hash-es

Notapor explorer » 2009-11-05 14:36 @650

Bienvenido a los foros de Perl en Español, lopezperl.

En cuanto a la pregunta, aquí programamos en Perl. ¿Tiene algo que ver con el problema?

Además, faltan datos para los que no somos bioinformáticos. Sí que podemos saber qué es un codón ya que se ha comentado antes en otros hilos, pero ¿de dónde sacamos la lista de aminoácidos que se pueden codificar?

¿Tienes algún código de pruebas? Publícalo y podremos ayudarte en lo que esté mal.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema de bioinformática

Notapor lopezperl » 2009-11-05 16:57 @748

Hola,

¡¡¡gracias por la bienvenida!!!

Sí, se trata de programación en Perl. Lo que yo he escrito es lo siguiente, pero no me
funciona. Creo que el problema está en la subrutina traducir_cada_codon(). No sé por qué pero dentro de esta subrutina, al invocar otra subrutina llamada traducir(), le paso a esta última como argumento el array entero, en vez de los elementos del array de uno en uno:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;                            
  3. use warnings;
  4.  
  5. print "Introduzca un codón: ";
  6. my $codon= <STDIN>;
  7. chomp $codon;
  8.  
  9. my $imprimir= mutar_codon($codon);
  10. print "\nHe aquí las posibles mutaciones individuales que puede sufrir su codón: $imprimir";
  11.  
  12. my $imprimir2= traducir_cada_codon($codon);
  13. print "\n\nY aquí tenemos los aminoácidos que codifica cada codón mutado: $imprimir2";
  14.  
  15. sub traducir_cada_codon {
  16.         my ($arg_codon)= @_;
  17.        
  18.        
  19.         my %aminoacidos= ();
  20.         my @codones_para_traducir= mutar_codon($arg_codon);
  21.        
  22.         foreach my $elemento (@codones_para_traducir){
  23.                
  24.                
  25.                  $aminoacidos {traduccion ($elemento)}++;
  26.                  
  27.        
  28.         }
  29.        
  30.         return keys %aminoacidos;
  31. }
  32.  
  33. sub mutar_codon{
  34.         my ($arg_codon)= @_;
  35.        
  36.         $arg_codon= uc $arg_codon;
  37.         my @bases= qw(A C G T);
  38.         my $i;
  39.         my @mutaciones= ();
  40.        
  41.         for ($i= 0; $i<3; ++$i){
  42.                 foreach my $base (@bases){
  43.                         my $mutacion= $arg_codon;      
  44.                        
  45.                         if ($base eq substr ($arg_codon,$i,1)){
  46.                                 next;  
  47.                         }else {
  48.                                 substr ($mutacion,$i,1,$base);
  49.                                
  50.                         }
  51.                         push (@mutaciones,$mutacion);  
  52.                        
  53.                 }
  54.         }
  55.         return "@mutaciones";          
  56. }
  57.  
  58. sub traduccion {
  59.     my($codon) = @_;
  60.  
  61.     $codon = uc $codon;
  62.  
  63.     my(%codigo_genetico) = (
  64.    
  65.     'TCA' => 'S',    # Serina
  66.     'TCC' => 'S',    # Serina
  67.     'TCG' => 'S',    # Serina
  68.     'TCT' => 'S',    # Serina
  69.     'TTC' => 'F',    # Fenilalanina
  70.     'TTT' => 'F',    # Fenilalanina
  71.     'TTA' => 'L',    # Leucina
  72.     'TTG' => 'L',    # Leucina
  73.     'TAC' => 'Y',    # Tirosina
  74.     'TAT' => 'Y',    # Tirosina
  75.     'TAA' => '_',    # Stop
  76.     'TAG' => '_',    # Stop
  77.     'TGC' => 'C',    # Cisteina
  78.     'TGT' => 'C',    # Cisteina
  79.     'TGA' => '_',    # Stop
  80.     'TGG' => 'W',    # Triptófano
  81.     'CTA' => 'L',    # Leucina
  82.     'CTC' => 'L',    # Leucina
  83.     'CTG' => 'L',    # Leucina
  84.     'CTT' => 'L',    # Leucina
  85.     'CCA' => 'P',    # Prolina
  86.     'CCC' => 'P',    # Prolina
  87.     'CCG' => 'P',    # Prolina
  88.     'CCT' => 'P',    # Prolina
  89.     'CAC' => 'H',    # Histidina
  90.     'CAT' => 'H',    # Histidina
  91.     'CAA' => 'Q',    # Glutamina
  92.     'CAG' => 'Q',    # Glutamina
  93.     'CGA' => 'R',    # Arginina
  94.     'CGC' => 'R',    # Arginina
  95.     'CGG' => 'R',    # Arginina
  96.     'CGT' => 'R',    # Arginina
  97.     'ATA' => 'I',    # Isoleucina
  98.     'ATC' => 'I',    # Isoleucina
  99.     'ATT' => 'I',    # Isoleucina
  100.     'ATG' => 'M',    # Metionina
  101.     'ACA' => 'T',    # Treonina
  102.     'ACC' => 'T',    # Treonina
  103.     'ACG' => 'T',    # Treonina
  104.     'ACT' => 'T',    # Treonina
  105.     'AAC' => 'N',    # Asparagina
  106.     'AAT' => 'N',    # Asparagina
  107.     'AAA' => 'K',    # Lisina
  108.     'AAG' => 'K',    # Lisina
  109.     'AGC' => 'S',    # Serina
  110.     'AGT' => 'S',    # Serina
  111.     'AGA' => 'R',    # Arginina
  112.     'AGG' => 'R',    # Arginina
  113.     'GTA' => 'V',    # Valina
  114.     'GTC' => 'V',    # Valina
  115.     'GTG' => 'V',    # Valina
  116.     'GTT' => 'V',    # Valina
  117.     'GCA' => 'A',    # Alanina
  118.     'GCC' => 'A',    # Alanina
  119.     'GCG' => 'A',    # Alanina
  120.     'GCT' => 'A',    # Alanina
  121.     'GAC' => 'D',    # Ácido aspártico
  122.     'GAT' => 'D',    # Ácido aspártico
  123.     'GAA' => 'E',    # Ácido glutámico
  124.     'GAG' => 'E',    # Ácido glutámico
  125.     'GGA' => 'G',    # Glicina
  126.     'GGC' => 'G',    # Glicina
  127.     'GGG' => 'G',    # Glicina
  128.     'GGT' => 'G',    # Glicina
  129.     );
  130.  
  131.     if(exists $codigo_genetico{$codon}) {
  132.         return $codigo_genetico{$codon};
  133.     }else{
  134.             print STDERR "\n\"$codon\" no es un codón\n";
  135.             exit;
  136.     }
  137. }
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4


¡¡¡¡Muchas gracias!!!!
lopezperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-11-05 13:08 @589

Re: Problema de bioinformática

Notapor explorer » 2009-11-05 18:58 @832

Sí, hay varios problemas...

mutar_codon() devuelve todas las mutaciones como un valor escalar. Al ponerlo en la línea 55 entrecomillado doble, estamos haciendo un despliegue del contenido del arreglo @mutaciones. Algo así como que la línea

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         return "@mutaciones";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


fuera

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         return join $", @mutaciones;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Como, por defecto, $" vale un carácter espacio, pues el resultado es un escalar en que los codones aparecen juntos en una cadena de caracteres, separados por un espacio en blanco entre cada dos de ellos. Bueno, no hay problema porque eso es justo lo que queremos para dárselo al usuario.

Fíjate, que estás llamando dos veces a mutar_codon(). Una en la línea 9, para informar al usuario, y otra en la 20, para hacer el cálculo.

Y además, en la línea 20 estás intentando ahora leer un arreglo de lo que te devuelve mutar_codon(). Ahí está el fallo gordo, pues mutar_codon() solo devuelve un escalar.

Una primera solución sería hacer un split() del valor escalar, ya que sabemos el aspecto que tiene (el descrito antes). Así, la línea 20 quedaría:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my @codones_para_traducir = split " ", mutar_codon($arg_codon);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y ya tenemos a todos los codones.

Es más, como el resultado ya lo hemos calculado antes, en realidad lo podemos dejar en

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my @codones_para_traducir = split " ", $imprimir;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En la línea 30 devolvemos el resultado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         return keys %aminoacidos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo hace como una lista de valores, por el efecto de keys(). El problema está ahora en la línea 12, ya que estás indicando que lo quieres en realidad es un valor escalar, para luego informar al usuario. Así que necesitamos arreglar esto.

Una solución sería modificar la línea 30 para que devuelva el resultado como un escalar que espera el usuario:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         return join " ", sort keys %aminoacidos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y ya está. El sort() es un aderezo para que la salida de los aminoácidos salga ordenada.

El programa, un poco más limpio, y con un par de cambios más, quedaría:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my (%codigo_genetico) = (
  6.     'TCA' => 'S',    # Serina
  7.     'TCC' => 'S',    # Serina
  8.     'TCG' => 'S',    # Serina
  9.     'TCT' => 'S',    # Serina
  10.     'TTC' => 'F',    # Fenilalanina
  11.     'TTT' => 'F',    # Fenilalanina
  12.     'TTA' => 'L',    # Leucina
  13.     'TTG' => 'L',    # Leucina
  14.     'TAC' => 'Y',    # Tirosina
  15.     'TAT' => 'Y',    # Tirosina
  16.     'TAA' => '_',    # Stop
  17.     'TAG' => '_',    # Stop
  18.     'TGC' => 'C',    # Cisteina
  19.     'TGT' => 'C',    # Cisteina
  20.     'TGA' => '_',    # Stop
  21.     'TGG' => 'W',    # Triptófano
  22.     'CTA' => 'L',    # Leucina
  23.     'CTC' => 'L',    # Leucina
  24.     'CTG' => 'L',    # Leucina
  25.     'CTT' => 'L',    # Leucina
  26.     'CCA' => 'P',    # Prolina
  27.     'CCC' => 'P',    # Prolina
  28.     'CCG' => 'P',    # Prolina
  29.     'CCT' => 'P',    # Prolina
  30.     'CAC' => 'H',    # Histidina
  31.     'CAT' => 'H',    # Histidina
  32.     'CAA' => 'Q',    # Glutamina
  33.     'CAG' => 'Q',    # Glutamina
  34.     'CGA' => 'R',    # Arginina
  35.     'CGC' => 'R',    # Arginina
  36.     'CGG' => 'R',    # Arginina
  37.     'CGT' => 'R',    # Arginina
  38.     'ATA' => 'I',    # Isoleucina
  39.     'ATC' => 'I',    # Isoleucina
  40.     'ATT' => 'I',    # Isoleucina
  41.     'ATG' => 'M',    # Metionina
  42.     'ACA' => 'T',    # Treonina
  43.     'ACC' => 'T',    # Treonina
  44.     'ACG' => 'T',    # Treonina
  45.     'ACT' => 'T',    # Treonina
  46.     'AAC' => 'N',    # Asparagina
  47.     'AAT' => 'N',    # Asparagina
  48.     'AAA' => 'K',    # Lisina
  49.     'AAG' => 'K',    # Lisina
  50.     'AGC' => 'S',    # Serina
  51.     'AGT' => 'S',    # Serina
  52.     'AGA' => 'R',    # Arginina
  53.     'AGG' => 'R',    # Arginina
  54.     'GTA' => 'V',    # Valina
  55.     'GTC' => 'V',    # Valina
  56.     'GTG' => 'V',    # Valina
  57.     'GTT' => 'V',    # Valina
  58.     'GCA' => 'A',    # Alanina
  59.     'GCC' => 'A',    # Alanina
  60.     'GCG' => 'A',    # Alanina
  61.     'GCT' => 'A',    # Alanina
  62.     'GAC' => 'D',    # Ácido aspártico
  63.     'GAT' => 'D',    # Ácido aspártico
  64.     'GAA' => 'E',    # Ácido glutámico
  65.     'GAG' => 'E',    # Ácido glutámico
  66.     'GGA' => 'G',    # Glicina
  67.     'GGC' => 'G',    # Glicina
  68.     'GGG' => 'G',    # Glicina
  69.     'GGT' => 'G',    # Glicina
  70. );
  71.  
  72.  
  73.  
  74. print "Introduzca un codón: ";
  75. my $codon = <STDIN>;
  76. chomp $codon;
  77.  
  78.  
  79. my $mutaciones = mutar_codon($codon);
  80. print "\nHe aquí las posibles mutaciones individuales que puede sufrir su codón: $mutaciones",             "\n\n";
  81. print "Y aquí tenemos los aminoácidos que codifica cada codón mutado: ", traducir_cada_codon($mutaciones), "\n\n";
  82.  
  83.  
  84. sub mutar_codon {
  85.     my ($codon)= @_;
  86.  
  87.     $codon = uc $codon;
  88.  
  89.     my @bases = qw(A C G T);
  90.     my @mutaciones;
  91.  
  92.     for (my $i= 0; $i<3; $i++) {
  93.  
  94.         foreach my $base (@bases) {
  95.  
  96.             my $mutacion = $codon;
  97.  
  98.             if ($base eq substr($codon, $i, 1)) {
  99.  
  100.                 next;                               # No mutamos si la $base es igual a lo que ya tenemos en el codón
  101.             }
  102.             else {
  103.                 substr($mutacion, $i, 1, $base);    # Mutamos el codón cambiando la base $i-ésima por la nueva $base
  104.             }
  105.  
  106.             push @mutaciones, $mutacion;
  107.         }
  108.     }
  109.     return "@mutaciones";                           # Devolvemos las mutaciones separadas por la variable $" (espacio, por defecto)
  110. }
  111.  
  112.  
  113. sub traducir_cada_codon {
  114.     my ($codones_mutados) = @_;
  115.  
  116.     my %aminoacidos;
  117.  
  118.     my @codones_para_traducir = split " ", $codones_mutados;
  119.  
  120.     foreach my $elemento (@codones_para_traducir) {
  121.  
  122.          $aminoacidos{ traduccion($elemento) }++;
  123.     }
  124.  
  125.     return join " ", sort keys %aminoacidos;
  126. }
  127.  
  128.  
  129. sub traduccion {
  130.     my ($codon) = @_;
  131.  
  132.     $codon = uc $codon;
  133.  
  134.     if (exists $codigo_genetico{$codon}) {
  135.         return $codigo_genetico{$codon};
  136.     }
  137.     else{
  138.         print STDERR "ERROR:\n\"$codon\" no es un codón\n";
  139.         exit;
  140.     }
  141. }
  142.  
  143. __END__
Coloreado en 0.005 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: Problema de bioinformática

Notapor lopezperl » 2009-11-06 14:11 @633

¡Muchísimas gracias por responder!
Agradezco mucho tu atención, tu ayuda me ha servido de mucho.

¡Gracias otra vez!¡Chao!
lopezperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-11-05 13:08 @589


Volver a Bioinformática

¿Quién está conectado?

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