annotate variant_effect_predictor/Bio/Align/DNAStatistics.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 # $Id: DNAStatistics.pm,v 1.4 2002/10/22 07:45:10 lapp Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 # BioPerl module for Bio::Align::DNAStatistics
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 # Cared for by Jason Stajich <jason@bioperl.org>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 # Copyright Jason Stajich
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 # POD documentation - main docs before the code
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 Bio::Align::DNAStatistics - Calculate some statistics for a DNA alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 use Bio::Align::DNAStatistics;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 use Bio::AlignIO;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 my $stats = new Bio::Align::PairwiseStatistics;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 my $alignin = new Bio::AlignIO(-format => 'emboss',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 -file => 't/data/insulin.water');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 my $jc = $stats->distance($aln, 'Jukes-Cantor');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 foreach my $r ( @$jc ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 print "\t";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 foreach my $r ( @$d ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 print "$r\t";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 print "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 This object contains routines for calculating various statistics and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 distances for DNA alignments. The routines are not well tested and do
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 contain errors at this point. Work is underway to correct them, but
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 do not expect this code to give you the right answer currently! Use
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 dnadist/distmat in the PHLYIP or EMBOSS packages to calculate the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 distances.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 =head1 FEEDBACK
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 =head2 Mailing Lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 User feedback is an integral part of the evolution of this and other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 Bioperl modules. Send your comments and suggestions preferably to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 the Bioperl mailing list. Your participation is much appreciated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 bioperl-l@bioperl.org - General discussion
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 http://bioperl.org/MailList.shtml - About the mailing lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 =head2 Reporting Bugs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 Report bugs to the Bioperl bug tracking system to help us keep track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 of the bugs and their resolution. Bug reports can be submitted via
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 email or the web:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 bioperl-bugs@bioperl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 http://bugzilla.bioperl.org/
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 =head1 AUTHOR - Jason Stajich
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 Email jason@bioperl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 Describe contact details here
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 =head1 CONTRIBUTORS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 Additional contributors names and emails here
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 The rest of the documentation details each of the object methods.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 # Let the code begin...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 package Bio::Align::DNAStatistics;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 use vars qw(@ISA %DNAChanges @Nucleotides %NucleotideIndexes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 $GapChars $SeqCount $DefaultGapPenalty %DistanceMethods);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 use Bio::Align::PairwiseStatistics;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 use Bio::Root::Root;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 BEGIN {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 $GapChars = '(\.|\-)';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 @Nucleotides = qw(A G T C);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 $SeqCount = 2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 # these values come from EMBOSS distmat implementation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 %NucleotideIndexes = ( 'A' => 0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 'T' => 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 'C' => 2,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 'G' => 3,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 'AT' => 0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 'AC' => 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 'AG' => 2,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 'CT' => 3,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 'GT' => 4,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 'CG' => 5,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 # these are wrong now
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 # 'S' => [ 1, 3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 # 'W' => [ 0, 4],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 # 'Y' => [ 2, 3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 # 'R' => [ 0, 1],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 # 'M' => [ 0, 3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 # 'K' => [ 1, 2],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 # 'B' => [ 1, 2, 3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 # 'H' => [ 0, 2, 3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 # 'V' => [ 0, 1, 3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 # 'D' => [ 0, 1, 2],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 $DefaultGapPenalty = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 # could put ambiguities here?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 %DNAChanges = ( 'Transversions' => { 'A' => [ 'T', 'C'],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 'T' => [ 'A', 'G'],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 'C' => [ 'A', 'G'],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 'G' => [ 'C', 'T'],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 },
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 'Transitions' => { 'A' => [ 'G' ],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 'G' => [ 'A' ],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 'C' => [ 'T' ],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 'T' => [ 'C' ],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 },
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 %DistanceMethods = ( 'jc|jukes|jukes-cantor' => 'JukesCantor',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 'f81' => 'F81',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 'k2|k2p|k80|kimura' => 'Kimura',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 't92|tamura|tamura92' => 'Tamura',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 'f84' => 'F84',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 'tajimanei|tajima-nei' => 'TajimaNei' );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 @ISA = qw( Bio::Root::Root Bio::Align::StatisticsI );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 =head2 new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 Title : new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 Usage : my $obj = new Bio::Align::DNAStatistics();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 Function: Builds a new Bio::Align::DNAStatistics object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 Returns : Bio::Align::DNAStatistics
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 my ($class,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 my $self = $class->SUPER::new(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 $self->pairwise_stats( new Bio::Align::PairwiseStatistics());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 =head2 distance
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 Title : distance
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 Usage : my $distance_mat = $stats->distance(-align => $aln,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 -method => $method);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 Function: Calculates a distance matrix for all pairwise distances of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 sequences in an alignment.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 Returns : Array ref
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 Args : -align => Bio::Align::AlignI object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 -method => String specifying specific distance method
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 (implementing class may assume a default)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 sub distance{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 my ($aln,$method) = $self->_rearrange([qw(ALIGN METHOD)],@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 if( ! defined $aln || ! ref ($aln) || ! $aln->isa('Bio::Align::AlignI') ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 $self->throw("Must supply a valid Bio::Align::AlignI for the -align parameter in distance");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 $method ||= 'JukesCantor';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 foreach my $m ( keys %DistanceMethods ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 if(defined $m && $method =~ /$m/i ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 my $mtd = "D_$DistanceMethods{$m}";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 return $self->$mtd($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 $self->warn("Unrecognized distance method $method must be one of [".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 join(',',$self->available_distance_methods())."]");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 =head2 available_distance_methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 Title : available_distance_methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 Usage : my @methods = $stats->available_distance_methods();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 Function: Enumerates the possible distance methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 Returns : Array of strings
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 sub available_distance_methods{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 return values %DistanceMethods;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 =head2 D - distance methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 =head2 D_JukesCantor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 Title : D_JukesCantor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 Usage : my $d = $stat->D_JukesCantor($aln)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 Function: Calculates D (pairwise distance) between 2 sequences in an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 alignment using the Jukes-Cantor 1 parameter model.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 Returns : ArrayRef of all pairwise distances of all sequence pairs in the alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 Args : Bio::Align::AlignI of DNA sequences
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 double - gap penalty
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 sub D_JukesCantor{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 my ($self,$aln,$gappenalty) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 return 0 unless $self->_check_arg($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 $gappenalty = $DefaultGapPenalty unless defined $gappenalty;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 # ambiguities ignored at this point
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 my (@seqs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 foreach my $seq ( $aln->each_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 push @seqs, [ split(//,uc $seq->seq())];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 my $seqct = scalar @seqs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 my @DVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 for(my $i = 1; $i <= $seqct; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 for( my $j = $i+1; $j <= $seqct; $j++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 my ($matrix,$pfreq,$gaps) = $self->_build_nt_matrix($seqs[$i-1],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 $seqs[$j-1]);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 # just want diagonals
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 my $m = ( $matrix->[0]->[0] + $matrix->[1]->[1] +
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 $matrix->[2]->[2] + $matrix->[3]->[3] );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 my $D = 1 - ( $m / ($aln->length - $gaps + ( $gaps * $gappenalty)));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 my $d = (- 3 / 4) * log ( 1 - (4 * $D/ 3));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 $DVals[$i]->[$j] = $DVals[$j]->[$i] = $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 return \@DVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 =head2 D_F81
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 Title : D_F81
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 Usage : my $d = $stat->D_F81($aln)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 Function: Calculates D (pairwise distance) between 2 sequences in an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 alignment using the Felsenstein 1981 distance model.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 Returns : ArrayRef of a 2d array of all pairwise distances in the alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 Args : Bio::Align::AlignI of DNA sequences
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 sub D_F81{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 return 0 unless $self->_check_arg($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 $self->throw("This isn't implemented yet - sorry");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 # M Kimura, J. Mol. Evol., 1980, 16, 111.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 =head2 D_Kimura
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 Title : D_Kimura
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 Usage : my $d = $stat->D_Kimura($aln)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 Function: Calculates D (pairwise distance) between 2 sequences in an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 alignment using the Kimura 2 parameter model.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 Returns : ArrayRef of pairwise distances between all sequences in alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 Args : Bio::Align::AlignI of DNA sequences
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 sub D_Kimura{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 return 0 unless $self->_check_arg($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 my $seqct = $aln->no_sequences;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 my @KVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 for( my $i = 1; $i <= $seqct; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 for( my $j = $i+1; $j <= $seqct; $j++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 my $pairwise = $aln->select_noncont($i,$j);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 my $L = $self->pairwise_stats->number_of_comparable_bases($pairwise);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 my $P = $self->transitions($pairwise) / $L;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 my $Q = $self->transversions($pairwise) / $L;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 my $a = 1 / ( 1 - (2 * $P) - $Q);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 my $b = 1 / ( 1 - 2 * $Q );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 my $K = (1/2) * log ( $a ) + (1/4) * log($b);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 $KVals[$i]->[$j] = $K;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 $KVals[$j]->[$i] = $K;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 return \@KVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 # K Tamura, Mol. Biol. Evol. 1992, 9, 678.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 =head2 D_Tamura
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 Title : D_Tamura
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 sub D_Tamura{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 my $seqct = $aln->no_sequences;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 my @KVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 for( my $i = 1; $i <= $seqct; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 for( my $j = $i+1; $j <= $seqct; $j++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 my $O = 0.25;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 my $t = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 my $a = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 my $b = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 my $d = 4 * $O * ( 1 - $O ) * $a * $t + 2 * $b * $t;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 return $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 =head2 D_F84
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 Title : D_F84
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 Usage : my $d = $stat->D_F84($aln)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 Function: Calculates D (pairwise distance) between 2 sequences in an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 alignment using the Felsenstein 1984 distance model.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 Returns : Distance value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 Args : Bio::Align::AlignI of DNA sequences
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 double - gap penalty
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 sub D_F84{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 return 0 unless $self->_check_arg($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 # Tajima and Nei, Mol. Biol. Evol. 1984, 1, 269.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 =head2 D_TajimaNei
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 Title : D_TajimaNei
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 Usage : my $d = $stat->D_TajimaNei($aln)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 Function: Calculates D (pairwise distance) between 2 sequences in an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 alignment using the TajimaNei 1984 distance model.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 Returns : Distance value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 Args : Bio::Align::AlignI of DNA sequences
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 sub D_TajimaNei{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 $self->warn("The result from this method is not correct right now");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 my (@seqs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 foreach my $seq ( $aln->each_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 push @seqs, [ split(//,uc $seq->seq())];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 my $seqct = scalar @seqs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 my @DVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 for(my $i = 1; $i <= $seqct; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 for( my $j = $i+1; $j <= $seqct; $j++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 my ($matrix,$pfreq,$gaps) = $self->_build_nt_matrix($seqs[$i-1],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 $seqs[$j-1]);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 my $fij2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 my $slen = $aln->length - $gaps;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 for( my $bs = 0; $bs < 4; $bs++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 my $fi = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 map {$fi += $matrix->[$bs]->[$_] } 0..3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 my $fj = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 map { $fj += $matrix->[$_]->[$bs] } 0..3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 my $fij = ( $fi && $fj ) ? ($fi + $fj) /( 2 * $slen) : 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 $fij2 += $fij**2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 my ($pair,$h) = (0,0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 for( my $bs = 0; $bs < 3; $bs++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 for( my $bs1 = $bs+1; $bs1 <= 3; $bs1++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 my $fij = $pfreq->[$pair++] / $slen;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 if( $fij ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 my ($ci1,$ci2,$cj1,$cj2) = (0,0,0,0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 map { $ci1 += $matrix->[$_]->[$bs] } 0..3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 map { $cj1 += $matrix->[$bs]->[$_] } 0..3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 map { $ci2 += $matrix->[$_]->[$bs1] } 0..3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 map { $cj2 += $matrix->[$bs1]->[$_] } 0..3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 $h += ( $fij*$fij / 2 ) /
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 ( ( ( $ci1 + $cj1 ) / 2 * $slen ) *
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 ( ( $ci2 + $cj2 ) /2 * $slen )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 $self->debug( "h is $h fij = $fij ci1 =$ci1 cj1=$cj1 ci2=$ci2 cj2=$cj2\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 # just want diagonals first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 my $m = ( $matrix->[0]->[0] + $matrix->[1]->[1] +
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 $matrix->[2]->[2] + $matrix->[3]->[3] );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 my $D = 1 - ( $m / $slen);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 my $b = (1-$fij2+(($D**2)/$h)) / 2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 $self->debug("h is $h fij2 is $fij2 b is $b\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 my $d = (-1 * $b) * log ( 1 - $D/ $b);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 $DVals[$i]->[$j] = $DVals[$j]->[$i] = $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 return \@DVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 # HKY -- HASEGAWA, M., H. KISHINO, and T. YANO. 1985
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 # Tamura and Nei 1993?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 # GTR?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 =head2 K - sequence substitution methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 =head2 K_JukesCantor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 Title : K_JukesCantor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 Usage : my $k = $stats->K_JukesCantor($aln)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 Function: Calculates K - the number of nucleotide substitutions between
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 2 seqs - according to the Jukes-Cantor 1 parameter model
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 This only involves the number of changes between two sequences.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451 Returns : double
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 Args : Bio::Align::AlignI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 sub K_JukesCantor{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 return 0 unless $self->_check_arg($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 my $seqct = $aln->no_sequences;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 my @KVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 for( my $i = 1; $i <= $seqct; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 for( my $j = $i+1; $j <= $seqct; $j++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 my $pairwise = $aln->select_noncont($i,$j);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 my $L = $self->pairwise_stats->number_of_comparable_bases($pairwise);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 my $N = $self->pairwise_stats->number_of_differences($pairwise);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 my $p = $N / $L;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468 my $K = - ( 3 / 4) * log ( 1 - (( 4 * $p) / 3 ));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 $KVals[$i]->[$j] = $KVals[$j]->[$i] = $K;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 return \@KVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 =head2 K_TajimaNei
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 Title : K_TajimaNei
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 Usage : my $k = $stats->K_TajimaNei($aln)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 Function: Calculates K - the number of nucleotide substitutions between
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 2 seqs - according to the Kimura 2 parameter model.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 This does not assume equal frequencies among all the nucleotides.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 Returns : ArrayRef of 2d matrix which contains pairwise K values for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 all sequences in the alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484 Args : Bio::Align::AlignI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 sub K_TajimaNei {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 return 0 unless $self->_check_arg($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 my @seqs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 foreach my $seq ( $aln->each_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494 push @seqs, [ split(//,uc $seq->seq())];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 my @KVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497 my $L = $self->pairwise_stats->number_of_comparable_bases($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 my $seqct = scalar @seqs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 for( my $i = 1; $i <= $seqct; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 for( my $j = $i+1; $j <= $seqct; $j++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 my (%q,%y);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 my ($first,$second) = ($seqs[$i-1],$seqs[$j-1]);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 for (my $k = 0;$k<$aln->length; $k++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 next if( $first->[$k] =~ /^$GapChars$/ ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 $second->[$k] =~ /^$GapChars$/);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 $q{$second->[$k]}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 $q{$first->[$k]}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 if( $first->[$k] ne $second->[$k] ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 $y{$first->[$k]}->{$second->[$k]}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 my $q_sum = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 foreach my $let ( @Nucleotides ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 # ct is the number of sequences compared (2)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 # L is the length of the alignment without gaps
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519 # $ct * $L = total number of nt compared
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 my $avg = $q{$let} / ( $SeqCount * $L );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521 $q_sum += $avg**2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 my $b1 = 1 - $q_sum;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 my $h = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 for( my $i = 0; $i <= 2; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 for( my $j = $i+1; $j <= 3; $j++) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 $y{$Nucleotides[$i]}->{$Nucleotides[$j]} ||= 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 $y{$Nucleotides[$j]}->{$Nucleotides[$i]} ||= 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 my $x = ($y{$Nucleotides[$i]}->{$Nucleotides[$j]} +
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 $y{$Nucleotides[$j]}->{$Nucleotides[$i]}) / $L;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531 $h += ($x ** 2) / ( 2 * $q{$Nucleotides[$i]} *
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 $q{$Nucleotides[$j]} );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535 my $N = $self->pairwise_stats->number_of_differences($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 my $p = $N / $L;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 my $b = ( $b1 + $p ** 2 / $h ) / 2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538 my $K = - $b * log ( 1 - $p / $b );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 $KVals[$i]->[$j] = $KVals[$j]->[$i] = $K;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542 return \@KVals;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547 =head2 transversions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549 Title : transversions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 Usage : my $transversions = $stats->transversion($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551 Function: Calculates the number of transversions between two sequences in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 an alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553 Returns : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 Args : Bio::Align::AlignI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 sub transversions{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561 return $self->_trans_count_helper($aln, $DNAChanges{'Transversions'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564 =head2 transitions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566 Title : transitions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567 Usage : my $transitions = Bio::Align::DNAStatistics->transitions($aln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568 Function: Calculates the number of transitions in a given DNA alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569 Returns : integer representing the number of transitions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570 Args : Bio::Align::AlignI object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575 sub transitions{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576 my ($self,$aln) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577 return $self->_trans_count_helper($aln, $DNAChanges{'Transitions'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
580
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
581 sub _trans_count_helper {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
582 my ($self,$aln,$type) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
583 return 0 unless( $self->_check_arg($aln) );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
584 if( ! $aln->is_flush ) { $self->throw("must be flush") }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
585 my (@seqs,@tcount);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
586 foreach my $seq ( $aln->get_seq_by_pos(1), $aln->get_seq_by_pos(2) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
587 push @seqs, [ split(//,$seq->seq())];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
588 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
589 my ($first,$second) = @seqs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
590
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
591 for (my $i = 0;$i<$aln->length; $i++ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
592 next if( $first->[$i] =~ /^$GapChars$/ ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
593 $second->[$i] =~ /^$GapChars$/);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
594 if( $first->[$i] ne $second->[$i] ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
595 foreach my $nt ( @{$type->{$first->[$i]}} ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
596 if( $nt eq $second->[$i]) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
597 $tcount[$i]++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
598 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
599 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
600 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
601 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
602 my $sum = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
603 map { if( $_) { $sum += $_} } @tcount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
604 return $sum;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
605 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
606
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
607 # this will generate a matrix which records across the row, the number
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
608 # of DNA subst
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
609 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
610 sub _build_nt_matrix {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
611 my ($self,$seqa,$seqb) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
612
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
613
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
614 my $basect_matrix = [ [ qw(0 0 0 0) ], # number of bases that match
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
615 [ qw(0 0 0 0) ],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
616 [ qw(0 0 0 0) ],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
617 [ qw(0 0 0 0) ] ];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
618 my $gaps = 0; # number of gaps
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
619 my $pfreq = [ qw( 0 0 0 0 0 0)]; # matrix for pair frequency
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
620
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
621 for( my $i = 0; $i < scalar @$seqa; $i++) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
622
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
623 my ($ti,$tj) = ($seqa->[$i],$seqb->[$i]);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
624 $ti =~ tr/U/T/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
625 $tj =~ tr/U/T/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
626
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
627 if( $ti =~ /^$GapChars$/) { $gaps++; next; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
628 if( $tj =~ /^$GapChars$/) { $gaps++; next }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
629
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
630 my $ti_index = $NucleotideIndexes{$ti};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
631 my $tj_index = $NucleotideIndexes{$tj};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
632
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
633 if( ! defined $ti_index ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
634 print "ti_index not defined for $ti\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
635 next;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
636 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
637
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
638 $basect_matrix->[$ti_index]->[$tj_index]++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
639
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
640 if( $ti ne $tj ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
641 $pfreq->[$NucleotideIndexes{join('',sort ($ti,$tj))}]++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
642 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
643 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
644 return ($basect_matrix,$pfreq,$gaps);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
645 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
646
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
647 sub _check_arg {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
648 my($self,$aln ) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
649 if( ! defined $aln || ! $aln->isa('Bio::Align::AlignI') ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
650 $self->warn("Must provide a Bio::Align::AlignI compliant object to Bio::Align::DNAStatistics");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
651 return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
652 } elsif( $aln->get_seq_by_pos(1)->alphabet ne 'dna' ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
653 $self->warn("Must provide a DNA alignment to Bio::Align::DNAStatistics, you provided a " . $aln->get_seq_by_pos(1)->alphabet);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
654 return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
655 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
656 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
657 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
658
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
659 =head2 Data Methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
660
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
661 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
662
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
663 =head2 pairwise_stats
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
664
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
665 Title : pairwise_stats
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
666 Usage : $obj->pairwise_stats($newval)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
667 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
668 Returns : value of pairwise_stats
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
669 Args : newvalue (optional)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
670
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
671
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
672 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
673
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
674 sub pairwise_stats{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
675 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
676 if( defined $value) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
677 $self->{'_pairwise_stats'} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
678 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
679 return $self->{'_pairwise_stats'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
680
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
681 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
682
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
683 1;