0
|
1 # Result.pm,v 1.3 2002/06/20 18:50:39 amackey Exp
|
|
2 #
|
|
3 # BioPerl module for Bio::Tools::Phylo::PAML::Result
|
|
4 #
|
|
5 # Cared for by Jason Stajich <jason@bioperl.org>
|
|
6 #
|
|
7 # Copyright Jason Stajich, Aaron Mackey
|
|
8 #
|
|
9 # You may distribute this module under the same terms as perl itself
|
|
10
|
|
11 # POD documentation - main docs before the code
|
|
12
|
|
13 =head1 NAME
|
|
14
|
|
15 Bio::Tools::Phylo::PAML::Result - A PAML result set object
|
|
16
|
|
17 =head1 SYNOPSIS
|
|
18
|
|
19 Give standard usage here
|
|
20
|
|
21 =head1 DESCRIPTION
|
|
22
|
|
23 Describe the object here
|
|
24
|
|
25 =head1 FEEDBACK
|
|
26
|
|
27 =head2 Mailing Lists
|
|
28
|
|
29 User feedback is an integral part of the evolution of this and other
|
|
30 Bioperl modules. Send your comments and suggestions preferably to
|
|
31 the Bioperl mailing list. Your participation is much appreciated.
|
|
32
|
|
33 bioperl-l@bioperl.org - General discussion
|
|
34 http://bioperl.org/MailList.shtml - About the mailing lists
|
|
35
|
|
36 =head2 Reporting Bugs
|
|
37
|
|
38 Report bugs to the Bioperl bug tracking system to help us keep track
|
|
39 of the bugs and their resolution. Bug reports can be submitted via
|
|
40 email or the web:
|
|
41
|
|
42 bioperl-bugs@bioperl.org
|
|
43 http://bugzilla.bioperl.org/
|
|
44
|
|
45 =head1 AUTHOR - Jason Stajich, Aaron Mackey
|
|
46
|
|
47 Email jason@bioperl.org
|
|
48 Email amackey@virginia.edu
|
|
49
|
|
50 Describe contact details here
|
|
51
|
|
52 =head1 CONTRIBUTORS
|
|
53
|
|
54 Additional contributors names and emails here
|
|
55
|
|
56 =head1 APPENDIX
|
|
57
|
|
58 The rest of the documentation details each of the object methods.
|
|
59 Internal methods are usually preceded with a _
|
|
60
|
|
61 =cut
|
|
62
|
|
63
|
|
64 # Let the code begin...
|
|
65
|
|
66
|
|
67 package Bio::Tools::Phylo::PAML::Result;
|
|
68 use vars qw(@ISA);
|
|
69 use strict;
|
|
70
|
|
71
|
|
72 use Bio::Root::Root;
|
|
73 use Bio::AnalysisResultI;
|
|
74 @ISA = qw(Bio::Root::Root Bio::AnalysisResultI);
|
|
75
|
|
76 =head2 new
|
|
77
|
|
78 Title : new
|
|
79 Usage : my $obj = new Bio::Tools::Phylo::PAML::Result(%data);
|
|
80 Function: Builds a new Bio::Tools::Phylo::PAML::Result object
|
|
81 Returns : Bio::Tools::Phylo::PAML::Result
|
|
82 Args : -trees => array reference of L<Bio::Tree::TreeI> objects
|
|
83 -MLmatrix => ML matrix
|
|
84 .... MORE ARGUMENTS LISTED HERE BY AARON AND JASON
|
|
85
|
|
86 =cut
|
|
87
|
|
88 sub new {
|
|
89 my($class,@args) = @_;
|
|
90
|
|
91 my $self = $class->SUPER::new(@args);
|
|
92
|
|
93 my ($trees,$mlmat,$seqs,$ngmatrix,
|
|
94 $codonpos,$codonfreq,$version) = $self->_rearrange([qw(TREES MLMATRIX
|
|
95 SEQS NGMATRIX
|
|
96 CODONPOS CODONFREQ
|
|
97 VERSION)], @args);
|
|
98 $self->reset_seqs;
|
|
99 if( $trees ) {
|
|
100 if(ref($trees) !~ /ARRAY/i ) {
|
|
101 $self->warn("Must have provided a valid array reference to initialize trees");
|
|
102 } else {
|
|
103 foreach my $t ( @$trees ) {
|
|
104 $self->add_tree($t);
|
|
105 }
|
|
106 }
|
|
107 }
|
|
108 $self->{'_treeiterator'} = 0;
|
|
109
|
|
110 if( $mlmat ) {
|
|
111 if( ref($mlmat) !~ /ARRAY/i ) {
|
|
112 $self->warn("Must have provided a valid array reference to initialize MLmatrix");
|
|
113 } else {
|
|
114 $self->set_MLmatrix($mlmat);
|
|
115 }
|
|
116 }
|
|
117 if( $seqs ) {
|
|
118 if( ref($seqs) !~ /ARRAY/i ) {
|
|
119 $self->warn("Must have provided a valid array reference to initialize seqs");
|
|
120 } else {
|
|
121 foreach my $s ( @$seqs ) {
|
|
122 $self->add_seq($s);
|
|
123 }
|
|
124 }
|
|
125 }
|
|
126 if( $ngmatrix ) {
|
|
127 if( ref($ngmatrix) !~ /ARRAY/i ) {
|
|
128 $self->warn("Must have provided a valid array reference to initialize NGmatrix");
|
|
129 } else {
|
|
130 $self->set_NGmatrix($ngmatrix);
|
|
131 }
|
|
132 }
|
|
133
|
|
134 if( $codonfreq ) {
|
|
135
|
|
136
|
|
137 }
|
|
138
|
|
139 if( $codonpos ) {
|
|
140 if( ref($codonpos) !~ /ARRAY/i ) {
|
|
141 $self->warn("Must have provided a valid array reference to initialize codonpos");
|
|
142 } else {
|
|
143 $self->set_codon_pos_basefreq(@$codonpos);
|
|
144 }
|
|
145 }
|
|
146
|
|
147 $self->version($version) if defined $version;
|
|
148
|
|
149 return $self;
|
|
150 }
|
|
151
|
|
152 =head2 next_tree
|
|
153
|
|
154 Title : next_tree
|
|
155 Usage : my $tree = $factory->next_tree;
|
|
156 Function: Get the next tree from the factory
|
|
157 Returns : L<Bio::Tree::TreeI>
|
|
158 Args : none
|
|
159
|
|
160 =cut
|
|
161
|
|
162 sub next_tree{
|
|
163 my ($self,@args) = @_;
|
|
164 return $self->{'_trees'}->[$self->{'_treeiterator'}++] || undef;
|
|
165 }
|
|
166
|
|
167 =head2 rewind_tree
|
|
168
|
|
169 Title : rewind_tree_iterator
|
|
170 Usage : $result->rewind_tree()
|
|
171 Function: Rewinds the tree iterator so that next_tree can be
|
|
172 called again from the beginning
|
|
173 Returns : none
|
|
174 Args : none
|
|
175
|
|
176 =cut
|
|
177
|
|
178 sub rewind_tree_iterator {
|
|
179 shift->{'_treeiterator'} = 0;
|
|
180 }
|
|
181
|
|
182 =head2 add_tree
|
|
183
|
|
184 Title : add_tree
|
|
185 Usage : $result->add_tree($tree);
|
|
186 Function: Adds a tree
|
|
187 Returns : integer which is the number of trees stored
|
|
188 Args : L<Bio::Tree::TreeI>
|
|
189
|
|
190 =cut
|
|
191
|
|
192 sub add_tree{
|
|
193 my ($self,$tree) = @_;
|
|
194 if( $tree && ref($tree) && $tree->isa('Bio::Tree::TreeI') ) {
|
|
195 push @{$self->{'_trees'}},$tree;
|
|
196 }
|
|
197 return scalar @{$self->{'_trees'}};
|
|
198 }
|
|
199
|
|
200
|
|
201 =head2 set_MLmatrix
|
|
202
|
|
203 Title : set_MLmatrix
|
|
204 Usage : $result->set_MLmatrix($mat)
|
|
205 Function: Set the ML Matrix
|
|
206 Returns : none
|
|
207 Args : Arrayref to MLmatrix (must be arrayref to 2D matrix whic is
|
|
208 lower triangle pairwise)
|
|
209
|
|
210
|
|
211 =cut
|
|
212
|
|
213 sub set_MLmatrix{
|
|
214 my ($self,$mat) = @_;
|
|
215 return unless ( defined $mat );
|
|
216 if( ref($mat) !~ /ARRAY/i ) {
|
|
217 $self->warn("Did not provide a valid 2D Array reference for set_MLmatrix");
|
|
218 return;
|
|
219 }
|
|
220 $self->{'_mlmatrix'} = $mat;
|
|
221 }
|
|
222
|
|
223 =head2 get_MLmatrix
|
|
224
|
|
225 Title : get_MLmatrix
|
|
226 Usage : my $mat = $result->get_MLmatrix()
|
|
227 Function: Get the ML matrix
|
|
228 Returns : 2D Array reference
|
|
229 Args : none
|
|
230
|
|
231
|
|
232 =cut
|
|
233
|
|
234 sub get_MLmatrix{
|
|
235 my ($self,@args) = @_;
|
|
236 return $self->{'_mlmatrix'};
|
|
237 }
|
|
238
|
|
239 =head2 set_NGmatrix
|
|
240
|
|
241 Title : set_NGmatrix
|
|
242 Usage : $result->set_NGmatrix($mat)
|
|
243 Function: Set the Nei & Gojobori Matrix
|
|
244 Returns : none
|
|
245 Args : Arrayref to NGmatrix (must be arrayref to 2D matrix whic is
|
|
246 lower triangle pairwise)
|
|
247
|
|
248
|
|
249 =cut
|
|
250
|
|
251 sub set_NGmatrix{
|
|
252 my ($self,$mat) = @_;
|
|
253 return unless ( defined $mat );
|
|
254 if( ref($mat) !~ /ARRAY/i ) {
|
|
255 $self->warn("Did not provide a valid 2D Array reference for set_NGmatrix");
|
|
256 return;
|
|
257 }
|
|
258 $self->{'_ngmatrix'} = $mat;
|
|
259 }
|
|
260
|
|
261 =head2 get_NGmatrix
|
|
262
|
|
263 Title : get_NGmatrix
|
|
264 Usage : my $mat = $result->get_NGmatrix()
|
|
265 Function: Get the Nei & Gojobori matrix
|
|
266 Returns : 2D Array reference
|
|
267 Args : none
|
|
268
|
|
269
|
|
270 =cut
|
|
271
|
|
272 sub get_NGmatrix{
|
|
273 my ($self,@args) = @_;
|
|
274 return $self->{'_ngmatrix'};
|
|
275 }
|
|
276
|
|
277
|
|
278 =head2 add_seq
|
|
279
|
|
280 Title : add_seq
|
|
281 Usage : $obj->add_seq($seq)
|
|
282 Function: Add a Bio::PrimarySeq to the Result
|
|
283 Returns : none
|
|
284 Args : Bio::PrimarySeqI
|
|
285 See also : L<Bio::PrimarySeqI>
|
|
286
|
|
287 =cut
|
|
288
|
|
289 sub add_seq{
|
|
290 my ($self,$seq) = @_;
|
|
291 if( $seq ) {
|
|
292 unless( $seq->isa("Bio::PrimarySeqI") ) {
|
|
293 $self->warn("Must provide a valid Bio::PrimarySeqI to add_seq");
|
|
294 return;
|
|
295 }
|
|
296 push @{$self->{'_seqs'}},$seq;
|
|
297 }
|
|
298
|
|
299 }
|
|
300
|
|
301 =head2 reset_seqs
|
|
302
|
|
303 Title : reset_seqs
|
|
304 Usage : $result->reset_seqs
|
|
305 Function: Reset the OTU seqs stored
|
|
306 Returns : none
|
|
307 Args : none
|
|
308
|
|
309
|
|
310 =cut
|
|
311
|
|
312 sub reset_seqs{
|
|
313 my ($self) = @_;
|
|
314 $self->{'_seqs'} = [];
|
|
315 }
|
|
316
|
|
317 =head2 get_seqs
|
|
318
|
|
319 Title : get_seqs
|
|
320 Usage : my @otus = $result->get_seqs
|
|
321 Function: Get the seqs Bio::PrimarySeq (OTU = Operational Taxonomic Unit)
|
|
322 Returns : Array of Bio::PrimarySeq
|
|
323 Args : None
|
|
324 See also : L<Bio::PrimarySeq>
|
|
325
|
|
326 =cut
|
|
327
|
|
328 sub get_seqs{
|
|
329 my ($self) = @_;
|
|
330 return @{$self->{'_seqs'}};
|
|
331 }
|
|
332
|
|
333 =head2 set_codon_pos_basefreq
|
|
334
|
|
335 Title : set_codon_pos_basefreq
|
|
336 Usage : $result->set_codon_pos_basefreq(@freqs)
|
|
337 Function: Set the codon position base frequencies
|
|
338 Returns : none
|
|
339 Args : Array of length 3 where each slot has a hashref
|
|
340 keyed on DNA base
|
|
341
|
|
342
|
|
343 =cut
|
|
344
|
|
345 sub set_codon_pos_basefreq {
|
|
346 my ($self,@codonpos) = @_;
|
|
347 if( scalar @codonpos != 3 ) {
|
|
348 $self->warn("invalid array to set_codon_pos_basefreq, must be an array of length 3");
|
|
349 return;
|
|
350 }
|
|
351 foreach my $pos ( @codonpos ) {
|
|
352 if( ref($pos) !~ /HASH/i ||
|
|
353 ! exists $pos->{'A'} ) {
|
|
354 $self->warn("invalid array to set_codon_pos_basefreq, must be an array with hashreferences keyed on DNA bases, C,A,G,T");
|
|
355 }
|
|
356 }
|
|
357 $self->{'_codonposbasefreq'} = [@codonpos];
|
|
358 }
|
|
359
|
|
360 =head2 get_codon_pos_basefreq
|
|
361
|
|
362 Title : get_codon_pos_basefreq
|
|
363 Usage : my @basepos = $result->get_codon_pos_basefreq;
|
|
364 Function: Get the codon position base frequencies
|
|
365 Returns : Array of length 3 (each codon position), each
|
|
366 slot is a hashref keyed on DNA bases, the values are
|
|
367 the frequency of the base at that position for all sequences
|
|
368 Args : none
|
|
369 Note : The array starts at 0 so position '1' is in position '0'
|
|
370 of the array
|
|
371
|
|
372 =cut
|
|
373
|
|
374 sub get_codon_pos_basefreq{
|
|
375 my ($self) = @_;
|
|
376 return @{$self->{'_codonposbasefreq'}};
|
|
377 }
|
|
378
|
|
379 =head2 version
|
|
380
|
|
381 Title : version
|
|
382 Usage : $obj->version($newval)
|
|
383 Function: Get/Set version
|
|
384 Returns : value of version
|
|
385 Args : newvalue (optional)
|
|
386
|
|
387
|
|
388 =cut
|
|
389
|
|
390 sub version{
|
|
391 my $self = shift;
|
|
392 $self->{'_version'} = shift if @_;
|
|
393 return $self->{'_version'};
|
|
394 }
|
|
395
|
|
396 1;
|