forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
VariantIndicatorImplementation.hpp
1 //
2 // VariantIndicatorImplementation.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 _VARIANTINDICATORIMPLEMENTATION_HPP_
37 #define _VARIANTINDICATORIMPLEMENTATION_HPP_
38 
39 
40 #include "VariantIndicator.hpp"
41 #include "Random.hpp"
42 #include "Reporter.hpp"
43 
44 
50 
51 
52 //
53 // VariantIndicator_Trivial
54 //
55 
63 
64 class VariantIndicator_Trivial : public VariantIndicator
65 {
66  public:
67 
68  VariantIndicator_Trivial(const std::string& id) : Configurable(id) {}
69 
70  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const {return 0;}
71 
72  // Configurable interface
73 
74  virtual std::string class_name() const {return "VariantIndicator_Trivial";}
75  virtual Parameters parameters() const {return Parameters();}
76  virtual void configure(const Parameters& parameters, const Registry& registry) {}
77 };
78 
79 
80 //
81 // VariantIndicator_IDRange
82 //
83 
95 
96 class VariantIndicator_IDRange : public VariantIndicator
97 {
98  public:
99 
100  VariantIndicator_IDRange(const std::string& id) : Configurable(id) {}
101 
102  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
103 
104  // Configurable interface
105 
106  virtual std::string class_name() const {return "VariantIndicator_IDRange";}
107  virtual Parameters parameters() const;
108  virtual void configure(const Parameters& parameters, const Registry& registry);
109  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
110 
111  protected:
112 
113  struct Entry
114  {
115  unsigned int id_start;
116  unsigned int id_count;
117  unsigned int id_step;
118  unsigned int value;
119 
120  Entry(unsigned int _id_start, unsigned int _id_count, unsigned int _id_step, unsigned int _value)
121  : id_start(_id_start), id_count(_id_count), id_step(_id_step), value(_value)
122  {}
123  };
124 
125  typedef std::multimap<Locus,Entry> EntryMap;
126  EntryMap entries_;
127 };
128 
129 
130 //
131 // VariantIndicator_IDSet
132 //
133 
145 
146 class VariantIndicator_IDSet : public VariantIndicator
147 {
148  public:
149 
150  VariantIndicator_IDSet(const std::string& id) : Configurable(id) {}
151  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
152  virtual void write_file(const std::string& filename) const;
153 
154  // Configurable interface
155 
156  virtual std::string class_name() const {return "VariantIndicator_IDSet";}
157  virtual Parameters parameters() const;
158  virtual void configure(const Parameters& parameters, const Registry& registry);
159  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
160 
161  struct Entry
162  {
163  unsigned int value;
164  std::set<unsigned int> ids;
165 
166  Entry(unsigned int _value = -1ul, std::set<unsigned int> _ids = std::set<unsigned int>())
167  : value(_value), ids(_ids)
168  {}
169  };
170 
171  typedef std::map<Locus,Entry> EntryMap;
172 
173  const EntryMap& entries() const {return entries_;} // for testing
174 
175  protected:
176 
177  EntryMap entries_;
178 };
179 
180 
181 //
182 // VariantIndicator_Random
183 //
184 
201 
203 {
204  public:
205 
206  VariantIndicator_Random(const std::string& id) : Configurable(id), VariantIndicator_IDSet(id) {}
207 
208  // Configurable interface
209 
210  virtual std::string class_name() const {return "VariantIndicator_Random";}
211  virtual Parameters parameters() const;
212  virtual void configure(const Parameters& parameters, const Registry& registry);
213  virtual void initialize(const SimulatorConfig& simconfig);
214  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
215 
216  private:
217 
218  struct LocusListInfo
219  {
220  size_t population_index;
221  LocusListPtr locus_list;
222  std::vector<double> frequencies;
223  Random::DistributionPtr distribution;
224 
225  LocusListInfo(size_t _population_index, const LocusListPtr& _locus_list,
226  std::vector<double> _frequencies)
227  : population_index(_population_index), locus_list(_locus_list), frequencies(_frequencies)
228  {}
229 
230  LocusListInfo(size_t _population_index, const LocusListPtr& _locus_list,
231  Random::DistributionPtr _distribution)
232  : population_index(_population_index), locus_list(_locus_list), distribution(_distribution)
233  {}
234  };
235 
236  typedef std::vector<LocusListInfo> LocusListInfos;
237  LocusListInfos locus_list_infos_;
238 };
239 
240 
241 //
242 // VariantIndicator_File
243 //
244 
260 
261 class VariantIndicator_File : public VariantIndicator
262 {
263  public:
264 
265  VariantIndicator_File(const std::string& id) : Configurable(id) {}
266 
267  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
268 
269  // Configurable interface
270 
271  virtual std::string class_name() const {return "VariantIndicator_File";}
272  virtual Parameters parameters() const;
273  virtual void configure(const Parameters& parameters, const Registry& registry);
274  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
275 
276  private:
277 
278  std::string msfile_;
279  MSFormatPtr ms_;
280  std::vector<Locus> loci_;
281  std::map<Locus, size_t> locus_index_map_;
282 };
283 
284 
285 //
286 // VariantIndicator_SingleLocusHardyWeinberg
287 //
288 
309 
311 {
312  public:
313 
314  VariantIndicator_SingleLocusHardyWeinberg(const std::string& id,
315  Locus locus = Locus("id_dummy"),
316  double allele_frequency = 0);
317  // Configurable interface
318 
319  virtual std::string class_name() const {return "VariantIndicator_SingleLocusHardyWeinberg";}
320  virtual Parameters parameters() const;
321  virtual void configure(const Parameters& parameters, const Registry& registry);
322  virtual void initialize(const SimulatorConfig& simconfig);
323  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
324 
325  private:
326 
327  Locus locus_;
328  double allele_frequency_;
329 };
330 
331 
332 //
333 // VariantIndicator_TwoLocusLD
334 //
335 
356 
357 class VariantIndicator_TwoLocusLD : public VariantIndicator
358 {
359  public:
360 
361  VariantIndicator_TwoLocusLD(const std::string& id,
362  size_t population_size = 0,
363  Locus locus_1 = Locus("id_dummy_1"),
364  double allele_frequency_1 = 0,
365  Locus locus_2 = Locus("id_dummy_2"),
366  double allele_frequency_2 = 0,
367  double D = 0,
368  unsigned int id_offset_step = 0);
369 
370  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
371 
372  // Configurable interface
373 
374  virtual std::string class_name() const {return "VariantIndicator_TwoLocusLD";}
375  virtual Parameters parameters() const;
376  virtual void configure(const Parameters& parameters, const Registry& registry);
377  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
378 
379  private:
380 
381  size_t population_size_;
382  Locus locus_1_;
383  double allele_frequency_1_;
384  Locus locus_2_;
385  double allele_frequency_2_;
386  double D_;
387  unsigned int id_offset_step_;
388 
389  size_t max_00_;
390  size_t max_01_;
391  size_t max_10_;
392  size_t max_11_;
393 
394  void initialize();
395 };
396 
397 
398 //
399 // VariantIndicator_Mutable
400 //
401 
402 //
403 // wrapper implementation for handling mutation
404 //
405 
406 class VariantIndicator_Mutable : public VariantIndicator, public Reporter
407 {
408  public:
409 
410  VariantIndicator_Mutable(const std::string& id,
411  unsigned int unused_id_start = 0,
412  VariantIndicatorPtr vi = VariantIndicatorPtr(),
413  const std::string& output_directory = "");
414 
415  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
416 
417  virtual unsigned int mutate(unsigned int old_chunk_id, const Locus& locus, unsigned int value);
418 
419  void report(std::ostream& os) const;
420 
421  // Configurable interface
422 
423  virtual std::string class_name() const {return "VariantIndicator_Mutable";}
424  virtual Parameters parameters() const;
425  virtual void configure(const Parameters& parameters, const Registry& registry);
426  virtual void initialize(const SimulatorConfig& simconfig);
427  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
428 
429  // Reporter interface
430 
431  virtual void update(size_t generation_index,
432  const PopulationPtrs& populations,
433  const PopulationDatas& population_datas,
434  bool is_final_generation);
435 
436  virtual Loci loci(size_t generation_index,
437  bool is_final_generation) const;
438 
439  private:
440 
441  unsigned int unused_id_start_;
442  unsigned int unused_id_current_;
443  VariantIndicatorPtr vi_;
444  bfs::path outdir_;
445  bfs::ofstream os_debug_;
446 
447  typedef std::map<unsigned int, unsigned int> IDAncestry;
448  IDAncestry id_ancestry_;
449 
450  typedef std::map<unsigned int, unsigned int> IDValueMap;
451  typedef std::map<Locus, IDValueMap> IDValueMaps;
452  IDValueMaps id_value_maps_;
453 };
454 
455 
456 #endif // _VARIANTINDICATORIMPLEMENTATION_HPP_
457 
458