• Publicidad

Alineamiento múltiple

Perl aplicado a la bioinformática

Re: Alineamiento múltiple

Notapor explorer » 2014-01-20 14:14 @635

Marne escribiste:Os dejo el programa funcional hasta la línea 380,
solo me queda un problemilla más, a partir de dicha línea.
Me gustaría que repitiera lo que es el programa en sí pero
haciendo un reverse de cada string para que me dé otro
resultado de alineamiento pero con las cadenas al revés.
Lo he intentado pero no sé cómo hacerlo... Si pudierais
echarme un último cable, yo feliz, y si no, pues haré los
estudios solo con las cadenas del derecho. Muchas gracias
por toda la ayuda prestada hasta conseguir que me funcionara esto.

En ese caso, en la parte principal del programa le das la vuelta a las secuencias, y llamas a las subrutinas otra vez.

En este foro de bioinformática hay algunos ejemplos, sobre todo en lo referente de obtención de la complementaria de una secuencia de ADN.

Para dar la vuelta a las secuencias, se puede usar la función reverse():
reverse LISTA
En contexto de lista, devuelve una lista de valores consistente en los elementos de LISTA en el orden opuesto.
En contexto escalar, concatena los elementos LISTA y devuelve un valor de cadena con todos los caracteres en
orden inverso.

print join(", ", reverse "mundo", "Hola"); # Hola, mundo

print scalar reverse "odnum ,", "aloH"; # Hola, mundo

Si se utiliza sin argumentos en contexto escalar, reverse() invierte $_.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Alineamiento múltiple

Notapor Marne » 2014-01-20 16:27 @727

El problema lo encuentro al intentar hacerlo con una array por que el resultado que me da
es este:

print scalar reverse @ss;
CCGTAATACAACATCTAGACAAGAGCAAAGTGTTCCTGTCGTAGCTACATGCATTCCGCGGCTGATACGGGGTAATGCCCGCACGGGTAGAGACACACCTGTTCCATAGACACAGCACGGCGGAATAGCCTGGTAGTTTTGCTTAGGCCCCTATATACCCGGAGCCTATAGAGAGCTTCGTCTGGTCTGTGACACAGGGTCCCTATCGAGGCTCTTCATGACGCTCGCTCTCCGGGAAGCGTCAACGGCGCCCAGCTGACCAATGTGGCCCTGTCATCGCTAGTTAAAAGTGTCTGGTGACTGTCTCTCACTGTGCTATCGAGATGGGCGGTGCAAGGGGCTCCGCGTAGTCTTGGCCGCGCTATAATAGTCGTCTGAAGATAGATAAGCCTTAAGCTCA

Me junta las cadenas en una sola, con lo que ya no puedo seguir con la comparación que coge las cadenas de 2 en 2.

Yo lo intenté haciendo esta subrutina,

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Reverse_ss {
  2.     @ssRev = reverse @ss;
  3.     foreach $linea (@ss) {
  4.         push( @ssRev, reverse $linea );
  5.     }
  6.     return "@ssRev";
  7. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Y luego llamándola así:

Reverse_ss(@ss);

Al hacerlo con un <STDIN> en vez de cogiendo los datos del @ss, me funciona. El problema es que no sé dónde
se encuentra el problema al tratar de simplemente darle la vuelta al @ss e introducirlo en otro array @ssRev
para que me repita el procedimiento de alineamiento pero con las cadenas al revés.
Marne
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-11-12 06:46 @324

Re: Alineamiento múltiple

Notapor explorer » 2014-01-20 19:44 @863

A ver... Una cosa es darle la vuelta a un array y otra es darle la vuelta a los elementos de un array.

Si haces un

@array = reverse @array;

Estás dando la vuelta al array, que quiere decir que el primer elemento se convierte en el último, y el último, en el primero. Sin tener en cuenta qué son cada uno de los elementos. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. > perl -E '@array = qw( ADN 123 CTGC ); say "@array"; @array = reverse @array; say "@array"' 
  2. ADN 123 CTGC 
  3. CTGC 123 ADN 


En cambio, otra cosa es darle la vuelta a los elementos que hay dentro de un array:

@array = map { scalar reverse } @array;

El orden de los elementos se mantiene, pero los elementos son girados, uno a uno. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. > perl -E '@array = qw( ADN 123 CTGC ); say "@array"; @array = map { scalar reverse } @array; say "@array"' 
  2. ADN 123 CTGC 
  3. NDA 321 CGTC 

La función scalar() es necesaria, para obligar a ejecutarse a reverse() en contexto escalar, y que nos devuelva el valor de $_, girado. Si no fuera por scalar(), al ejecutarse en contexto lista, un simple reverse() (sin argumentos), no sabe que tiene que girar la variable por defecto $_, así que piensa que no debe girar nada, por lo que devuelve una lista vacía (o sea, nada). Y si pusiéramos reverse($_), obtendríamos el propio valor de $_ sin girar, ya que reverse cree entonces que está girando una lista de elementos compuestos de un solo elemento.

Resumen:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $_ = "Hola";
  2. print;                          # "Hola"
  3. print reverse;                  # "".     Contexto lista, y no hemos indicado qué, así que no devuelve nada
  4. print reverse $_;               # "Hola". Contexto lista, compuesta de un solo elemento, así que nos devuelve el valor de $_
  5. print scalar reverse;           # "aloH", porque reverse, en contexto escalar, sabe que tiene que dar la vuelta a $_
  6. print scalar reverse $_;        # "aloH". Aquí le decimos qué queremos girar
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Finalmente, es obvio que se pueden querer las dos cosas a la vez: girar el array y girar sus elementos:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. > perl -E '@array = qw( ADN 123 CTGC ); say "@array"; @array = reverse map { scalar reverse } @array; say "@array"' 
  2. ADN 123 CTGC 
  3. CGTC 321 NDA 
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Alineamiento múltiple

Notapor Marne » 2014-01-22 09:45 @448

¡Ole! Me acabas de salvar una vez más. Voy a ver si lo consigo implementar, muchas gracias de nuevo
:) Un saludo

Algo tan simple y no sabes la ventana que me acabas de abrir, de verdad muchas gracias por todo.
Marne
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-11-12 06:46 @324

Anterior

Volver a Bioinformática

¿Quién está conectado?

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