Página 1 de 1

De fastaq a fasta en subrutina

NotaPublicado: 2016-09-12 14:32 @647
por abraham03
Hola, he creado este script para extraer múltiples secuencias contenidas en una carpeta en formato fastq y pasarlas a formato fasta y que mantenga el mismo nombre de cada archivo fastq:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use Getopt::Long;
  6.  
  7. my ($dir, $files, $file_name, $file_format, $extension);
  8.  
  9.     GetOptions (
  10.                 'dr=s'  =>\$dir
  11.                 );
  12.  
  13. foreach $files (glob("$dir/*.fastq")) {
  14.         open LINE, "<", $files or die "can't read open $files";
  15.             while(
  16.                     defined(my $head    = <LINE>)       &&
  17.                     defined(my $seq     = <LINE>)       &&
  18.                     defined(my $qhead   = <LINE>)       &&
  19.                     defined(my $quality = <LINE>)          
  20.             ){
  21.                         substr($head, 0, 1, '>');
  22.                        
  23.                         $extension = "\\.fastq";
  24.                         $files =~ s/(.*)$extension(.*)/$1/;
  25.                         $file_name =$files;
  26.                         open OUTFILE, '>>', $file_name.".fasta";
  27.                         print OUTFILE $head, $seq;
  28.             }
  29. }
  30. close LINE;
  31. close OUTFILE;
  32. exit;
  33.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El código funciona bien, solo que quiero agregarle más opciones. Una de ellas es convertir un solo archivo si así se desea, para lo cual quisiera saber cómo organizar en una subrutina la siguiente parte del código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  while(
  2.                     defined(my $head    = <LINE>)       &&
  3.                     defined(my $seq     = <LINE>)       &&
  4.                     defined(my $qhead   = <LINE>)       &&
  5.                     defined(my $quality = <LINE>)          
  6.             ){
  7.                         substr($head, 0, 1, '>');
  8.                        
  9.                         $extension = "\\.fastq";
  10.                         $files =~ s/(.*)$extension(.*)/$1/;
  11.                         $file_name =$files;
  12.                         open OUTFILE, '>>', $file_name.".fasta";
  13.                         print OUTFILE $head, $seq;
  14.             }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para usarlo en las dos opciones (carpeta con múltiples fastq y un solo archivo fastq). Actualmente tengo que usar dos scripts para las diferentes opciones y quisiera tenerlo en uno solo y creo que usar una subrutina me evitará tener código repetido.

¡¡Muchas gracias!!

Re: De fastaq a fasta en subrutina

NotaPublicado: 2016-09-12 16:51 @743
por explorer
El programa puede saber que $dir no es un directorio, sino un único fichero, con la prueba '-f':

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (-f $dir) {
  2.         # procesar un único archivo
  3. }
  4. else {
  5.         # procesar varios ficheros
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y podrías meter en subrutina la parte de procesamiento de un solo archivo, las líneas 14 a 28.

A propósito, los open() y los close() están mal puestos. Debe estar fuera de los bucles.

Quedaría algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use Getopt::Long;
  5.  
  6. my ($dir, $file_name, $file_format);
  7. my $extension = "\\.fastq";
  8.  
  9. GetOptions (
  10.     'dr=s' => \$dir
  11. );
  12.  
  13. if (-f $dir) {
  14.     procesa($dir);
  15. }
  16. else {
  17.     foreach my $file (glob("$dir/*.fastq")) {
  18.         procesa($file);
  19.     }
  20. }
  21.  
  22.  
  23. sub procesa {
  24.     my $file = shift;
  25.  
  26.     ($file_name = $file) =~ s/(.*)$extension.*/$1/;
  27.  
  28.     open LINE,    '<',   $file             or die "can't read open $file\n";
  29.     open OUTFILE, '>>', "$file_name.fasta" or die "can't write $file_name\n";
  30.  
  31.     while (
  32.         defined(my $head    = <LINE>)       &&
  33.         defined(my $seq     = <LINE>)       &&
  34.         defined(my $qhead   = <LINE>)       &&
  35.         defined(my $quality = <LINE>)
  36.     ) {
  37.         print OUTFILE ">$head", $seq;
  38.     }
  39.  
  40.     close OUTFILE;
  41.     close LINE;
  42. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: De fastaq a fasta en subrutina

NotaPublicado: 2016-09-14 15:00 @667
por abraham03
Como siempre, mil gracias, no solo por contestar, ¡¡¡ si no también por hacer las cosas sencillas !!!