• Publicidad

De fastaq a fasta en subrutina

Perl aplicado a la bioinformática

De fastaq a fasta en subrutina

Notapor abraham03 » 2016-09-12 14:32 @647

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.002 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!!
abraham03
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2016-08-05 15:52 @703

Publicidad

Re: De fastaq a fasta en subrutina

Notapor explorer » 2016-09-12 16:51 @743

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.002 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: De fastaq a fasta en subrutina

Notapor abraham03 » 2016-09-14 15:00 @667

Como siempre, mil gracias, no solo por contestar, ¡¡¡ si no también por hacer las cosas sencillas !!!
abraham03
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2016-08-05 15:52 @703


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron