| Summary | Included libraries | Package variables | Synopsis | Description | General documentation | Methods |
use Bio::SearchIO;
my $parser = Bio::SearchIO->new(-file => 'file.psl',
-format => 'psl');
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 |
| next_result | code | next | Top |
Title : next_result |
| start_element | code | prev | next | Top |
Title : start_element |
| end_element | code | prev | next | Top |
Title : end_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 |
| _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::PSLHSP' ) );}
| next_result | description | prev | next | Top |
my ($self) = @_; my ( $lastquery, $lasthit ); local $/ = "\n"; local $_; # skip over any header lines}
while( defined($_ = $self->_readline) and ! /^\d+\s+\d+\s+/ ) {} $self->_pushback($_); # now start the main parsing loop
while ( defined( $_ = $self->_readline ) ) { my ( $matches, $mismatches, $rep_matches, $n_count, $q_num_insert, $q_base_insert, $t_num_insert, $t_base_insert, $strand, $q_name, $q_length, $q_start, $q_end, $t_name, $t_length, $t_start, $t_end, $block_count, $block_sizes, $q_starts, $t_starts ) = split; $q_length > 0 or $self->throw("parse error, invalid query length '$q_length'"); my $score = sprintf( "%.2f", 100 * ( $matches + $mismatches + $rep_matches ) / $q_length );
# this is overall percent identity...
my $match_total = $matches + $mismatches + $rep_matches; $match_total > 0 or $self->throw("parse error, matches + mismatches + rep_matches must be > 0!"); my $percent_id = sprintf("%.2f", 100 * ( $matches + $rep_matches ) / $match_total );
# Remember Jim's code is 0 based
if ( defined $lastquery && $lastquery ne $q_name ) { $self->end_element( { 'Name' => 'Hit' } ); $self->end_element( { 'Name' => 'PSLOutput' } ); $self->_pushback($_); return $self->end_document; } elsif ( !defined $lastquery ) { $self->{'_result_count'}++; $self->start_element( { 'Name' => 'PSLOutput' } ); $self->element( { 'Name' => 'PSLOutput_program', 'Data' => $self->program_name } ); $self->element( { 'Name' => 'PSLOutput_query-def', 'Data' => $q_name } ); $self->element( { 'Name' => 'PSLOutput_query-len', 'Data' => $q_length } ); $self->start_element( { 'Name' => 'Hit' } ); $self->element( { 'Name' => 'Hit_id', 'Data' => $t_name } ); $self->element( { 'Name' => 'Hit_len', 'Data' => $t_length } ); $self->element( { 'Name' => 'Hit_score', 'Data' => $score } ); } elsif ( $lasthit ne $t_name ) { $self->end_element( { 'Name' => 'Hit' } ); $self->start_element( { 'Name' => 'Hit' } ); $self->element( { 'Name' => 'Hit_id', 'Data' => $t_name } ); $self->element( { 'Name' => 'Hit_len', 'Data' => $t_length } ); $self->element( { 'Name' => 'Hit_score', 'Data' => $score } ); } my $identical = $matches + $rep_matches; $self->start_element( { 'Name' => 'Hsp' } ); $self->element( { 'Name' => 'Hsp_score', 'Data' => $score } ); $self->element( { 'Name' => 'Hsp_identity', 'Data' => $identical } ); $self->element( { 'Name' => 'Hsp_positive', 'Data' => $identical } ); $self->element( { 'Name' => 'Hsp_mismatches', 'Data' => $mismatches } ); $self->element( { 'Name' => 'Hsp_gaps', 'Data' => $q_base_insert + $t_base_insert } ); # query gaps are the number of target inserts and vice-versa
$self->element( { 'Name' => 'Hsp_querygaps', 'Data' => $t_base_insert } ); $self->element( { 'Name' => 'Hsp_hitgaps', 'Data' => $q_base_insert } ); if ( $strand eq '+' ) { $self->element( { 'Name' => 'Hsp_query-from', 'Data' => $q_start + 1 } ); $self->element( { 'Name' => 'Hsp_query-to', 'Data' => $q_end } ); } else { $self->element( { 'Name' => 'Hsp_query-to', 'Data' => $q_start + 1 } ); $self->element( { 'Name' => 'Hsp_query-from', 'Data' => $q_end } ); } my $hsplen = $q_base_insert + $t_base_insert + abs( $t_end - $t_start ) + abs( $q_end - $q_start ); $self->element( { 'Name' => 'Hsp_hit-from', 'Data' => $t_start + 1 } ); $self->element( { 'Name' => 'Hsp_hit-to', 'Data' => $t_end } ); $self->element( { 'Name' => 'Hsp_align-len', 'Data' => $hsplen } ); # cleanup trailing commas in some output
$block_sizes =~ s/\,$//; $q_starts =~ s/\,$//; $t_starts =~ s/\,$//; my @blocksizes = split( /,/, $block_sizes ); # block sizes
my @qstarts = split( /,/, $q_starts ); # starting position of each block
# in query
my @tstarts = split( /,/, $t_starts ); # starting position of each block
# in target
my ( @qgapblocks, @hgapblocks ); for ( my $i = 0 ; $i < $block_count ; $i++ ) { if ( $strand eq '+' ) { push @qgapblocks, [ $qstarts[$i] + 1, $blocksizes[$i] ]; } else { push @qgapblocks, [ $q_length - $qstarts[$i], $blocksizes[$i] ]; } push @hgapblocks, [ $tstarts[$i] + 1, $blocksizes[$i] ]; } $self->element( { 'Name' => 'Hsp_qgapblocks', 'Data' =>\@ qgapblocks } ); $self->element( { 'Name' => 'Hsp_hgapblocks', 'Data' =>\@ hgapblocks } ); $self->end_element( { 'Name' => 'Hsp' } ); $lastquery = $q_name; $lasthit = $t_name; } if ( defined $lasthit || defined $lastquery ) { $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->_eventHandler->will_handle($type) ) { my $func = 'start_'.lc $type; $self->_eventHandler->$func( $data->{'Attributes'} ); } unshift @{ $self->{'_elements'} }, $type; } if ( $nm eq 'PSLOutput' ) { $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->_eventHandler->will_handle($type) ) { my $func = 'end_'.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( __PACKAGE__ . "::end_element: unknown nm '$nm', ignoring\n" ); } $self->{'_last_data'} = ''; # remove read data if we are at
# end of an element
$self->{'_result'} = $rc if ( defined $nm && defined $MODEMAP{$nm} && $MODEMAP{$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 ) = @_; return unless ( defined $data->{'Data'} ); 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; } 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 |
http://bugzilla.open-bio.org/
| AUTHOR - Jason Stajich | Top |
| APPENDIX | Top |
| new | Top |
Title : new
Usage : my $obj = Bio::SearchIO::psl->new();
Function: Builds a new Bio::SearchIO::psl object
Returns : an instance of Bio::SearchIO::psl
Args :