sub next_result
{ my ($self) = @_;
my $filehandle;
my $line;
my $id;
while ($_=$self->_readline()){
$line = $_;
chomp $line;
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;
my $superfeature = Bio::SeqFeature::Generic->new();
next unless ( $matches =~/^\d+$/ );
my (%feat1, %feat2);
$feat1{name} = $t_name;
$feat2{name} = $q_name;
$strand = $1 if ($strand =~/([+-])[+-]/);
$feat2{strand} = 1;
$feat1{strand} = $strand;
my $percent_id = sprintf "%.2f",
(100 * ($matches + $rep_matches)/( $matches + $mismatches + $rep_matches));
unless ( $q_length ){
$self->warn("length of query is zero, something is wrong!");
next;
}
my $score = sprintf "%.2f",
(100 * ( $matches + $mismatches + $rep_matches ) / $q_length);
my @block_sizes = split ",",$block_sizes;
my @q_start_positions = split ",",$q_starts;
my @t_start_positions = split ",",$t_starts;
$superfeature->seq_id($q_name);
$superfeature->score( $score );
$superfeature->add_tag_value('percent_id',$percent_id);
for (my $i=0; $i<$block_count; $i++ ){
my ($query_start,$query_end);
if ( $strand eq '+' ){
$query_start = $q_start_positions[$i] + 1;
$query_end = $query_start + $block_sizes[$i] - 1;
}else{
$query_end = $q_length - $q_start_positions[$i];
$query_start = $query_end - $block_sizes[$i] + 1;
}
$feat2 {start} = $query_start;
$feat2 {end} = $query_end;
if ( $query_end < $query_start ){
$self->warn("dodgy feature coordinates: end = $query_end, start = $query_start. Reversing...");
$feat2 {end} = $query_start;
$feat2 {start} = $query_end;
}
$feat1 {start} = $t_start_positions[$i] + 1;
$feat1 {end} = $feat1{start} + $block_sizes[$i] - 1;
$feat2 {score} = $score;
$feat1 {score} = $feat2 {score};
$feat2 {percent} = $percent_id;
$feat1 {percent} = $feat2 {percent};
$feat1 {db} = undef;
$feat1 {db_version} = undef;
$feat1 {program} = 'blat';
$feat1 {p_version} = '1';
$feat1 {source} = 'blat';
$feat1 {primary} = 'similarity';
$feat2 {source} = 'blat';
$feat2 {primary} = 'similarity';
my $feature_pair = $self->create_feature(\%feat1,\% feat2);
$superfeature->add_sub_SeqFeature( $feature_pair,'EXPAND');
}
return $superfeature;
}} |
sub create_feature
{ my ($self, $feat1,$feat2) = @_;
my $feature1= Bio::SeqFeature::Generic->new(
-seq_id =>$feat1->{name},
-start =>$feat1->{start},
-end =>$feat1->{end},
-strand =>$feat1->{strand},
-score =>$feat1->{score},
-source =>$feat1->{source},
-primary =>$feat1->{primary} );
my $feature2= Bio::SeqFeature::Generic->new(
-seq_id =>$feat2->{name},
-start =>$feat2->{start},
-end =>$feat2->{end},
-strand =>$feat2->{strand},
-score =>$feat2->{score},
-source =>$feat2->{source},
-primary =>$feat2->{primary} );
my $featurepair = Bio::SeqFeature::FeaturePair->new;
$featurepair->feature1 ($feature1);
$featurepair->feature2 ($feature2);
$featurepair->add_tag_value('evalue',$feat2->{p});
$featurepair->add_tag_value('percent_id',$feat2->{percent});
$featurepair->add_tag_value("hid",$feat2->{primary});
return $featurepair;} |