# $Id: Pagel.pm 843 2009-03-04 23:50:27Z rvos $ package Bio::Phylo::Unparsers::Pagel; use strict; use Bio::Phylo::Forest::Tree; use Bio::Phylo::IO; use vars qw(@ISA); @ISA=qw(Bio::Phylo::IO); =head1 NAME Bio::Phylo::Unparsers::Pagel - Serializer used by Bio::Phylo::IO, no serviceable parts inside =head1 DESCRIPTION This module unparses a Bio::Phylo data structure into an input file for Discrete/Continuous/Multistate. The pagel file format (as it is interpreted here) consists of: =over =item first line the number of tips, the number of characters =item subsequent lines offspring name, parent name, branch length, character state(s). =back Here is an example of what the output might look like: 4 2 A,n1,0.000000,1,2 B,n1,0.000000,1,2 n1,n2,0.000000 C,n2,0.000000,2,2 n2,n3,0.000000 D,n3,0.000000,2,1 To the unparse() function pass a tree object as value of the '-phylo' argument. The tips in this tree must be linked to taxon objects, and the taxon objects must be linked to datum objects whose character state sequences are to be serialized. During unparsing, the tree is randomly resolved, and branch lengths are formatted to %f floats (i.e. integers, decimal point, integers). The pagel module is called by the L object, so look there to learn about parsing and serializing in general. =begin comment Type : Constructor Title : new Usage : my $pagel = new Bio::Phylo::Unparsers::Pagel; Function: Initializes a Bio::Phylo::Unparsers::Pagel object. Alias : Returns : A Bio::Phylo::Unparsers::Pagel object. Args : none. =end comment =cut sub _new { my $class = shift; my $self = {}; if (@_) { my %opts = @_; foreach my $key ( keys %opts ) { my $localkey = uc $key; $localkey =~ s/-//; unless ( ref $opts{$key} ) { $self->{$localkey} = uc $opts{$key}; } else { $self->{$localkey} = $opts{$key}; } } } bless $self, $class; return $self; } =begin comment Type : Unparser Title : to_string($tree) Usage : $pagel->to_string($tree); Function: Unparses a Bio::Phylo::Tree object into a pagel formatted string. Returns : SCALAR Args : Bio::Phylo::Tree =end comment =cut sub _to_string { my $self = shift; my $tree = $self->{'PHYLO'}; $tree->resolve; my ( $charcounter, $string ) = 0; foreach my $node ( @{ $tree->get_entities } ) { if ( $node->get_parent ) { $string .= $node->get_internal_name . ',' . $node->get_parent->get_internal_name . ','; if ( $node->get_branch_length ) { $string .= sprintf( "%f", $node->get_branch_length ); } else { $string .= sprintf( "%f", 0 ); } if ( $node->get_taxon ) { my $taxon = $node->get_taxon; foreach ( @{ $taxon->get_data } ) { $string .= ',' . $_->get_char; $charcounter++; } } $string .= "\n"; } else { next; } } my $header = $tree->calc_number_of_terminals . " "; $header .= $charcounter / $tree->calc_number_of_terminals; $string = $header . "\n" . $string; return $string; } # podinherit_insert_token # podinherit_start_token_do_not_remove # AUTOGENERATED pod created by /Users/rvosa/Applications/podinherit on Wed Mar 4 17:13:59 2009 # DO NOT EDIT the code below, rerun /Users/rvosa/Applications/podinherit instead. =pod =head1 INHERITED METHODS Bio::Phylo::Unparsers::Pagel inherits from one or more superclasses. This means that objects of class Bio::Phylo::Unparsers::Pagel also "do" the methods from the superclasses in addition to the ones implemented in this class. Below is the documentation for those additional methods, organized by superclass. =head2 SUPERCLASS Bio::Phylo::IO Bio::Phylo::Unparsers::Pagel inherits from superclass L. Below are the public methods (if any) from this superclass. =over =item parse() Parses a file or string. Type : Class method Title : parse Usage : my $obj = Bio::Phylo::IO->parse(%options); Function: Creates (file) handle, instantiates appropriate parser. Returns : A Bio::Phylo::* object Args : -file => (path), or -string => (scalar), -format => (description format), -(other) => (parser specific options) Comments: The parse method makes assumptions about the capabilities of Bio::Phylo::Parsers::* modules: i) their names match those of the -format => (blah) arguments, insofar that ucfirst(blah) . '.pm' is an existing module; ii) the modules implement a _from_handle, or a _from_string method. Exceptions are thrown if either assumption is violated. If @ARGV contains even key/value pairs such as "format newick file " (note: no dashes) these will be prepended to @_, for one-liners. =item unparse() Unparses object(s) to a string. Type : Class method Title : unparse Usage : my $string = Bio::Phylo::IO->unparse( %options ); Function: Turns Bio::Phylo object into a string according to specified format. Returns : SCALAR Args : -phylo => (Bio::Phylo object), -format => (description format), -(other) => (parser specific options) =back =cut # podinherit_stop_token_do_not_remove =head1 SEE ALSO =over =item L The pagel unparser is called by the L object. Look there to learn how to create pagel formatted files. =item L Also see the manual: L and L. =back =head1 REVISION $Id: Pagel.pm 843 2009-03-04 23:50:27Z rvos $ =cut 1;