• Publicidad

Contar repeticiones secuencias de bases

Perl aplicado a la bioinformática

Re: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-29 22:36 @983

Solo tengo unas dudas respecto al código. En la línea 8 introduces lo siguiente "{ aggregate => 0 }" ¿cuál fue el objetivo de esto?

Estuve investigando qué hace la función "pos()" y no me ha quedado muy claro. ¿De manera sencilla podrías decirme cuál es su utilidad?

La parte donde no entiendo nada es donde defines la variable "$rango".

No me queda más que agradecer tu ayuda, con este código me vale, ahora solo tengo que hacer una pequeña modificación (espero no cargarme el script), ya que analizaré varios miles de secuencias que están en un archivo de texto, supongo que tendré que introducir un bucle para leer una a una. Si tengo problemas tendrán noticias mías en el foro.

Saludos.
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Publicidad

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-30 03:58 @207

asegurac escribiste:Solo tengo unas dudas respecto al código. En la línea 8 introduces lo siguiente "{ aggregate => 0 }" ¿cuál fue el objetivo de esto?

Por defecto, File::Read devuelve los ficheros leídos como un único elemento (un escalar), pero en esa línea, quiero que cada línea del fichero vaya a un elemento del array. Con la opción 'aggregate', el módulo nos devuelve las líneas en forma de lista de valores.


asegurac escribiste:Estuve investigando qué hace la función "pos()" y no me ha quedado muy claro. ¿De manera sencilla podrías decirme cuál es su utilidad?

(extraído de perlfunc)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
pos ESCALAR
pos
    Devuelve la posición de la última búsqueda m//g para la variable en cuestión
($_ se usa cuando la variable no se ha especificado). Note que 0 es un
desplazamiento de coincidencia válido. undef indica que la posición de búsqueda se
ha reinicializado (normalmente debido a un fallo en el cotejamiento, pero puede
ser también porque todavía no se ha aplicado ningún cotejamiento al escalar). pos
accede directamente a la posición usada por el motor regexp para almacenar el
desplazamiento, por lo que asignar un valor a pos cambiará este desplazamiento, y
también influirá en la aserción de anchura cero \G en las expresiones regulares.
Debido a que un cotejamiento fallido no reinicia el desplazamiento, pos devolverá lo mismo que la última vez que se le llamó. Vea perlre y perlop.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En resumen: pos() nos devuelve la posición de la última coincidencia encontrada con la expresión regular. Y podemos cambiar esa posición si le asignamos un valor. El valor está basado en 0 (las posiciones de los caracteres dentro de una cadena empiezan en 0).

Lo que hacemos dentro del bucle del programa es modificar la posición de búsqueda de la expresión regular, para que comience a buscar la coincidencia sólo una base más a la derecha, y no a partir del final de la secuencia encontrada antes. Para eso, le indicamos a pos() que "retroceda" tantas posiciones como de larga sea la secuencia encontrada, menos uno. Así, podemos localizar todas las posiciones solapadas, ya que solo se diferencian en la posición de la primera base.


asegurac escribiste:La parte donde no entiendo nada es donde defines la variable "$rango".

my $rango = Number::Range->new(@posiciones)->range();

En esta línea estamos creando un objeto del tipo Number::Range. Le pasamos las @posiciones encontradas de las apariciones. Y de ese objeto creado, llamamos al método range(), que nos devuelve una cadena de caracteres con la representación del rango, agrupado, como este: 26,29,34..40,43. Eso es lo que pintamos en la línea 30.

Lo que sigue después es un bucle while() localizando, con una expresión regular, los números que rodean a cada '..', de la cadena anterior (34 y 40, en el ejemplo). Se hace una cuenta sencilla (40-34+1) y de ahí deducimos cuántos números en tándem hay (7).
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: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-30 11:28 @519

Hola,

Si no deseara localizar todas las posiciones solapadas, similar a lo que hacía en mi primer intento, ¿tendría que modificar algo aquí?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($secuencia =~ /$repetición/g) {
        $veces++;
        pos($secuencia) = pos($secuencia) - length($repetición) + 1;
        push @posiciones, pos($secuencia);
    }
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Saludos
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-30 16:05 @712

Sí y no... ¿qué posiciones no quieres localizar?
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: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-30 16:17 @720

Hola,

Por ejemplo:
En la siguiente secuencia, que comenzara a leer desde el primer carácter y que no contara los solapamientos, similar a como lo hacía el primer código que publiqué en el foro.

ATGGAGTCTTTTAGAGAGTTTATCCAACAATTCAAAAAAAATAAGGCAGCGGTCGTTGGGGCTTGGATTGTGCT

Entonces si busco la palabra "TT" y solo quiero que cuente las veces que aparece contigua, el resultado seria: "TT" = 2 (color azul en la secuencia)
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-30 16:49 @742

Entonces sí, te vale con dejarle como estaba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($secuencia =~ /$repetición/g) {
    $veces++;
    push @posiciones, pos($secuencia) - length($repetición);
}
Coloreado en 0.001 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: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-30 17:01 @751

Ahora el problema es que ya no cuenta cuantas veces están contiguas, ¿algo paso con "$rango"?

Por ejemplo ahora como resultado aparece:
AA = 25,28,33,35,37,39,42

Es decir, son las posiciones donde aparece "TT" (7 veces) pero ya no aparece el número de veces que esta contigua (2 veces).
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-30 18:03 @793

Esto es una cosa nueva...

¿Tienes claro de a dónde quieres llegar con el programa? ¿O estamos hablando de programas distintos?
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: Contar repeticiones secuencias de bases

Notapor asegurac » 2010-04-30 18:27 @810

Una disculpa si no me he explicado bien. Por ejemplo en el programa donde se encontraban las repeticiones incluso las que se solapan, el número de repeticiones contiguas era extraído al analizar $rango:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($rango =~ /(\d+)\.\.(\d+)/g) {
            $tándem += $2 - $1 + 1;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si recordamos en los ejemplos previos que publicaste en el foro algunos de los resultado era el siguiente:

"AA = 10 apariciones totales: 26,29,34..40,43 y 7 apariciones en tándem."

Ahora al modificar las líneas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($secuencia =~ /$repetición/g) {
        $veces++;
        pos($secuencia) = pos($secuencia) - length($repetición) + 1;
        push @posiciones, pos($secuencia);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


por:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($secuencia =~ /$repetición/g) {
        $veces++;
        push @posiciones, pos($secuencia)- length($repetición);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El resultado es el siguiente:

"AA= 7 apariciones totales:25,28,33,35,37,39,42"

Este resultado está bien, solo cuenta las apariciones en un solo sentido (no incluyó las que se solapan); sin embargo, no aparecen las contiguas (en tándem).

Supongo que con la modificación algo paso en $rango, porque no imprime ninguna de las posiciones entre los dos puntos (por ejemplo 34..40) y consecuentemente no aparece el print() de "y $tándem apariciones en tándem" if $tándem;"

¿Tu crees que esto signifique un cambio radical en el programa?
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Re: Contar repeticiones secuencias de bases

Notapor explorer » 2010-04-30 18:36 @817

Las posiciones que se solapan no salen porque dijiste que no te interesa sacarlas. Así, si solo buscamos posiciones de AA, sale 25,28,33,35,37,39,42, que, como vemos, ya no tienen secuencias solapadas (pero sí contiguas, como las posiciones 33, 35, 37 y 39).

Así que no tiene sentido decir que no quieres ver posiciones de secuencias que se solapan, con querer ver la frase "en tándem".

Y una cosa son secuencias contiguas (no se solapan) y otra, secuencias solapadas.

Es mejor que pongas un ejemplo de una secuencia de entrada y qué salida quieres obtener.
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

AnteriorSiguiente

Volver a Bioinformática

¿Quién está conectado?

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