annotate variant_effect_predictor/Bio/SearchIO/blast.pm @ 3:d30fa12e4cc5 default tip

Merge heads 2:a5976b2dce6f and 1:09613ce8151e which were created as a result of a recently fixed bug.
author devteam <devteam@galaxyproject.org>
date Mon, 13 Jan 2014 10:38:30 -0500
parents 1f6dce3d34e0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 # $Id: blast.pm,v 1.42.2.14 2003/09/15 16:19:01 jason Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 # BioPerl module for Bio::SearchIO::blast
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 # Cared for by Jason Stajich <jason@bioperl.org>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 # Copyright Jason Stajich
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 # POD documentation - main docs before the code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 Bio::SearchIO::blast - Event generator for event based parsing of blast reports
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 # Do not use this object directly - it is used as part of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 # Bio::SearchIO system.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22 use Bio::SearchIO;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 my $searchio = new Bio::SearchIO(-format => 'blast',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 -file => 't/data/ecolitst.bls');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 while( my $result = $searchio->next_result ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 while( my $hit = $result->next_hit ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 while( my $hsp = $hit->next_hsp ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 # ...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 This object encapsulated the necessary methods for generating events
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 suitable for building Bio::Search objects from a BLAST report file.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 Read the L<Bio::SearchIO> for more information about how to use this.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 User feedback is an integral part of the evolution of this and other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 Bioperl modules. Send your comments and suggestions preferably to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 the Bioperl mailing list. Your participation is much appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 http://bioperl.org/MailList.shtml - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 Report bugs to the Bioperl bug tracking system to help us keep track
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 of the bugs and their resolution. Bug reports can be submitted via
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 email or the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 bioperl-bugs@bioperl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 =head1 AUTHOR - Jason Stajich
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 Email jason@bioperl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 Describe contact details here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 =head1 CONTRIBUTORS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 Additional contributors names and emails here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 The rest of the documentation details each of the object methods.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 Internal methods are usually preceded with a _
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 # Let the code begin...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 package Bio::SearchIO::blast;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 use vars qw(@ISA %MAPPING %MODEMAP $DEFAULT_BLAST_WRITER_CLASS);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 use Bio::SearchIO;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 @ISA = qw(Bio::SearchIO );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 BEGIN {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 # mapping of NCBI Blast terms to Bioperl hash keys
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 %MODEMAP = ('BlastOutput' => 'result',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 'Hit' => 'hit',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 'Hsp' => 'hsp'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 # This should really be done more intelligently, like with
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 # XSLT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 %MAPPING =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 'Hsp_bit-score' => 'HSP-bits',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 'Hsp_score' => 'HSP-score',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 'Hsp_evalue' => 'HSP-evalue',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 'Hsp_pvalue' => 'HSP-pvalue',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 'Hsp_query-from' => 'HSP-query_start',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 'Hsp_query-to' => 'HSP-query_end',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 'Hsp_hit-from' => 'HSP-hit_start',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 'Hsp_hit-to' => 'HSP-hit_end',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 'Hsp_positive' => 'HSP-conserved',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 'Hsp_identity' => 'HSP-identical',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 'Hsp_gaps' => 'HSP-hsp_gaps',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 'Hsp_hitgaps' => 'HSP-hit_gaps',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 'Hsp_querygaps' => 'HSP-query_gaps',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 'Hsp_qseq' => 'HSP-query_seq',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 'Hsp_hseq' => 'HSP-hit_seq',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 'Hsp_midline' => 'HSP-homology_seq',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 'Hsp_align-len' => 'HSP-hsp_length',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 'Hsp_query-frame'=> 'HSP-query_frame',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 'Hsp_hit-frame' => 'HSP-hit_frame',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 'Hit_id' => 'HIT-name',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 'Hit_len' => 'HIT-length',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 'Hit_accession' => 'HIT-accession',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 'Hit_def' => 'HIT-description',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 'Hit_signif' => 'HIT-significance',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 'Hit_score' => 'HIT-score',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 'Iteration_iter-num' => 'HIT-iteration',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 'BlastOutput_program' => 'RESULT-algorithm_name',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 'BlastOutput_version' => 'RESULT-algorithm_version',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 'BlastOutput_query-def'=> 'RESULT-query_name',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 'BlastOutput_query-len'=> 'RESULT-query_length',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 'BlastOutput_query-acc'=> 'RESULT-query_accession',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 'BlastOutput_querydesc'=> 'RESULT-query_description',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 'BlastOutput_db' => 'RESULT-database_name',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 'BlastOutput_db-len' => 'RESULT-database_entries',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 'BlastOutput_db-let' => 'RESULT-database_letters',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 'Parameters_matrix' => { 'RESULT-parameters' => 'matrix'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 'Parameters_expect' => { 'RESULT-parameters' => 'expect'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 'Parameters_include' => { 'RESULT-parameters' => 'include'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 'Parameters_sc-match' => { 'RESULT-parameters' => 'match'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 'Parameters_sc-mismatch' => { 'RESULT-parameters' => 'mismatch'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 'Parameters_gap-open' => { 'RESULT-parameters' => 'gapopen'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 'Parameters_gap-extend'=> { 'RESULT-parameters' => 'gapext'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 'Parameters_filter' => {'RESULT-parameters' => 'filter'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 'Parameters_allowgaps' => { 'RESULT-parameters' => 'allowgaps'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 'Statistics_db-len' => {'RESULT-statistics' => 'dbentries'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 'Statistics_db-let' => { 'RESULT-statistics' => 'dbletters'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 'Statistics_hsp-len' => { 'RESULT-statistics' => 'effective_hsplength'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 'Statistics_query-len' => { 'RESULT-statistics' => 'querylength'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 'Statistics_eff-space' => { 'RESULT-statistics' => 'effectivespace'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 'Statistics_eff-spaceused' => { 'RESULT-statistics' => 'effectivespaceused'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 'Statistics_eff-dblen' => { 'RESULT-statistics' => 'effectivedblength'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 'Statistics_kappa' => { 'RESULT-statistics' => 'kappa' },
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 'Statistics_lambda' => { 'RESULT-statistics' => 'lambda' },
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 'Statistics_entropy' => { 'RESULT-statistics' => 'entropy'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 'Statistics_framewindow'=> { 'RESULT-statistics' => 'frameshiftwindow'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 'Statistics_decay'=> { 'RESULT-statistics' => 'decayconst'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 'Statistics_T'=> { 'RESULT-statistics' => 'T'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 'Statistics_A'=> { 'RESULT-statistics' => 'A'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 'Statistics_X1'=> { 'RESULT-statistics' => 'X1'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 'Statistics_X2'=> { 'RESULT-statistics' => 'X2'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 'Statistics_S1'=> { 'RESULT-statistics' => 'S1'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 'Statistics_S2'=> { 'RESULT-statistics' => 'S2'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 'Statistics_hit_to_db' => { 'RESULT-statistics' => 'Hits_to_DB'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 'Statistics_num_extensions' => { 'RESULT-statistics' => 'num_extensions'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 'Statistics_num_extensions' => { 'RESULT-statistics' => 'num_extensions'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 'Statistics_num_suc_extensions' => { 'RESULT-statistics' => 'num_successful_extensions'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 'Statistics_seqs_better_than_cutoff' => { 'RESULT-statistics' => 'seqs_better_than_cutoff'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 'Statistics_posted_date' => { 'RESULT-statistics' => 'posted_date'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 # WU-BLAST stats
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 'Statistics_DFA_states'=> { 'RESULT-statistics' => 'num_dfa_states'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 'Statistics_DFA_size'=> { 'RESULT-statistics' => 'dfa_size'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 'Statistics_search_cputime' => { 'RESULT-statistics' => 'search_cputime'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 'Statistics_total_cputime' => { 'RESULT-statistics' => 'total_cputime'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 'Statistics_search_actualtime' => { 'RESULT-statistics' => 'search_actualtime'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 'Statistics_total_actualtime' => { 'RESULT-statistics' => 'total_actualtime'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 'Statistics_noprocessors' => { 'RESULT-statistics' => 'no_of_processors'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 'Statistics_neighbortime' => { 'RESULT-statistics' => 'neighborhood_generate_time'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 'Statistics_starttime' => { 'RESULT-statistics' => 'start_time'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 'Statistics_endtime' => { 'RESULT-statistics' => 'end_time'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 $DEFAULT_BLAST_WRITER_CLASS = 'Bio::Search::Writer::HitTableWriter';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 Title : new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 Usage : my $obj = new Bio::SearchIO::blast();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 Function: Builds a new Bio::SearchIO::blast object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 Returns : Bio::SearchIO::blast
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 Args : -fh/-file => filehandle/filename to BLAST file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 -format => 'blast'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 =head2 next_result
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 Title : next_result
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 Usage : my $hit = $searchio->next_result;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 Function: Returns the next Result from a search
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 Returns : Bio::Search::Result::ResultI object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 sub next_result{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 my $data = '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 my $seentop = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 my ($reporttype,$seenquery,$reportline);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 $self->start_document();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 my @hit_signifs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 while( defined ($_ = $self->_readline )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 next if( /^\s+$/); # skip empty lines
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 next if( /CPU time:/);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 next if( /^>\s*$/);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 if( /^([T]?BLAST[NPX])\s*(.+)$/i ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 /^(PSITBLASTN)\s+(.+)$/i ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 /^(RPS-BLAST)\s*(.+)$/i ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 /^(MEGABLAST)\s*(.+)$/i
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 if( $seentop ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 $self->_pushback($_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 $self->end_element({ 'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 $self->in_element('hit') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 $self->end_element({ 'Name' => 'Hit'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 $self->end_element({ 'Name' => 'BlastOutput'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 return $self->end_document();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 $self->start_element({ 'Name' => 'BlastOutput' } );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 $self->{'_result_count'}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 $seentop = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 $reporttype = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 $reportline = $_; # to fix the fact that RPS-BLAST output is wrong
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 $self->element({ 'Name' => 'BlastOutput_program',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 'Data' => $reporttype});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 $self->element({ 'Name' => 'BlastOutput_version',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 'Data' => $2});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 } elsif ( /^Query=\s*(.+)$/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 my $q = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 my $size = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 if( defined $seenquery ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 $self->_pushback($reportline);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 $self->_pushback($_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 $self->end_element({'Name'=> 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 $self->in_element('hit') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 $self->end_element({'Name'=> 'Hit'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 $self->end_element({'Name' => 'BlastOutput'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 return $self->end_document();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 if( ! defined $reporttype ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 $self->start_element({'Name' => 'BlastOutput'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 $seentop = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 $self->{'_result_count'}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 $seenquery = $q;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 $_ = $self->_readline;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 while( defined ($_) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 if( /^Database:/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 $self->_pushback($_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 chomp;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 if( /\((\-?[\d,]+)\s+letters.*\)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 $size = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 $size =~ s/,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 $q .= " $_";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 $q =~ s/ +/ /g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 $q =~ s/^ | $//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 $_ = $self->_readline;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 chomp($q);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 my ($nm,$desc) = split(/\s+/,$q,2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 $self->element({ 'Name' => 'BlastOutput_query-def',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 'Data' => $nm});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 $self->element({ 'Name' => 'BlastOutput_query-len',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 'Data' => $size});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 defined $desc && $desc =~ s/\s+$//;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 $self->element({ 'Name' => 'BlastOutput_querydesc',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 'Data' => $desc});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 if( my @pieces = split(/\|/,$nm) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 my $acc = pop @pieces;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 $acc = pop @pieces if( ! defined $acc || $acc =~ /^\s+$/);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 $self->element({ 'Name' => 'BlastOutput_query-acc',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 'Data' => $acc});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 } elsif( /Sequences producing significant alignments:/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 descline:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 while( defined ($_ = $self->_readline() )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 if( /^>/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 $self->_pushback($_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 last descline;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 } elsif( /(\d+)\s+([\d\.\-eE]+)(\s+\d+)?\s*$/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 # the last match is for gapped BLAST output
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 # which will report the number of HSPs for the Hit
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 my ($score, $evalue) = ($1, $2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 # Some data clean-up so e-value will appear numeric to perl
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 $evalue =~ s/^e/1e/i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 push @hit_signifs, [ $evalue, $score ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 } elsif( /Sequences producing High-scoring Segment Pairs:/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 # skip the next line
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 $_ = $self->_readline();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 while( defined ($_ = $self->_readline() ) &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 ! /^\s+$/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 my @line = split;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 pop @line; # throw away first number which is for 'N'col
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 push @hit_signifs, [ pop @line, pop @line];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 } elsif ( /^Database:\s*(.+)$/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 my $db = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 while( defined($_ = $self->_readline) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 if( /^\s+(\-?[\d\,]+)\s+sequences\;\s+(\-?[\d,]+)\s+total\s+letters/){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 my ($s,$l) = ($1,$2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 $s =~ s/,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 $l =~ s/,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 $self->element({'Name' => 'BlastOutput_db-len',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 'Data' => $s});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 $self->element({'Name' => 'BlastOutput_db-let',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 'Data' => $l});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 chomp;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 $db .= $_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 $self->element({'Name' => 'BlastOutput_db',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 'Data' => $db});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 } elsif( /^>(\S+)\s*(.*)?/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 chomp;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 $self->in_element('hsp') && $self->end_element({ 'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 $self->in_element('hit') && $self->end_element({ 'Name' => 'Hit'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 $self->start_element({ 'Name' => 'Hit'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 my $id = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 my $restofline = $2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 $self->element({ 'Name' => 'Hit_id',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 'Data' => $id});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 my ($acc, $version);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 if ($id =~ /(gb|emb|dbj|sp|pdb|bbs|ref|lcl)\|(.*)\|(.*)/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 ($acc, $version) = split /\./, $2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 } elsif ($id =~ /(pir|prf|pat|gnl)\|(.*)\|(.*)/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 ($acc, $version) = split /\./, $3;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 #punt, not matching the db's at ftp://ftp.ncbi.nih.gov/blast/db/README
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 #Database Name Identifier Syntax
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 #============================ ========================
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 #GenBank gb|accession|locus
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 #EMBL Data Library emb|accession|locus
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 #DDBJ, DNA Database of Japan dbj|accession|locus
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 #NBRF PIR pir||entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 #Protein Research Foundation prf||name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 #SWISS-PROT sp|accession|entry name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 #Brookhaven Protein Data Bank pdb|entry|chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 #Patents pat|country|number
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 #GenInfo Backbone Id bbs|number
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 #General database identifier gnl|database|identifier
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 #NCBI Reference Sequence ref|accession|locus
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 #Local Sequence identifier lcl|identifier
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 $acc=$id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 $self->element({ 'Name' => 'Hit_accession',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 'Data' => $acc});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 my $v = shift @hit_signifs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 if( defined $v ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 $self->element({'Name' => 'Hit_signif',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 'Data' => $v->[0]});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 $self->element({'Name' => 'Hit_score',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 'Data' => $v->[1]});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 while(defined($_ = $self->_readline()) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 next if( /^\s+$/ );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 chomp;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 if( /Length\s*=\s*([\d,]+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 my $l = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 $l =~ s/\,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 $self->element({ 'Name' => 'Hit_len',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 'Data' => $l });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 $restofline .= $_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 $restofline =~ s/\s+/ /g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 $self->element({ 'Name' => 'Hit_def',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 'Data' => $restofline});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 } elsif( /\s+(Plus|Minus) Strand HSPs:/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 } elsif( ($self->in_element('hit') ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 $self->in_element('hsp')) && # wublast
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 m/Score\s*=\s*(\S+)\s* # Bit score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 \(([\d\.]+)\s*bits\), # Raw score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 \s*Expect\s*=\s*([^,\s]+), # E-value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 \s*(?:Sum)?\s* # SUM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 P(?:\(\d+\))?\s*=\s*([^,\s]+) # P-value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 /ox
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 my ($score, $bits,$evalue,$pvalue) = ($1,$2,$3,$4);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 $evalue =~ s/^e/1e/i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 $pvalue =~ s/^e/1e/i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 $self->in_element('hsp') && $self->end_element({'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 $self->start_element({'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 $self->element( { 'Name' => 'Hsp_score',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 'Data' => $score});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 $self->element( { 'Name' => 'Hsp_bit-score',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 'Data' => $bits});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 $self->element( { 'Name' => 'Hsp_evalue',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 'Data' => $evalue});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 $self->element( {'Name' => 'Hsp_pvalue',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 'Data' => $pvalue});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 } elsif( ($self->in_element('hit') ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 $self->in_element('hsp')) && # ncbi blast
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 m/Score\s*=\s*(\S+)\s*bits\s* # Bit score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 (?:\((\d+)\))?, # Missing for BLAT pseudo-BLAST fmt
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 \s*Expect(?:\(\d+\))?\s*=\s*(\S+) # E-value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 /ox) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 my ($bits,$score,$evalue) = ($1,$2,$3);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 $evalue =~ s/^e/1e/i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 $self->in_element('hsp') && $self->end_element({ 'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 $self->start_element({'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 $self->element( { 'Name' => 'Hsp_score',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 'Data' => $score});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 $self->element( { 'Name' => 'Hsp_bit-score',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 'Data' => $bits});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 $self->element( { 'Name' => 'Hsp_evalue',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 'Data' => $evalue});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 } elsif( $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 m/Identities\s*=\s*(\d+)\s*\/\s*(\d+)\s*[\d\%\(\)]+\s*
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 (?:,\s*Positives\s*=\s*(\d+)\/(\d+)\s*[\d\%\(\)]+\s*)? # pos only valid for Protein alignments
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 (?:\,\s*Gaps\s*=\s*(\d+)\/(\d+))? # Gaps
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 /oxi
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 $self->element( { 'Name' => 'Hsp_identity',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 $self->element( {'Name' => 'Hsp_align-len',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 'Data' => $2});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 if( defined $3 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 $self->element( { 'Name' => 'Hsp_positive',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 'Data' => $3});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 $self->element( { 'Name' => 'Hsp_positive',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 if( defined $6 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 $self->element( { 'Name' => 'Hsp_gaps',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 'Data' => $5});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 $self->{'_Query'} = { 'begin' => 0, 'end' => 0};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 $self->{'_Sbjct'} = { 'begin' => 0, 'end' => 0};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 if( /(Frame\s*=\s*.+)$/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 # handle wu-blast Frame listing on same line
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 $self->_pushback($1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 } elsif( $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 /Strand\s*=\s*(Plus|Minus)\s*\/\s*(Plus|Minus)/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 # consume this event ( we infer strand from start/end)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 } elsif( $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 /Frame\s*=\s*([\+\-][1-3])\s*(\/\s*([\+\-][1-3]))?/ ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 my ($one,$two)= ($1,$2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 my ($queryframe,$hitframe);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 if( $reporttype eq 'TBLASTX' ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 ($queryframe,$hitframe) = ($one,$two);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 $hitframe =~ s/\/\s*//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 } elsif( $reporttype =~ /^(PSI)?TBLASTN/oi ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 ($hitframe,$queryframe) = ($one,0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 } elsif( $reporttype eq 'BLASTX' ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 ($queryframe,$hitframe) = ($one,0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 $self->element({'Name' => 'Hsp_query-frame',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 'Data' => $queryframe});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 $self->element({'Name' => 'Hsp_hit-frame',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 'Data' => $hitframe});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 } elsif( /^Parameters:/ || /^\s+Database:\s+?/ || /^\s+Subset/ ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 /^\s+Subset/ || /^\s*Lambda/ || /^\s*Histogram/ ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 ( $self->in_element('hsp') && /WARNING|NOTE/ ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 $self->in_element('hsp') && $self->end_element({'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 $self->in_element('hit') && $self->end_element({'Name' => 'Hit'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 next if /^\s+Subset/;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 my $blast = ( /^(\s+Database\:)|(\s*Lambda)/ ) ? 'ncbi' : 'wublast';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 if( /^\s*Histogram/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 $blast = 'btk';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 my $last = '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 # default is that gaps are allowed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 $self->element({'Name' => 'Parameters_allowgaps',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 'Data' => 'yes'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 while( defined ($_ = $self->_readline ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 if( /^(PSI)?([T]?BLAST[NPX])\s*(.+)$/i ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 /^(RPS-BLAST)\s*(.+)$/i ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 /^(MEGABLAST)\s*(.+)$/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 $self->_pushback($_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 # let's handle this in the loop
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 } elsif( /^Query=/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 $self->_pushback($reportline);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 $self->_pushback($_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 # -- Superfluous I think
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 $self->end_element({'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 $self->in_element('hit') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 $self->end_element({'Name' => 'Hit'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 # --
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 $self->end_element({ 'Name' => 'BlastOutput'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 return $self->end_document();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 # here is where difference between wublast and ncbiblast
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 # is better handled by different logic
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 if( /Number of Sequences:\s+([\d\,]+)/i ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 /of sequences in database:\s+([\d,]+)/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 my $c = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 $c =~ s/\,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 $self->element({'Name' => 'Statistics_db-len',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 'Data' => $c});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 } elsif ( /letters in database:\s+(\-?[\d,]+)/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 my $s = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 $s =~ s/,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 $self->element({'Name' => 'Statistics_db-let',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 'Data' => $s});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 } elsif( $blast eq 'btk' ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 } elsif( $blast eq 'wublast' ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 if( /E=(\S+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 $self->element({'Name' => 'Parameters_expect',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 } elsif( /nogaps/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 $self->element({'Name' => 'Parameters_allowgaps',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 'Data' => 'no'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 } elsif( $last =~ /(Frame|Strand)\s+MatID\s+Matrix name/i ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 s/^\s+//;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 #throw away first two slots
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563 my @vals = split;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 splice(@vals, 0,2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 my ($matrix,$lambda,$kappa,$entropy) = @vals;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 $self->element({'Name' => 'Parameters_matrix',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 'Data' => $matrix});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 $self->element({'Name' => 'Statistics_lambda',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 'Data' => $lambda});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 $self->element({'Name' => 'Statistics_kappa',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 'Data' => $kappa});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 $self->element({'Name' => 'Statistics_entropy',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 'Data' => $entropy});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 } elsif( m/^\s+Q=(\d+),R=(\d+)\s+/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 $self->element({'Name' => 'Parameters_gap-open',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 $self->element({'Name' => 'Parameters_gap-extend',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 'Data' => $2});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 } elsif( /(\S+\s+\S+)\s+DFA:\s+(\S+)\s+\((.+)\)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 if( $1 eq 'states in') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 $self->element({'Name' => 'Statistics_DFA_states',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 'Data' => "$2 $3"});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 } elsif( $1 eq 'size of') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 $self->element({'Name' => 'Statistics_DFA_size',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 'Data' => "$2 $3"});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 } elsif( /^\s+Time to generate neighborhood:\s+(\S+\s+\S+\s+\S+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 $self->element({'Name' => 'Statistics_neighbortime',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 } elsif( /processors\s+used:\s+(\d+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 $self->element({'Name' => 'Statistics_noprocessors',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 } elsif( m/^\s+(\S+)\s+cpu\s+time:\s+(\S+\s+\S+\s+\S+)\s+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 Elapsed:\s+(\S+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 my $cputype = lc($1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 $self->element({'Name' => "Statistics_$cputype\_cputime",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 'Data' => $2});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 $self->element({'Name' => "Statistics_$cputype\_actualtime",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 'Data' => $3});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 } elsif( /^\s+Start:/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 my ($junk,$start,$stime,$end,$etime) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 split(/\s+(Start|End)\:\s+/,$_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 chomp($stime);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 $self->element({'Name' => 'Statistics_starttime',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 'Data' => $stime});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 chomp($etime);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 $self->element({'Name' => 'Statistics_endtime',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 'Data' => $etime});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 } elsif( !/^\s+$/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 $self->debug( "unmatched stat $_");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 } elsif ( $blast eq 'ncbi' ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 if( m/^Matrix:\s+(\S+)/oxi ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 $self->element({'Name' => 'Parameters_matrix',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 } elsif( /Lambda/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 $_ = $self->_readline;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 s/^\s+//;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 my ($lambda, $kappa, $entropy) = split;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 $self->element({'Name' => 'Statistics_lambda',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 'Data' => $lambda});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 $self->element({'Name' => 'Statistics_kappa',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 'Data' => $kappa});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 $self->element({'Name' => 'Statistics_entropy',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 'Data' => $entropy});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 } elsif( m/effective\s+search\s+space\s+used:\s+(\d+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 $self->element({'Name' => 'Statistics_eff-spaceused',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 } elsif( m/effective\s+search\s+space:\s+(\d+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 $self->element({'Name' => 'Statistics_eff-space',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 } elsif( m/Gap\s+Penalties:\s+Existence:\s+(\d+)\,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 \s+Extension:\s+(\d+)/ox) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 $self->element({'Name' => 'Parameters_gap-open',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 $self->element({'Name' => 'Parameters_gap-extend',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 'Data' => $2});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 } elsif( /effective\s+HSP\s+length:\s+(\d+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 $self->element({'Name' => 'Statistics_hsp-len',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 } elsif( /effective\s+length\s+of\s+query:\s+([\d\,]+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 my $c = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 $c =~ s/\,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645 $self->element({'Name' => 'Statistics_query-len',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 'Data' => $c});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 } elsif( m/effective\s+length\s+of\s+database:\s+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 ([\d\,]+)/ox){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 my $c = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 $c =~ s/\,//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 $self->element({'Name' => 'Statistics_eff-dblen',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 'Data' => $c});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 } elsif( m/^(T|A|X1|X2|S1|S2):\s+(.+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 my $v = $2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 chomp($v);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 $self->element({'Name' => "Statistics_$1",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 'Data' => $v});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 } elsif( m/frameshift\s+window\,\s+decay\s+const:\s+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 (\d+)\,\s+([\.\d]+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 $self->element({'Name'=> 'Statistics_framewindow',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662 $self->element({'Name'=> 'Statistics_decay',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 'Data' => $2});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664 } elsif( m/^Number\s+of\s+Hits\s+to\s+DB:\s+(\S+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 $self->element({'Name' => 'Statistics_hit_to_db',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667 } elsif( m/^Number\s+of\s+extensions:\s+(\S+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 $self->element({'Name' => 'Statistics_num_extensions',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670 } elsif( m/^Number\s+of\s+successful\s+extensions:\s+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 (\S+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672 $self->element({'Name' => 'Statistics_num_suc_extensions',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674 } elsif( m/^Number\s+of\s+sequences\s+better\s+than\s+
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 (\S+):\s+(\d+)/ox ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 $self->element({'Name' => 'Parameters_expect',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 'Data' => $1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 $self->element({'Name' => 'Statistics_seqs_better_than_cutoff',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 'Data' => $2});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 } elsif( /^\s+Posted\s+date:\s+(.+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 my $d = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682 chomp($d);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 $self->element({'Name' => 'Statistics_posted_date',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684 'Data' => $d});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 } elsif( ! /^\s+$/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 $self->debug( "unmatched stat $_");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689 $last = $_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 } elsif( $self->in_element('hsp') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692 # let's read 3 lines at a time;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 my %data = ( 'Query' => '',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 'Mid' => '',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695 'Hit' => '' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696 my ($l,$len);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 for( my $i = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698 defined($_) && $i < 3;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699 $i++ ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700 chomp;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 if( ($i == 0 && /^\s+$/) || ($l = /^\s*Lambda/i) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702 $self->_pushback($_) if defined $_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703 # this fixes bug #1443
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 $self->end_element({'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 $self->end_element({'Name' => 'Hit'}) if $l;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 if( /^((Query|Sbjct):\s+(\d+)\s*)(\S+)\s+(\d+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709 $data{$2} = $4;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 $len = length($1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 $self->{"\_$2"}->{'begin'} = $3 unless $self->{"_$2"}->{'begin'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 $self->{"\_$2"}->{'end'} = $5;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 $self->throw("no data for midline $_")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715 unless (defined $_ && defined $len);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 $data{'Mid'} = substr($_,$len);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 $_ = $self->_readline();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 $self->characters({'Name' => 'Hsp_qseq',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721 'Data' => $data{'Query'} });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 $self->characters({'Name' => 'Hsp_hseq',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723 'Data' => $data{'Sbjct'}});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 $self->characters({'Name' => 'Hsp_midline',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 'Data' => $data{'Mid'} });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 $self->debug( "unrecognized line $_");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 if( $seentop ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 # double back check that hits and hsps are closed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 # this in response to bug #1443 (may be uncessary due to fix
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 # above, but making double sure)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736 $self->end_element({'Name' => 'Hsp'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 $self->in_element('hit') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738 $self->end_element({'Name' => 'Hit'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 $self->end_element({'Name' => 'BlastOutput'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 # $self->end_element({'Name' => 'BlastOutput'}) unless ! $seentop;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742 return $self->end_document();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 =head2 start_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747 Title : start_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 Usage : $eventgenerator->start_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749 Function: Handles a start element event
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 Args : hashref with at least 2 keys 'Data' and 'Name'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 sub start_element{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 my ($self,$data) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 # we currently don't care about attributes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759 my $nm = $data->{'Name'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 my $type = $MODEMAP{$nm};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761 if( $type ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 if( $self->_eventHandler->will_handle($type) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 my $func = sprintf("start_%s",lc $type);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764 $self->_eventHandler->$func($data->{'Attributes'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 unshift @{$self->{'_elements'}}, $type;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767 if( $type eq 'result') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768 $self->{'_values'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769 $self->{'_result'}= undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 # cleanup some things
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772 if( defined $self->{'_values'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 foreach my $k ( grep { /^\U$type\-/ }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 keys %{$self->{'_values'}} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775 delete $self->{'_values'}->{$k};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 =head2 end_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 Title : start_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 Usage : $eventgenerator->end_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 Function: Handles an end element event
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 Args : hashref with at least 2 keys 'Data' and 'Name'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793 sub end_element {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 my ($self,$data) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 my $nm = $data->{'Name'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 my $type = $MODEMAP{$nm};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 my $rc;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798 if($nm eq 'BlastOutput_program' &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 $self->{'_last_data'} =~ /(t?blast[npx])/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 $self->{'_reporttype'} = uc $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803 # Hsp are sort of weird, in that they end when another
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804 # object begins so have to detect this in end_element for now
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805 if( $nm eq 'Hsp' ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 foreach ( qw(Hsp_qseq Hsp_midline Hsp_hseq) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807 $self->element({'Name' => $_,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808 'Data' => $self->{'_last_hspdata'}->{$_}});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 $self->{'_last_hspdata'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 $self->element({'Name' => 'Hsp_query-from',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812 'Data' => $self->{'_Query'}->{'begin'}});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813 $self->element({'Name' => 'Hsp_query-to',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814 'Data' => $self->{'_Query'}->{'end'}});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816 $self->element({'Name' => 'Hsp_hit-from',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 'Data' => $self->{'_Sbjct'}->{'begin'}});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818 $self->element({'Name' => 'Hsp_hit-to',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 'Data' => $self->{'_Sbjct'}->{'end'}});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 if( $type = $MODEMAP{$nm} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822 if( $self->_eventHandler->will_handle($type) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823 my $func = sprintf("end_%s",lc $type);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 $rc = $self->_eventHandler->$func($self->{'_reporttype'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825 $self->{'_values'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827 shift @{$self->{'_elements'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829 } elsif( $MAPPING{$nm} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 if ( ref($MAPPING{$nm}) =~ /hash/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 # this is where we shove in the data from the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833 # hashref info about params or statistics
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 my $key = (keys %{$MAPPING{$nm}})[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 $self->{'_values'}->{$key}->{$MAPPING{$nm}->{$key}} = $self->{'_last_data'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 $self->{'_values'}->{$MAPPING{$nm}} = $self->{'_last_data'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 $self->debug( "unknown nm $nm, ignoring\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842 $self->{'_last_data'} = ''; # remove read data if we are at
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 # end of an element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844 $self->{'_result'} = $rc if( defined $type && $type eq 'result' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 return $rc;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849 =head2 element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 Title : element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 Usage : $eventhandler->element({'Name' => $name, 'Data' => $str});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 Function: Convience method that calls start_element, characters, end_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855 Args : Hash ref with the keys 'Name' and 'Data'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860 sub element{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 my ($self,$data) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862 $self->start_element($data);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863 $self->characters($data);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864 $self->end_element($data);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867 =head2 characters
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869 Title : characters
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870 Usage : $eventgenerator->characters($str)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871 Function: Send a character events
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873 Args : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878 sub characters{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879 my ($self,$data) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 return unless ( defined $data->{'Data'} && $data->{'Data'} !~ /^\s+$/ );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882 if( $self->in_element('hsp') &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883 $data->{'Name'} =~ /Hsp\_(qseq|hseq|midline)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884 $self->{'_last_hspdata'}->{$data->{'Name'}} .= $data->{'Data'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 $self->{'_last_data'} = $data->{'Data'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889 =head2 within_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 Title : within_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892 Usage : if( $eventgenerator->within_element($element) ) {}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 Function: Test if we are within a particular element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894 This is different than 'in' because within can be tested
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 for a whole block.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896 Returns : boolean
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897 Args : string element name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902 sub within_element{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903 my ($self,$name) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904 return 0 if ( ! defined $name &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905 ! defined $self->{'_elements'} ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906 scalar @{$self->{'_elements'}} == 0) ;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907 foreach ( @{$self->{'_elements'}} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908 if( $_ eq $name ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912 return 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 =head2 in_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918 Title : in_element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919 Usage : if( $eventgenerator->in_element($element) ) {}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920 Function: Test if we are in a particular element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921 This is different than 'in' because within can be tested
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922 for a whole block.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 Returns : boolean
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924 Args : string element name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929 sub in_element{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930 my ($self,$name) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
931 return 0 if ! defined $self->{'_elements'}->[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
932 return ( $self->{'_elements'}->[0] eq $name)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
933 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
934
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
935 =head2 start_document
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
936
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
937 Title : start_document
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
938 Usage : $eventgenerator->start_document
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
939 Function: Handle a start document event
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
940 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
941 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
942
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
943
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
944 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
945
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
946 sub start_document{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
947 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
948 $self->{'_lasttype'} = '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
949 $self->{'_values'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
950 $self->{'_result'}= undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
951 $self->{'_elements'} = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
952 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
953
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
954 =head2 end_document
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
955
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
956 Title : end_document
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
957 Usage : $eventgenerator->end_document
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
958 Function: Handles an end document event
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
959 Returns : Bio::Search::Result::ResultI object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
960 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
961
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
962
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
963 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
964
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
965 sub end_document{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
966 my ($self,@args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
967 return $self->{'_result'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
968 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
969
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
970
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
971 sub write_result {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
972 my ($self, $blast, @args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
973
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
974 if( not defined($self->writer) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
975 $self->warn("Writer not defined. Using a $DEFAULT_BLAST_WRITER_CLASS");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
976 $self->writer( $DEFAULT_BLAST_WRITER_CLASS->new() );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
977 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
978 $self->SUPER::write_result( $blast, @args );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
979 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
980
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
981 sub result_count {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
982 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
983 return $self->{'_result_count'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
984 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
985
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
986 sub report_count { shift->result_count }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
987
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
988 1;