BioPerl
view release on metacpan or search on metacpan
Bio/SearchIO/psl.pm view on Meta::CPAN
sub _initialize {
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'
)
);
}
=head2 next_result
Title : next_result
Usage : my $result = $parser->next_result
Function: Parse the next result from the data stream
Returns : L<Bio::Search::Result::ResultI> or undef if no more results
Args : none
=cut
sub next_result {
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
}
);
( run in 0.478 second using v1.01-cache-2.11-cpan-39bf76dae61 )