2 # BioPerl module for Bio::TreeIO::newick
4 # Please direct questions and support issues to <bioperl-l@bioperl.org>
6 # Cared for by Jason Stajich <jason@bioperl.org>
8 # Copyright Jason Stajich
10 # You may distribute this module under the same terms as perl itself
12 # POD documentation - main docs before the code
16 Bio::TreeIO::newick - parsing and writing of Newick/PHYLIP/New Hampshire format
20 # do not use this module directly
23 my $treeio = Bio::TreeIO->new(-format => 'newick',
24 -file => 't/data/LOAD_Ccd1.dnd');
25 my $tree = $treeio->next_tree;
29 This module handles parsing and writing of Newick/PHYLIP/New Hampshire format.
35 User feedback is an integral part of the evolution of this and other
36 Bioperl modules. Send your comments and suggestions preferably to the
37 Bioperl mailing list. Your participation is much appreciated.
39 bioperl-l@bioperl.org - General discussion
40 http://bioperl.org/wiki/Mailing_lists - About the mailing lists
44 Please direct usage questions or support issues to the mailing list:
46 I<bioperl-l@bioperl.org>
48 rather than to the module maintainer directly. Many experienced and
49 reponsive experts will be able look at the problem and quickly
50 address it. Please include a thorough description of the problem
51 with code and data examples if at all possible.
55 Report bugs to the Bioperl bug tracking system to help us keep track
56 of the bugs and their resolution. Bug reports can be submitted via the
59 https://github.com/bioperl/bioperl-live/issues
61 =head1 AUTHOR - Jason Stajich
63 Email jason-at-bioperl-dot-org
67 The rest of the documentation details each of the object methods.
68 Internal methods are usually preceded with a _
72 # Let the code begin...
74 package Bio
::TreeIO
::newick
;
78 use Bio
::Event
::EventGeneratorI
;
80 use base
qw(Bio::TreeIO Bio::TreeIO::NewickParser);
85 Args : -print_count => boolean default is false
86 -bootstrap_style => set the bootstrap style (one of nobranchlength,
88 -order_by => set the order by sort method
90 See L<Bio::Node::Node::each_Descendent()>
96 $self->SUPER::_initialize
(@_);
97 my ( $print_count ) = $self->_rearrange(
103 $self->print_tree_count( $print_count || 0 );
110 Usage : my $tree = $treeio->next_tree
111 Function: Gets the next tree in the stream
112 Returns : L<Bio::Tree::TreeI>
120 return unless $_ = $self->_readline;
124 my $despace = sub { my $dirty = shift; $dirty =~ s/\s+//gs; return $dirty };
127 $dirty =~ s/^"?\s*(.+?)\s*"?$/$1/;
130 s/([^"]*)(".+?")([^"]*)/$despace->($1) . $dequote->($2) . $despace->($3)/egsx;
132 if (s/^\s*\[([^\]]+)\]//) {
136 if ( $match =~ /([-\d\.+]+)/ ) {
141 $self->_eventHandler->start_document;
143 # Call the parse_newick method as defined in NewickParser.pm
144 $self->parse_newick($_);
146 my $tree = $self->_eventHandler->end_document;
148 # Add the tree score afterwards if it exists.
150 $tree->score($score);
155 # Returns the default set of parsing & writing parameters for the Newick format.
156 sub get_default_params
{
160 newline_each_node
=> 0,
161 order_by
=> '', # ???
162 bootstrap_style
=> 'traditional', # Can be 'traditional', 'molphy', 'nobranchlength'
163 internal_node_id
=> 'id', # Can be 'id' or 'bootstrap'
165 no_branch_lengths
=> 0,
166 no_bootstrap_values
=> 0,
167 no_internal_node_labels
=> 0
175 Usage : $treeio->write_tree($tree);
176 Function: Write a tree out to data stream in newick/phylip format
178 Args : L<Bio::Tree::TreeI> object
183 my ( $self, @trees ) = @_;
184 if ( $self->print_tree_count ) {
185 $self->_print( sprintf( " %d\n", scalar @trees ) );
188 my $params = $self->get_params;
190 foreach my $tree (@trees) {
192 || ref($tree) =~ /ARRAY/i
193 || !$tree->isa('Bio::Tree::TreeI') )
196 "Calling write_tree with non Bio::Tree::TreeI object\n");
198 my @data = $self->_write_tree_Helper( $tree->get_root_node, $params);
199 $self->_print( join( ',', @data ).";" );
202 $self->flush if $self->_flush_on_write && defined $self->_fh;
206 sub _write_tree_Helper
{
208 my ( $node, $params ) = @_;
211 foreach my $n ( $node->each_Descendent($params->{order_by
}) ) {
212 push @data, $self->_write_tree_Helper( $n, $params );
215 my $label = $self->_node_as_string($node,$params);
217 if ( scalar(@data) >= 1) {
218 $data[0] = "(" . $data[0];
228 sub _node_as_string
{
233 my $label_stringbuffer = '';
235 if ($params->{no_bootstrap_values
} != 1 &&
237 defined $node->bootstrap &&
238 $params->{bootstrap_style
} eq 'traditional' &&
239 $params->{internal_node_id
} eq 'bootstrap') {
240 # If we're an internal node and we're using 'traditional' bootstrap style,
241 # we output the bootstrap instead of any label.
242 my $bootstrap = $node->bootstrap;
243 $label_stringbuffer .= $bootstrap if (defined $bootstrap);
244 } elsif ($params->{no_internal_node_labels
} != 1) {
246 $label_stringbuffer .= $id if( defined $id );
249 if ($params->{no_branch_lengths
} != 1) {
250 my $blen = $node->branch_length;
251 $label_stringbuffer .= ":". $blen if (defined $blen);
254 if ($params->{bootstrap_style
} eq 'molphy') {
255 my $bootstrap = $node->bootstrap;
256 $label_stringbuffer .= "[$bootstrap]" if (defined $bootstrap);
259 if ($params->{newline_each_node
} == 1) {
260 $label_stringbuffer .= "\n";
263 return $label_stringbuffer;
267 =head2 print_tree_count
269 Title : print_tree_count
270 Usage : $obj->print_tree_count($newval)
271 Function: Get/Set flag for printing out the tree count (paml,protml way)
272 Returns : value of print_tree_count (a scalar)
273 Args : on set, new value (a scalar or undef, optional)
277 sub print_tree_count
{
279 return $self->{'_print_tree_count'} = shift if @_;
280 return $self->{'_print_tree_count'} || 0;
283 =head2 bootstrap_style
285 Title : bootstrap_style
286 Usage : $obj->bootstrap_style($newval)
287 Function: A description of how bootstraps and branch lengths are
288 written, as the ID part of the internal node or else in []
289 in the branch length (Molphy-like; I am sure there is a
290 better name for this but am not sure where to go for some
291 sort of format documentation)
293 If no branch lengths are requested then no bootstraps are usually
294 written (unless someone REALLY wants this functionality...)
296 Can take on strings which contain the possible values of
297 'nobranchlength' --> don't draw any branch lengths - this
298 is helpful if you don't want to have to
299 go through and delete branch len on all nodes
300 'molphy' --> draw bootstraps (100) like
301 (A:0.11,B:0.22):0.33[100];
302 'traditional' --> draw bootstraps (100) like
303 (A:0.11,B:0.22)100:0.33;
304 Returns : value of bootstrap_style (a scalar)
305 Args : on set, new value (a scalar or undef, optional)
309 sub bootstrap_style
{
312 if ( defined $val ) {
314 if ( $val !~ /^nobranchlength|molphy|traditional/i ) {
316 "requested an unknown bootstrap style $val, expect one of nobranchlength,molphy,traditional, not updating value.\n"
320 $self->{'_bootstrap_style'} = $val;
323 return $self->{'_bootstrap_style'} || 'traditional';
329 Usage : $obj->order_by($newval)
330 Function: Allow node order to be specified (typically "alpha")
331 See L<Bio::Node::Node::each_Descendent()>
332 Returns : value of order_by (a scalar)
333 Args : on set, new value (a scalar or undef, optional)
340 return $self->{'order_by'} = shift if @_;
341 return $self->{'order_by'};