comparison variant_effect_predictor/Bio/Tree/NodeI.pm @ 0:2bc9b66ada89 draft default tip

Uploaded
author mahtabm
date Thu, 11 Apr 2013 06:29:17 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:2bc9b66ada89
1 # $Id: NodeI.pm,v 1.19.2.2 2003/09/14 19:00:35 jason Exp $
2 #
3 # BioPerl module for Bio::Tree::NodeI
4 #
5 # Cared for by Jason Stajich <jason@bioperl.org>
6 #
7 # Copyright Jason Stajich
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::Tree::NodeI - Interface describing a Tree Node
16
17 =head1 SYNOPSIS
18
19 # get a Tree::NodeI somehow
20 # like from a TreeIO
21 use Bio::TreeIO;
22 # read in a clustalw NJ in phylip/newick format
23 my $treeio = new Bio::TreeIO(-format => 'newick', -file => 'file.dnd');
24
25 my $tree = $treeio->next_tree; # we'll assume it worked for demo purposes
26 # you might want to test that it was defined
27
28 my $rootnode = $tree->get_root_node;
29
30 # process just the next generation
31 foreach my $node ( $rootnode->each_Descendent() ) {
32 print "branch len is ", $node->branch_length, "\n";
33 }
34
35 # process all the children
36 my $example_leaf_node;
37 foreach my $node ( $rootnode->get_all_Descendents() ) {
38 if( $node->is_Leaf ) {
39 print "node is a leaf ... ";
40 # for example use below
41 $example_leaf_node = $node unless defined $example_leaf_node;
42 }
43 print "branch len is ", $node->branch_length, "\n";
44 }
45
46 # The ancestor() method points to the parent of a node
47 # A node can only have one parent
48
49 my $parent = $example_leaf_node->ancestor;
50
51 # parent won't likely have an description because it is an internal node
52 # but child will because it is a leaf
53
54 print "Parent id: ", $parent->id," child id: ",
55 $example_leaf_node->id, "\n";
56
57
58 =head1 DESCRIPTION
59
60 A NodeI is capable of the basic structure of building a tree and
61 storing the branch length between nodes. The branch length is the
62 length of the branch between the node and its ancestor, thus a root
63 node in a Tree will not typically have a valid branch length.
64
65 Various implementations of NodeI may extend the basic functions and
66 allow storing of other information (like attatching a species object
67 or full sequences used to build a tree or alternative sequences). If
68 you don't know how to extend a Bioperl object please ask, happy to
69 help, we would also greatly appreciate contributions with improvements
70 or extensions of the objects back to the Bioperl code base so that
71 others don't have to reinvent your ideas.
72
73
74 =head1 FEEDBACK
75
76 =head2 Mailing Lists
77
78 User feedback is an integral part of the evolution of this and other
79 Bioperl modules. Send your comments and suggestions preferably to
80 the Bioperl mailing list. Your participation is much appreciated.
81
82 bioperl-l@bioperl.org - General discussion
83 http://bioperl.org/MailList.shtml - About the mailing lists
84
85 =head2 Reporting Bugs
86
87 Report bugs to the Bioperl bug tracking system to help us keep track
88 of the bugs and their resolution. Bug reports can be submitted via
89 the web:
90
91 http://bugzilla.bioperl.org/
92
93 =head1 AUTHOR - Jason Stajich
94
95 Email jason@bioperl.org
96
97 =head1 CONTRIBUTORS
98
99 Aaron Mackey amackey@virginia.edu
100
101 =head1 APPENDIX
102
103 The rest of the documentation details each of the object methods.
104 Internal methods are usually preceded with a _
105
106 =cut
107
108 # Let the code begin...
109
110 package Bio::Tree::NodeI;
111 use vars qw(@ISA);
112 use strict;
113 use Bio::Root::RootI;
114 @ISA = qw(Bio::Root::RootI);
115
116
117 =head2 add_Descendent
118
119 Title : add_Descendent
120 Usage : $node->add_Descendant($node);
121 Function: Adds a descendent to a node
122 Returns : number of current descendents for this node
123 Args : Bio::Node::NodeI
124
125
126 =cut
127
128 sub add_Descendent{
129 my ($self,@args) = @_;
130
131 $self->throw_not_implemented();
132 }
133
134
135 =head2 each_Descendent
136
137 Title : each_Descendent
138 Usage : my @nodes = $node->each_Descendent;
139 Function: all the descendents for this Node (but not their descendents
140 i.e. not a recursive fetchall)
141 Returns : Array of Bio::Tree::NodeI objects
142 Args : none
143
144 =cut
145
146 sub each_Descendent{
147 my ($self) = @_;
148 $self->throw_not_implemented();
149 }
150
151 =head2 Decorated Interface methods
152
153 =cut
154
155 =head2 get_all_Descendents
156
157 Title : get_all_Descendents($sortby)
158 Usage : my @nodes = $node->get_all_Descendents;
159 Function: Recursively fetch all the nodes and their descendents
160 *NOTE* This is different from each_Descendent
161 Returns : Array or Bio::Tree::NodeI objects
162 Args : $sortby [optional] "height", "creation" or coderef to be used
163 to sort the order of children nodes.
164
165 =cut
166
167 sub get_all_Descendents{
168 my ($self, $sortby) = @_;
169 $sortby ||= 'height';
170 my @nodes;
171 foreach my $node ( $self->each_Descendent($sortby) ) {
172 push @nodes, ($node->get_all_Descendents($sortby), $node);
173 }
174 return @nodes;
175 }
176
177 *get_Descendents = \&get_all_Descendents;
178
179 =head2 is_Leaf
180
181 Title : is_Leaf
182 Usage : if( $node->is_Leaf )
183 Function: Get Leaf status
184 Returns : boolean
185 Args : none
186
187 =cut
188
189 sub is_Leaf{
190 my ($self) = @_;
191 $self->throw_not_implemented();
192 }
193
194 =head2 descendent_count
195
196 Title : descendent_count
197 Usage : my $count = $node->descendent_count;
198 Function: Counts the number of descendents a node has
199 (and all of their subnodes)
200 Returns : integer
201 Args : none
202
203 =cut
204
205 sub descendent_count{
206 my ($self) = @_;
207 my $count = 0;
208
209 foreach my $node ( $self->each_Descendent ) {
210 $count += 1;
211 $node->can('descendent_count') ? $count += $node->descendent_count : next;
212 }
213 return $count;
214 }
215
216 =head2 to_string
217
218 Title : to_string
219 Usage : my $str = $node->to_string()
220 Function: For debugging, provide a node as a string
221 Returns : string
222 Args : none
223
224
225 =cut
226
227 sub to_string{
228 my ($self) = @_;
229 return sprintf("%s%s%s",
230 defined $self->id ? $self->id : '',
231 defined $self->branch_length ? ':' . $self->branch_length : ' ',
232 $self->is_Leaf() ? '(leaf)' : ''
233 );
234 }
235
236 =head2 height
237
238 Title : height
239 Usage : my $len = $node->height
240 Function: Returns the height of the tree starting at this
241 node. Height is the maximum branchlength.
242 Returns : The longest length (weighting branches with branch_length) to a leaf
243 Args : none
244
245 =cut
246
247 sub height{
248 my ($self) = @_;
249
250 if( $self->is_Leaf ) {
251 if( !defined $self->branch_length ) {
252 $self->debug(sprintf("Trying to calculate height of a node when a Node (%s) has an undefined branch_length\n",$self->id || '?' ));
253 return 0;
254 }
255 return $self->branch_length;
256 }
257 my $max = 0;
258 foreach my $subnode ( $self->each_Descendent ) {
259 my $s = $subnode->height;
260 if( $s > $max ) { $max = $s; }
261 }
262 return $max + ($self->branch_length || 1);
263 }
264
265 =head2 Get/Set methods
266
267 =cut
268
269 =head2 branch_length
270
271 Title : branch_length
272 Usage : $obj->branch_length()
273 Function: Get/Set the branch length
274 Returns : value of branch_length
275 Args : newvalue (optional)
276
277
278 =cut
279
280 sub branch_length{
281 my ($self)= @_;
282 $self->throw_not_implemented();
283 }
284
285 =head2 id
286
287 Title : id
288 Usage : $obj->id($newval)
289 Function: The human readable identifier for the node
290 Returns : value of human readable id
291 Args : newvalue (optional)
292
293
294 =cut
295
296 sub id{
297 my ($self)= @_;
298 $self->throw_not_implemented();
299 }
300
301 =head2 internal_id
302
303 Title : internal_id
304 Usage : my $internalid = $node->internal_id
305 Function: Returns the internal unique id for this Node
306 Returns : unique id
307 Args : none
308
309 =cut
310
311 sub internal_id{
312 my ($self) = @_;
313 $self->throw_not_implemented();
314 }
315
316 =head2 description
317
318 Title : description
319 Usage : $obj->description($newval)
320 Function: Get/Set the description string
321 Returns : value of description
322 Args : newvalue (optional)
323
324
325 =cut
326
327 sub description{
328 my ($self) = @_;
329 $self->throw_not_implemented();
330 }
331
332 =head2 bootstrap
333
334 Title : bootstrap
335 Usage : $obj->bootstrap($newval)
336 Function: Get/Set the bootstrap value
337 Returns : value of bootstrap
338 Args : newvalue (optional)
339
340
341 =cut
342
343 sub bootstrap{
344 my ($self) = @_;
345 $self->throw_not_implemented();
346 }
347
348 =head2 ancestor
349
350 Title : ancestor
351 Usage : my $node = $node->ancestor;
352 Function: Get/Set the ancestor node pointer for a Node
353 Returns : Null if this is top level node
354 Args : none
355
356 =cut
357
358
359 sub ancestor{
360 my ($self,@args) = @_;
361 $self->throw_not_implemented();
362 }
363
364 =head2 invalidate_height
365
366 Title : invalidate_height
367 Usage : private helper method
368 Function: Invalidate our cached value of the node height in the tree
369 Returns : nothing
370 Args : none
371
372 =cut
373
374 sub invalidate_height {
375 shift->throw_not_implemented();
376 }
377
378 =head2 Methods for associating Tag/Values with a Node
379
380 These methods associate tag/value pairs with a Node
381
382 =head2 add_tag_value
383
384 Title : add_tag_value
385 Usage : $node->add_tag_value($tag,$value)
386 Function: Adds a tag value to a node
387 Returns : number of values stored for this tag
388 Args : $tag - tag name
389 $value - value to store for the tag
390
391
392 =cut
393
394 sub add_tag_value{
395 shift->throw_not_implemented();
396 }
397
398 =head2 remove_tag
399
400 Title : remove_tag
401 Usage : $node->remove_tag($tag)
402 Function: Remove the tag and all values for this tag
403 Returns : boolean representing success (0 if tag does not exist)
404 Args : $tag - tagname to remove
405
406
407 =cut
408
409 sub remove_tag {
410 shift->throw_not_implemented();
411 }
412
413 =head2 remove_all_tags
414
415 Title : remove_all_tags
416 Usage : $node->remove_all_tags()
417 Function: Removes all tags
418 Returns : None
419 Args : None
420
421
422 =cut
423
424 sub remove_all_tags{
425 shift->throw_not_implemented();
426 }
427
428 =head2 get_all_tags
429
430 Title : get_all_tags
431 Usage : my @tags = $node->get_all_tags()
432 Function: Gets all the tag names for this Node
433 Returns : Array of tagnames
434 Args : None
435
436
437 =cut
438
439 sub get_all_tags {
440 shift->throw_not_implemented();
441 }
442
443 =head2 get_tag_values
444
445 Title : get_tag_values
446 Usage : my @values = $node->get_tag_value($tag)
447 Function: Gets the values for given tag ($tag)
448 Returns : Array of values or empty list if tag does not exist
449 Args : $tag - tag name
450
451
452 =cut
453
454 sub get_tag_values{
455 shift->throw_not_implemented();
456 }
457
458 =head2 has_tag
459
460 Title : has_tag
461 Usage : $node->has_tag($tag)
462 Function: Boolean test if tag exists in the Node
463 Returns : Boolean
464 Args : $tag - tagname
465
466
467 =cut
468
469 sub has_tag{
470 shift->throw_not_implemented();
471 }
472
473 1;