comparison egglib/egglib-2.1.5/include/egglib-cpp/NucleotideDiversity.hpp @ 1:420b57c3c185 draft

Uploaded
author dereeper
date Fri, 10 Jul 2015 04:39:30 -0400
parents
children
comparison
equal deleted inserted replaced
0:3e19d0dfcf3e 1:420b57c3c185
1 /*
2 Copyright 2008-2009 Stéphane De Mita, Mathieu Siol
3
4 This file is part of the EggLib library.
5
6 EggLib is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 EggLib is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with EggLib. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20
21 #ifndef EGGLIB_NUCLEOTIDEDIVERSITY_HPP
22 #define EGGLIB_NUCLEOTIDEDIVERSITY_HPP
23
24
25 #include "BaseDiversity.hpp"
26 #include <string>
27 #include <vector>
28
29
30
31 namespace egglib {
32
33
34 /** \brief Performs analyzes of population genetics
35 *
36 * \ingroup polymorphism
37 *
38 * This class computes several summary statistics based on
39 * nucleotide analysis. Note that it is possible to use the same
40 * object to analyze different data set. Calling the load() method
41 * erases all data preivously computed (if any). Calling the load()
42 * method is absolutely required to compute any statistics. Some
43 * statistics are not computed by default, but are if the
44 * corresponding accessor is used (only load() is required).
45 *
46 * Note that "unsecure" accessors don't perform out-of-bound checks.
47 *
48 * S is the number of varying sites (only in sites that were not
49 * rejected).
50 *
51 * eta is the minimum number of mutations, that is the sum of the
52 * number of alleles minus 1 for each varying site. eta = S if all
53 * sites have no variant or 2 alleles. eta is computed independently
54 * of the option multiple and IS NOT computed over lseff sites.
55 *
56 * Pi is the average number of pairwise differences between sequences
57 * (expressed here per site) or (as computed here) the mean per site
58 * (unbiased) heterozygosity. Pi is zero if no polymorphic sites.
59 *
60 * D is the Tajima's test of neutrality
61 * Ref. Tajima F.: Statistical method for testing the neutral
62 * mutation hypothesis by DNA polymorphism. Genetics 1989, 123:585-595.
63 * It is arbitrary set to 0 if no polymorphic sites.
64 *
65 * tW: thetaW: estimator of theta based on polymorphic sites (ref.
66 * e.g. Watterson 1975 Theor. Pop. Biol.).
67 * Both D and thetaW are computed assuming that rounded nseff samples
68 * have been sampled.
69 * The variance of D is computed using rounded nseff instead of ns.
70 *
71 * H is the Fay and Wu's test of neutrality.
72 * Z is the standardized version and E a similar test.
73 * Ref. Fay J. C., Wu C.-I.: Hitchhiking under positive Darwinian
74 * selection. Genetics 2000, 155:1405-1413. and Zeng K., Fu Y. X.,
75 * Shi S., Wu C.-I.: Statistical tests for detecting positive
76 * selection by utilizing high-frequency variants. Genetics 2006,
77 * 174:1431-9. Both are arbitrary set to 0 if no polymorphic or
78 * orientable sites.
79 *
80 * tH and tL: theta H: estimators of theta based on derived
81 * polymorphic sites (ref in Fay and Wu and Zeng al.). The variance
82 * of H/Z are computed assuming that rounded nseff samples have
83 * been sampled.
84 *
85 */
86 class NucleotideDiversity : public BaseDiversity {
87
88 public:
89
90 /** \brief Builds an object
91 *
92 */
93 NucleotideDiversity();
94
95
96 /** \brief Destroys an object
97 *
98 */
99 virtual ~NucleotideDiversity();
100
101
102 /** \brief Identifies polymorphic sites and computes basis
103 * statistics
104 *
105 * \param data an alignment object (subclass of CharMatrix).
106 * The presence of outgroup or of different populations will
107 * be detected based on the populationLabel members of the
108 * passed object. The populationLabel 999 will be interpreted
109 * as outgroups. If several outgroups are passed, sites were
110 * the outgroups are not consistent will be treated as "non-
111 * orientable".
112 *
113 * \param allowMultipleMutations if true, sites with more
114 * than two alleles will not be ignored. The sum of the
115 * frequencies of all alleles not matching the outgroup will
116 * treated as the derived allele frequency (for orientable
117 * sites).
118 *
119 * \param minimumExploitableData sites where the non-missing
120 * data (as defined by characterMapping) are at a frequency
121 * larger than this value will be removed from the analysis.
122 * Use 1. to take only 'complete' sites into account and 0.
123 * to use all sites. (The outgroup is not considered in this
124 * computation.)
125 *
126 * \param ignoreFrequency removes sites that are polymorph
127 * because of an allele at absolute frequency smaller than or
128 * equal to this value. If ignoreFrequency=1, no sites are
129 * removed, if ignoreFrequency=0, singleton sites are
130 * ignored. Such sites are completely removed from the
131 * analysis (not counted in lseff). Note that if more than
132 * one mutation is allowed, the site is removed only if all
133 * the alleles but one are smaller than or equal to this
134 * value. For example, an alignment column AAAAAAGAAT is
135 * ignored with an ignoreFrequency of 1, but AAAAAAGGAT is
136 * conserved (including the third allele T which is a
137 * singleton).
138 *
139 * \param characterMapping a string giving the list of
140 * characters that should be considered as valid data. If a
141 * space is present in the string, the characters left of the
142 * space will be treated as valid data and the characters
143 * right of the space will be treated as missing data, that
144 * is tolerated but ignored. All characters not in the string
145 * will cause an EggInvalidCharacterError to be raised.
146 *
147 * \param useZeroAsAncestral if true, all outgroups (if
148 * present) will be ignored and the character "0" will be
149 * considered as ancestral for all sites, whatever the
150 * character mapping.
151 *
152 */
153 virtual void load(
154 CharMatrix& data,
155 bool allowMultipleMutations=false,
156 double minimumExploitableData=1.,
157 unsigned int ignoreFrequency=0,
158 std::string characterMapping=dnaMapping,
159 bool useZeroAsAncestral=false
160 );
161
162
163 // accessors for the "site analysis" section
164
165 /// Number of polymorphic sites
166 unsigned int S() const;
167
168 /// Number of polymorphic orientable sites
169 unsigned int So() const;
170
171 /// Minimum number of mutations
172 unsigned int eta() const;
173
174 /// Average of per-site number of sequences effectively used
175 double nseff() const;
176
177 /// Number of sites effectively used
178 unsigned int lseff() const;
179
180 /// Average of number of sequences effectively used at orientable sites
181 double nseffo() const;
182
183 /// Number of orientable sites
184 unsigned int lseffo() const;
185
186 /// Number of detected populations
187 unsigned int npop() const;
188
189 /// Label of the population with given index (unsecure)
190 unsigned int popLabel(unsigned int popIndex) const; // no check!
191
192
193 // accessors for the "diversity" section
194
195 /// Nucleotide diversity
196 double Pi();
197
198 /// Watterson estimator of theta
199 double thetaW();
200
201 /// Average of Pi over populations
202 double average_Pi();
203
204 /// Pi of a given population (unsecure)
205 double pop_Pi(unsigned int popIndex); // no check!
206
207 /// Tajima's D
208 double D();
209
210 // accessors for the "outgroup diversity" section
211
212 /// Fay and Wu estimator of theta
213 double thetaH();
214
215 /// Zeng et al. estimator of theta
216 double thetaL();
217
218 /// Fay and Wu's H
219 double H();
220
221 /// Standardized H
222 double Z();
223
224 /// Zeng et al.'s E
225 double E();
226
227 // accessors for the "differentiation" section
228
229 /// Number of sites with at least one fixed difference
230 unsigned int FixedDifferences();
231
232 /// Number of sites with at least one allele shared among at least two populations
233 unsigned int CommonAlleles();
234
235 /// Number of sites with at least one non-fixed allele shared among at least two populations
236 unsigned int SharedAlleles();
237
238 /// Number of sites with at least one allele specific to one population
239 unsigned int SpecificAlleles();
240
241 /// Number of sites with at least one derived allele specific to one population
242 unsigned int SpecificDerivedAlleles();
243
244 /// Number of polymorphisms in a given population (unsecure)
245 unsigned int Polymorphisms(unsigned int pop);
246
247 /// Number of specific alleles for a given population (unsecure)
248 unsigned int SpecificAlleles(unsigned int pop);
249
250 /// Number of specific derived allele for a given population (unsecure)
251 unsigned int SpecificDerivedAlleles(unsigned int pop);
252
253 /// Number of fixed differences between a given pair of populations (unsecure; pop2 must be larger than pop1)
254 unsigned int FixedDifferences(unsigned int pop1, unsigned int pop2);
255
256 /// Number of common alleles between a given pair of populations (unsecure; pop2 must be larger than pop1)
257 unsigned int CommonAlleles(unsigned int pop1, unsigned int pop2);
258
259 /// Number of shared non-fixed alleles between a given pair of populations (unsecure; pop2 must be larger than pop1)
260 unsigned int SharedAlleles(unsigned int pop1, unsigned int pop2);
261
262
263 // accessor for the "triConfigurations" section
264
265 /** \brief Number falling into one of the possible site configurations
266 *
267 * The statistics are limited to three populations.
268 * Assuming an unrooted A/G polymorphism (A and G can be
269 * substitued), the site configurations are:
270 * - 0: A&G A A specific 1
271 * - 1: A&G A G specific 1 + fixed 2-3
272 * - 2: A A&G A specific 2
273 * - 3: A A&G G specific 2 + fixed 1-3
274 * - 4: A A A&G specific 3
275 * - 5: A G A&G specific 3 + fixed 1-2
276 * - 6: A&G A&G A shared 1-2
277 * - 7: A&G A A&G shared 1-3
278 * - 8: A A&G A&G shared 2-3
279 * - 9: A&G A&G A&G shared 1-2-3
280 * - 10: A G G fixed 1
281 * - 11: A G A fixed 2
282 * - 12: A A G fixed 3
283 *
284 * \param index must be an index from 0 to 12.
285 *
286 */
287 unsigned int triConfiguration(unsigned int index);
288
289
290 /// Builds and returns the vector of positions of all polymorphic sites
291 std::vector<unsigned int> polymorphic_positions() const;
292
293
294 /** \brief Builds and returns the vector of positions of all singleton sites
295 *
296 * A site singleton when it is polymorphic according to
297 * parameter of the diversity analysis, when it has exactly two
298 * alleles and one of them is at absolute frequency 1 (one
299 * copy) disregarding the outgroup.
300 *
301 */
302 std::vector<unsigned int> singleton_positions() const;
303
304
305 protected:
306
307 /** \brief This class cannot be copied
308 *
309 */
310 NucleotideDiversity(const NucleotideDiversity& source) { }
311
312
313 /** \brief This class cannot be copied
314 *
315 */
316 NucleotideDiversity& operator=(const NucleotideDiversity& source) { return *this; }
317
318
319 void init(); // initializes values
320 void clear(); // free memory but doesn't initializes
321
322 // diversity (without outgroup)
323 void diversity();
324
325 // diversity with outgroup
326 void outgroupDiversity();
327
328 // site patterns
329 void differentiation();
330
331 // triconfigurations
332 void triConfigurations();
333
334
335 // holders for statistics, with booleans flagging groups of stats
336
337 bool b_analysisSites;
338
339 bool b_diversity;
340
341 double v_Pi; // nucleotide diversity
342 double v_thetaW; // theta (Watterson estimator)
343 double v_average_Pi; // average diversity across populations
344 double *v_pop_Pi; // diversity per population
345 double v_D; // Tajima's D
346
347 bool b_outgroupDiversity;
348
349 double v_thetaH; // theta (Fay and Wu estimator)
350 double v_thetaL; // theta (Zeng estimator)
351 double v_H; // Fay and Wu's H
352 double v_Z; // normalized Fay and Wu's H
353 double v_E; // Zeng et al.'s E
354
355 bool b_differentiation;
356
357 unsigned int *v_pairwiseFixedDifferences;
358 unsigned int *v_pairwiseCommonAlleles;
359 unsigned int *v_pairwiseSharedAlleles;
360 unsigned int *v_popPolymorphic;
361 unsigned int *v_popSpecific;
362 unsigned int *v_popSpecificDerived;
363 unsigned int v_countFixedDifferences;
364 unsigned int v_countCommonAlleles;
365 unsigned int v_countSharedAlleles;
366 unsigned int v_countSpecificAlleles;
367 unsigned int v_countSpecificDerivedAlleles;
368
369
370 bool b_triConfigurations;
371
372 unsigned int *v_triConfigurations;
373
374 };
375 }
376
377 #endif