forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
QuantitativeTraitImplementation.hpp
1 //
2 // QuantitativeTraitImplementation.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 _QUANTITATIVETRAITIMPLEMENTATION_HPP_
37 #define _QUANTITATIVETRAITIMPLEMENTATION_HPP_
38 
39 
40 #include "QuantitativeTrait.hpp"
41 #include "Random.hpp"
42 
43 
50 
51 
52 //
53 // QuantitativeTrait_PopulationComposite
54 //
55 
65 
66 
67 class QuantitativeTrait_PopulationComposite : public QuantitativeTrait
68 {
69  public:
70 
71  QuantitativeTrait_PopulationComposite(const std::string& id,
72  const QuantitativeTraitPtrs& qts = QuantitativeTraitPtrs());
73 
74  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
75  size_t generation_index,
76  size_t population_index) const;
77  // Configurable interface
78 
79  virtual std::string class_name() const {return "QuantitativeTrait_PopulationComposite";}
80  virtual Parameters parameters() const;
81  virtual void configure(const Parameters& parameters, const Registry& registry);
82  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
83 
84  private:
85 
86  QuantitativeTraitPtrs qts_;
87 };
88 
89 
90 //
91 // QuantitativeTrait_GenerationComposite
92 //
93 
103 
104 
105 class QuantitativeTrait_GenerationComposite : public QuantitativeTrait
106 {
107  public:
108 
109  typedef std::map<size_t, QuantitativeTraitPtr> GenerationQTMap;
110 
111  QuantitativeTrait_GenerationComposite(const std::string& id,
112  const GenerationQTMap& qts = GenerationQTMap());
113 
114  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
115  size_t generation_index,
116  size_t population_index) const;
117  // Configurable interface
118 
119  virtual std::string class_name() const {return "QuantitativeTrait_GenerationComposite";}
120  virtual Parameters parameters() const;
121  virtual void configure(const Parameters& parameters, const Registry& registry);
122  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
123 
124  private:
125 
126  GenerationQTMap qts_; // generation_index -> QT
127 };
128 
129 
130 //
131 // QuantitativeTrait_SingleLocusFitness
132 //
133 
148 
149 class QuantitativeTrait_SingleLocusFitness : public QuantitativeTrait
150 {
151  public:
152 
153  QuantitativeTrait_SingleLocusFitness(const std::string& id,
154  Locus locus = Locus("id_dummy"),
155  std::vector<double> w = std::vector<double>(3));
156 
157  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
158  size_t generation_index,
159  size_t population_index) const;
160  // Configurable interface
161 
162  virtual std::string class_name() const {return "QuantitativeTrait_SingleLocusFitness";}
163  virtual Parameters parameters() const;
164  virtual void configure(const Parameters& parameters, const Registry& registry);
165  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
166 
167  private:
168 
169  Locus locus_;
170  std::vector<double> w_; // relative fitnesses
171 };
172 
173 
174 //
175 // QTLEffect
176 //
177 
178 
179 struct QTLEffect
180 {
181  Locus locus;
182  std::vector<double> effects;
183 
184  QTLEffect();
185  QTLEffect(const Locus& l, double e0, double e1, double e2);
186  QTLEffect(const std::string& configuration, const Configurable::Registry& registry);
187  std::string configuration() const;
188 };
189 
190 
191 typedef std::vector<QTLEffect> QTLEffects;
192 
193 
194 //
195 // QTLEffectGenerator
196 //
197 
212 
214 {
215  public:
216 
217  QTLEffectGenerator(const std::string& id,
218  LocusListPtr locus_list = LocusListPtr(),
219  Random::DistributionPtr effect_size_distribution = Random::DistributionPtr(),
220  Random::DistributionPtr dominance_distribution = Random::DistributionPtr(),
221  bool random_effect_sign = false);
222 
223  void generate_qtl_effects(QTLEffects& qtl_effects) const;
224 
225  // Configurable interface
226 
227  virtual std::string class_name() const {return "QTLEffectGenerator";}
228  virtual Parameters parameters() const;
229  virtual void configure(const Parameters& parameters, const Registry& registry);
230  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
231 
232  private:
233 
234  LocusListPtr locus_list_;
235  Random::DistributionPtr effect_size_distribution_;
236  Random::DistributionPtr dominance_distribution_;
237  bool random_effect_sign_;
238 };
239 
240 
241 typedef shared_ptr<QTLEffectGenerator> QTLEffectGeneratorPtr;
242 
243 
244 //
245 // QuantitativeTrait_IndependentLoci
246 //
247 
261 
262 class QuantitativeTrait_IndependentLoci : public QuantitativeTrait
263 {
264  public:
265 
266  QuantitativeTrait_IndependentLoci(const std::string& id,
267  QTLEffects qtl_effects = QTLEffects(),
268  double environmental_variance = 0);
269 
270  virtual DataVectorPtr calculate_trait_values(const GenotypeMap& genotypes,
271  size_t generation_index,
272  size_t population_index) const;
273 
274  const QTLEffects& qtl_effects() const {return qtl_effects_;}
275 
276  // Configurable interface
277 
278  virtual std::string class_name() const {return "QuantitativeTrait_IndependentLoci";}
279  virtual Parameters parameters() const;
280  virtual void configure(const Parameters& parameters, const Registry& registry);
281  virtual void initialize(const SimulatorConfig& config);
282  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
283 
284  private:
285 
286  QTLEffects qtl_effects_;
287  size_t qtl_effects_specified_;
288  double environmental_variance_;
289  Random::DistributionPtr environment_effect_;
290  std::vector<QTLEffectGeneratorPtr> qtl_effect_generators_;
291 };
292 
293 
294 #endif // _QUANTITATIVETRAITIMPLEMENTATION_HPP_
295