t/AlignIO/AlignIO.t: fix number of tests in plan (fixup c523e6bed866)
[bioperl-live.git] / Bio / Tree / NodeNHX.pm
blob548e51cc4c15d4ac581de1c96c4bc0e677f4dbd5
2 # BioPerl module for Bio::Tree::NodeNHX
4 # Please direct questions and support issues to <bioperl-l@bioperl.org>
6 # Cared for by Aaron Mackey <amackey@virginia.edu>
8 # Copyright Aaron Mackey
10 # You may distribute this module under the same terms as perl itself
12 # POD documentation - main docs before the code
14 =head1 NAME
16 Bio::Tree::NodeNHX - A Simple Tree Node with support for NHX tags
18 =head1 SYNOPSIS
20 use Bio::Tree::NodeNHX;
21 my $nodeA = Bio::Tree::NodeNHX->new();
22 my $nodeL = Bio::Tree::NodeNHX->new();
23 my $nodeR = Bio::Tree::NodeNHX->new();
25 my $node = Bio::Tree::NodeNHX->new();
26 $node->add_Descendents($nodeL);
27 $node->add_Descendents($nodeR);
29 print "node is not a leaf \n" if( $node->is_leaf);
31 =head1 DESCRIPTION
33 Makes a Tree Node with NHX tags, suitable for building a Tree. See
34 L<Bio::Tree::Node> for a full list of functionality.
36 =head1 FEEDBACK
38 =head2 Mailing Lists
40 User feedback is an integral part of the evolution of this and other
41 Bioperl modules. Send your comments and suggestions preferably to
42 the Bioperl mailing list. Your participation is much appreciated.
44 bioperl-l@bioperl.org - General discussion
45 http://bioperl.org/wiki/Mailing_lists - About the mailing lists
47 =head2 Support
49 Please direct usage questions or support issues to the mailing list:
51 I<bioperl-l@bioperl.org>
53 rather than to the module maintainer directly. Many experienced and
54 reponsive experts will be able look at the problem and quickly
55 address it. Please include a thorough description of the problem
56 with code and data examples if at all possible.
58 =head2 Reporting Bugs
60 Report bugs to the Bioperl bug tracking system to help us keep track
61 of the bugs and their resolution. Bug reports can be submitted via
62 the web:
64 https://github.com/bioperl/bioperl-live/issues
66 =head1 AUTHOR - Aaron Mackey
68 Email amackey@virginia.edu
70 =head1 CONTRIBUTORS
72 The NHX (New Hampshire eXtended) format was created by Chris Zmasek,
73 and is described at:
75 http://sourceforge.net/projects/forester-atv/
77 =head1 APPENDIX
79 The rest of the documentation details each of the object methods.
80 Internal methods are usually preceded with a _
82 =cut
85 # Let the code begin...
87 package Bio::Tree::NodeNHX;
88 use strict;
91 use base qw(Bio::Tree::Node);
93 =head2 new
95 Title : new
96 Usage : my $obj = Bio::Tree::NodeNHX->new();
97 Function: Builds a new Bio::Tree::NodeNHX object
98 Returns : Bio::Tree::NodeNHX
99 Args : -left => pointer to Left descendent (optional)
100 -right => pointer to Right descenent (optional)
101 -branch_length => branch length [integer] (optional)
102 -bootstrap => bootstrap value (string)
103 -description => description of node
104 -id => unique id for node
105 -nhx => hashref of NHX tags and values
107 =cut
109 sub new {
110 my($class,@args) = @_;
112 my $self = $class->SUPER::new(@args);
113 my ($nhx) = $self->_rearrange([qw(NHX)], @args);
114 $self->nhx_tag($nhx);
115 return $self;
118 sub DESTROY {
119 my ($self) = @_;
120 # try to insure that everything is cleaned up
121 $self->SUPER::DESTROY();
122 if( defined $self->{'_desc'} &&
123 ref($self->{'_desc'}) =~ /ARRAY/i ) {
124 while( my ($nodeid,$node) = each %{ $self->{'_desc'} } ) {
125 $node->{'_ancestor'} = undef; # insure no circular references
126 $node->DESTROY();
127 $node = undef;
129 $self->{'_desc'} = {};
133 sub to_string{
134 my ($self) = @_;
135 my @tags = $self->get_all_tags;
136 my $tagstr = '';
137 if( scalar(@tags) > 0 ) {
138 $tagstr = '[' . join(":", "&&NHX",
139 map { "$_=" .join(',',
140 $self->get_tag_values($_))}
141 @tags ) . ']';
143 return sprintf("%s%s%s",
144 defined $self->id ? $self->id : '',
145 defined $self->branch_length ? ':' .
146 $self->branch_length : ' ',
147 $tagstr);
150 =head2 nhx_tag
152 Title : nhx_tag
153 Usage : my $tag = $nodenhx->nhx_tag(%tags);
154 Function: Set tag-value pairs for NHX nodes
155 Returns : none
156 Args : hashref to update the tags/value pairs
158 with a scalar value update the bootstrap value by default
161 =cut
163 sub nhx_tag {
164 my ($self, $tags) = @_;
165 if (defined $tags && (ref($tags) =~ /HASH/i)) {
166 while( my ($tag,$val) = each %$tags ) {
167 if( ref($val) =~ /ARRAY/i ) {
168 for my $v ( @$val ) {
169 $self->add_tag_value($tag,$v);
171 } else {
172 $self->add_tag_value($tag,$val);
175 if (exists $tags->{'B'}) {
176 $self->bootstrap($tags->{'B'});
178 } elsif (defined $tags and ! ref ($tags)) {
179 $self->debug( "here with $tags\n");
180 # bootstrap by default
181 $self->bootstrap($tags);