Verás, explorer: son 3 programas cuya ejecución me da problemas.
Todos funcionan bien desde la línea de comandos, e incluso, si en vez de hacer el paso de subir el archivo desde una localización remota, lo pongo en la carpeta de la Base de Datos directamente, también me funcionan.
Creo que el problema está en el paso de reescritura del archivo vía IO HANDLE (al menos en dos de ellos, no en el BLAST cuyo problema no alcanzo a entender ya que todo el CGI va a la perfección, es decir, representa en pantalla el código HTML/CSS, y da un enlace al resultado, que eso sí, no aparece por ningún lado, cosa que sigo pensando que se debe al IO HANDLE).
Mi opinión es que como los archivos FASTA (en el caso de BLAST) y los reportes de resultados que usan los otros dos programas para hacer su función de
parsing, pierden su formato original al pasarse por el
buffer y re-escribirse en la salida del IO HANDLE (las líneas no se conservan separadas, sino que se escriben sin salto de línea "\n" en el fichero de copia resultante) y por eso los
parsers no funcionan, ya que están escritos para procesar un fichero con un formato determinado y línea a línea, para así extraer parámetros determinados de cada una, si se cumplen ciertas condiciones, y si esto no va así, no funcionan.
Te pondré el código ejemplo de un
parser para ilustrar mejor lo que digo.
Yo opino desde mi poca experiencia, que si no puedo re-escribir (desde el
buffer) las líneas una a una y conservar la estructura original del reporte de resultados, no podré hacer funcionar el
parser (del BLAST ya ni hablamos...)
Ejemplo de
parser:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
chomp(my $target = shift @ARGV);
open(INFILE,"$target") or die ("ERROR: $!\n");
chomp (my @lineas = <INFILE>);
open SALIDA,'>TP_parsed.txt' or die "ERROR: $!\n";
chomp(my $TProb = shift @ARGV);
for(@lineas){
if (/^\w+\s+\d+/){
my ($seqid, $seqlen, $mTP, $SP, $other, $loc, $RC, $TPlen) = split(/\s+/, $_);
if ($loc eq "M"){
if($mTP >= $TProb){
print SALIDA ("$seqid\t"."$mTP\t"."$loc\t\n");
}
}
}
}
close INFILE;
close SALIDA;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Este
parser lo ejecuto como hicimos con el HMMer anteriormente en este
post:
Using perl Syntax Highlighting
#!c:/perl/bin/perl.exe
use warnings;
use strict;
use diagnostics;
use IO::Handle;
use CGI ':standard';
##############HTML OMITIDO
my $target= param('file');
my $mTPP= param('mitoProb');
my $filename= "$$"."$^T"."$target";
my $lightweight_fh;
my $io_handle;
my $bytesread;
$lightweight_fh = upload('file');
if (defined $lightweight_fh) {
$io_handle = $lightweight_fh->handle;
open (OUTFILE,'>>'."C:/xampp/htdocs/DB/Uploads/$filename");
binmode(OUTFILE);
while ($bytesread = $io_handle->read(my $buffer,2048)) {
print OUTFILE $buffer."\n";
}
#close OUTFILE;
}
my$archivo = "C:/xampp/htdocs/DB/Uploads/$filename";
my $resultado = `A_TParser.pl "$archivo" "$mTPP" > C:/xampp/htdocs/DB/Results/$filename.out`;
my $report= "$filename.out";
print qq(<A HREF='Results/$report' TARGET='_blank'>-Open in browser or Right click to download file-</A><br><br><br><br><br>\n);
##############HTML OMITIDO
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y me devuelve un resultado, pero vacío, ya que no puede
parsear el reporte por lo que comenté antes de la perdida de formato.
Desde la línea de comandos con el mismo
parser, el mismo reporte y el mismo valor de probabilidad ($mTTP) me hace el
parsing perfectamente.
PREGUNTA: ¿Puedo conseguir que el IO HANDLE me mantenga el formato del reporte al subirlo al servidor para procesarlo?
Esto no funciona, te lo comento por si era lo obvio...
Using perl Syntax Highlighting
print OUTFILE $buffer."\n";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Un saludo y disculpa por la gran chapa.