• Publicidad

Dividir un archivo FASTA en partes

Perl aplicado a la bioinformática

Dividir un archivo FASTA en partes

Notapor Alfumao » 2010-12-23 12:52 @578

Hola de nuevo y Felices Fiestas a todos.

Tengo un problema con la división de un archivo multiFASTA en partes.
Quiero delimitar el número de secuencias que cada una de las partes ha de contener y lo he intentado usando "while", pero resulta que el bucle se sale de madre y no me divide los archivos de la forma que quiero.
Creo que el código se explicará mejor que yo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $count=0;
  6. my @arr;
  7.  
  8. print "Enter your list\n";
  9. chomp(my $entrada = <STDIN>);
  10. open (INFILE, "$entrada") || die ("can´t open input file");
  11. my @data=<INFILE>;
  12. close(INFILE);
  13. my $outfile="$entrada-section_$count.txt";
  14. my $head = 0; #inicializo $head como control del bucle
  15. while ($head <=10){
  16.  
  17. foreach (@data){
  18.   chomp;
  19.   if ($_=~/^>(\w+)/) { #localizo cada linea de encabezado de secuencia
  20.   push (@arr, "$_\n");
  21.   $head++; #cuento cada encabezado de secuencia
  22.   next;
  23.   }
  24.   else {
  25.   push (@arr, "$_\n");
  26.   }
  27.     &create_file($entrada, @arr);
  28.   }
  29.   }
  30. #############################################################
  31. sub create_file {
  32. my ($entrada, @arr) =@_;    
  33. $count++;
  34. $outfile="$entrada _ $count.txt";    
  35. open(OUTFILE,">$outfile") or die "Error with outfile: $!\\n";
  36. print OUTFILE "@arr";    
  37. close(OUTFILE);
  38. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


El problema es que me da un archivo por cada línea del fichero FASTA en vez de crearme archivos que contengan 10 secuencias. No sé cómo hacer que el contador $head funcione regulando así el bucle del while().

Ojalá se me haya entendido y me podáis ayudar.
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Publicidad

Re: Dividir un archivo FASTA en partes

Notapor explorer » 2010-12-23 13:59 @624

El control de bucles no es correcto: estás releyendo el contenido de @data por cada cambio en $head.

Debes crear un nuevo fichero cuando leas una nueva línea que empiece por '>'.

Tal como lo tienes ahora, estás creando un nuevo fichero por cada línea.

Esta es mi versión (no probada):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $head;                     # contador de cabeceras
  2. my @arr;                      # aquí almacenamos cada bloque
  3. for (@data) {                 # por todo el fichero...
  4.     if (/^>(\w+)/) {          # localizado un encabezado de secuencia
  5.         if (@arr) {           # ¿teníamos un bloque leído antes?
  6.             create_file($entrada, @arr);      # sí, lo guardamos
  7.             @arr = ();                        # y lo ponemos a 0 (perdón, vacío)
  8.         }
  9.         $head++;              # cuento cada encabezado de secuencia
  10.         last if $head > 10;   # salimos inmediatamente si ya tenemos 10
  11.     }
  12.  
  13.     push (@arr, $_);          # guardamos la línea
  14. }
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: Dividir un archivo FASTA en partes

Notapor Alfumao » 2010-12-23 14:42 @654

Hola explorer,

Con tu código obtengo 10 archivos de una secuencia.
Lo que quiero hacer es dividir un archivo de por ejemplo 1500 secuencias, en 150 archivos con 10 secuencias cada uno...

Por eso meto las líneas al array, e intento llevar la cuenta de cada "header" para que me imprima el array en el fichero de salida cuando la cuenta sea ($head <= 10).

Lo que pasa es que no sé regular el bucle para que haga esto.

CÓDIGO
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $head;
my @arr;
while ($head <=10){ #quiero que pare este bucle cuando haya 10 header
   
foreach (@data){
  chomp;
  if ($_=~/^>(\w+)/) {
  push (@arr, "$_\n");#meto la linea de encabezado al array
  $head++;# esta variable se incrementa cada vez que hay un encabezado
  next;
  }
  else {
  push (@arr, "$_\n");#meto la linea normal al array
  }
  }
  &create_file($entrada, @arr); #creo un archivo cuando tengo 10 secuencias
  }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ojalá me puedas entender esta vez.

Muchas gracias de nuevo por tu atención.
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Dividir un archivo FASTA en partes

Notapor explorer » 2010-12-23 15:11 @674

Bueno, entonces se trata de cambiar algunas líneas de orden (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $head;                     # contador de cabeceras
  2. my @arr;                      # aquí almacenamos cada bloque
  3.  
  4. for (@data) {                 # por todo el fichero...
  5.     if (/^>(\w+)/) {          # localizado un encabezado de secuencia
  6.         $head++;              # lo cuento
  7.         if ($head > 10) {     # si ya hemos leído 10...
  8.             create_file($entrada, @arr);      # guardamos lo leído
  9.             @arr = ();                        # y lo ponemos a 0 (perdón, vacío)
  10.             $head = 1;        # y ponemos contador a 1
  11.         }
  12.     }
  13.     push (@arr, $_);          # guardamos la línea
  14. }
  15. create_file($entrada, @arr) if @arr;      # guardamos lo que reste
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: Dividir un archivo FASTA en partes

Notapor Alfumao » 2010-12-23 15:30 @687

Muchísimas gracias explorer.
Objetivo conseguido una vez más.

Un saludo y felices fiestas a tí y a todo el foro.

PD. Gran idea la del subforo de Bioinformática
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514


Volver a Bioinformática

¿Quién está conectado?

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