File Coverage

blib/lib/Bio/Phylo/Forest/DrawTreeRole.pm
Criterion Covered Total %
statement 54 91 59.3
branch 12 24 50.0
condition n/a
subroutine 11 13 84.6
pod 2 2 100.0
total 79 130 60.7


line stmt bran cond sub pod time code
1             package Bio::Phylo::Forest::DrawTreeRole;
2 31     31   60545 use strict;
  31         66  
  31         715  
3 31     31   140 use warnings;
  31         56  
  31         584  
4 31     31   138 use Carp;
  31         56  
  31         1843  
5 31     31   16922 use Bio::Phylo::Forest::TreeRole;
  31         91  
  31         229  
6 31     31   240 use base 'Bio::Phylo::Forest::TreeRole';
  31         62  
  31         3472  
7 31     31   208 use Bio::Phylo::Forest::DrawNodeRole;
  31         64  
  31         212  
8 31     31   160 use Bio::Phylo::Util::CONSTANT 'looks_like_hash';
  31         59  
  31         24984  
9             {
10              
11             our $AUTOLOAD;
12             my @properties = qw(width height node_radius tip_radius node_color node_shape
13             node_image branch_color branch_shape branch_width branch_style collapsed_clade_width
14             font_face font_size font_style margin margin_top margin_bottom margin_left
15             margin_right padding padding_top padding_bottom padding_left padding_right
16             mode shape text_horiz_offset text_vert_offset);
17              
18             =head1 NAME
19              
20             Bio::Phylo::Forest::DrawTreeRole - Tree with extra methods for tree drawing
21              
22             =head1 SYNOPSIS
23              
24             # see Bio::Phylo::Forest::Tree
25              
26             =head1 DESCRIPTION
27              
28             The object models a phylogenetic tree, a container of Bio::Phylo::For-
29             est::Node objects. The tree object inherits from Bio::Phylo::Listable,
30             so look there for more methods.
31              
32             In addition, this subclass of the default tree object L<Bio::Phylo::Forest::Tree>
33             has getters and setters for drawing trees, e.g. font and text attributes, etc.
34              
35             =head1 METHODS
36              
37             =head2 CONSTRUCTORS
38              
39             =over
40              
41             =item new()
42              
43             Tree constructor.
44              
45             Type : Constructor
46             Title : new
47             Usage : my $tree = Bio::Phylo::Forest::DrawTree->new;
48             Function: Instantiates a Bio::Phylo::Forest::DrawTree object.
49             Returns : A Bio::Phylo::Forest::DrawTree object.
50             Args : No required arguments.
51              
52             =cut
53              
54             sub new {
55 194     194 1 751 my $class = shift;
56 194         804 my %args = looks_like_hash @_;
57 194 50       626 if ( not $args{'-tree'} ) {
58 194         983 return $class->SUPER::new(@_);
59             }
60             else {
61 0         0 my $tree = $args{'-tree'};
62 0         0 my $self = $tree->clone;
63 0         0 bless $self, $class;
64 0         0 for my $node ( @{ $self->get_entities } ) {
  0         0  
65 0         0 bless $node, 'Bio::Phylo::Forest::DrawNode';
66             }
67            
68 0         0 delete $args{'-tree'};
69 0         0 for my $key ( keys %args ) {
70 0         0 my $method = $key;
71 0         0 $method =~ s/^-/set_/;
72 0         0 $self->$method( $args{$key} );
73             }
74 0         0 return $self;
75             }
76             }
77              
78             =back
79              
80             =head2 MUTATORS
81              
82             =over
83              
84             =item set_width()
85              
86             Type : Mutator
87             Title : set_width
88             Usage : $tree->set_width($width);
89             Function: Sets width
90             Returns : $self
91             Args : width
92              
93             =item set_height()
94              
95             Type : Mutator
96             Title : set_height
97             Usage : $tree->set_height($height);
98             Function: Sets height
99             Returns : $self
100             Args : height
101              
102             =item set_node_radius()
103              
104             Type : Mutator
105             Title : set_node_radius
106             Usage : $tree->set_node_radius($node_radius);
107             Function: Sets node_radius
108             Returns : $self
109             Args : node_radius
110              
111             =item set_tip_radius()
112              
113             Type : Mutator
114             Title : set_tip_node_radius
115             Usage : $tree->set_tip_radius($node_radius);
116             Function: Sets tip radius
117             Returns : $self
118             Args : tip radius
119              
120             =item set_node_colour()
121              
122             Type : Mutator
123             Title : set_node_colour
124             Usage : $tree->set_node_colour($node_colour);
125             Function: Sets node_colour
126             Returns : $self
127             Args : node_colour
128              
129             =item set_node_shape()
130              
131             Type : Mutator
132             Title : set_node_shape
133             Usage : $tree->set_node_shape($node_shape);
134             Function: Sets node_shape
135             Returns : $self
136             Args : node_shape
137              
138             =item set_node_image()
139              
140             Type : Mutator
141             Title : set_node_image
142             Usage : $tree->set_node_image($node_image);
143             Function: Sets node_image
144             Returns : $self
145             Args : node_image
146              
147             =item set_collapsed_clade_width()
148              
149             Sets collapsed clade width.
150              
151             Type : Mutator
152             Title : set_collapsed_clade_width
153             Usage : $tree->set_collapsed_clade_width(6);
154             Function: sets the width of collapsed clade triangles relative to uncollapsed tips
155             Returns :
156             Args : Positive number
157              
158             =item set_branch_color()
159              
160             Type : Mutator
161             Title : set_branch_color
162             Usage : $tree->set_branch_color($branch_color);
163             Function: Sets branch_color
164             Returns : $self
165             Args : branch_color
166              
167             =item set_branch_shape()
168              
169             Type : Mutator
170             Title : set_branch_shape
171             Usage : $tree->set_branch_shape($branch_shape);
172             Function: Sets branch_shape
173             Returns : $self
174             Args : branch_shape
175              
176             =item set_branch_width()
177              
178             Type : Mutator
179             Title : set_branch_width
180             Usage : $tree->set_branch_width($branch_width);
181             Function: Sets branch width
182             Returns : $self
183             Args : branch_width
184              
185             =item set_branch_style()
186              
187             Type : Mutator
188             Title : set_branch_style
189             Usage : $tree->set_branch_style($branch_style);
190             Function: Sets branch style
191             Returns : $self
192             Args : branch_style
193              
194             =item set_font_face()
195              
196             Type : Mutator
197             Title : set_font_face
198             Usage : $tree->set_font_face($font_face);
199             Function: Sets font_face
200             Returns : $self
201             Args : font face, Verdana, Arial, Serif
202              
203             =item set_font_size()
204              
205             Type : Mutator
206             Title : set_font_size
207             Usage : $tree->set_font_size($font_size);
208             Function: Sets font_size
209             Returns : $self
210             Args : Font size in pixels
211              
212             =item set_font_style()
213              
214             Type : Mutator
215             Title : set_font_style
216             Usage : $tree->set_font_style($font_style);
217             Function: Sets font_style
218             Returns : $self
219             Args : Font style, e.g. Italic
220              
221             =item set_margin()
222              
223             Type : Mutator
224             Title : set_margin
225             Usage : $tree->set_margin($margin);
226             Function: Sets margin
227             Returns : $self
228             Args : margin
229              
230             =item set_margin_top()
231              
232             Type : Mutator
233             Title : set_margin_top
234             Usage : $tree->set_margin_top($margin_top);
235             Function: Sets margin_top
236             Returns : $self
237             Args : margin_top
238              
239             =item set_margin_bottom()
240              
241             Type : Mutator
242             Title : set_margin_bottom
243             Usage : $tree->set_margin_bottom($margin_bottom);
244             Function: Sets margin_bottom
245             Returns : $self
246             Args : margin_bottom
247              
248             =item set_margin_left()
249              
250             Type : Mutator
251             Title : set_margin_left
252             Usage : $tree->set_margin_left($margin_left);
253             Function: Sets margin_left
254             Returns : $self
255             Args : margin_left
256              
257             =item set_margin_right()
258              
259             Type : Mutator
260             Title : set_margin_right
261             Usage : $tree->set_margin_right($margin_right);
262             Function: Sets margin_right
263             Returns : $self
264             Args : margin_right
265              
266             =item set_padding()
267              
268             Type : Mutator
269             Title : set_padding
270             Usage : $tree->set_padding($padding);
271             Function: Sets padding
272             Returns : $self
273             Args : padding
274              
275             =item set_padding_top()
276              
277             Type : Mutator
278             Title : set_padding_top
279             Usage : $tree->set_padding_top($padding_top);
280             Function: Sets padding_top
281             Returns : $self
282             Args : padding_top
283              
284             =item set_padding_bottom()
285              
286             Type : Mutator
287             Title : set_padding_bottom
288             Usage : $tree->set_padding_bottom($padding_bottom);
289             Function: Sets padding_bottom
290             Returns : $self
291             Args : padding_bottom
292              
293             =item set_padding_left()
294              
295             Type : Mutator
296             Title : set_padding_left
297             Usage : $tree->set_padding_left($padding_left);
298             Function: Sets padding_left
299             Returns : $self
300             Args : padding_left
301              
302             =item set_padding_right()
303              
304             Type : Mutator
305             Title : set_padding_right
306             Usage : $tree->set_padding_right($padding_right);
307             Function: Sets padding_right
308             Returns : $self
309             Args : padding_right
310              
311             =item set_mode()
312              
313             Type : Mutator
314             Title : set_mode
315             Usage : $tree->set_mode($mode);
316             Function: Sets mode
317             Returns : $self
318             Args : mode, e.g. 'CLADO' or 'PHYLO'
319              
320             =item set_shape()
321              
322             Type : Mutator
323             Title : set_shape
324             Usage : $tree->set_shape($shape);
325             Function: Sets shape
326             Returns : $self
327             Args : shape, e.g. 'RECT', 'CURVY', 'DIAG'
328              
329             =item set_text_horiz_offset()
330              
331             Type : Mutator
332             Title : set_text_horiz_offset
333             Usage : $tree->set_text_horiz_offset($text_horiz_offset);
334             Function: Sets text_horiz_offset
335             Returns : $self
336             Args : text_horiz_offset
337              
338             =item set_text_vert_offset()
339              
340             Type : Mutator
341             Title : set_text_vert_offset
342             Usage : $tree->set_text_vert_offset($text_vert_offset);
343             Function: Sets text_vert_offset
344             Returns : $self
345             Args : text_vert_offset
346              
347             =back
348              
349             =head2 ACCESSORS
350              
351             =over
352              
353             =item get_width()
354              
355             Type : Accessor
356             Title : get_width
357             Usage : my $width = $tree->get_width();
358             Function: Gets width
359             Returns : width
360             Args : NONE
361              
362             =item get_height()
363              
364             Type : Accessor
365             Title : get_height
366             Usage : my $height = $tree->get_height();
367             Function: Gets height
368             Returns : height
369             Args : NONE
370              
371             =item get_node_radius()
372              
373             Type : Accessor
374             Title : get_node_radius
375             Usage : my $node_radius = $tree->get_node_radius();
376             Function: Gets node_radius
377             Returns : node_radius
378             Args : NONE
379              
380             =item get_node_colour()
381              
382             Type : Accessor
383             Title : get_node_colour
384             Usage : my $node_colour = $tree->get_node_colour();
385             Function: Gets node_colour
386             Returns : node_colour
387             Args : NONE
388              
389             =item get_node_shape()
390              
391             Type : Accessor
392             Title : get_node_shape
393             Usage : my $node_shape = $tree->get_node_shape();
394             Function: Gets node_shape
395             Returns : node_shape
396             Args : NONE
397              
398             =item get_node_image()
399              
400             Type : Accessor
401             Title : get_node_image
402             Usage : my $node_image = $tree->get_node_image();
403             Function: Gets node_image
404             Returns : node_image
405             Args : NONE
406              
407             =item get_collapsed_clade_width()
408              
409             Gets collapsed clade width.
410              
411             Type : Mutator
412             Title : get_collapsed_clade_width
413             Usage : $w = $tree->get_collapsed_clade_width();
414             Function: gets the width of collapsed clade triangles relative to uncollapsed tips
415             Returns : Positive number
416             Args : None
417              
418             =item get_branch_color()
419              
420             Type : Accessor
421             Title : get_branch_color
422             Usage : my $branch_color = $tree->get_branch_color();
423             Function: Gets branch_color
424             Returns : branch_color
425             Args : NONE
426              
427             =item get_branch_shape()
428              
429             Type : Accessor
430             Title : get_branch_shape
431             Usage : my $branch_shape = $tree->get_branch_shape();
432             Function: Gets branch_shape
433             Returns : branch_shape
434             Args : NONE
435              
436             =item get_branch_width()
437              
438             Type : Accessor
439             Title : get_branch_width
440             Usage : my $branch_width = $tree->get_branch_width();
441             Function: Gets branch_width
442             Returns : branch_width
443             Args : NONE
444              
445             =item get_branch_style()
446              
447             Type : Accessor
448             Title : get_branch_style
449             Usage : my $branch_style = $tree->get_branch_style();
450             Function: Gets branch_style
451             Returns : branch_style
452             Args : NONE
453              
454             =item get_font_face()
455              
456             Type : Accessor
457             Title : get_font_face
458             Usage : my $font_face = $tree->get_font_face();
459             Function: Gets font_face
460             Returns : font_face
461             Args : NONE
462              
463             =item get_font_size()
464              
465             Type : Accessor
466             Title : get_font_size
467             Usage : my $font_size = $tree->get_font_size();
468             Function: Gets font_size
469             Returns : font_size
470             Args : NONE
471              
472             =item get_font_style()
473              
474             Type : Accessor
475             Title : get_font_style
476             Usage : my $font_style = $tree->get_font_style();
477             Function: Gets font_style
478             Returns : font_style
479             Args : NONE
480              
481             =item get_margin()
482              
483             Type : Accessor
484             Title : get_margin
485             Usage : my $margin = $tree->get_margin();
486             Function: Gets margin
487             Returns : margin
488             Args : NONE
489              
490             =item get_margin_top()
491              
492             Type : Accessor
493             Title : get_margin_top
494             Usage : my $margin_top = $tree->get_margin_top();
495             Function: Gets margin_top
496             Returns : margin_top
497             Args : NONE
498              
499             =item get_margin_bottom()
500              
501             Type : Accessor
502             Title : get_margin_bottom
503             Usage : my $margin_bottom = $tree->get_margin_bottom();
504             Function: Gets margin_bottom
505             Returns : margin_bottom
506             Args : NONE
507              
508             =item get_margin_left()
509              
510             Type : Accessor
511             Title : get_margin_left
512             Usage : my $margin_left = $tree->get_margin_left();
513             Function: Gets margin_left
514             Returns : margin_left
515             Args : NONE
516              
517             =item get_margin_right()
518              
519             Type : Accessor
520             Title : get_margin_right
521             Usage : my $margin_right = $tree->get_margin_right();
522             Function: Gets margin_right
523             Returns : margin_right
524             Args : NONE
525              
526             =item get_padding()
527              
528             Type : Accessor
529             Title : get_padding
530             Usage : my $padding = $tree->get_padding();
531             Function: Gets padding
532             Returns : padding
533             Args : NONE
534              
535             =item get_padding_top()
536              
537             Type : Accessor
538             Title : get_padding_top
539             Usage : my $padding_top = $tree->get_padding_top();
540             Function: Gets padding_top
541             Returns : padding_top
542             Args : NONE
543              
544             =item get_padding_bottom()
545              
546             Type : Accessor
547             Title : get_padding_bottom
548             Usage : my $padding_bottom = $tree->get_padding_bottom();
549             Function: Gets padding_bottom
550             Returns : padding_bottom
551             Args : NONE
552              
553             =item get_padding_left()
554              
555             Type : Accessor
556             Title : get_padding_left
557             Usage : my $padding_left = $tree->get_padding_left();
558             Function: Gets padding_left
559             Returns : padding_left
560             Args : NONE
561              
562             =item get_padding_right()
563              
564             Type : Accessor
565             Title : get_padding_right
566             Usage : my $padding_right = $tree->get_padding_right();
567             Function: Gets padding_right
568             Returns : padding_right
569             Args : NONE
570              
571             =item get_mode()
572              
573             Type : Accessor
574             Title : get_mode
575             Usage : my $mode = $tree->get_mode();
576             Function: Gets mode
577             Returns : mode
578             Args : NONE
579              
580             =cut
581              
582             sub get_mode {
583 1     1 1 3 my $self = shift;
584 1 50       14 if ( $self->is_cladogram ) {
585 1         5 return 'CLADO';
586             }
587 0         0 return $self->get_meta_object( 'map:mode' );
588             }
589              
590             =item get_shape()
591              
592             Type : Accessor
593             Title : get_shape
594             Usage : my $shape = $tree->get_shape();
595             Function: Gets shape
596             Returns : shape
597             Args : NONE
598              
599             =item get_text_horiz_offset()
600              
601             Type : Accessor
602             Title : get_text_horiz_offset
603             Usage : my $text_horiz_offset = $tree->get_text_horiz_offset();
604             Function: Gets text_horiz_offset
605             Returns : text_horiz_offset
606             Args : NONE
607              
608             =item get_text_vert_offset()
609              
610             Type : Accessor
611             Title : get_text_vert_offset
612             Usage : my $text_vert_offset = $tree->get_text_vert_offset();
613             Function: Gets text_vert_offset
614             Returns : text_vert_offset
615             Args : NONE
616              
617             =begin comment
618              
619             This method re-computes the node coordinates
620              
621             =end comment
622              
623             =cut
624              
625             sub _redraw {
626 29     29   42 my $self = shift;
627 29         109 my ( $width, $height ) = ( $self->get_width, $self->get_height );
628 29         42 my $tips_seen = 0;
629 29         90 my $total_tips = $self->calc_number_of_terminals();
630 29 50       58 if ( my $root = $self->get_root ) {
631 0         0 my $tallest = $root->calc_max_path_to_tips;
632 0         0 my $maxnodes = $root->calc_max_nodes_to_tips;
633 0         0 my $is_clado = $self->get_mode =~ m/^c/i;
634             $self->visit_depth_first(
635             '-post' => sub {
636 0     0   0 my $node = shift;
637 0         0 my ( $x, $y );
638 0 0       0 if ( $node->is_terminal ) {
639 0         0 $tips_seen++;
640 0         0 $y = ( $height / $total_tips ) * $tips_seen;
641 0 0       0 $x =
642             $is_clado
643             ? $width
644             : ( $width / $tallest ) * $node->calc_path_to_root;
645             }
646             else {
647 0         0 my @children = @{ $node->get_children };
  0         0  
648 0         0 $y += $_->get_y for @children;
649 0         0 $y /= scalar @children;
650 0 0       0 $x =
651             $is_clado
652             ? $width -
653             ( ( $width / $maxnodes ) * $node->calc_max_nodes_to_tips )
654             : ( $width / $tallest ) * $node->calc_path_to_root;
655             }
656 0         0 $node->set_y($y);
657 0         0 $node->set_x($x);
658             }
659 0         0 );
660             }
661             }
662              
663              
664             =back
665              
666             =cut
667              
668             sub AUTOLOAD {
669 116     116   7610 my $self = shift;
670 116         169 my $method = $AUTOLOAD;
671 116         557 $method =~ s/.+://; # strip package names
672 116         211 $method =~ s/colour/color/; # map Canadian/British to American :)
673            
674             # if the user calls some non-existant method, try to do the
675             # usual way, with this message, from perspective of caller
676 116         155 my $template = 'Can\'t locate object method "%s" via package "%s"';
677            
678             # handler set_* method calls
679 116 100       401 if ( $method =~ /^set_(.+)$/ ) {
    100          
680 29         89 my $prop = $1;
681              
682             # test if this is actually settable
683 29 50       57 if ( grep { /^\Q$prop\E$/ } @properties ) {
  841         2107  
684 29         52 my $value = shift;
685            
686             # these are properties that must be applied to all nodes
687 29 100       74 if ( $prop =~ /_(?:node|tip|branch|clade|font|text)_/ ) {
688             $self->visit(sub{
689 0     0   0 my $node = shift;
690 0         0 $node->$method($value);
691 1         6 });
692             }
693            
694             # these are properties that must be expanded to left/right/top/bottom
695 29 50       69 if ( $prop =~ /_(?:margin|padding)$/ ) {
696 0         0 for my $pos ( qw(left right top bottom) ) {
697 0         0 my $expanded = $method . '_' . $pos;
698 0         0 $self->$expanded($value);
699             }
700             }
701            
702             # also apply the property to the tree itself
703 29         114 $self->set_meta_object( "map:$prop" => $value );
704 29         84 $self->_redraw;
705 29         127 return $self;
706             }
707             else {
708 0         0 croak sprintf $template, $method, __PACKAGE__;
709             }
710             }
711             elsif ( $method =~ /^get_(.+)$/ ) {
712 86         171 my $prop = $1;
713            
714             # test if this is actually gettable
715 86 50       153 if ( grep { /^\Q$prop\E$/ } @properties ) {
  2494         6473  
716            
717             # return the annotation
718 86         291 return $self->get_meta_object( "map:$prop" );
719             }
720             else {
721 0         0 croak sprintf $template, $method, __PACKAGE__;
722             }
723             }
724             else {
725 1         222 croak sprintf $template, $method, __PACKAGE__;
726             }
727             }
728              
729             # podinherit_insert_token
730              
731             =head1 SEE ALSO
732              
733             There is a mailing list at L<https://groups.google.com/forum/#!forum/bio-phylo>
734             for any user or developer questions and discussions.
735              
736             =over
737              
738             =item L<Bio::Phylo::Forest::Tree>
739              
740             This object inherits from L<Bio::Phylo::Forest::Tree>, so methods
741             defined there are also applicable here.
742              
743             =item L<Bio::Phylo::Manual>
744              
745             Also see the manual: L<Bio::Phylo::Manual> and L<http://rutgervos.blogspot.com>.
746              
747             =back
748              
749             =head1 CITATION
750              
751             If you use Bio::Phylo in published research, please cite it:
752              
753             B<Rutger A Vos>, B<Jason Caravas>, B<Klaas Hartmann>, B<Mark A Jensen>
754             and B<Chase Miller>, 2011. Bio::Phylo - phyloinformatic analysis using Perl.
755             I<BMC Bioinformatics> B<12>:63.
756             L<http://dx.doi.org/10.1186/1471-2105-12-63>
757              
758             =cut
759              
760             }
761             1;