sub
new {
my
(
$class
,
@args
) =
@_
;
my
$self
=
$class
->SUPER::new(
@args
);
$self
->_initialize_io(
@args
);
return
$self
;
}
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
;
}
1;