#!/usr/bin/env perl
# Demonstrates the use of a SearchIO Blast parser and a SearchWriterI object
# for producing custom output of Blast hit data from a Blast report
# input stream.
#
# Here we define a custom SearchWriterI object that ouputs just the data we want
# from each BLAST report.
#
# NOTE: If you just want pick and choose which columns you want
# in the output table, you don't need to create your own custom
# SearchWriterI implementation as we do here. HitTableWriter and HSPTableWriter
# are configurable as to what columns and order you want.
# The hitwriter*.pl and hspwriter.pl examples in this directory
# illustrate this.
#
# For a complete list of columns, see the docs for these modules:
# Bio::SearchIO::Writer::HitTableWriter
# Bio::SearchIO::Writer::HSPTableWriter
#
# This example serves as an illustration of how to use the
# SearchWriterI api and plug it in to a SearchIO parser,
# which you may want to do if you want to generate data column(s)
# not provided by the available writers.
#
# Usage:
# STDIN: stream containing one or more BLAST or PSI-BLAST reports.
# STDOUT: none, but generates an output file "custom_writer.out"
# containing tab-delimited data on a per-hit basis.
# STDERR: Progress info.
#
# Author: Steve Chervitz <sac@bioperl.org>
package MyBlastWriter;
use strict;
use lib '../../';
use Bio::Root::Root;
use Bio::SearchIO::SearchWriterI;
use base qw( Bio::Root::Root Bio::SearchIO::SearchWriterI );
sub to_string {
my ($self, $result, @args) = @_;
my $str = '';
my $hits_reported = 0;
foreach my $hit($result->hits) {
# If this is a PSI-BLAST report, only report novel hits
if( $result->psiblast ) {
# Note that we could have supplied this has a -HIT_FILTER function
# when we defined our input SearchIO object. Then we wouldn't need
# to define a custom writer.
next unless $hit->iteration > 1 and not $hit->found_again;
}
$hits_reported++;
printf STDERR "$hit\n";
$str .= sprintf "%s\t%d\t%s\t%d\t%.2f\t%d\t%.1e\t%d\t%d\t%d\t%d\t%s\n",
$result->query_name, $result->query_length, $hit->name,
$hit->length, $hit->frac_identical('query'), $hit->length_aln,
$hit->expect, $hit->score, $hit->bits,
$hit->gaps('total'), $hit->num_hsps, $hit->iteration || '-';
}
printf STDERR "\n%d hits written\n", $hits_reported;
$str;
}
package main;
#===================================================
# Start of script
#===================================================
use strict;
use lib '../../../';
use Bio::SearchIO;
select STDOUT; $|=1;
my $in = Bio::SearchIO->new( -format => 'blast',
-fh => \*ARGV,
-signif => 0.1 );
my $writer = MyBlastWriter->new();
my $out = Bio::SearchIO->new( -format => 'blast',
-writer => $writer,
-file => ">custom_writer.out" );
while ( my $result = $in->next_result() ) {
printf STDERR "Report %d: $result\n", $in->result_count;
$out->write_result($result);
}
printf STDERR "\n%d Results processed.\n", $in->result_count;
printf STDERR "Output sent to file: %s\n", $out->file if $out->file;