forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
QuantitativeTrait.hpp
1 //
2 // QuantitativeTrait.hpp
3 //
4 // Created by Darren Kessner with John Novembre
5 //
6 // Copyright (c) 2013 Regents of the University of California
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // * Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // * Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // * Neither UCLA nor the names of its contributors may be used to endorse or
20 // promote products derived from this software without specific prior
21 // written permission.
22 //
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
27 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 //
34 
35 
36 #ifndef _QUANTITATIVETRAIT_HPP_
37 #define _QUANTITATIVETRAIT_HPP_
38 
39 
40 #include "Genotype.hpp"
41 #include "DataVector.hpp"
42 #include "Random.hpp"
43 #include "shared_ptr.hpp"
44 
45 
52 
53 
54 //
55 // QuantitativeTrait
56 //
57 
61 
63 {
64  public:
65 
66  // return set of loci (the QTLs contributing to the trait)
67  const Loci& loci() const {return loci_;}
68 
69  // calculate trait values for a single population using genotypes
70  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
71  size_t generation_index,
72  size_t population_index) const = 0;
73  virtual ~QuantitativeTrait() {}
74 
75  // Configurable interface
76 
77  virtual std::string class_name() const;
78  virtual Parameters parameters() const;
79  virtual void configure(const Parameters& parameters, const Registry& registry);
80 
81  protected:
82 
83  QuantitativeTrait(const std::string& id) : Configurable(id) {}
84 
85  Loci loci_;
86 };
87 
88 
89 typedef shared_ptr<QuantitativeTrait> QuantitativeTraitPtr;
90 typedef std::vector<QuantitativeTraitPtr> QuantitativeTraitPtrs;
91 
92 
93 class TraitValueMap : public std::map<std::string, DataVectorPtr> // map QT id -> trait_values
94 {
95  public:
96 
97  DataVectorPtr get(const std::string& qtid) const
98  {
99  if (!count(qtid))
100  throw std::runtime_error(("[TraitValueMap] Quantitative trait id " + qtid + " not found.").c_str());
101  return at(qtid);
102  }
103 };
104 
105 
106 typedef shared_ptr<TraitValueMap> TraitValueMapPtr;
107 
108 
109 //
110 // QuantitativeTrait_PopulationComposite
111 //
112 
122 
123 
125 {
126  public:
127 
128  QuantitativeTrait_PopulationComposite(const std::string& id,
129  const QuantitativeTraitPtrs& qts = QuantitativeTraitPtrs());
130 
131  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
132  size_t generation_index,
133  size_t population_index) const;
134  // Configurable interface
135 
136  virtual std::string class_name() const {return "QuantitativeTrait_PopulationComposite";}
137  virtual Parameters parameters() const;
138  virtual void configure(const Parameters& parameters, const Registry& registry);
139  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
140 
141  private:
142 
143  QuantitativeTraitPtrs qts_;
144 };
145 
146 
147 //
148 // QuantitativeTrait_GenerationComposite
149 //
150 
160 
161 
163 {
164  public:
165 
166  typedef std::map<size_t, QuantitativeTraitPtr> GenerationQTMap;
167 
168  QuantitativeTrait_GenerationComposite(const std::string& id,
169  const GenerationQTMap& qts = GenerationQTMap());
170 
171  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
172  size_t generation_index,
173  size_t population_index) const;
174  // Configurable interface
175 
176  virtual std::string class_name() const {return "QuantitativeTrait_GenerationComposite";}
177  virtual Parameters parameters() const;
178  virtual void configure(const Parameters& parameters, const Registry& registry);
179  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
180 
181  private:
182 
183  GenerationQTMap qts_; // generation_index -> QT
184 };
185 
186 
187 //
188 // QuantitativeTrait_SingleLocusFitness
189 //
190 
205 
207 {
208  public:
209 
210  QuantitativeTrait_SingleLocusFitness(const std::string& id,
211  Locus locus = Locus("id_dummy"),
212  std::vector<double> w = std::vector<double>(3));
213 
214  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
215  size_t generation_index,
216  size_t population_index) const;
217  // Configurable interface
218 
219  virtual std::string class_name() const {return "QuantitativeTrait_SingleLocusFitness";}
220  virtual Parameters parameters() const;
221  virtual void configure(const Parameters& parameters, const Registry& registry);
222  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
223 
224  private:
225 
226  Locus locus_;
227  std::vector<double> w_; // relative fitnesses
228 };
229 
230 
231 //
232 // QTLEffect
233 //
234 
235 
236 struct QTLEffect
237 {
238  Locus locus;
239  std::vector<double> effects;
240 
241  QTLEffect();
242  QTLEffect(const Locus& l, double e0, double e1, double e2);
243  QTLEffect(const std::string& configuration, const Configurable::Registry& registry);
244  std::string configuration() const;
245 };
246 
247 
248 typedef std::vector<QTLEffect> QTLEffects;
249 
250 
251 //
252 // QTLEffectGenerator
253 //
254 
269 
271 {
272  public:
273 
274  QTLEffectGenerator(const std::string& id,
275  LocusListPtr locus_list = LocusListPtr(),
276  Random::DistributionPtr effect_size_distribution = Random::DistributionPtr(),
277  Random::DistributionPtr dominance_distribution = Random::DistributionPtr());
278 
279  void generate_qtl_effects(QTLEffects& qtl_effects) const;
280 
281  // Configurable interface
282 
283  virtual std::string class_name() const {return "QTLEffectGenerator";}
284  virtual Parameters parameters() const;
285  virtual void configure(const Parameters& parameters, const Registry& registry);
286  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
287 
288  private:
289 
290  LocusListPtr locus_list_;
291  Random::DistributionPtr effect_size_distribution_;
292  Random::DistributionPtr dominance_distribution_;
293 };
294 
295 
296 typedef shared_ptr<QTLEffectGenerator> QTLEffectGeneratorPtr;
297 
298 
299 //
300 // QuantitativeTrait_IndependentLoci
301 //
302 
316 
318 {
319  public:
320 
321  QuantitativeTrait_IndependentLoci(const std::string& id,
322  QTLEffects qtl_effects = QTLEffects(),
323  double environmental_variance = 0);
324 
325  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
326  size_t generation_index,
327  size_t population_index) const;
328 
329  const QTLEffects& qtl_effects() const {return qtl_effects_;}
330 
331  // Configurable interface
332 
333  virtual std::string class_name() const {return "QuantitativeTrait_IndependentLoci";}
334  virtual Parameters parameters() const;
335  virtual void configure(const Parameters& parameters, const Registry& registry);
336  virtual void initialize(const SimulatorConfig& config);
337  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
338 
339  private:
340 
341  QTLEffects qtl_effects_;
342  size_t qtl_effects_specified_;
343  double environmental_variance_;
344  Random::DistributionPtr environment_effect_;
345  std::vector<QTLEffectGeneratorPtr> qtl_effect_generators_;
346 };
347 
348 
349 #endif // _QUANTITATIVETRAIT_HPP_
350