| Summary | Included libraries | Package variables | Synopsis | Description | General documentation | Methods |
| WebCvs |
# do not use this module directly
use Bio::SearchIO;
my $parser = Bio::SearchIO->new(-file => $file,
-format => 'blasttable');
while( my $result = $parser->next_result ) { }
| _initialize | No description | Code |
| next_result | Description | Code |
| start_element | Description | Code |
| end_element | Description | Code |
| element | Description | Code |
| characters | Description | Code |
| _mode | Description | Code |
| within_element | Description | Code |
| in_element | Description | Code |
| start_document | Description | Code |
| end_document | Description | Code |
| result_count | Description | Code |
| program_name | Description | Code |
| _will_handle | Description | Code |
| next_result | code | next | Top |
Title : next_result |
| start_element | code | prev | next | Top |
Title : start_element |
| end_element | code | prev | next | Top |
Title : start_element |
| element | code | prev | next | Top |
Title : element |
| characters | code | prev | next | Top |
Title : characters |
| _mode | code | prev | next | Top |
Title : _mode |
| within_element | code | prev | next | Top |
Title : within_element |
| in_element | code | prev | next | Top |
Title : in_element |
| start_document | code | prev | next | Top |
Title : start_document |
| end_document | code | prev | next | Top |
Title : end_document |
| result_count | code | prev | next | Top |
Title : result_count |
| program_name | code | prev | next | Top |
Title : program_name |
| _will_handle | code | prev | next | Top |
Title : _will_handleOptimizations: 1 Using the cached pointer to the EventHandler to minimize repeatedlookups. 2 Caching the will_handle status for each type that is encountered sothat it only need be checked by calling handler->will_handle($type) once. This does not lead to a major savings by itself (only 5-10%). In combination with other optimizations, or for large parse jobs, the savings good be significant. To test against the unoptimized version, remove the parentheses from around the third term in the ternary " ? : " operator and add two calls to $self->_eventHandler(). |
| _initialize | description | prev | next | Top |
my ($self,@args) = @_; $self->SUPER::_initialize(@args); my ($pname) = $self->_rearrange([qw(PROGRAM_NAME)], @args); $self->program_name($pname || $DefaultProgramName); $self->_eventHandler->register_factory('result', Bio::Search::Result::ResultFactory->new(-type => 'Bio::Search::Result::GenericResult')); $self->_eventHandler->register_factory('hit', Bio::Search::Hit::HitFactory->new(-type => 'Bio::Search::Hit::GenericHit')); $self->_eventHandler->register_factory('hsp', Bio::Search::HSP::HSPFactory->new(-type => 'Bio::Search::HSP::GenericHSP'));}
| next_result | description | prev | next | Top |
my ($self) = @_; my ($lastquery,$lasthit); local $/ = "\n"; local $_; my ($alg, $ver); while( defined ($_ = $self->_readline) ) { # WU-BLAST -mformat 3 only}
if(m{^#\s((?:\S+?)?BLAST[NPX])\s(\d+\.\d+.+\d{4}\])}) { ($alg, $ver) = ($1, $2); # only one header for whole file with WU-BLAST
# so $alg and $ver won't get set properly for
# each result
$self->program_name($alg) if $alg; $self->element({'Name' => 'Result_version', 'Data' => $ver}) if $ver; next; } # -m 9 only
elsif(m{^#\s+((?:\S+?)?BLAST[NPX])\s+(.+)}) { ($alg, $ver) = ($1, $2); next; } next if /^#/ || /^\s*$/; my @fields = split; next if @fields == 1; my ($qname,$hname, $percent_id, $hsp_len, $mismatches,$gapsm, $qstart,$qend,$hstart,$hend,$evalue,$bits); # WU-BLAST-specific
my ($num_scores, $raw_score, $identities, $positives, $percent_pos, $qgap_blocks,$qgaps, $sgap_blocks, $sgaps, $qframe, $sframe); # NCBI -m8 and -m9
if (@fields == 12) { ($qname,$hname, $percent_id, $hsp_len, $mismatches,$gapsm, $qstart,$qend,$hstart,$hend,$evalue,$bits) = @fields; # NCBI -m8 and -m9, v 2.2.18+
} elsif (@fields == 13) { ($qname, $hname, $percent_id, $percent_pos, $hsp_len, $mismatches, $gapsm, $qstart,$qend,$hstart,$hend,$evalue,$bits) = @fields; } # WU-BLAST -mformat 2 and 3
elsif ((@fields == 22) or (@fields == 24)) { ($qname,$hname,$evalue,$num_scores, $bits, $raw_score, $hsp_len, $identities, $positives,$mismatches, $percent_id, $percent_pos, $qgap_blocks, $qgaps, $sgap_blocks, $sgaps, $qframe, $qstart, $qend, $sframe, $hstart,$hend,) = @fields; # we need total gaps in the alignment
$gapsm=$qgaps+$sgaps; } # Remember Jim's code is 0 based
if( defined $lastquery && $lastquery ne $qname ) { $self->end_element({'Name' => 'Hit'}); $self->end_element({'Name' => 'Result'}); $self->_pushback($_); return $self->end_document; } elsif( ! defined $lastquery ) { $self->{'_result_count'}++; $self->start_element({'Name' => 'Result'}); $self->element({'Name' => 'Result_program', 'Data' => $alg || $self->program_name}); $self->element({'Name' => 'Result_version', 'Data' => $ver}) if $ver; $self->element({'Name' => 'Result_query-def', 'Data' => $qname}); $self->start_element({'Name' => 'Hit'}); $self->element({'Name' => 'Hit_id', 'Data' => $hname}); # we'll store the 1st hsp bits as the hit bits
$self->element({'Name' => 'Hit_bits', 'Data' => $bits}); # we'll store the 1st hsp value as the hit evalue
$self->element({'Name' => 'Hit_signif', 'Data' => $evalue}); } elsif( $lasthit ne $hname ) { if( $self->in_element('hit') ) { $self->end_element({'Name' => 'Hit'}); } $self->start_element({'Name' => 'Hit'}); $self->element({'Name' => 'Hit_id', 'Data' => $hname}); # we'll store the 1st hsp bits as the hit bits
$self->element({'Name' => 'Hit_bits', 'Data' => $bits}); # we'll store the 1st hsp value as the hit evalue
$self->element({'Name' => 'Hit_signif', 'Data' => $evalue}); } my $identical = $hsp_len - $mismatches - $gapsm; $self->start_element({'Name' => 'Hsp'}); $self->element({'Name' => 'Hsp_evalue', 'Data' => $evalue}); $self->element({'Name' => 'Hsp_bit-score', 'Data' => $bits}); $self->element({'Name' => 'Hsp_identity', 'Data' => $identical}); $self->element({'Name' => 'Hsp_positive', 'Data' => $positives}); $self->element({'Name' => 'Hsp_gaps', 'Data' => $gapsm}); $self->element({'Name' => 'Hsp_query-from', 'Data' => $qstart}); $self->element({'Name' => 'Hsp_query-to', 'Data' => $qend}); $self->element({'Name' => 'Hsp_hit-from', 'Data' => $hstart }); $self->element({'Name' => 'Hsp_hit-to', 'Data' => $hend }); $self->element({'Name' => 'Hsp_align-len', 'Data' => $hsp_len}); $self->end_element({'Name' => 'Hsp'}); $lastquery = $qname; $lasthit = $hname; } # fencepost
if( defined $lasthit && defined $lastquery ) { if( $self->in_element('hit') ) { $self->end_element({'Name' => 'Hit'}); } $self->end_element({'Name' => 'Result'}); return $self->end_document; }
| start_element | description | prev | next | Top |
my ($self,$data) = @_; # we currently don't care about attributes}
my $nm = $data->{'Name'}; if( my $type = $MODEMAP{$nm} ) { $self->_mode($type); if( $self->_will_handle($type) ) { my $func = sprintf("start_%s",lc $type); $self->_eventHandler->$func($data->{'Attributes'}); } unshift @{$self->{'_elements'}}, $type; } if($nm eq 'Result') { $self->{'_values'} = {}; $self->{'_result'}= undef; $self->{'_mode'} = ''; }
| end_element | description | prev | next | Top |
my ($self,$data) = @_; my $nm = $data->{'Name'}; my $rc; # Hsp are sort of weird, in that they end when another}
# object begins so have to detect this in end_element for now
if( my $type = $MODEMAP{$nm} ) { if( $self->_will_handle($type) ) { my $func = sprintf("end_%s",lc $type); $rc = $self->_eventHandler->$func($self->{'_reporttype'}, $self->{'_values'}); } shift @{$self->{'_elements'}}; } elsif( $MAPPING{$nm} ) { if ( ref($MAPPING{$nm}) =~ /hash/i ) { my $key = (keys %{$MAPPING{$nm}})[0]; $self->{'_values'}->{$key}->{$MAPPING{$nm}->{$key}} = $self->{'_last_data'}; } else { $self->{'_values'}->{$MAPPING{$nm}} = $self->{'_last_data'}; } } else { $self->warn( "unknown nm $nm ignoring\n"); } $self->{'_last_data'} = ''; # remove read data if we are at
# end of an element
$self->{'_result'} = $rc if( $nm eq 'Result' ); return $rc;
| element | description | prev | next | Top |
my ($self,$data) = @_; $self->start_element($data); $self->characters($data); $self->end_element($data);}
| characters | description | prev | next | Top |
my ($self,$data) = @_; # deep bug fix: set $self->{'_last_data'} to undef if $$data{Data} is}
# a valid slot, whose value is undef --
# allows an undef to be propagated to object constructors and
# handled there as desired; in particular, when Hsp_postive => -conserved
# is not defined (in BLASTN, e.g.), the value of hsp's {CONSERVED} property is
# set to the value of {IDENTICAL}.
#/maj
# return unless ( defined $data->{'Data'} );
return unless ( grep /Data/, keys %$data ); if ( !defined $data->{'Data'} ) { $self->{'_last_data'} = undef; return; } if( $data->{'Data'} =~ /^\s+$/ ) { return unless $data->{'Name'} =~ /Hsp\_(midline|qseq|hseq)/; } if( $self->in_element('hsp') && $data->{'Name'} =~ /Hsp\_(qseq|hseq|midline)/ ) { $self->{'_last_hspdata'}->{$data->{'Name'}} .= $data->{'Data'}; } $self->{'_last_data'} = $data->{'Data'};
| _mode | description | prev | next | Top |
my ($self,$value) = @_; if( defined $value) { $self->{'_mode'} = $value; } return $self->{'_mode'};}
| within_element | description | prev | next | Top |
my ($self,$name) = @_; return 0 if ( ! defined $name && ! defined $self->{'_elements'} || scalar @{$self->{'_elements'}} == 0) ; foreach ( @{$self->{'_elements'}} ) { if( $_ eq $name ) { return 1; } } return 0;}
| in_element | description | prev | next | Top |
my ($self,$name) = @_; return 0 if ! defined $self->{'_elements'}->[0]; return ( $self->{'_elements'}->[0] eq $name)}
| start_document | description | prev | next | Top |
my ($self) = @_; $self->{'_lasttype'} = ''; $self->{'_values'} = {}; $self->{'_result'}= undef; $self->{'_mode'} = ''; $self->{'_elements'} = [];}
| end_document | description | prev | next | Top |
my ($self,@args) = @_; return $self->{'_result'};}
| result_count | description | prev | next | Top |
my $self = shift; return $self->{'_result_count'};}
| program_name | description | prev | next | Top |
my $self = shift; $self->{'program_name'} = shift if @_; return $self->{'program_name'} || $DefaultProgramName;}
| _will_handle | description | prev | next | Top |
my ($self,$type) = @_; my $handler = $self->{'_handler'}; my $will_handle = defined($self->{'_will_handle_cache'}->{$type}) ? $self->{'_will_handle_cache'}->{$type} : ($self->{'_will_handle_cache'}->{$type} = $handler->will_handle($type)); return $will_handle ? $handler : undef; } 1;}
| FEEDBACK | Top |
| Mailing Lists | Top |
bioperl-l@bioperl.org - General discussion
http://bioperl.org/wiki/Mailing_lists - About the mailing lists
| Support | Top |
| Reporting Bugs | Top |
https://redmine.open-bio.org/projects/bioperl/
| AUTHOR - Jason Stajich | Top |
| APPENDIX | Top |
| new | Top |
Title : new
Usage : my $obj = Bio::SearchIO::blasttable->new();
Function: Builds a new Bio::SearchIO::blasttable object
Returns : an instance of Bio::SearchIO::blasttable
Args :