annotate variant_effect_predictor/Bio/Tree/Node.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 # $Id: Node.pm,v 1.17.2.3 2003/09/14 19:00:35 jason Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 # BioPerl module for Bio::Tree::Node
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::Tree::Node - A Simple Tree Node
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 use Bio::Tree::Node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 my $nodeA = new Bio::Tree::Node();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 my $nodeL = new Bio::Tree::Node();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22 my $nodeR = new Bio::Tree::Node();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 my $node = new Bio::Tree::Node();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 $node->add_Descendent($nodeL);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 $node->add_Descendent($nodeR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 print "node is not a leaf \n" if( $node->is_leaf);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 Makes a Tree Node suitable for building a Tree.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 User feedback is an integral part of the evolution of this and other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 Bioperl modules. Send your comments and suggestions preferably to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 the Bioperl mailing list. Your participation is much appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 http://bioperl.org/MailList.shtml - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 Report bugs to the Bioperl bug tracking system to help us keep track
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 of the bugs and their resolution. Bug reports can be submitted via
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 =head1 AUTHOR - Jason Stajich
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 Email jason@bioperl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 =head1 CONTRIBUTORS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 Aaron Mackey amackey@virginia.edu
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 The rest of the documentation details each of the object methods.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 Internal methods are usually preceded with a _
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 # Let the code begin...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 package Bio::Tree::Node;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 use vars qw(@ISA $CREATIONORDER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 use Bio::Root::Root;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 use Bio::Tree::NodeI;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 @ISA = qw(Bio::Root::Root Bio::Tree::NodeI);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 BEGIN {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 $CREATIONORDER = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 Title : new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 Usage : my $obj = new Bio::Tree::Node();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 Function: Builds a new Bio::Tree::Node object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 Returns : Bio::Tree::Node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 Args : -left => pointer to Left descendent (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 -right => pointer to Right descenent (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 -branch_length => branch length [integer] (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 -bootstrap => value bootstrap value (string)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 -description => description of node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 -id => human readable id for node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 my($class,@args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 my $self = $class->SUPER::new(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 my ($children, $branchlen,$id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 $bootstrap, $desc,$d) = $self->_rearrange([qw(DESCENDENTS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 BRANCH_LENGTH
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 ID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 BOOTSTRAP
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 DESC
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 )],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 @args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 $self->_register_for_cleanup(\&node_cleanup);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 $self->{'_desc'} = {}; # for descendents
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 if( $d && $desc ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 $self->warn("can only accept -desc or -description, not both, accepting -description");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 $desc = $d;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 } elsif( defined $d && ! defined $desc ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 $desc = $d;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 defined $desc && $self->description($desc);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 defined $bootstrap && $self->bootstrap($bootstrap);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 defined $id && $self->id($id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 defined $branchlen && $self->branch_length($branchlen);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 if( defined $children ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 if( ref($children) !~ /ARRAY/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 $self->warn("Must specify a valid ARRAY reference to initialize a Node's Descendents");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 foreach my $c ( @$children ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 $self->add_Descendent($c);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 $self->_creation_id($CREATIONORDER++);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 =head2 add_Descendent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 Title : add_Descendent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 Usage : $node->add_Descendant($node);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 Function: Adds a descendent to a node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 Returns : number of current descendents for this node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 Args : Bio::Node::NodeI
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 boolean flag, true if you want to ignore the fact that you are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 adding a second node with the same unique id (typically memory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 location reference in this implementation). default is false and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 will throw an error if you try and overwrite an existing node.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 sub add_Descendent{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 my ($self,$node,$ignoreoverwrite) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 return -1 if( ! defined $node ) ;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 if( ! $node->isa('Bio::Tree::NodeI') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 $self->warn("Trying to add a Descendent who is not a Bio::Tree::NodeI");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 return -1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 # do we care about order?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 $node->ancestor($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 if( $self->{'_desc'}->{$node->internal_id} && ! $ignoreoverwrite ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 $self->throw("Going to overwrite a node which is $node that is already stored here, set the ignore overwrite flag (parameter 2) to true to ignore this in the future");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 $self->{'_desc'}->{$node->internal_id} = $node; # is this safely unique - we've tested before at any rate??
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 $self->invalidate_height();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 return scalar keys %{$self->{'_desc'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 =head2 each_Descendent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 Title : each_Descendent($sortby)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 Usage : my @nodes = $node->each_Descendent;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 Function: all the descendents for this Node (but not their descendents
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 i.e. not a recursive fetchall)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 Returns : Array of Bio::Tree::NodeI objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 Args : $sortby [optional] "height", "creation" or coderef to be used
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 to sort the order of children nodes.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 sub each_Descendent{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 my ($self, $sortby) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 # order can be based on branch length (and sub branchlength)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 $sortby ||= 'height';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 if (ref $sortby eq 'CODE') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 return sort $sortby values %{$self->{'_desc'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 if ($sortby eq 'height') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 return map { $_->[0] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 sort { $a->[1] <=> $b->[1] ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 $a->[2] <=> $b->[2] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 map { [$_, $_->height, $_->internal_id ] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 values %{$self->{'_desc'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 return map { $_->[0] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 sort { $a->[1] <=> $b->[1] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 map { [$_, $_->height ] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 values %{$self->{'_desc'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 =head2 remove_Descendent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 Title : remove_Descendent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 Usage : $node->remove_Descedent($node_foo);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 Function: Removes a specific node from being a Descendent of this node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 Returns : nothing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 Args : An array of Bio::Node::NodeI objects which have be previously
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 passed to the add_Descendent call of this object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 sub remove_Descendent{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 my ($self,@nodes) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 my $c= 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 foreach my $n ( @nodes ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 if( $self->{'_desc'}->{$n->internal_id} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 $n->ancestor(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 # should be redundant
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 $self->{'_desc'}->{$n->internal_id}->ancestor(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 delete $self->{'_desc'}->{$n->internal_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 my $a1 = $self->ancestor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 # remove unecessary nodes if we have removed the part
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 # which branches.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 # if( $a1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 # my $bl = $self->branch_length || 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 # my @d = $self->each_Descendent;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 # if (scalar @d == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 # $d[0]->branch_length($bl + ($d[0]->branch_length || 0));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 # $a1->add_Descendent($d[0]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 # }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 # $a1->remove_Descendent($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 #}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 $c++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 if( $self->verbose ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 $self->debug(sprintf("no node %s (%s) listed as a descendent in this node %s (%s)\n",$n->id, $n,$self->id,$self));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 $self->debug("Descendents are " . join(',', keys %{$self->{'_desc'}})."\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 $c;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 =head2 remove_all_Descendents
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 Title : remove_all_Descendents
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 Usage : $node->remove_All_Descendents()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 Function: Cleanup the node's reference to descendents and reset
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 their ancestor pointers to undef, if you don't have a reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 to these objects after this call they will be cleaned up - so
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 a get_nodes from the Tree object would be a safe thing to do first
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 Returns : nothing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 sub remove_all_Descendents{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 # this won't cleanup the nodes themselves if you also have
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 # a copy/pointer of them (I think)...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 while( my ($node,$val) = each %{ $self->{'_desc'} } ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 $val->ancestor(undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 $self->{'_desc'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 =head2 get_all_Descendents
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 Title : get_all_Descendents
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 Usage : my @nodes = $node->get_all_Descendents;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 Function: Recursively fetch all the nodes and their descendents
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 *NOTE* This is different from each_Descendent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 Returns : Array or Bio::Tree::NodeI objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 # implemented in the interface
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 =head2 ancestor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 Title : ancestor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 Usage : $obj->ancestor($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 Function: Set the Ancestor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 Returns : value of ancestor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 sub ancestor{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 $self->{'_ancestor'} = shift @_ if @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 return $self->{'_ancestor'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 =head2 branch_length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 Title : branch_length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 Usage : $obj->branch_length()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 Function: Get/Set the branch length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 Returns : value of branch_length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 sub branch_length{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 if( @_ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 my $bl = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 if( defined $bl &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 $bl =~ s/\[(\d+)\]// ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 $self->bootstrap($1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 $self->{'_branch_length'} = $bl;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 return $self->{'_branch_length'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 =head2 bootstrap
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 Title : bootstrap
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 Usage : $obj->bootstrap($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 Function: Get/Set the bootstrap value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 Returns : value of bootstrap
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 sub bootstrap {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 if( @_ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 if( $self->has_tag('B') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 $self->remove_tag('B');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 $self->add_tag_value('B',shift);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 return ($self->get_tag_values('B'))[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 =head2 description
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 Title : description
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 Usage : $obj->description($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 Function: Get/Set the description string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 Returns : value of description
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 sub description{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 $self->{'_description'} = shift @_ if @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 return $self->{'_description'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 =head2 id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 Title : id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 Usage : $obj->id($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 Function: The human readable identifier for the node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 Returns : value of human readable id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 Note : id cannot contain the chracters '();:'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 "A name can be any string of printable characters except blanks,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 colons, semicolons, parentheses, and square brackets. Because you may
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 want to include a blank in a name, it is assumed that an underscore
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 character ("_") stands for a blank; any of these in a name will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 converted to a blank when it is read in."
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 from L<http://evolution.genetics.washington.edu/phylip/newicktree.html>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 sub id{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 my ($self, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 if ($value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 $self->warn("Illegal characters ();: and space in the id [$value], converting to _ ")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 if $value =~ /\(\);:/ and $self->verbose >= 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 $value =~ s/[\(\);:\s]/_/g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 $self->{'_id'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 return $self->{'_id'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 =head2 internal_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 Title : internal_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 Usage : my $internalid = $node->internal_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 Function: Returns the internal unique id for this Node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 (a monotonically increasing number for this in-memory implementation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 but could be a database determined unique id in other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 implementations)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 Returns : unique id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 sub internal_id{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 return $_[0]->_creation_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 =head2 _creation_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 Title : _creation_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 Usage : $obj->_creation_id($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 Function: a private method signifying the internal creation order
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 Returns : value of _creation_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 sub _creation_id{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 my $self = shift @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 $self->{'_creation_id'} = shift @_ if( @_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 return $self->{'_creation_id'} || 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 =head2 Bio::Node::NodeI decorated interface implemented
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 The following methods are implemented by L<Bio::Node::NodeI> decorated
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 interface.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 =head2 is_Leaf
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 Title : is_Leaf
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 Usage : if( $node->is_Leaf )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 Function: Get Leaf status
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 Returns : boolean
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 sub is_Leaf {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 my $isleaf = ! (defined $self->{'_desc'} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 (keys %{$self->{'_desc'}} > 0) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 return $isleaf;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 =head2 to_string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 Title : to_string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 Usage : my $str = $node->to_string()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 Function: For debugging, provide a node as a string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 Returns : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 =head2 height
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 Title : height
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 Usage : my $len = $node->height
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 Function: Returns the height of the tree starting at this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 node. Height is the maximum branchlength.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 Returns : The longest length (weighting branches with branch_length) to a leaf
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 sub height {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 return $self->{'_height'} if( defined $self->{'_height'} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 if( $self->is_Leaf ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 if( !defined $self->branch_length ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 $self->debug(sprintf("Trying to calculate height of a node when a Node (%s) has an undefined branch_length\n",$self->id || '?' ));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 return 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 return $self->branch_length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 my $max = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 foreach my $subnode ( $self->each_Descendent ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 my $s = $subnode->height;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 if( $s > $max ) { $max = $s; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 return ($self->{'_height'} = $max + ($self->branch_length || 1));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 =head2 invalidate_height
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 Title : invalidate_height
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 Usage : private helper method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 Function: Invalidate our cached value of the node's height in the tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 Returns : nothing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 #'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 sub invalidate_height {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 $self->{'_height'} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 if( $self->ancestor ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 $self->ancestor->invalidate_height;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 =head2 add_tag_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 Title : add_tag_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 Usage : $node->add_tag_value($tag,$value)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 Function: Adds a tag value to a node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 Returns : number of values stored for this tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 Args : $tag - tag name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 $value - value to store for the tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 sub add_tag_value{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 my ($self,$tag,$value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 if( ! defined $tag || ! defined $value ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 $self->warn("cannot call add_tag_value with an undefined value");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 push @{$self->{'_tags'}->{$tag}}, $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 return scalar @{$self->{'_tags'}->{$tag}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 =head2 remove_tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 Title : remove_tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 Usage : $node->remove_tag($tag)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 Function: Remove the tag and all values for this tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 Returns : boolean representing success (0 if tag does not exist)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 Args : $tag - tagname to remove
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 sub remove_tag {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 my ($self,$tag) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 if( exists $self->{'_tags'}->{$tag} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 $self->{'_tags'}->{$tag} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 delete $self->{'_tags'}->{$tag};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 return 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 =head2 remove_all_tags
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 Title : remove_all_tags
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 Usage : $node->remove_all_tags()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 Function: Removes all tags
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 Returns : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 Args : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 sub remove_all_tags{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 $self->{'_tags'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 =head2 get_all_tags
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 Title : get_all_tags
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 Usage : my @tags = $node->get_all_tags()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 Function: Gets all the tag names for this Node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 Returns : Array of tagnames
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 Args : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 sub get_all_tags{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 return sort keys %{$self->{'_tags'} || {}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 =head2 get_tag_values
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 Title : get_tag_values
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 Usage : my @values = $node->get_tag_value($tag)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 Function: Gets the values for given tag ($tag)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 Returns : Array of values or empty list if tag does not exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 Args : $tag - tag name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 sub get_tag_values{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 my ($self,$tag) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 return @{$self->{'_tags'}->{$tag} || []};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 =head2 has_tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 Title : has_tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 Usage : $node->has_tag($tag)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 Function: Boolean test if tag exists in the Node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 Returns : Boolean
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 Args : $tag - tagname
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 sub has_tag {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 my ($self,$tag) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 return exists $self->{'_tags'}->{$tag};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 sub node_cleanup {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 if( defined $self->{'_desc'} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 ref($self->{'_desc'}) =~ /ARRAY/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 while( my ($nodeid,$node) = each %{ $self->{'_desc'} } ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 $node->ancestor(undef); # insure no circular references
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 $node = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 $self->{'_desc'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 1;