• Publicidad

Extraer un extracto de secuencia

Perl aplicado a la bioinformática

Extraer un extracto de secuencia

Notapor wampaier » 2009-04-20 09:11 @424

Qué tal... soy nuevo en esto de BioPerl... necesito su ayuda...

Tengo un archivo con varias secuencias de proteína. Necesito extraer un segmento de esa secuencia que siempre empieza con C y termina con TF; bueno, en algunos casos es con SF o LF. Necesito extraer ese pedazo de secuencia y el nombre de la misma.

Por ejemplo...

>secuencia1
MMNPOTADCQQYYTRPWTF

>secuencia2
URPACMNLEPPOAAADKRRCMQ
HTHWPPYTF


y la salida más o menos así
Código: Seleccionar todo
secuencia1                  CQQYYTRPWTF
secuencia1                  CMQHTHWPPYTF


Si alguien me pudiera ayudar se los agradecería mucho.

Simplemente quiero saber cómo extraer un fragmento de un texto. Es con expresiones regulares... pero en ocasiones ese fragmento va a estar en 2 líneas... ¿cómo lo puedo extraer de esa manera? Para que me respete lo que estoy buscando y que tome en cuenta nueva línea en caso de que haya.

Gracias
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Publicidad

Notapor explorer » 2009-04-20 18:48 @825

Bueno, esta es una forma un poco pedestre de hacerlo...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $nombre_secuencia;
my $secuencia;

sub pinta_extracto {
    while ($secuencia =~ /(C[^C]*(?:T|S|L)F)/g) {
        print "$nombre_secuencia\t$1\n";
    }
}

open FICHERO, "<kk.txt" or die "ERROR: No puedo abrir: $!\n";

while (<FICHERO>) {
    chomp;

    if (/^>(.*)/) {
        pinta_extracto($secuencia) if $secuencia;
        $nombre_secuencia = $1;
        $secuencia = '';
    }
    else {
        $secuencia .= $_;
    }
}

close FICHERO;

pinta_extracto($secuencia) if $secuencia;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Definimos una subrutina que nos localiza el extracto, en caso de que tengamos alguna $secuencia que analizar.

En la expresión regular, esperamos que $secuencia contenga toda la secuencia de nucleótidos. Y buscamos el siguiente patrón: Una letra 'C' seguida de cero o más letras (*) que no sean 'C' ([^C]), y seguidas finalmente por alguna de las combinaciones TF, SF o LF.

En la parte de lectura del fichero, vamos leyendo línea por línea. Si es una línea de nombre de secuencia, la guardamos para el futuro. Si es una línea en blanco, buscamos el extracto (solo una vez). Y si no es nada de eso, suponemos que hemos leído una parte de la secuencia, así que la vamos almacenando en la variable del mismo nombre.

Después del bucle, hay que hacer otra búsqueda, por si hemos terminado de leer el fichero pero no hemos encontrado una línea en blanco. Si no lo hiciéramos, no veríamos el último extracto.
Última edición por explorer el 2009-04-22 14:17 @636, editado 2 veces en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor wampaier » 2009-04-21 10:49 @492

Gracias por la ayuda del código... la función... de buscar el extracto me funcionó de maravilla... solo le hice un cambio... pero así está la idea... nada más una pregunta.... si está en un formato fasta y se encuentra el fragmento que estoy buscando en dos renglones... ¿cómo puedo hacerle para que me lo tome en cuenta...? ¿podría ser con $ al final así como está en la condición?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($secuencia =~ /(C.+(TF|SF|AF|IF|NF|GF|PF|MF|VF|FF))$/)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Notapor explorer » 2009-04-21 11:39 @527

No. Si está en dos renglones -que supongo que quiere decir que puede existir un carácter de nueva línea enmedio-, entonces debes indicar a la expresión regular que '.' también equivale a ese carácter.

Debes agregar la opción /s al final. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($secuencia =~ /(C.+(TF|SF|AF|IF|NF|GF|PF|MF|VF|FF))$/s)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Siempre es mucho más cómodo leer la secuencia entera y tratarla como un conjunto de letras, y no con excepciones.

En varios hilos de este sitio web hemos hablado del formato FASTA. Usa el sistema de búsqueda para encontrar más formas de leer ese tipo de ficheros.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor wampaier » 2009-04-21 12:47 @574

ok... sí... ya, ya lo chequé... y sí, esa es la manera más factible... sí me toma los espacios en blanco sin ningún problema...
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Notapor wampaier » 2009-04-22 10:57 @498

Qué tal... mira... lo he probado con la /s... pero no me funciona... lo he pensado hacer con un chop();... pero no sé qué tan factible sea esta opción... mira éste es más o menos el tipo de archivo que voy a utilizar...

>NT01KV0002|transposase 617 aa
MVEQYGRVKRFLPAMLRDLHFQSAPAGENTLSAIHYLAELSGSKKRLLENAPEQIITGPW
KRLVYDSEGRIQRAGYSLCLLERLQDSLRRRDIWLENSDRWGDPRQKFLQGKEWQAQRIA
VCRALGHPTDGGNAVKQLATELDETWKTVASRFELNAAVSICHQGKYPSLTISSLEKLEE
PQPLILLNSRVRQLVPPVDLTELLLEIDARTGFTREFTHVSESEARAQDLNISLCCQQYD
DLPPTF
AVLLAEACNIGHEPLIKHSIPALTRHRLSWVKQNYIRAETLVSANARLVDFQST
LELSERWGGGEVASADGMRFVTPVKTLNSGPNRKYFGSGRGITWYNFVSDQYSGFHGIVI
PGTLRDSIFVLEGLLEQQTGLNPVEIMTDTGGSSDIIFGLFWLLGYQFSPRLADAGEAVF
WRADKNANYGVLDELARGCVELSKIETQWDEMMRVSGSLKLGTVHASELVGSLLKSSRPS
GLAQAIMEVGRVNKTLYLLNYIDDEEYRRRILTQLNRGEGRHAVARAICYGQRGEIRKRY
REGQEDQLGALGLVTNAVVLWNTLYMQEALSHLRSAGEIPEDEHISRLSPLMYGHINMLG
HYTFTLPENILKGELRPLNFNSNNELLP
>NT01KV0003|transposase 617 aa
MVEQYGRVRRFLPHLLNTVKFSSAPAGVTTLNACDYLSREFSSRRQFFDDAPTEIISRSW
KRLVINKEKHITRRGYTLCFLSKLQDSLRRRDVYVTGSNRWGDPRARLLQGADWQANRIK
VYRSLGHPTDPQEAIKSLGHQLDSRYRQVAARLGENEAVELDVSGPKPRLTISPLASLDE
PDSLKRLSKMISDLLPPVDLTELLLEINAHTGFADEFFHASEASARVDDLPVSISAVLMA
EACNIGLEPLIRSNVPALTRHRLNWTKANYLRAETITSANARLVDFQATLPLAQIWGGGE
VASADGMRFVTPVRTINAGPNRKYFGNNRGITWYNFVSDQYSGFHGIVIPGTLRDSIFVL
EGLLEQETGLNPTEIMTDTAGTSELVFGLFWLLGYQFSPRLADAGASVFWRMGHDANYGV
LNDIARGQSDPRKIVLQWDEMIRTAGSLKLGKVQASVLVRSLLKSERPSGLTQAIIEVGR
INKTLYLLNYIDDEDYRRRILTQLNRGESRHAVARAICHGQKGEIRKRYTDGQEDQLGAL
GLVTNAVVLWNTMYMQAALDHLRAQGETLNDEDIARLSPLCHGHINMLGHYSFTLAELVT
KGHLRPLKEASEVENVACQQSYSTPRATF

Y cuando ejecuto el programa con este archivo... solo me encuentra el de la segunda secuencia...
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Notapor explorer » 2009-04-22 11:31 @522

He modificado mi programa anterior porque el fichero de ejemplo que acabas de poner no concuerda con el primer ejemplo que pusiste. En concreto:

1.- No tiene la línea en blanco que pensaba que sí tenía, pero en el segundo ejemplo no lo hay

2.- Puede darse el caso de que exista más de un extracto en la misma secuencia. Por eso, he cambiado el if() por un while() junto con la opción /g para hacer una búsqueda por toda la secuencia.

Ahora, con el fichero que has puesto, me sale:
Código: Seleccionar todo
NT01KV0002|transposase 617 aa   CQQYDDLPPTF
NT01KV0002|transposase 617 aa   CNIGHEPLIKHSIPALTRHRLSWVKQNYIRAETLVSANARLVDFQSTLELSERWGGGEVASADGMRFVTPVKTLNSGPNRKYFGSGRGITWYNFVSDQYSGFHGIVIPGTLRDSIFVLEGLLEQQTGLNPVEIMTDTGGSSDIIFGLF
NT01KV0002|transposase 617 aa   CYGQRGEIRKRYREGQEDQLGALGLVTNAVVLWNTLYMQEALSHLRSAGEIPEDEHISRLSPLMYGHINMLGHYTF
NT01KV0003|transposase 617 aa   CNIGLEPLIRSNVPALTRHRLNWTKANYLRAETITSANARLVDFQATLPLAQIWGGGEVASADGMRFVTPVRTINAGPNRKYFGNNRGITWYNFVSDQYSGFHGIVIPGTLRDSIFVLEGLLEQETGLNPTEIMTDTAGTSELVFGLF
NT01KV0003|transposase 617 aa   CHGHINMLGHYSF
NT01KV0003|transposase 617 aa   CQQSYSTPRATF


Otra cosa. El chop() elimina el último carácter de la línea. Esa es la razón de que use en mi programa chomp(), que es más seguro, porque solo quita el último carácter si ese carácter es un final de línea.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor wampaier » 2009-04-22 12:00 @541

Sí, lo que pasa es que el otro era solo un ejemplo con el que estaba trabajando... pero en realidad voy a hacerlo con un archivo multifasta... Es por eso que lo empecé a ejecutar con este ejemplo más claro... Perdón... pero es que soy nuevo en esto... ¿le puedo poner después de la expresión regular que me encuentre el motivo {1,20} para que no me ponga los motivos más grandes?
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Notapor wampaier » 2009-04-22 13:00 @583

Ok, encontré... una solución... siendo un poco más estricto con la reg-exp... espero que así sí funcione...
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576


Volver a Bioinformática

¿Quién está conectado?

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

cron