• Publicidad

Frecuencia de palabras en ADN

Perl aplicado a la bioinformática

Frecuencia de palabras en ADN

Notapor j_f_r_85 » 2010-12-10 06:44 @322

Estimados compañeros,

Buen día. Hoy recurro a ustedes ante una pregunta producto de mi clase de bioinformática, a la cual no he encontrado la manera de abordarla. El profesor nos pide hacer un script llamado cuentapalabras.pl. Este script debe buscar "palabras" (más bien dicho, "conjunto de bases") de una longitud especificada por el usuario, las cuales están dentro de un archivo de texto. Dicho script debe de tener un "uso: <Tamaño de palabra> <archivo de secuencia>" y una salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Palabra    Frecuencia
=======    ==========
CAATG         1052
AATGA         1426
ATGAC         1170
TGACT         1105
GACTG          781
ACTGA         1148
CTGAT         1468
TGATG          916
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El tamaño de la palabra debe de ser un número entero mayor a 0, y según el profesor, menor a 12 con el propósito de no comprometer la memoria de la computadora. El archivo de secuencia es un archivo en formato txt con 300 líneas de secuencias de ADN, de 100 bases (A, C, G, T) cada línea. El archivo realmente es pequeño (33 Kb y adjunto a la presente pregunta).

Según el profesor, él creó un script que le permite realizar dicha tarea con palabras de hasta 32 caracteres en un archivo de 3 Gb. Pero, él sabe que es complicado, y solo nos solicita elaborar un script que no contenga el uso de alguna biblioteca de Perl. Finalmente, él recomienda que se realice tal tarea usando solo una subrutina, aunque dice que no es el único método.

Me acerco a ustedes, porque realmente no tengo una idea clara de por dónde empezar. Sé que de principio debo de leer el archivo y asegurarme que se lean todas sus líneas. Gracias a explorer sé que puedo utilizar:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use common::sense;
  2. use File::Slurp;
  3.  
  4. -e $fichero             or  die "ERROR: no encuentro el fichero $fichero\n";
  5.  
  6. my $secuencia = read_file($fichero);
  7.  
  8. $secuencia =~ s/\s+//g;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sé que tal vez usando un hash sería posible almacenar las palabras que el script localice, y mediante alguna expresión obtener su frecuencia. Por ejemplo, se me ocurre usar:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while(<>) {
    foreach $palabra (split(' ', $_)) {  
        $frecuencia{$palabra}++;
    }
}
foreach $word (sort keys %frecuencia) {
    print "$palabra $frecuencia{$palabra}\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero no estoy seguro de cómo indicar al programa que deseo buscar palabras de una determinada longitud (¿usar "for"?). Más aun, ¿se puede realizar esto solo usando una sub-rutina? ¿acaso las sub-rutinas no son una parte de la cual depende una instrucción principal?

¿Me pueden ayudar? ¡Gracias de antemano!

P.S. El profesor está de acuerdo con el uso de los foros. Los considera más enriquecedores que un manual para principiantes.
j_f_r_85
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2010-12-06 06:24 @309

Publicidad

Re: Frecuencia de palabras en ADN

Notapor explorer » 2010-12-10 12:24 @558

¿Y qué hacemos con el caso de que palabra se encuentre superpuesta en múltiples posiciones consecutivas?

Por ejemplo, tenemos la secuencia "ATCCGGCCTAGCTTACCAGCAAAAAAAAC". Si buscamos por la palabra "AAAAA", ¿cuántos resultados debe darnos, 1 u 8?

Está bien saber que eres estudiante de bioinformática, pues así sabremos que no debemos daros todas las soluciones ya hechas, sino guiaros hasta ellas. Lo bueno de Perl es que hay más soluciones para un mismo problema, así que es más probable encontrar alguna de ellas. Un saludo para el profesor.

Quizás dentro de poco, tengamos un subforo completamente dedicado a bioinformática.

Lo normal es usar hash, para este problema, pero si dice el profesor que la memoria del ordenador puede agotarse, puede usarse el método de escribir los resultados intermedios a disco.

El caso es que la memoria no tiene por qué agotarse, ya que la memoria ocupada es la del hash que va almacenando las frecuencias. No hay porqué leer la secuencia entera a memoria, sobre todo cuando son 3Gb.

En Perl hay varios módulos que permiten mapear el contenido de un fichero en una variable escalar, sin tener que leer el contenido del fichero (precisamente por no caber en memoria). Por ejemplo, el módulo File::Map. Eso sí, como estamos hablando de un fichero de más de 2Gb, hay que prestar atención a los problemas de estar en sistemas de 32 bits. En la sección PITFALLS de este módulo, se recomienda que, aunque estés trabajando en sistemas de 64 bits y tengas un Perl compilado para 64 bits, es mejor que uses Perl v5.12. Y en la sección de BUGS se comenta que hay un problema con el motor de expresiones regulares, que provocan un fallo de segmentación si el fichero tiene un tamaño que es múltiplo del tamaño de página de lectura. Pero bueno, esto último es fácil de solventar ;)

Solo cuando tenemos estos problemas de espacio es cuando hay que hilar un poco más fino, pero sino, es muy fácil solventarlo.

Una cosa importante: una cosa es un script y otra cosa es un programa. Un script es un programa que hace de guión (traducción literal de script) para la ejecución de otros procesos. Y no es éste el caso. Lo que el profesor os ha mandado hacer es un programa. La mayor parte de los programadores de Perl hace programas, no scripts.

Si os pide que no utilicéis ninguna librería de Perl, es porque se trata de un ejercicio. En el mundo real, en producción, sí que se usarán librerías de Perl, igual que los programadores de Java, .Net y demás lenguajes no pueden hacer casi nada sin ellas.

Has acertado con lo de leer primero toda la secuencia. En otros hilos hemos comentado cómo leer ese tipo de archivos. En el ejemplo pones File:Slurp, pero recuerda que el profesor dice que no podéis usar ninguna librería, así que no puedes usar File::Slurp.

El problema principal de la tarea es saber qué método usar para localizar las palabras. Y soluciones para esto hay unas cuantas. Incluso sin usar expresiones regulares :)

Actualización: hay otro hilo donde comentamos este tema: Contar repeticiones secuencias de bases.
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


Volver a Bioinformática

¿Quién está conectado?

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