• Publicidad

Filtrado genes en archivos FASTA

Perl aplicado a la bioinformática

Re: Filtrado genes en archivos FASTA

Notapor explorer » 2016-09-02 12:28 @561

El fallo está en la línea 12:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. chomp $palabras;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Esa variable no es conocida, en esa línea. Perl no hace nada ahí.

En realidad, lo que quieres hacer es quitar los finales de línea de todas las @palabras, así que la línea debería ser
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. chomp @palabras;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Al no quitar los caracteres de fin de línea, en la línea 20 estábamos buscando por una $palabra dentro de $registro, pero como $palabra lleva los caracteres de fin de línea, obligamos a que esa $palabra esté al final del $registro, lo cual es muy posible que no suceda en todos los casos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Filtrado genes en archivos FASTA

Notapor rednet » 2016-09-02 12:44 @572

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.    
  3.  
  4.    
  5.     ## Procesar todas las líneas, una a una
  6.     open (F,"<lista_de_secuencias.txt") or die "can't open lista\n";
  7.     my @palabras=<F>;
  8.     close F;
  9.     #chomp @palabras;
  10.     print "@palabras\n";
  11.     open (INPUT , "<$ARGV[0]");
  12.     open (OUTPUT, ">$ARGV[0].out");
  13.      
  14.     $/ = "\n>"; # separador entre registros
  15.     chomp @palabras;
  16.     print "@palabras\n";
  17.     while(my $registro = <INPUT>) {
  18.         chomp $registro;
  19.         #print "$registro||\n";
  20.         for my $palabra (@palabras) {
  21.             chomp $palabra;
  22.             #print "$registro||$palabra|!!!|\n";
  23.             if ($registro =~ /$palabra/) {    # si es el que nos interesa
  24.                                              # quitar el marcador '>'
  25.                 say OUTPUT ">$registro\n";       # resultado
  26.             }
  27.             last;
  28.         }
  29.     }
  30.     close INPUT;
  31.     close OUTPUT;
  32.     exit;
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Hice el cambio pero aún la lista solo busca el primer nombre de la lista y no corre, aún no veo por qué no funciona.
rednet
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2007-11-15 09:15 @427

Re: Filtrado genes en archivos FASTA

Notapor explorer » 2016-09-02 12:59 @582

Sería interesante que publicaras dos ejemplos, uno de un archivo a filtrar, y luego otro con las palabras, pero como supongo que son muy largos, con unas versiones más cortas, de unas decenas de líneas, sería suficiente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Filtrado genes en archivos FASTA

Notapor rednet » 2016-09-02 14:40 @653

aqui van los archivos que usa el script
Adjuntos
lista_de_secuencias.txt
aqui van los archivos que usa el scrit
(177 Bytes) 133 veces
ejemplosecuencias.txt
(19.4 KiB) 141 veces
rednet
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2007-11-15 09:15 @427

Re: Filtrado genes en archivos FASTA

Notapor explorer » 2016-09-03 13:20 @597

El problema estaba en que los archivos están en formato MSDOS (las líneas terminan en dos caracteres: el carácter de retorno de carro (13) y el de avance de línea (10)).

Como yo trabajo en Linux, me llamó la atención que solo pudiera leer un registro. Es debido precisamente a la distinta terminación de los finales de línea.

Si estás trabajando en Windows, entonces Perl lo sabría y no notarías nada (podrías leer las líneas tal cual). El problema está si los archivos se han generado/descargado de un sistema MSDOS y los vas a procesar en un sistema distinto (Linux o Mac). Hay que tener en cuenta estos detalles, para evitar sorpresas.

Una forma de solventarlo es indicando expresamente a Perl que los archivos a leer/escribir tengan siempre los finales de línea con caracteres tipo MSDOS. En perldoc PerlIO está la documentación sobre la capa ':crlf', que transforma, en la lectura, los dos bytes 13-10 al carácter "\n" y, en escritura, justo al revés.

El siguiente programa hace la lectura y procesamiento correcto del archivo de secuencias, y saca los registros que coincidan con alguna de los nombres de la lista.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use open IO => ':crlf';                                         # la entrada y la salida, en formato MSDOS
  3.  
  4. ### Lectura de las secuencias a extraer
  5. open(F,"<lista_de_secuencias.txt") or die "can't open lista\n";
  6. my @palabras = <F>;
  7. close F;
  8. chomp @palabras;
  9.  
  10. ### Procesamiento del argumento
  11. -e $ARGV[0] or die "ERROR: No encuentro [$ARGV[0]]: $!\n";      # si no encontramos el argumento, terminamos
  12.  
  13. open(INPUT , "<",  $ARGV[0]);
  14. open(OUTPUT, ">", "$ARGV[0].out");
  15.  
  16. my $registro = '';                                              # aquí almacenamos cada registro
  17.  
  18. while(my $linea = <INPUT>) {                                    # leemos línea a línea
  19.     if ($linea =~ /^>/) {                                       # si la línea comienza con marca de registro
  20.         procesar_registro($registro) if $registro;              # procesamos el registro almacenado antes (si lo hay, claro)
  21.         $registro = '';                                         # y lo ponemos a cero (perdón, a nada)
  22.     }
  23.  
  24.     $registro .= $linea;                                        # vamos guardando cada $linea en $registro
  25. }
  26.  
  27. procesar_registro($registro) if $registro;                      # en caso de terminar, procesamos el último $registro
  28.  
  29. close INPUT;
  30. close OUTPUT;
  31.  
  32.  
  33. sub procesar_registro {                                         # aquí procesamos cada $registro
  34.     my $registro = shift;
  35.  
  36.     foreach my $palabra (@palabras) {                           # para cada $palabra, de entre todas las @palabras
  37.         if ($registro =~ /\b$palabra\b/) {                      # si el $registro contiene esa $palabra
  38.             print OUTPUT $registro;                             # volcamos el $registro fuera
  39.             last;                                               # y terminamos
  40.         }
  41.     }
  42. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo he comprobado con tus ejemplos, y la salida es idéntica al original, ya que la lista de secuencias coincide con todos los registros.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Filtrado genes en archivos FASTA

Notapor rednet » 2016-09-08 09:33 @439

Gracias, explorer.
rednet
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2007-11-15 09:15 @427

Anterior

Volver a Bioinformática

¿Quién está conectado?

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