• Publicidad

Extracción secuencia

Perl aplicado a la bioinformática

Extracción secuencia

Notapor Victor » 2006-01-23 19:53 @870

Hola actualmente me encuentro desarrollando un proyecto usando Perl... tengo un fichero denominado $seq el cual contiene una serie de secuencias en cada línea ... adicionalmente tengo una base de datos llamada $dat_bas... la idea es que debo tomar cada línea de mi fichero $seq y lo enfrento con la base de datos... cada vez que haya una coincidencia con la base de datos y la secuencia debo tomar los 100 elementos que se encuentran antes del inicio de la secuencia y los 100 elementos al final de la secuencia:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$seq = 'fgvodffoslssk';   # esta es una línea
$dat_bas = 'aslkddjcncxxnflldkskdjfhfhiru<span style="font-weight: bold">fgvodffoslssk</span>asdfghjklmnbv';            # este es un ejemplo de un segmento de la DB..
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


cuando mi secuencia coincida yo debo generar un nuevo string que contenga los 100 elementos que están antes del inicio de mi secuencia y los 100 que están después del último elemento de mi secuencia... incluyendo mi secuencia y si es posible estableciendo la posición dentro de la base de datos y generar una salida en un nuevo fichero... Bueno, espero me puedan orientar... Gracias...
varcila
Victor
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2006-01-23 19:34 @857

Publicidad

Notapor macgregor » 2006-01-24 06:39 @318

Te aconsejo que te mires los manuales que hay en este sitio sobre expresiones regulares.
A mi me resulta muy cómodo hacerlo en líneas separadas para no perderme cuando son complicadas (casi siempre!)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$dat_bas =~ m{
        ^                       #inicio de cadena
        (.*)$seq        #primera parte del string hasta tu secuencia
        (.*)            #continuacion de tu secuencia
        $                       #Fin de la cadena
        }x;                     #usamos "x" para poder romper la linea
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


a partir de aquí puedes acceder a $1 y tendrás lo que hay delante de tu secuencia y "recortar" los elementos que te interesan.
Para lo que va detrás de tu secuencia haz lo mismo pero accediendo a $2.

Mientras escribía esto me he dado cuenta que siempre que busco un patrón ya lo conozco de antemano y por lo tanto pongo la "cadena" en la expresión regular, nunca uso variables como la que he puesto en la respuesta. ( (.*)$seq #primera parte del string hasta tu secuencia)
Si tengo tiempo lo probaré, aunque estoy casi seguro de que debe funcionar. El que lo sepa con certeza que se lo confirme a Victor.


Cuando hablas de base de datos no me queda nada claro a qué te refieres.
En cuanto a la posición dentro del string "$dat_bas" si se encuentra tu secuencia solo tienes que consultar length($1) para saber que en la siguiente posición comienza lo que buscas.

Espero haberte ayudado un poco.
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa

Notapor kidd » 2006-01-24 14:22 @640

Hola:

Podría ser

Código: Seleccionar todo
    if($dat_bas =~ /([a-zA-Z0-9]{100})(?:$seq)([a-zA-Z0-9]{100})/m){
        my $antes = $1;
        my $despues = $2;

    }



SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Gracias ... lo ensayo y comento

Notapor Victor » 2006-01-24 14:31 @646

Gracias por la respuesta ..con respecto a la base de datos les comento que trabajo en un proyecto en biologia y tengo una secuencia de letras que corresponden a un genoma ejm CGTAGCTGCTAGCTAGCTAGCTA... PUEDEN SER MILLONES ... y lo que busco es que mi secuencia coincida con un pequeño segmento de esta base de datos la cual tiene un formato especifico y el cual yo puedo manipular con "perl" ... toda esta información esta en la web disponible ..y lo que buscamos desarrollar es un pequeño programa que me permita hacer comparaciones rapidamente de secuencia conocidas frente un gran genoma que contiene incluso billones de letras y que hacerlo en laboratorio demoraria mucho tiempo ... adapto la sugerencia a mi necesidad y les comento mi resultado ...
varcila
Victor
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2006-01-23 19:34 @857

Re: extraccion secuencia

Notapor explorer » 2006-01-24 17:29 @770

Victor escribiste:tengo un fichero denominado $seq el cual contiene una serie de secuencias en cada linea ... adicionalmente tengo una base de datos llamada $dat_bas .... la idea es que debo tomar cada linea de mi fichero $seq y lo enfrento con la base de datos ... cada vez que haya una coincidencia con la base de datos y la secuencia debo tomar los 100 elementos que se encuentran antes del inicio de la secuencia y los 100 elementos al final de la secuencia.
Código: Seleccionar todo
my $seq = 'fgvodffoslssk';   # esta es una secuencia a buscar
my $largo_seq = length $seq;

# este es un ejemplo de un segmento de la DB..
my $dat_bas = 'aslkddjcncxxnflldkskdjfhfhiru[b]fgvodffoslssk[/b]asdfghjklmnbv';           

Como la secuencia genética es conocida (no hay bases que desconozcamos), es mejor usar la función index, que, como dice el manual, no es tan pesada como una expresión regular y sí algo más rápida. Naturalmente la solución de kidd es muy elegante, pero aquí vamos a darle a Victor más posibilidades.
Suponiendo que tenemos en $seq la secuencia a buscar y en $data la secuencia a analizar, se podría hacer así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $seq=q(agtgctagtagctagctacgggagctag);
my $data=q(dsfhkdsfhksjd->agtgctagtagctagctacgggagctag<-fhkjdshfksjdfh);

# Hacemos la búsqueda
my $pos = index($data,$seq);

# Si no la encontramos, saltamos a probar con otra secuencia
return if $pos == -1;

# Encontrado. Ahora hay que saber la parte que queremos recortar.
# Queremos quedarnos a los lados con $largo bases más
my $largo = 100;

# $lado_izq será el comienzo del recorte por el lado izquierdo
# Si resulta que la secuencia la hemos encontrado 'demasiado' cerca
# del borde izquierdo, ponemos el $lado_izq al índice de la primera base,
# es decir, 0. Si no es así, lo ponemos $largo posiciones antes de la
# secuencia encontrada.
my $lado_izq = ($pos < $largo) ? 0:$pos-$largo;

# $recorte es la secuencia extraída: la secuencia que estábamos buscando
# rodeada de bases extras (hasta $largo más)
my $recorte = substr(
    $data,
    $lado_izq,
    ( $pos - $lado_izq ) + $largo_seq + $largo
);

# Impresión a pantalla, fichero, etc...
print $recorte,"\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Por qué hay que hacer cuentas? Pues porque se puede dar el caso de que la secuencia a buscar esté hacia el principio de la base de datos, por lo que no podremos conseguir extraer las 100 bases extra antes de ella. Hacemos unas sumas y restas para saber esa posición.
En cuanto a la parte derecha, no hay problema. La función substr se encargará de darnos todo lo que pueda desde la base de datos, aunque la secuencia encontrada esté cerca del final.

Este enlace te será de interés.

De todas formas... es mejor usar BioPerl.
En su web oficial podrás encontrar mucha información.
En el FAQ hay una pregunta parecida a lo que buscas.
Por este foro ya hemos hablado un poco del tema.
Aquí, en el Instituto Pasteur hay un curso.

A propósito... estoy buscando puesto de trabajo de bioinformático :)
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