Mercurial > repos > mahtabm > ensemb_rep_gvl
diff variant_effect_predictor/Bio/Tree/NodeNHX.pm @ 0:2bc9b66ada89 draft default tip
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 06:29:17 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/Tree/NodeNHX.pm Thu Apr 11 06:29:17 2013 -0400 @@ -0,0 +1,171 @@ +# $Id: NodeNHX.pm,v 1.5.2.1 2003/09/14 19:00:35 jason Exp $ +# +# BioPerl module for Bio::Tree::NodeNHX +# +# Cared for by Aaron Mackey <amackey@virginia.edu> +# +# Copyright Aaron Mackey +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::Tree::NodeNHX - A Simple Tree Node with support for NHX tags + +=head1 SYNOPSIS + + use Bio::Tree::NodeNHX; + my $nodeA = new Bio::Tree::NodeNHX(); + my $nodeL = new Bio::Tree::NodeNHX(); + my $nodeR = new Bio::Tree::NodeNHX(); + + my $node = new Bio::Tree::NodeNHX(); + $node->add_Descendents($nodeL); + $node->add_Descendents($nodeR); + + print "node is not a leaf \n" if( $node->is_leaf); + +=head1 DESCRIPTION + +Makes a Tree Node with NHX tags, suitable for building a Tree. See +L<Bio::Tree::Node> for a full list of functionality. + +=head1 FEEDBACK + +=head2 Mailing Lists + +User feedback is an integral part of the evolution of this and other +Bioperl modules. Send your comments and suggestions preferably to +the Bioperl mailing list. Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://bioperl.org/MailList.shtml - About the mailing lists + +=head2 Reporting Bugs + +Report bugs to the Bioperl bug tracking system to help us keep track +of the bugs and their resolution. Bug reports can be submitted via +the web: + + http://bugzilla.bioperl.org/ + +=head1 AUTHOR - Aaron Mackey + +Email amackey@virginia.edu + +=head1 CONTRIBUTORS + +The NHX (New Hampshire eXtended) format was created by Chris Zmasek, +and is described at: + + http://www.genetics.wustl.edu/eddy/forester/NHX.html + +=head1 APPENDIX + +The rest of the documentation details each of the object methods. +Internal methods are usually preceded with a _ + +=cut + + +# Let the code begin... + +package Bio::Tree::NodeNHX; +use vars qw(@ISA); +use strict; + +use Bio::Tree::Node; + +@ISA = qw(Bio::Tree::Node); + +=head2 new + + Title : new + Usage : my $obj = new Bio::Tree::NodeNHX(); + Function: Builds a new Bio::Tree::NodeNHX object + Returns : Bio::Tree::NodeNHX + Args : -left => pointer to Left descendent (optional) + -right => pointer to Right descenent (optional) + -branch_length => branch length [integer] (optional) + -bootstrap => value bootstrap value (string) + -description => description of node + -id => unique id for node + -nhx => hashref of NHX tags and values + +=cut + +sub new { + my($class,@args) = @_; + + my $self = $class->SUPER::new(@args); + my ($nhx) = $self->_rearrange([qw(NHX)], @args); + $self->nhx_tag($nhx); + return $self; +} + +sub DESTROY { + my ($self) = @_; + # try to insure that everything is cleaned up + $self->SUPER::DESTROY(); + if( defined $self->{'_desc'} && + ref($self->{'_desc'}) =~ /ARRAY/i ) { + while( my ($nodeid,$node) = each %{ $self->{'_desc'} } ) { + $node->{'_ancestor'} = undef; # insure no circular references + $node->DESTROY(); + $node = undef; + } + $self->{'_desc'} = {}; + } +} + +sub to_string{ + my ($self) = @_; + return sprintf("%s%s%s", + defined $self->id ? $self->id : '', + defined $self->branch_length ? ':' . + $self->branch_length : ' ', + '[' . join(":", "&&NHX", + map { "$_=" .join(',', + $self->get_tag_values($_))} + $self->get_all_tags() ) . ']' + ); +} + +=head2 nhx_tag + + Title : nhx_tag + Usage : my $tag = $nodenhx->nhx_tag(%tags); + Function: Set tag-value pairs for NHX nodes + Returns : none + Args : hashref to update the tags/value pairs + OR + with a scalar value update the bootstrap value by default + + +=cut + +sub nhx_tag { + my ($self, $tags) = @_; + if (defined $tags && (ref($tags) =~ /HASH/i)) { + while( my ($tag,$val) = each %$tags ) { + if( ref($val) =~ /ARRAY/i ) { + for my $v ( @$val ) { + $self->add_tag_value($tag,$v); + } + } else { + $self->add_tag_value($tag,$val); + } + } + if (exists $tags->{'B'}) { + $self->bootstrap($tags->{'B'}); + } + } elsif (defined $tags and ! ref ($tags)) { + print STDERR "here with $tags\n"; + # bootstrap by default + $self->bootstrap($tags); + } +} + +1;