Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/TreeIO/TreeEventBuilder.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1f6dce3d34e0 |
---|---|
1 # $Id: TreeEventBuilder.pm,v 1.11.2.1 2003/09/13 21:51:05 jason Exp $ | |
2 # | |
3 # BioPerl module for Bio::TreeIO::TreeEventBuilder | |
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::TreeIO::TreeEventBuilder - Build Bio::Tree::Tree's and | |
16 Bio::Tree::Node's from Events | |
17 | |
18 =head1 SYNOPSIS | |
19 | |
20 # internal use only | |
21 | |
22 =head1 DESCRIPTION | |
23 | |
24 This object will take events and build a Bio::Tree::TreeI compliant | |
25 object makde up of Bio::Tree::NodeI objects. | |
26 | |
27 =head1 FEEDBACK | |
28 | |
29 =head2 Mailing Lists | |
30 | |
31 User feedback is an integral part of the evolution of this and other | |
32 Bioperl modules. Send your comments and suggestions preferably to | |
33 the Bioperl mailing list. Your participation is much appreciated. | |
34 | |
35 bioperl-l@bioperl.org - General discussion | |
36 http://bioperl.org/MailList.shtml - About the mailing lists | |
37 | |
38 =head2 Reporting Bugs | |
39 | |
40 Report bugs to the Bioperl bug tracking system to help us keep track | |
41 of the bugs and their resolution. Bug reports can be submitted via | |
42 email or the web: | |
43 | |
44 bioperl-bugs@bioperl.org | |
45 http://bugzilla.bioperl.org/ | |
46 | |
47 =head1 AUTHOR - Jason Stajich | |
48 | |
49 Email jason@bioperl.org | |
50 | |
51 Describe contact details here | |
52 | |
53 =head1 CONTRIBUTORS | |
54 | |
55 Additional contributors names and emails here | |
56 | |
57 =head1 APPENDIX | |
58 | |
59 The rest of the documentation details each of the object methods. | |
60 Internal methods are usually preceded with a _ | |
61 | |
62 =cut | |
63 | |
64 | |
65 # Let the code begin... | |
66 | |
67 | |
68 package Bio::TreeIO::TreeEventBuilder; | |
69 use vars qw(@ISA); | |
70 use strict; | |
71 | |
72 use Bio::Root::Root; | |
73 use Bio::Event::EventHandlerI; | |
74 use Bio::Tree::Tree; | |
75 use Bio::Tree::Node; | |
76 | |
77 @ISA = qw(Bio::Root::Root Bio::Event::EventHandlerI); | |
78 | |
79 =head2 new | |
80 | |
81 Title : new | |
82 Usage : my $obj = new Bio::TreeIO::TreeEventBuilder(); | |
83 Function: Builds a new Bio::TreeIO::TreeEventBuilder object | |
84 Returns : Bio::TreeIO::TreeEventBuilder | |
85 Args : | |
86 | |
87 | |
88 =cut | |
89 | |
90 sub new { | |
91 my($class,@args) = @_; | |
92 | |
93 my $self = $class->SUPER::new(@args); | |
94 my ($treetype, $nodetype) = $self->_rearrange([qw(TREETYPE | |
95 NODETYPE)], @args); | |
96 $treetype ||= 'Bio::Tree::Tree'; | |
97 $nodetype ||= 'Bio::Tree::Node'; | |
98 | |
99 eval { | |
100 $self->_load_module($treetype); | |
101 $self->_load_module($nodetype); | |
102 }; | |
103 | |
104 if( $@ ) { | |
105 $self->throw("Could not load module $treetype or $nodetype. \n$@\n") | |
106 } | |
107 $self->treetype($treetype); | |
108 $self->nodetype($nodetype); | |
109 $self->{'_treelevel'} = 0; | |
110 | |
111 return $self; | |
112 } | |
113 | |
114 =head2 treetype | |
115 | |
116 Title : treetype | |
117 Usage : $obj->treetype($newval) | |
118 Function: | |
119 Returns : value of treetype | |
120 Args : newvalue (optional) | |
121 | |
122 | |
123 =cut | |
124 | |
125 sub treetype{ | |
126 my ($self,$value) = @_; | |
127 if( defined $value) { | |
128 $self->{'treetype'} = $value; | |
129 } | |
130 return $self->{'treetype'}; | |
131 } | |
132 | |
133 =head2 nodetype | |
134 | |
135 Title : nodetype | |
136 Usage : $obj->nodetype($newval) | |
137 Function: | |
138 Returns : value of nodetype | |
139 Args : newvalue (optional) | |
140 | |
141 | |
142 =cut | |
143 | |
144 sub nodetype{ | |
145 my ($self,$value) = @_; | |
146 if( defined $value) { | |
147 $self->{'nodetype'} = $value; | |
148 } | |
149 return $self->{'nodetype'}; | |
150 } | |
151 | |
152 | |
153 =head2 SAX methods | |
154 | |
155 =cut | |
156 | |
157 =head2 start_document | |
158 | |
159 Title : start_document | |
160 Usage : $handler->start_document | |
161 Function: Begins a Tree event cycle | |
162 Returns : none | |
163 Args : none | |
164 | |
165 =cut | |
166 | |
167 sub start_document { | |
168 my ($self) = @_; | |
169 $self->{'_lastitem'} = {}; | |
170 $self->{'_currentitems'} = []; | |
171 $self->{'_currentnodes'} = []; | |
172 return; | |
173 } | |
174 | |
175 =head2 end_document | |
176 | |
177 Title : end_document | |
178 Usage : my @trees = $parser->end_document | |
179 Function: Finishes a Phylogeny cycle | |
180 Returns : An array Bio::Tree::TreeI | |
181 Args : none | |
182 | |
183 =cut | |
184 | |
185 sub end_document { | |
186 my ($self) = @_; | |
187 my $vb = $self->verbose; | |
188 my $root = $self->nodetype->new(-verbose => $vb); | |
189 # aggregate the nodes into trees basically ad-hoc. | |
190 while ( @{$self->{'_currentnodes'}} ) { | |
191 my ($node) = ( shift @{$self->{'_currentnodes'}}); | |
192 $root->add_Descendent($node); | |
193 } | |
194 | |
195 $self->debug("Root node is " . $root->to_string()."\n"); | |
196 if( $self->verbose > 0 ) { | |
197 foreach my $node ( $root->get_Descendents ) { | |
198 $self->debug("node is ". $node->to_string(). "\n"); | |
199 } | |
200 } | |
201 my $tree = $self->treetype->new(-root => $root, | |
202 -verbose => $vb); | |
203 return $tree; | |
204 } | |
205 | |
206 =head2 start_element | |
207 | |
208 Title : start_element | |
209 Usage : | |
210 Function: | |
211 Example : | |
212 Returns : | |
213 Args : $data => hashref with key 'Name' | |
214 | |
215 =cut | |
216 | |
217 sub start_element{ | |
218 my ($self,$data) =@_; | |
219 $self->{'_lastitem'}->{$data->{'Name'}}++; | |
220 | |
221 $self->debug("starting element: $data->{Name}\n"); | |
222 | |
223 push @{$self->{'_lastitem'}->{'current'}},$data->{'Name'}; | |
224 | |
225 my %data; | |
226 | |
227 if( $data->{'Name'} eq 'node' ) { | |
228 push @{$self->{'_currentitems'}}, \%data; | |
229 } elsif ( $data->{Name} eq 'tree' ) { | |
230 $self->{'_treelevel'}++; | |
231 } | |
232 } | |
233 | |
234 =head2 end_element | |
235 | |
236 Title : end_element | |
237 Usage : | |
238 Function: | |
239 Returns : none | |
240 Args : $data => hashref with key 'Name' | |
241 | |
242 =cut | |
243 | |
244 sub end_element{ | |
245 my ($self,$data) = @_; | |
246 | |
247 $self->debug("end of element: $data->{Name}\n"); | |
248 | |
249 if( $data->{'Name'} eq 'node' ) { | |
250 my $tnode; | |
251 my $node = pop @{$self->{'_currentitems'}}; | |
252 | |
253 $tnode = $self->nodetype->new(-verbose => $self->verbose, | |
254 %{$node}); | |
255 unless ( $node->{'-leaf'} ) { | |
256 for ( splice( @{$self->{'_currentnodes'}}, | |
257 - $self->{'_nodect'}->[$self->{'_treelevel'}+1])) { | |
258 | |
259 $self->debug("adding desc: " . $_->to_string . "\n"); | |
260 $tnode->add_Descendent($_); | |
261 } | |
262 $self->{_nodect}->[$self->{_treelevel}+1] = 0; | |
263 } | |
264 push @{$self->{'_currentnodes'}}, $tnode; | |
265 $self->{_nodect}->[$self->{'_treelevel'}]++; | |
266 $self->debug ("added node: nodes in stack is ". scalar @{$self->{'_currentnodes'}} . ", treelevel: $self->{_treelevel}, nodect: $self->{_nodect}->[$self->{_treelevel}]\n"); | |
267 } elsif( $data->{'Name'} eq 'tree' ) { | |
268 $self->debug("end of tree: nodes in stack is ". scalar @{$self->{'_currentnodes'}}. "\n"); | |
269 $self->{'_treelevel'}--; | |
270 } | |
271 $self->{'_lastitem'}->{ $data->{'Name'} }--; | |
272 | |
273 pop @{$self->{'_lastitem'}->{'current'}}; | |
274 } | |
275 | |
276 | |
277 =head2 in_element | |
278 | |
279 Title : in_element | |
280 Usage : | |
281 Function: | |
282 Example : | |
283 Returns : | |
284 Args : | |
285 | |
286 | |
287 =cut | |
288 | |
289 sub in_element{ | |
290 my ($self,$e) = @_; | |
291 | |
292 return 0 if ! defined $self->{'_lastitem'} || | |
293 ! defined $self->{'_lastitem'}->{'current'}->[-1]; | |
294 return ($e eq $self->{'_lastitem'}->{'current'}->[-1]); | |
295 | |
296 } | |
297 | |
298 =head2 within_element | |
299 | |
300 Title : within_element | |
301 Usage : | |
302 Function: | |
303 Example : | |
304 Returns : | |
305 Args : | |
306 | |
307 | |
308 =cut | |
309 | |
310 sub within_element{ | |
311 my ($self,$e) = @_; | |
312 return $self->{'_lastitem'}->{$e}; | |
313 } | |
314 | |
315 =head2 characters | |
316 | |
317 Title : characters | |
318 Usage : $handler->characters($text); | |
319 Function: Processes characters | |
320 Returns : none | |
321 Args : text string | |
322 | |
323 | |
324 =cut | |
325 | |
326 sub characters{ | |
327 my ($self,$ch) = @_; | |
328 if( $self->within_element('node') ) { | |
329 my $hash = pop @{$self->{'_currentitems'}}; | |
330 if( $self->in_element('bootstrap') ) { | |
331 $hash->{'-bootstrap'} = $ch; | |
332 } elsif( $self->in_element('branch_length') ) { | |
333 $hash->{'-branch_length'} = $ch; | |
334 } elsif( $self->in_element('id') ) { | |
335 $hash->{'-id'} = $ch; | |
336 } elsif( $self->in_element('description') ) { | |
337 $hash->{'-desc'} = $ch; | |
338 } elsif ( $self->in_element('tag_name') ) { | |
339 $hash->{'-NHXtagname'} = $ch; | |
340 } elsif ( $self->in_element('tag_value') ) { | |
341 $hash->{'-nhx'}->{$hash->{'-NHXtagname'}} = $ch; | |
342 delete $hash->{'-NHXtagname'}; | |
343 } elsif( $self->in_element('leaf') ) { | |
344 $hash->{'-leaf'} = $ch; | |
345 } | |
346 push @{$self->{'_currentitems'}}, $hash; | |
347 } | |
348 $self->debug("chars: $ch\n"); | |
349 } | |
350 | |
351 | |
352 1; |