File Coverage

Bio/Search/Hit/HmmpfamHit.pm
Criterion Covered Total %
statement 94 101 93.0
branch 20 24 83.3
condition 18 29 62.0
subroutine 19 20 95.0
pod 8 8 100.0
total 159 182 87.3


line stmt bran cond sub pod time code
1             #
2             # BioPerl module for Bio::Search::Hit::HmmpfamHit
3             #
4             # Please direct questions and support issues to
5             #
6             # Cared for by Sendu Bala
7             #
8             # Copyright Sendu Bala
9             #
10             # You may distribute this module under the same terms as perl itself
11              
12             # POD documentation - main docs before the code
13              
14             =head1 NAME
15              
16             Bio::Search::Hit::HmmpfamHit - A parser and hit object for hmmpfam hits
17              
18             =head1 SYNOPSIS
19              
20             # generally we use Bio::SearchIO to build these objects
21             use Bio::SearchIO;
22             my $in = Bio::SearchIO->new(-format => 'hmmer_pull',
23             -file => 'result.hmmer');
24              
25             while (my $result = $in->next_result) {
26             while (my $hit = $result->next_hit) {
27             print $hit->name, "\n";
28             print $hit->score, "\n";
29             print $hit->significance, "\n";
30              
31             while (my $hsp = $hit->next_hsp) {
32             # process HSPI objects
33             }
34             }
35             }
36              
37             =head1 DESCRIPTION
38              
39             This object implements a parser for hmmpfam hit output, a program in the HMMER
40             package.
41              
42             =head1 FEEDBACK
43              
44             =head2 Mailing Lists
45              
46             User feedback is an integral part of the evolution of this and other
47             Bioperl modules. Send your comments and suggestions preferably to
48             the Bioperl mailing list. Your participation is much appreciated.
49              
50             bioperl-l@bioperl.org - General discussion
51             http://bioperl.org/wiki/Mailing_lists - About the mailing lists
52              
53             =head2 Support
54              
55             Please direct usage questions or support issues to the mailing list:
56              
57             I
58              
59             rather than to the module maintainer directly. Many experienced and
60             reponsive experts will be able look at the problem and quickly
61             address it. Please include a thorough description of the problem
62             with code and data examples if at all possible.
63              
64             =head2 Reporting Bugs
65              
66             Report bugs to the Bioperl bug tracking system to help us keep track
67             of the bugs and their resolution. Bug reports can be submitted via the
68             web:
69              
70             https://github.com/bioperl/bioperl-live/issues
71              
72             =head1 AUTHOR - Sendu Bala
73              
74             Email bix@sendu.me.uk
75              
76             =head1 APPENDIX
77              
78             The rest of the documentation details each of the object methods.
79             Internal methods are usually preceded with a _
80              
81             =cut
82              
83             # Let the code begin...
84              
85             package Bio::Search::Hit::HmmpfamHit;
86              
87 1     1   3 use strict;
  1         1  
  1         21  
88              
89 1     1   401 use Bio::Search::HSP::HmmpfamHSP;
  1         3  
  1         31  
90              
91 1     1   5 use base qw(Bio::Root::Root Bio::Search::Hit::PullHitI);
  1         1  
  1         524  
92              
93             =head2 new
94              
95             Title : new
96             Usage : my $obj = Bio::Search::Hit::HmmpfamHit->new();
97             Function: Builds a new Bio::Search::Hit::HmmpfamHit object.
98             Returns : Bio::Search::Hit::HmmpfamHit
99             Args : -chunk => [Bio::Root::IO, $start, $end] (required if no -parent)
100             -parent => Bio::PullParserI object (required if no -chunk)
101             -hit_data => array ref with [name description score significance
102             num_hsps rank]
103              
104             where the array ref provided to -chunk contains an IO object
105             for a filehandle to something representing the raw data of the
106             hit, and $start and $end define the tell() position within the
107             filehandle that the hit data starts and ends (optional; defaults
108             to start and end of the entire thing described by the filehandle)
109              
110             =cut
111              
112             sub new {
113 16     16 1 23 my ($class, @args) = @_;
114 16         30 my $self = $class->SUPER::new(@args);
115            
116 16         37 $self->_setup(@args);
117            
118 16         24 my $fields = $self->_fields;
119 16         20 foreach my $field (qw( next_domain domains hsp_data )) {
120 48         57 $fields->{$field} = undef;
121             }
122            
123 16         19 my $hit_data = $self->_raw_hit_data;
124 16 50 33     60 if ($hit_data && ref($hit_data) eq 'ARRAY') {
125 16         17 foreach my $field (qw(name description score significance num_hsps rank)) {
126 96         56 $fields->{$field} = shift(@{$hit_data});
  96         127  
127             }
128             }
129 16         16 $fields->{hit_start} = 1;
130            
131 16         28 delete $self->_fields->{accession};
132            
133 16         45 $self->_dependencies( { ( length => 'hsp_data' ) } );
134            
135 16         32 return $self;
136             }
137              
138             #
139             # PullParserI discovery methods so we can answer all HitI questions
140             #
141              
142             sub _discover_description {
143             # this should be set when this object is created, but if it was undef as is
144             # possible, this _discover method will be called: just return and keep the
145             # return value undef
146 10     10   14 return;
147             }
148              
149             sub _discover_hsp_data {
150 16     16   16 my $self = shift;
151 16         59 my $hsp_table = $self->get_field('hsp_table');
152 16   100     27 my $hsp_data = $hsp_table->{$self->get_field('name')} || undef;
153 16 100       37 if ($hsp_data) {
154 4 100       10 if (defined $hsp_data->{hit_length}) {
155 3         6 $self->_fields->{length} = $hsp_data->{hit_length};
156             }
157            
158             # rank query_start query_end hit_start hit_end score evalue
159 4         7 $self->_fields->{hsp_data} = $hsp_data->{hsp_data};
160             }
161             }
162              
163             sub _discover_query_start {
164 2     2   3 my $self = shift;
165 2   50     6 my $hsp_data = $self->get_field('hsp_data') || return;
166            
167 2         3 my ($this_hsp) = sort { $a->[1] <=> $b->[1] } @{$hsp_data};
  2         6  
  2         6  
168 2         6 $self->_fields->{query_start} = $this_hsp->[1];
169             }
170              
171             sub _discover_query_end {
172 2     2   3 my $self = shift;
173 2   50     6 my $hsp_data = $self->get_field('hsp_data') || return;
174            
175 2         4 my ($this_hsp) = sort { $b->[2] <=> $a->[2] } @{$hsp_data};
  2         8  
  2         5  
176 2         5 $self->_fields->{query_end} = $this_hsp->[2];
177             }
178              
179             sub _discover_hit_start {
180 0     0   0 my $self = shift;
181 0   0     0 my $hsp_data = $self->get_field('hsp_data') || return;
182            
183 0         0 my ($this_hsp) = sort { $a->[3] <=> $b->[3] } @{$hsp_data};
  0         0  
  0         0  
184 0         0 $self->_fields->{hit_start} = $this_hsp->[3];
185             }
186              
187             sub _discover_hit_end {
188 2     2   2 my $self = shift;
189 2   50     4 my $hsp_data = $self->get_field('hsp_data') || return;
190            
191 2         3 my ($this_hsp) = sort { $b->[4] <=> $a->[4] } @{$hsp_data};
  2         7  
  2         6  
192 2         4 $self->_fields->{hit_end} = $this_hsp->[4];
193             }
194              
195             sub _discover_next_hsp {
196 49     49   37 my $self = shift;
197 49   100     66 my $hsp_data = $self->get_field('hsp_data') || return;
198 44 100       61 unless (defined $self->{_next_hsp_index}) {
199 2         4 $self->{_next_hsp_index} = 0;
200             }
201 44 100       66 return if $self->{_next_hsp_index} == -1;
202            
203             $self->_fields->{next_hsp} = Bio::Search::HSP::HmmpfamHSP->new(-parent => $self,
204 30         118 -hsp_data => $hsp_data->[$self->{_next_hsp_index}++]);
205            
206 30 100       31 if ($self->{_next_hsp_index} > $#{$hsp_data}) {
  30         67  
207 15         26 $self->{_next_hsp_index} = -1;
208             }
209             }
210              
211             =head2 next_hsp
212              
213             Title : next_hsp
214             Usage : while( $hsp = $obj->next_hsp()) { ... }
215             Function : Returns the next available High Scoring Pair
216             Example :
217             Returns : L object or null if finished
218             Args : none
219              
220             =cut
221              
222             sub next_hsp {
223 49     49 1 1190 my $self = shift;
224 49         69 my $hsp = $self->get_field('next_hsp');
225 49         64 undef $self->_fields->{next_hsp};
226 49         89 return $hsp;
227             }
228              
229             =head2 next_domain
230              
231             Title : next_domain
232             Usage : my $domain = $hit->next_domain();
233             Function: An alias for L, this will return the next HSP
234             Returns : L object
235             Args : none
236              
237             =cut
238              
239             *next_domain = \&next_hsp;
240              
241             =head2 hsps
242              
243             Usage : $hit_object->hsps();
244             Purpose : Get a list containing all HSP objects.
245             Example : @hsps = $hit_object->hsps();
246             Returns : list of L objects.
247             Argument : none
248              
249             =cut
250              
251             sub hsps {
252 16     16 1 25 my $self = shift;
253 16   100     42 my $old = $self->{_next_hsp_index} || 0;
254 16         28 $self->rewind;
255 16         14 my @hsps;
256 16         22 while (defined(my $hsp = $self->next_hsp)) {
257 24         39 push(@hsps, $hsp);
258             }
259 16 100       26 $self->{_next_hsp_index} = @hsps > 0 ? $old : -1;
260 16         30 return @hsps;
261             }
262              
263             =head2 domains
264              
265             Title : domains
266             Usage : my @domains = $hit->domains();
267             Function: An alias for L, this will return the full list of hsps
268             Returns : array of L objects
269             Args : none
270              
271             =cut
272              
273             *domains = \&hsps;
274              
275             =head2 hsp
276              
277             Usage : $hit_object->hsp( [string] );
278             Purpose : Get a single HSPI object for the present HitI object.
279             Example : $hspObj = $hit_object->hsp; # same as 'best'
280             : $hspObj = $hit_object->hsp('best');
281             : $hspObj = $hit_object->hsp('worst');
282             Returns : Object reference for a L object.
283             Argument : String (or no argument).
284             : No argument (default) = highest scoring HSP (same as 'best').
285             : 'best' = highest scoring HSP.
286             : 'worst' = lowest scoring HSP.
287             Throws : Exception if an unrecognized argument is used.
288              
289             See Also : L, L()
290              
291             =cut
292              
293             sub hsp {
294 4     4 1 13 my ($self, $type) = @_;
295 4   50     9 $type ||= 'best';
296 4   50     9 my $hsp_data = $self->get_field('hsp_data') || return;
297            
298 4         5 my $sort;
299 4 100       10 if ($type eq 'best') {
    50          
300 2     2   8 $sort = sub { $a->[6] <=> $b->[6] };
  2         6  
301             }
302             elsif ($type eq 'worst') {
303 2     2   9 $sort = sub { $b->[6] <=> $a->[6] };
  2         5  
304             }
305             else {
306 0         0 $self->throw("Unknown arg '$type' given to hsp()");
307             }
308            
309 4         5 my ($this_hsp) = sort $sort @{$hsp_data};
  4         14  
310 4         16 return Bio::Search::HSP::HmmpfamHSP->new(-parent => $self, -hsp_data => $this_hsp);
311             }
312              
313             =head2 rewind
314              
315             Title : rewind
316             Usage : $result->rewind;
317             Function: Allow one to reset the Hit iterator to the beginning, so that
318             next_hit() will subsequently return the first hit and so on.
319             Returns : n/a
320             Args : none
321              
322             =cut
323              
324             sub rewind {
325 16     16 1 13 my $self = shift;
326 16   100     27 my $hsp_data = $self->get_field('hsp_data') || return;
327 12 50       10 $self->{_next_hsp_index} = @{$hsp_data} > 0 ? 0 : -1;
  12         25  
328             }
329              
330             # have p() a synonym of significance()
331             sub p {
332 3     3 1 669 return shift->significance;
333             }
334              
335             =head2 strand
336              
337             Usage : $sbjct->strand( [seq_type] );
338             Purpose : Gets the strand(s) for the query, sbjct, or both sequences.
339             : For hmmpfam, the answers are always 1 (forward strand).
340             Example : $qstrand = $sbjct->strand('query');
341             : $sstrand = $sbjct->strand('hit');
342             : ($qstrand, $sstrand) = $sbjct->strand();
343             Returns : scalar context: integer '1'
344             : array context without args: list of two strings (1, 1)
345             : Array context can be "induced" by providing an argument of 'list'
346             : or 'array'.
347             Argument : In scalar context: seq_type = 'query' or 'hit' or 'sbjct' (default
348             : = 'query') ('sbjct' is synonymous with 'hit')
349              
350             =cut
351              
352             sub strand {
353 9     9 1 12 my ($self, $type) = @_;
354 9 50 66     29 $type ||= (wantarray ? 'list' : 'query');
355 9         11 $type = lc($type);
356 9 100 66     32 if ($type eq 'list' || $type eq 'array') {
357 3         7 return (1, 1);
358             }
359 6         15 return 1;
360             }
361              
362             =head2 frac_aligned_query
363              
364             Usage : $hit_object->frac_aligned_query();
365             Purpose : Get the fraction of the query sequence which has been aligned
366             : across all HSPs (not including intervals between non-overlapping
367             : HSPs).
368             Example : $frac_alnq = $hit_object->frac_aligned_query();
369             Returns : undef (the length of query sequences is unknown in Hmmpfam reports)
370             Argument : none
371              
372             =cut
373              
374             # noop
375       1 1   sub frac_aligned_query { }
376              
377             1;