#!/usr/bin/perl 

# Demonstrates the use of a SearchIO Blast parser and a SearchWriterI object
# for producing tab-delimited output of result data from a Blast report 
# input stream.
#
# This writer only outputs information at the level of the result object.
# This shows that you can work with a writer that only knows about 
# Bio::Search::Result objects and doesn't care about hit or HSP data. 
# Therefore, the output from this example doesn't contain any information 
# about hits or HSPs. 
# See the hitwriter.pl and hspwriter.pl examples for that.
#
# This parser represents a new and improved version of Bio::Tools::Blast.
#
# Usage:
#   STDIN:  stream containing one or more BLAST or PSI-BLAST reports.
#   STDOUT: none, but generates an output file "resultwriter.out"
#           containing tab-delimited data on a per-report basis.
#   STDERR: Any errors that occurred.
#
# For more documentation about the writer, including
# a complete list of columns, see the docs for 
#   Bio::SearchIO::Writer::ResultTableWriter.
#
# For more documentation about working with Blast result objects,
# see docs for these modules:
#   Bio::Search::Result::BlastResult
#   Bio::Search::Iteration::IterationI
#   Bio::Search::Hit::BlastHit
#   Bio::Search::HSP::BlastHSP
#
# For more documentation about the Blast parser, see docs for
#   Bio::SearchIO
#
# Author: Steve Chervitz <sac@bioperl.org>


use strict;

use Bio::SearchIO;
use Bio::SearchIO::Writer::ResultTableWriter;
use Bio::SearchIO::Writer::HTMLResultWriter;

print "\nUsing SearchIO->new()\n";


# Note that all parameters for the $in, $out, and $writer objects are optional.
# Default in = STDIN; Default out = STDOUT; Default writer = all columns
# In this example, we're reading from STDIN and  writing to STDOUT
# and using the default columns for the writer.
# We're also telling the script to timeout if input isn't received
# within 10 sec. (Note the clock is still ticking when you background the job.)
# Setting verbose to 1 is useful for debugging.
my $in = Bio::SearchIO->new( -format => 'blast', 
                             -fh => \*ARGV,
                             -signif => 0.1, 
                             -verbose => 0, 
                             -timeout_sec => 10 );
# not specifying any columns to get the default.
my $writer = Bio::SearchIO::Writer::ResultTableWriter->new();
my $out    = Bio::SearchIO->new( -format => 'blast', 
                                 -writer => $writer,
                                 -file => ">resultwriter.out");

my $writerhtml = new Bio::SearchIO::Writer::HTMLResultWriter();
my $outhtml = new Bio::SearchIO(-writer => $writerhtml,
                                -file   => ">searchio.html");


while ( my $result = $in->next_result() ) {
    eval {
        # printf STDERR "Report %d: $result\n", $in->result_count;
        $out->write_result($result, ($in->result_count - 1 ? 0 : 1) );
        
        $outhtml->write_result($result, 1);

        # To get at the statistical parameters:
        # Calling raw_statistics() returns a list containing the
        # unparsed lines of the parameters section of the report.
        # Here we're only interested in parameters beginning with "effective".
        #         print "Report Stats, effective data:\n";
        #         foreach( $result->raw_statistics) {
        #             print "$_" if /^effective/i;
        #         }
        
	## For a simple progress monitor, uncomment this line:
	#print STDERR "."; print STDERR "\n" if $in->result_count % 50 == 0;
    };
    if($@) {
        warn "Warning: Blast parsing or writing exception caught for $result:\n$@\n";
    }
}

printf STDERR "\n%d Blast report(s) processed.\n", $in->result_count;
printf STDERR "Output sent to file: %s\n",  $out->file if $out->file;
