use
vars
qw(%MAPPING %MODEMAP $DEFAULT_WRITER_CLASS)
;
%MODEMAP
= (
'WiseOutput'
=>
'result'
,
'Hit'
=>
'hit'
,
'Hsp'
=>
'hsp'
);
%MAPPING
=
(
'Hsp_query-from'
=>
'HSP-query_start'
,
'Hsp_query-to'
=>
'HSP-query_end'
,
'Hsp_hit-from'
=>
'HSP-hit_start'
,
'Hsp_hit-to'
=>
'HSP-hit_end'
,
'Hsp_qseq'
=>
'HSP-query_seq'
,
'Hsp_hseq'
=>
'HSP-hit_seq'
,
'Hsp_midline'
=>
'HSP-homology_seq'
,
'Hsp_score'
=>
'HSP-score'
,
'Hsp_qlength'
=>
'HSP-query_length'
,
'Hsp_hlength'
=>
'HSP-hit_length'
,
'Hsp_align-len'
=>
'HSP-hsp_length'
,
'Hsp_positive'
=>
'HSP-conserved'
,
'Hsp_identity'
=>
'HSP-identical'
,
'Hit_id'
=>
'HIT-name'
,
'Hit_score'
=>
'HIT-score'
,
'WiseOutput_program'
=>
'RESULT-algorithm_name'
,
'WiseOutput_query-def'
=>
'RESULT-query_name'
,
'WiseOutput_query-desc'
=>
'RESULT-query_description'
,
'WiseOutput_query-len'
=>
'RESULT-query_length'
,
);
$DEFAULT_WRITER_CLASS
=
'Bio::Search::Writer::HitTableWriter'
;
sub
_initialize {
my
(
$self
,
@args
) =
@_
;
my
(
$wisetype
,
$file
,
$fh
) =
$self
->_rearrange([
qw(WISETYPE FILE FH)
],
@args
);
my
@newargs
;
while
(
@args
) {
my
$a
=
shift
@args
;
if
(
$a
=~ /FILE|FH/i ) {
shift
@args
;
next
;
}
push
@newargs
,
$a
,
shift
@args
;
}
$self
->SUPER::_initialize(
@newargs
);
$self
->{
'_handler_cache'
} =
$self
->_eventHandler;
$self
->wisetype(
$wisetype
);
my
@ioargs
;
if
(
$fh
) {
push
@ioargs
, (
'-fh'
=>
$fh
);
}
elsif
(
$file
) {
push
@ioargs
, (
'-file'
=>
$file
);
}
if
(
$wisetype
=~ /genewise/i ) {
$self
->wise(new Bio::Tools::Genewise(
@ioargs
));
}
elsif
(
$wisetype
=~ /genomewise/i ) {
$self
->wise(new Bio::Tools::Genomewise(
@ioargs
));
}
else
{
$self
->throw(
"Must supply a -wisetype to "
.
ref
(
$self
).
" which is one of 'genomewise' 'genewise'\n"
);
}
return
$self
;
}
sub
next_result{
my
(
$self
) =
@_
;
local
$/ =
"\n"
;
local
$_
;
return
unless
$self
->wise;
my
$prediction
=
$self
->wise->next_prediction;
return
unless
$prediction
;
$self
->{
'_reporttype'
} =
uc
$self
->wisetype;
$self
->start_element({
'Name'
=>
'WiseOutput'
});
$self
->element({
'Name'
=>
'WiseOutput_program'
,
'Data'
=>
$self
->wisetype});
$self
->element({
'Name'
=>
'WiseOutput_query-def'
,
'Data'
=>
$self
->wise->_target_id});
my
@transcripts
=
$prediction
->transcripts;
foreach
my
$transcript
(
@transcripts
) {
my
@exons
=
$transcript
->exons;
my
$protid
;
$self
->start_element({
'Name'
=>
'Hit'
});
if
(
$exons
[0]->has_tag(
'supporting_feature'
) ) {
my
(
$supporting_feature
) =
$exons
[0]->get_tag_values(
'supporting_feature'
);
$protid
=
$supporting_feature
->feature2->seq_id;
$self
->element({
'Name'
=>
'Hit_id'
,
'Data'
=>
$protid
});
}
$self
->element({
'Name'
=>
'Hit_score'
,
'Data'
=>
$exons
[0]->score});
foreach
my
$exon
(
@exons
) {
$self
->start_element({
'Name'
=>
'Hsp'
});
if
(
$exon
->strand < 0 ) {
$self
->element({
'Name'
=>
'Hsp_query-from'
,
'Data'
=>
$exon
->end});
$self
->element({
'Name'
=>
'Hsp_query-to'
,
'Data'
=>
$exon
->start});
}
else
{
$self
->element({
'Name'
=>
'Hsp_query-from'
,
'Data'
=>
$exon
->start});
$self
->element({
'Name'
=>
'Hsp_query-to'
,
'Data'
=>
$exon
->end});
}
$self
->element({
'Name'
=>
'Hsp_score'
,
'Data'
=>
$exon
->score});
if
(
$exon
->has_tag(
'supporting_feature'
) ) {
my
(
$sf
) =
$exon
->get_tag_values(
'supporting_feature'
);
my
$protein
=
$sf
->feature2;
if
(
$protein
->strand < 0 ) {
$self
->element({
'Name'
=>
'Hsp_hit-from'
,
'Data'
=>
$protein
->end});
$self
->element({
'Name'
=>
'Hsp_hit-to'
,
'Data'
=>
$protein
->start});
}
else
{
$self
->element({
'Name'
=>
'Hsp_hit-from'
,
'Data'
=>
$protein
->start});
$self
->element({
'Name'
=>
'Hsp_hit-to'
,
'Data'
=>
$protein
->end});
}
}
$self
->element({
'Name'
=>
'Hsp_identity'
,
'Data'
=> 0});
$self
->element({
'Name'
=>
'Hsp_positive'
,
'Data'
=> 0});
$self
->end_element({
'Name'
=>
'Hsp'
});
}
$self
->end_element({
'Name'
=>
'Hit'
});
}
$self
->end_element({
'Name'
=>
'WiseOutput'
});
return
$self
->end_document();
}
sub
start_element{
my
(
$self
,
$data
) =
@_
;
my
$nm
=
$data
->{
'Name'
};
my
$type
=
$MODEMAP
{
$nm
};
if
(
$type
) {
if
(
$self
->_eventHandler->will_handle(
$type
) ) {
my
$func
=
sprintf
(
"start_%s"
,
lc
$type
);
$self
->_eventHandler->
$func
(
$data
->{
'Attributes'
});
}
unshift
@{
$self
->{
'_elements'
}},
$type
;
if
(
$type
eq
'result'
) {
$self
->{
'_values'
} = {};
$self
->{
'_result'
}=
undef
;
}
}
}
sub
end_element {
my
(
$self
,
$data
) =
@_
;
my
$nm
=
$data
->{
'Name'
};
my
$type
=
$MODEMAP
{
$nm
};
my
$rc
;
if
(
$type
=
$MODEMAP
{
$nm
} ) {
if
(
$self
->_eventHandler->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
->debug(
"unknown nm $nm, ignoring\n"
);
}
$self
->{
'_last_data'
} =
''
;
$self
->{
'_result'
} =
$rc
if
(
defined
$type
&&
$type
eq
'result'
);
return
$rc
;
}
sub
element{
my
(
$self
,
$data
) =
@_
;
$self
->start_element(
$data
);
$self
->characters(
$data
);
$self
->end_element(
$data
);
}
sub
characters{
my
(
$self
,
$data
) =
@_
;
return
unless
(
defined
$data
->{
'Data'
} &&
$data
->{
'Data'
} !~ /^\s+$/ );
$self
->{
'_last_data'
} =
$data
->{
'Data'
};
}
sub
within_element{
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;
}
sub
in_element{
my
(
$self
,
$name
) =
@_
;
return
0
if
!
defined
$self
->{
'_elements'
}->[0];
return
(
$self
->{
'_elements'
}->[0] eq
$name
)
}
sub
start_document{
my
(
$self
) =
@_
;
$self
->{
'_lasttype'
} =
''
;
$self
->{
'_values'
} = {};
$self
->{
'_result'
}=
undef
;
$self
->{
'_elements'
} = [];
$self
->{
'_reporttype'
} =
'exonerate'
;
}
sub
end_document{
my
(
$self
,
@args
) =
@_
;
return
$self
->{
'_result'
};
}
sub
write_result {
my
(
$self
,
$blast
,
@args
) =
@_
;
if
( not
defined
(
$self
->writer) ) {
$self
->
warn
(
"Writer not defined. Using a $DEFAULT_WRITER_CLASS"
);
$self
->writer(
$DEFAULT_WRITER_CLASS
->new() );
}
$self
->SUPER::write_result(
$blast
,
@args
);
}
sub
result_count {
my
$self
=
shift
;
return
$self
->{
'_result_count'
};
}
sub
report_count {
shift
->result_count }
sub
wise{
my
$self
=
shift
;
return
$self
->{
'wise'
} =
shift
if
@_
;
return
$self
->{
'wise'
};
}
sub
wisetype{
my
$self
=
shift
;
return
$self
->{
'wisetype'
} =
shift
if
@_
;
return
$self
->{
'wisetype'
};
}
1;