• Publicidad

Dividir en codones

Perl aplicado a la bioinformática

Dividir en codones

Notapor Lumyjj » 2009-12-27 07:11 @341

Relacionado con este tema tengo yo una duda. Necesito pasar de una variable escalar de la forma acccgtttauuugt a un array de esta otra forma: acc, cgt, tta, ... etc. Es decir, que me divida el escalar en grupos de 3 elementos y cada grupo como una variable del array. Tengo que hacer un trabajo sobre qué codón es el más usado para codificar cada proteína y estoy hecha un lío.

Gracias.
Lumyjj
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-12-27 07:05 @336

Publicidad

Re: Extraer y guardar datos en un array

Notapor explorer » 2009-12-27 08:49 @409

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

Para separar (o extraer) los codones, puedes usar la función subtr().

Recorres todo el escalar usando un bucle ternario for(). Usa length() para saber la longitud del escalar. Luego, extraes el codón según la variable índice del bucle for(). Lo que no sé es si debes extraerlo desde el final o desde el principio.

Si quieres llevar la cuenta del codón más popular, los metes como claves de un hash, que irás incrementando en uno cada vez que veas el mismo codón.

Finalmente, haces un bucle por las claves del hash (los codones vistos), sacando las veces que se repite. El mayor de ese número será el más popular.

Inténtalo y nos muestras el código que vayas haciendo, y te daremos más ayudas.
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: Dividir en codones

Notapor Lumyjj » 2009-12-27 11:51 @535

Gracias por la respuesta :)

Entonces, para meter los codones en un array, ¿tendría primero que crear un array vacío y luego concatenar los resultados del subtr()? ¿Es posible?

El problema que tengo con lo del codón más usado es que no sólo es el más usado sino el más usado para cada aminoácido, es decir, tengo que separar de alguna forma cada uno de los aminoácidos y de cada uno decir el que más se utiliza, y la verdad es que no tengo muy claro cómo podría hacerlo.

¡Gracias por la ayuda!
Lumyjj
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-12-27 07:05 @336

Re: Dividir en codones

Notapor explorer » 2009-12-27 14:31 @646

Lumyjj escribiste:Entonces, para meter los codones en un array, ¿tendría primero que crear un array vacío y luego concatenar los resultados del subtr()? ¿Es posible?
Sí, pero no sé qué plan tienes pensado. Ya te he dado un guión de cómo se puede hacer, y en él no es necesario usar ningún array.

Lumyjj escribiste:El problema que tengo con lo del codón más usado es que no sólo es el más usado sino el más usado para cada aminoácido, es decir, tengo que separar de alguna forma cada uno de los aminoácidos y de cada uno decir el que más se utiliza, y la verdad es que no tengo muy claro cómo podría hacerlo.
En estos hilos hemos comentado la conversión entre codones y aminoácidos. Usa el sistema de búsqueda, y busca por la palabra "codones".

Es mejor que desarrolles un plan de qué es lo que quieres hacer, una especie de guión. Y luego detallarlo poco a poco hasta que sea fácil trasladar ese guión a Perl.
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: Dividir en codones

Notapor Lumyjj » 2009-12-28 10:12 @466

He buscado en el foro y la verdad es que no he encontrado respuesta a mis dudas, quizá no he sabido buscar bien.

Mi problema es que no es simplemente dividir en codones y ver el más usado, sino ver el más usado para cada aminoácido, estando todos mezclados.

El caso es que le doy vueltas y vueltas y no se me ocurre ninguna manera de conseguir al final tener un hash con todos los aminoácidos por un lado y cada uno de ellos con el codón que más se ha usado.

He pensado que lo que podría hacer sería dividir el escalar que tiene todos los aminoácidos en grupos de 3 (para formar los codones) y meterlos todos en un array en el mismo orden, para que así el primer elemento del array de aminoácidos se corresponda con el primer codón del otro array.

A partir de aquí no sé si sería buena idea irle preguntando al programa que busque en el array de aminoácidos, uno por uno, todos los aminoácidos que existen, por ejemplo, el "M", y cada vez que encuentre un "M", de alguna forma, se vaya a la misma posición en la que ha encontrado el aminoácido, pero del otro array de codones y que ese codón lo incluya en otro array, así con todas las "M" que encuentre. Teniendo todos los codones en un array no sé sin embargo cómo pedirle que me de el que más veces aparece en el array y lo introduzca en el hash.

Por otro lado, una duda que tengo, y que tendré que preguntarle a mi profesor, es si es posible hacer el programa pidiéndole que busque en el array todos los aminoácidos que existen o tengo que hacerlo para que el hash se vaya completando sin yo darle información de cuáles son los aminoácidos que existen.

Muchas gracias y siento las molestias, estoy bastante pesada pero es que con el programa me juego el aprobado o el suspenso y por ahora lo veo todo bastante negro...
Lumyjj
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-12-27 07:05 @336

Re: Dividir en codones

Notapor explorer » 2009-12-28 11:01 @500

Para construir un programa, debes conocer los ladrillos y el tipo de ladrillos que puedes componer para que resuelva el problema.

Debes tener en cuenta las diferencias de funcionamiento entre un array y un hash, para poder decidir qué usar a cada momento.

También debes pensar en cómo representar la información que vas a manejar, tanto la de partida, con la lista de aminoácidos que corresponden a cada codón, como la de salida, guardar un contador por cada aminoácido.

Lo mejor es preparar un plan de trabajo de cómo lo resolverías con lápiz y papel.

Ejemplo de resolución:
Problema:
* Dada una secuencia genómica, dividirla en codones.
* Cada codón representa a un aminoácido.
* Contar el número de veces que aparece cada aminoácido en la secuencia.
* Mostrar el aminoácido que más veces aparece.

Una vez que tengo descrito el problema, si hay partes que no están claras, las desmenuzo un poco más.

Por ejemplo, la parte de buscar el aminoácido que más veces se repite se puede describir como:
* Tengo una variable llamada $max que guardará el nombre del aminoácido que más veces se repite
* Tengo una variable llamada $veces que guardará el número de veces que se repite. Inicialmente valdrá 0.
* Hago un bucle por todos los aminoácido que he leído. Por cada $aminoácido, hago:
* Extraigo el $nombre del aminoácido y las $repeticiones que ha tenido
* Si las $repeticiones son mayores que las $veces, es que he encontrado un aminoácido que se repite más veces, luego
* { hago que $veces = $repeticiones, y $max = $nombre, para recordar qué aminoácido es el que más veces se repite }
* Y así para todos los aminoácidos
* Al final, imprimir los valores de $nombre y $veces.

Ya solo me queda pasar lo escrito a Perl, lo cual es muy sencillo porque Perl es un lenguaje muy cercano al natural:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $max;
my $veces = 0;
for my $aminoacido (@aminoacidos) {
    my %hash         = %{$aminoacido};   # El $aminoacido es una referencia a un hash
    my $nombre       = $hash{ nombre };
    my $repeticiones = $hash{ veces  };

    if ($repeticiones > $veces) {
        $max   = $nombre;
        $veces = $repeticiones;
    }
}
print "El aminoacido $max aparece $veces veces.\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Realmente, estoy siguiendo los mismos pasos que yo haría si solo tuviera a mi disposición un lápiz y un papel.

No se trata de forzarte a usar un hash porque yo lo diga. Solo digo que en problemas similares yo siempre he usado un hash. Los hash me sirven para recordar cosas, y en este tipo de problemas, hay que recordar varias (qué aminoácido corresponde a cada codón, un contador por cada aminoácido). Pero, naturalmente, en Perl se puede hacer de muchas otras formas.

En el ejemplo que te he puesto, he elegido una estructura de datos de un array de hashes. Eso quiere decir que tengo una lista de valores (el array), que cada uno de ellos es un hash, donde guardo el nombre y las veces que aparece un aminoácido. Pero se podría haber hecho como una estructura de un array de arrays, o de forma más simple, un hash, cuyas claves fueran los nombres de los aminoácidos, y los valores, las veces que salen. En este caso, queda incluso más corto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $max;
my $veces = 0;
for my $nombre (keys %aminoacidos) {          # Para todos los aminoácidos
    my $repeticiones = $aminoacidos{$nombre}; # Vemos las veces que se repite

    if ($repeticiones > $veces) {             # ¿Supera el récord?
        $max   = $nombre;                     # Sí, nos quedamos con su nombre
        $veces = $repeticiones;               # y las veces que sale
    }
}
print "El aminoacido $max aparece $veces veces.\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ya tienes la parte final de tu programa. Ahora solo tienes que decidir cómo guardar la información mientras vas leyendo. Comienza con algo sencillo: intenta leer los codones desde la secuencia y déjalos en un array. Publica el código que vayas probando y te echaremos una mano (o un par de teclas, mientras el profesor no se entere).
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: Dividir en codones

Notapor Lumyjj » 2009-12-29 05:33 @273

¡Lo siento! Creo que no me expliqué muy bien.

El problema del programa sería:
* Dada una secuencia de proteínas, junto a los codones que codifican cada una de estas:
* Buscar para cada proteína cuál es el codón más repetido (ya que codones diferentes pueden codificar un mismo aminoácido).
* Hacer un hash en el que aparezcan por un lado todos los aminoácidos y por otro los codones más usados en la secuencia que se nos dio, para cada uno de ellos.
* A partir de este hash (de los más repetidos) traducir una secuencia de nucleótidos en proteínas y compararla con la traducción real.

Al final lo que estoy viendo que será más sencillo es, haciendo uso de la tabla de esta página: http://es.wikipedia.org/wiki/Cod%C3%B3n, pedirle que me encuentre por ejemplo todas las Tirosinas dentro de un hash que habría hecho previamente en el que habría introducido todos los aminoácidos de la secuencia, repetidos, tal cual me venían, con sus codones en la otra "columna", y luego pedirle que me busque las veces que se repite UAU y UAC en las tirosinas que ha encontrado ya que estos son los dos codones que pueden codificarla. Es un latazo porque tendría que hacer lo mismo como 20 veces, pero es la única forma que se me ocurre y que esté a mi alcance, porque la verdad es que como se puede ver, no llevo mucho con Perl y tampoco se me da muy bien, ¡ja,ja! xD ¡Lo único que espero es que a mi profesor no le importe tanto como para suspenderme por hacer eso @.@!

Gracias por la explicación, lo del contador me lo estudiaré mejor para comprenderlo bien y lo usaré para contar los distintos codones, y según cuál salga más veces, ese será el que corresponda al aminoácido que estaba estudiando. Por ejemplo, si sale más veces UAU, pues en otro hash introduzco la "Tirosina" por un lado y asociada a ella, "UAU".
Lumyjj
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-12-27 07:05 @336

Re: Dividir en codones

Notapor explorer » 2009-12-29 07:23 @349

Lumyjj escribiste:* Buscar para cada proteína cuál es el codón más repetido (ya que codones diferentes pueden codificar un mismo aminoácido).

En principio, eso se hace con hash en cuyas claves son los codones, y los valores son las veces que se repiten.

Lumyjj escribiste:* Hacer un hash en el que aparezcan por un lado todos los aminoácidos y por otro los codones más usados en la secuencia que se nos dio, para cada uno de ellos.

Sí, pero ¿qué significa "más usados"?

La construcción de ese hash es muy parecida a la indicada en este hilo: un hash de array, cada aminoácido dirige a una lista de codones.

Lumyjj escribiste:* A partir de este hash (de los más repetidos) traducir una secuencia de nucleótidos en proteínas y compararla con la traducción real.

Esto yo ya no lo veo claro... habría que explicarlo un poco más. Ten en cuenta que un hash guarda sus claves de forma desordenada, por lo que no te vale para recrear una secuencia.

Lumyjj escribiste:Al final lo que estoy viendo que será más sencillo es, haciendo uso de la tabla de esta página: http://es.wikipedia.org/wiki/Cod%C3%B3n, pedirle que me encuentre por ejemplo todas las Tirosinas dentro de un hash que habría hecho previamente en el que habría introducido todos los aminoácidos de la secuencia, repetidos, tal cual me venían, con sus codones en la otra "columna", y luego pedirle que me busque las veces que se repite UAU y UAC en las tirosinas que ha encontrado ya que estos son los dos codones que pueden codificarla. Es un latazo porque tendría que hacer lo mismo como 20 veces, pero es la única forma que se me ocurre

A ver... una cosa es buscar algo dentro de una secuencia. Y otra cosa es leer la secuencia e irme encontrando esos "algo". Desde luego, es más efectiva la segunda opción, ya que no tiene en cuenta aquellos aminoácidos que no aparecen. Y a no ser que efectivamente no me interese saber aquellos que no aparecen.

Piensa también una cosa: si algo lo tienes que repetir 20 veces, es que lo estás haciendo mal. Quizás funcione, pero es muy posible que esas 20 veces se pueda reducir a un único caso genérico.

Lumyjj escribiste:Gracias por la explicación, lo del contador me lo estudiaré mejor para comprenderlo bien y lo usaré para contar los distintos codones, y según cuál salga más veces, ese será el que corresponda al aminoácido que estaba estudiando. Por ejemplo, si sale más veces UAU, pues en otro hash introduzco la "Tirosina" por un lado y asociada a ella, "UAU".

Sigues sin decir cuál es la discriminación a usar... ¿qué significa que "sale más veces"? ¿Comparado con qué?

Repito que lo más fácil es que lo intentes hacer con lápiz y papel, y luego, pasarlo a código. Hasta que no nos enseñes algo de código, poco más podemos ayudarte.
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: Dividir en codones

Notapor Lumyjj » 2009-12-29 10:59 @499

Estoy haciendo lo que me has aconsejado y lo estoy escribiendo todo en un papel para aclarar mis ideas :)

Una pregunta: sobre los hashes que no tengo muy clara: ¿cómo se crea un hash vacío, en el que luego ir añadiendo valores? ¿my %hash ('','')?

Y luego, para añadirle valores, ¿podría hacerlo de esta forma: %hash = ('valor1' , 'valorqueasocioalvalor1')? ¿o de qué forma se concatenan valores?

¿En arrays se haría, por otra parte, de esta forma: @arrayalquequieroañadirvalores .= $valorquequieroañadiraarray?

¡Gracias! Voy a seguir dándole vueltas al problema, a ver si saco algo en claro :)
Lumyjj
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2009-12-27 07:05 @336

Re: Dividir en codones

Notapor explorer » 2009-12-29 12:09 @548

Es que ese es tu principal problema, Lumyjj: no sabes la sintaxis de Perl.

Debes repasar los apuntes de clase, mirar manuales y tutoriales de Perl para aprender la sintaxis básica. En este foro tienes algunos (enlace, arriba, donde pone Tutoriales. Leete el Perl Básico Parte 1). También un enlace a Por dónde empezar.

Para declarar un hash : my %hash;
Para declarar un array: my @array;

Para declarar e inicializar un hash : my %hash = ( clave => 'valor', );
Para declarar e inicializar un array: my @array = ( 'valor', 'valor2',);

Para agregar valores a un hash : $hash{clave} = 'valor';
Para agregar valores a un array: $array[$indice] = 'valor';

Obviamente, estas son solo unas formas de hacerlo. En Perl se puede hacer de otras formas. En los enlaces que te he dado en los mensajes anteriores hay ejemplos de códigos en los que puedes ver cómo inicializar y usar los hash y array.

También se pueden agregar elementos a un array con las funciones shift(), unshift(), push() y pop(), según quieras que entren los elementos por el principio o el final.
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

Siguiente

Volver a Bioinformática

¿Quién está conectado?

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