annotate variant_effect_predictor/Bio/Tree/RandomFactory.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 # $Id: RandomFactory.pm,v 1.8 2002/12/24 17:52:03 jason Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 # BioPerl module for Bio::Tree::RandomFactory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 # Cared for by Jason Stajich <jason@bioperl.org>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 # Copyright Jason Stajich
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 # POD documentation - main docs before the code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 Bio::Tree::RandomFactory - TreeFactory for generating Random Trees
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 use Bio::Tree::RandomFactory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 my $factory = new Bio::Tree::RandomFactory( -samples => \@taxonnames,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 -maxcount => 10);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 # or for anonymous samples
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 my $factory = new Bio::Tree::RandomFactory( -sample_size => 6,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 -maxcount = 50);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 Builds a random tree every time next_tree is called or up to -maxcount times.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 This algorithm is based on the make_tree algorithm from Richard Hudson 1990.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 Hudson, R. R. 1990. Gene genealogies and the coalescent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 process. Pp. 1-44 in D. Futuyma and J. Antonovics, eds. Oxford
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 surveys in evolutionary biology. Vol. 7. Oxford University
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 Press, New York
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 User feedback is an integral part of the evolution of this and other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 Bioperl modules. Send your comments and suggestions preferably to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 the Bioperl mailing list. Your participation is much appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 http://bioperl.org/MailList.shtml - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 Report bugs to the Bioperl bug tracking system to help us keep track
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 of the bugs and their resolution. Bug reports can be submitted via
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 =head1 AUTHOR - Jason Stajich
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 Email jason@bioperl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 =head1 CONTRIBUTORS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 Matthew Hahn, E<lt>matthew.hahn@duke.eduE<gt>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 The rest of the documentation details each of the object methods.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 Internal methods are usually preceded with a _
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 # Let the code begin...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 package Bio::Tree::RandomFactory;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 use vars qw(@ISA $PRECISION_DIGITS);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 BEGIN {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 $PRECISION_DIGITS = 3; # Precision for the branchlength
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 use Bio::Factory::TreeFactoryI;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 use Bio::Root::Root;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 use Bio::TreeIO::TreeEventBuilder;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 use Bio::Tree::AlleleNode;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 @ISA = qw(Bio::Root::Root Bio::Factory::TreeFactoryI );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 Title : new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 Usage : my $factory = new Bio::Tree::RandomFactory(-samples => \@samples,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 -maxcount=> $N);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 Function: Initializes a Bio::Tree::RandomFactory object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 Returns : Bio::Tree::RandomFactory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 sub new{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 my ($class,@args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 my $self = $class->SUPER::new(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 $self->{'_eventbuilder'} = new Bio::TreeIO::TreeEventBuilder();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 $self->{'_treecounter'} = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 $self->{'_maxcount'} = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 my ($maxcount, $samps,$samplesize ) = $self->_rearrange([qw(MAXCOUNT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 SAMPLES
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 SAMPLE_SIZE)],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 @args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 my @samples;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 if( ! defined $samps ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 if( ! defined $samplesize || $samplesize <= 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 $self->throw("Must specify a valid samplesize if parameter -SAMPLE is not specified");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 foreach ( 1..$samplesize ) { push @samples, "Samp$_"; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 if( ref($samps) =~ /ARRAY/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 $self->throw("Must specify a valid ARRAY reference to the parameter -SAMPLES, did you forget a leading '\\'?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 @samples = @$samps;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 $self->samples(\@samples);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 $self->sample_size(scalar @samples);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 if( defined $maxcount ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 $self->maxcount($maxcount);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 =head2 next_tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 Title : next_tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 Usage : my $tree = $factory->next_tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 Function: Returns a random tree based on the initialized number of nodes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 NOTE: if maxcount is not specified on initialization or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 set to a valid integer, subsequent calls to next_tree will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 continue to return random trees and never return undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 Returns : Bio::Tree::TreeI object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 sub next_tree{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 # If maxcount is set to something non-zero then next tree will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 # continue to return valid trees until maxcount is reached
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 # otherwise will always return trees
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 return undef if( $self->maxcount &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 $self->{'_treecounter'}++ >= $self->maxcount );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 my $size = $self->sample_size;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 my $in;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 my @tree = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 my @list = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 for($in=0;$in < 2*$size -1; $in++ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 push @tree, { 'nodenum' => "Node$in" };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 # in C we would have 2 arrays
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 # an array of nodes (tree)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 # and array of pointers to these nodes (list)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 # and we just shuffle the list items to do the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 # tree topology generation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 # instead in perl, we will have a list of hashes (nodes) called @tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 # and a list of integers representing the indexes in tree called @list
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 for($in=0;$in < $size;$in++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 $tree[$in]->{'time'} = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 $tree[$in]->{'desc1'} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 $tree[$in]->{'desc2'} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 push @list, $in;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 my $t=0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 # generate times for the nodes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 for($in = $size; $in > 1; $in-- ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 $t+= -2.0 * log(1 - $self->random(1)) / ( $in * ($in-1) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 $tree[2 * $size - $in]->{'time'} =$t;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 # topology generation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 for ($in = $size; $in > 1; $in-- ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 my $pick = int $self->random($in);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 my $nodeindex = $list[$pick];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 my $swap = 2 * $size - $in;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 $tree[$swap]->{'desc1'} = $nodeindex;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 $list[$pick] = $list[$in-1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 $pick = int rand($in - 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 $nodeindex = $list[$pick];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 $tree[$swap]->{'desc2'} = $nodeindex;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 $list[$pick] = $swap;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 # Let's convert the hashes into nodes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 my @nodes = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 foreach my $n ( @tree ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 push @nodes,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 new Bio::Tree::AlleleNode(-id => $n->{'nodenum'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 -branch_length => $n->{'time'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 my $ct = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 foreach my $node ( @nodes ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 my $n = $tree[$ct++];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 if( defined $n->{'desc1'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 $node->add_Descendent($nodes[$n->{'desc1'}]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 if( defined $n->{'desc2'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 $node->add_Descendent($nodes[$n->{'desc2'}]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 my $T = new Bio::Tree::Tree(-root => pop @nodes );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 return $T;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 =head2 add_Mutations
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 Title : add_Mutations
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 Usage : $factory->add_Mutations($tree, $mutcount);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 Function: Adds mutations to a tree via a random process weighted by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 branch length (it is a poisson distribution
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 as part of a coalescent process)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 Args : $tree - Bio::Tree::TreeI
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 $nummut - number of mutations
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 sub add_Mutations{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 my ($self,$tree, $nummut) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 my @branches;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 my @lens;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 my $branchlen = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 my $last = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 my @nodes = $tree->get_nodes();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 my $precision = 10**$PRECISION_DIGITS;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 my $i = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 # Jason's somewhat simplistics way of doing a poission
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 # distribution for a fixed number of mutations
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 # build an array and put the node number in a slot
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 # representing the branch to put a mutation on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 # but weight the number of slots per branch by the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 # length of the branch ( ancestor's time - node time)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 foreach my $node ( @nodes ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 if( $node->ancestor ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 my $len = int ( ($node->ancestor->branch_length -
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 $node->branch_length) * $precision);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 if ( $len > 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 for( my $j =0;$j < $len;$j++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 push @branches, $i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 $last += $len;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 $branchlen += $len;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 if( ! $node->isa('Bio::Tree::AlleleNode') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 bless $node, 'Bio::Tree::AlleleNode'; # rebless it to the right node
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 $node->purge_markers;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 $i++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 # sanity check
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 die("branch len is $branchlen arraylen is $last")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 unless ( $branchlen == $last );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 for( my $j = 0; $j < $nummut; $j++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 my $index = int(rand($branchlen));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 my $branch = $branches[$index];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 $nodes[$branch]->add_alleles("Mutation$j", [1]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 =head2 maxcount
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 Title : maxcount
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 Usage : $obj->maxcount($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 Function:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 Returns : value of maxcount
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 sub maxcount{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 my ($self,$value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 if( defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 if( $value =~ /^(\d+)/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 $self->{'maxcount'} = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 $self->warn("Must specify a valid Positive integer to maxcount");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 $self->{'maxcount'} = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 return $self->{'_maxcount'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 =head2 samples
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 Title : samples
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 Usage : $obj->samples($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 Function:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 Returns : value of samples
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 sub samples{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 my ($self,$value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 if( defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 if( ref($value) !~ /ARRAY/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 $self->warn("Must specify a valid array ref to the method 'samples'");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 $value = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 $self->{'samples'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 return $self->{'samples'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 =head2 sample_size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 Title : sample_size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 Usage : $obj->sample_size($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 Function:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 Returns : value of sample_size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 sub sample_size{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 my ($self,$value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 if( defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 $self->{'sample_size'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 return $self->{'sample_size'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 =head2 attach_EventHandler
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 Title : attach_EventHandler
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 Usage : $parser->attatch_EventHandler($handler)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 Function: Adds an event handler to listen for events
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 Args : Bio::Event::EventHandlerI
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 sub attach_EventHandler{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 my ($self,$handler) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 return if( ! $handler );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 if( ! $handler->isa('Bio::Event::EventHandlerI') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 $self->warn("Ignoring request to attatch handler ".ref($handler). ' because it is not a Bio::Event::EventHandlerI');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 $self->{'_handler'} = $handler;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 =head2 _eventHandler
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 Title : _eventHandler
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 Usage : private
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 Function: Get the EventHandler
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 Returns : Bio::Event::EventHandlerI
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 sub _eventHandler{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 return $self->{'_handler'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 =head2 random
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 Title : random
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 Usage : my $rfloat = $node->random($size)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 Function: Generates a random number between 0 and $size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 This is abstracted so that someone can override and provide their
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 own special RNG. This is expected to be a uniform RNG.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 Returns : Floating point random
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 Args : $maximum size for random number (defaults to 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 sub random{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 my ($self,$max) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 return rand($max);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 1;