forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
ReporterImplementation.hpp
1 //
2 // ReporterImplementation.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 _REPORTERIMPLEMENTATION_HPP_
37 #define _REPORTER_IMPLEMENTATIONHPP_
38 
39 
40 #include "Reporter.hpp"
41 #include "Simulator.hpp"
42 #include "boost/filesystem.hpp"
43 #include "boost/filesystem/fstream.hpp"
44 #include <ctime>
45 
46 
47 namespace bfs = boost::filesystem;
48 
49 
58 
59 
60 //
61 // Reporter_Timer
62 //
63 
73 
74 class Reporter_Timer : public Reporter
75 {
76  public:
77 
78  Reporter_Timer(const std::string& id);
79 
80  const std::vector<double>& times() {return times_;}
81  double mean_generation_time() const;
82 
83  virtual void update(size_t generation_index,
84  const PopulationPtrs& populations,
85  const PopulationDatas& population_datas,
86  bool is_final_generation);
87 
88  // Configurable interface
89 
90  virtual std::string class_name() const {return "Reporter_Timer";}
91  virtual Parameters parameters() const;
92  virtual void configure(const Parameters& parameters, const Registry& registry);
93 
94  private:
95 
96  std::clock_t begin_;
97  std::vector<double> times_;
98 };
99 
100 
101 
102 //
103 // Reporter_Population
104 //
105 
117 
118 class Reporter_Population : public Reporter
119 {
120  public:
121 
122  Reporter_Population(const std::string& id);
123 
124  virtual void update(size_t generation_index,
125  const PopulationPtrs& populations,
126  const PopulationDatas& population_datas,
127  bool is_final_generation);
128 
129  // Configurable interface
130 
131  virtual std::string class_name() const {return "Reporter_Population";}
132  virtual Parameters parameters() const;
133  virtual void configure(const Parameters& parameters, const Registry& registry);
134 
135  private:
136 
137  size_t update_step_;
138 };
139 
140 
141 //
142 // Reporter_AlleleFrequencies
143 //
144 
163 
164 class Reporter_AlleleFrequencies : public Reporter
165 {
166  // note: this handles binary SNPs only (0/1 values)
167 
168  public:
169 
170  Reporter_AlleleFrequencies(const std::string& id) : Configurable(id) {}
171 
172  virtual void update(size_t generation_index,
173  const PopulationPtrs& populations,
174  const PopulationDatas& population_datas,
175  bool is_final_generation);
176 
177  virtual Loci loci(size_t generation_index,
178  bool is_final_generation) const {return loci_;}
179 
180  // Configurable interface
181 
182  virtual std::string class_name() const {return "Reporter_AlleleFrequencies";}
183  virtual Parameters parameters() const;
184  virtual void configure(const Parameters& parameters, const Registry& registry);
185  virtual void initialize(const SimulatorConfig& config);
186  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
187 
188  private:
189 
190  Loci loci_;
191 
192  Loci loci_specified_;
193  LocusListPtrs locus_lists_specified_;
194  QuantitativeTraitPtrs qts_specified_;
195 
196  typedef shared_ptr<std::ostream> OstreamPtr;
197  typedef std::map<Locus, OstreamPtr> OstreamMap;
198  OstreamMap os_map_;
199 
200  std::string generate_filename(const Locus& locus) const;
201  void open_streams();
202 };
203 
204 
205 //
206 // Reporter_LD
207 //
208 
221 
222 class Reporter_LD : public Reporter
223 {
224  // note: this handles binary SNPs only (0/1 values)
225 
226  public:
227 
228  Reporter_LD(const std::string& id,
229  Locus locus_1 = Locus("id_dummy_1"),
230  Locus locus_2 = Locus("id_dummy_2"));
231 
232  virtual void update(size_t generation_index,
233  const PopulationPtrs& populations,
234  const PopulationDatas& population_datas,
235  bool is_final_generation);
236 
237  virtual Loci loci(size_t generation_index,
238  bool is_final_generation) const;
239 
240  // Configurable interface
241 
242  virtual std::string class_name() const {return "Reporter_LD";}
243  virtual Parameters parameters() const;
244  virtual void configure(const Parameters& parameters, const Registry& registry);
245  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
246 
247  private:
248 
249  Locus locus_1_;
250  Locus locus_2_;
251 
252  bfs::ofstream os_;
253 
254  void open_streams();
255 };
256 
257 
258 //
259 // Reporter_TraitValues
260 //
261 
275 
276 class Reporter_TraitValues : public Reporter
277 {
278  public:
279 
280  Reporter_TraitValues(const std::string& id,
281  const std::string& qtid = "");
282 
283  virtual void update(size_t generation_index,
284  const PopulationPtrs& populations,
285  const PopulationDatas& population_datas,
286  bool is_final_generation);
287 
288  // Configurable interface
289 
290  virtual std::string class_name() const {return "Reporter_TraitValues";}
291  virtual Parameters parameters() const;
292  virtual void configure(const Parameters& parameters, const Registry& registry);
293 
294  private:
295 
296  std::string qtid_;
297  bool write_full_;
298  bfs::ofstream os_mean_;
299 
300  void open_streams();
301 };
302 
303 
304 //
305 // Reporter_MeanFitnesses
306 //
307 
317 
318 class Reporter_MeanFitnesses : public Reporter
319 {
320  public:
321 
322  Reporter_MeanFitnesses(const std::string& id);
323 
324  virtual void update(size_t generation_index,
325  const PopulationPtrs& populations,
326  const PopulationDatas& population_datas,
327  bool is_final_generation);
328 
329  // Configurable interface
330 
331  virtual std::string class_name() const {return "Reporter_MeanFitnesses";}
332  virtual Parameters parameters() const;
333  virtual void configure(const Parameters& parameters, const Registry& registry);
334 
335  private:
336 
337  bfs::ofstream os_;
338 
339  void open_streams();
340 };
341 
342 
343 //
344 // Reporter_HaplotypeDiversity
345 //
346 
347 // in development
348 //
349 // reports haplotype diversity for each population in each generation
350 //
351 // Parameters:
352 // - chromosome = <chromosome_pair_index> <length> <step>
353 //
354 // \ingroup Reporters
355 //
356 
357 class Reporter_HaplotypeDiversity : public Reporter
358 {
359  public:
360 
362  {
363  size_t index;
364  size_t length;
365  size_t step;
366 
367  ChromosomeEntry(size_t i = 0, size_t l = 0, size_t s = 0);
368  ChromosomeEntry(const std::string& configuration);
369  std::string configuration() const;
370  };
371 
372  typedef std::map<size_t, ChromosomeEntry> ChromosomeEntries; // chromosome index -> ChromosomeEntry
373 
374  Reporter_HaplotypeDiversity(const std::string& id,
375  const ChromosomeEntries& chromosome_entries = ChromosomeEntries());
376 
377  virtual void update(size_t generation_index,
378  const PopulationPtrs& populations,
379  const PopulationDatas& population_datas,
380  bool is_final_generation);
381 
382  // Configurable interface
383 
384  virtual std::string class_name() const {return "Reporter_HaplotypeDiversity";}
385  virtual Parameters parameters() const;
386  virtual void configure(const Parameters& parameters, const Registry& registry);
387 
388  private:
389 
390  ChromosomeEntries chromosome_entries_;
391 
392  // map chromosome pair index -> vector<stream> (one stream for each population)
393  typedef std::map< size_t, std::vector< shared_ptr<bfs::ofstream> > > ChromosomeStreams;
394  ChromosomeStreams chromosome_streams_;
395 
396  void open_streams(size_t population_count);
397 };
398 
399 
400 
401 //
402 // HaplotypeGrouping
403 //
404 
405 
407 {
408  public:
409 
410  HaplotypeGrouping(const std::string& id) : Configurable(id) {}
411 
412  virtual size_t group_count() const = 0;
413  virtual size_t group(unsigned int chromosome_id) const = 0;
414  virtual ~HaplotypeGrouping() {}
415 
416  // Configurable interface
417 
418  virtual std::string class_name() const;
419  virtual Parameters parameters() const;
420  virtual void configure(const Parameters& parameters, const Registry& registry);
421 };
422 
423 
424 typedef shared_ptr<HaplotypeGrouping> HaplotypeGroupingPtr;
425 
426 
427 //
428 // HaplotypeGrouping_IDRange
429 //
430 
442 
443 
445 {
446  public:
447 
448  HaplotypeGrouping_IDRange(const std::string& id);
449 
450  virtual size_t group_count() const;
451  virtual size_t group(unsigned int chromosome_id) const;
452 
453  // Configurable interface
454 
455  virtual std::string class_name() const {return "HaplotypeGrouping_IDRange";}
456  virtual Parameters parameters() const;
457  virtual void configure(const Parameters& parameters, const Registry& registry);
458 
459  private:
460 
461  std::vector<unsigned int> id_starts_;
462  std::vector<unsigned int> id_counts_;
463 };
464 
465 
466 //
467 // HaplotypeGrouping_Uniform
468 //
469 
483 
484 
486 {
487  public:
488 
489  HaplotypeGrouping_Uniform(const std::string& id);
490 
491  virtual size_t group_count() const;
492  virtual size_t group(unsigned int chromosome_id) const;
493 
494  // Configurable interface
495 
496  virtual std::string class_name() const {return "HaplotypeGrouping_Uniform";}
497  virtual Parameters parameters() const;
498  virtual void configure(const Parameters& parameters, const Registry& registry);
499  virtual void initialize(const SimulatorConfig& config);
500 
501  private:
502  unsigned int ids_per_group_;
503  unsigned int id_offset_;
504  unsigned int id_count_;
505 };
506 
507 
508 //
509 // Reporter_HaplotypeFrequencies
510 //
511 
525 
526 
527 class Reporter_HaplotypeFrequencies : public Reporter
528 {
529  public:
530 
531  Reporter_HaplotypeFrequencies(const std::string& id,
532  HaplotypeGroupingPtr haplotype_grouping = HaplotypeGroupingPtr(),
533  size_t chromosome_step = 0,
534  size_t update_step = 0);
535 
536  virtual void update(size_t generation_index,
537  const PopulationPtrs& populations,
538  const PopulationDatas& population_datas,
539  bool is_final_generation);
540 
541  // Configurable interface
542 
543  virtual std::string class_name() const {return "Reporter_HaplotypeFrequencies";}
544  virtual Parameters parameters() const;
545  virtual void configure(const Parameters& parameters, const Registry& registry);
546  virtual void initialize(const SimulatorConfig& config);
547  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
548 
549  private:
550 
551  HaplotypeGroupingPtr haplotype_grouping_;
552  size_t chromosome_step_;
553  size_t update_step_;
554  std::vector<unsigned int> chromosome_lengths_;
555 
556  void write_haplotype_frequencies(std::ostream& os, const Population& population,
557  size_t chromosome_pair_index, unsigned int chromosome_length) const;
558 };
559 
560 
561 //
562 // Reporter_Regions
563 //
564 
576 
577 
578 class Reporter_Regions : public Reporter
579 {
580  public:
581 
582  struct Region
583  {
584  Locus locus;
585  size_t length;
586 
587  Region(const Locus& _locus = Locus("dummy_id"),
588  size_t _length = 0)
589  : locus(_locus), length(_length)
590  {}
591 
592  std::string configuration() const;
593  };
594 
595  typedef std::vector<Region> Regions;
596 
597  Reporter_Regions(const std::string& id,
598  const Regions& regions = Regions());
599 
600  virtual void update(size_t generation_index,
601  const PopulationPtrs& populations,
602  const PopulationDatas& population_datas,
603  bool is_final_generation);
604 
605  // Configurable interface
606 
607  virtual std::string class_name() const {return "Reporter_Regions";}
608  virtual Parameters parameters() const;
609  virtual void configure(const Parameters& parameters, const Registry& registry);
610  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
611 
612  private:
613 
614  Regions regions_;
615  unsigned int ms_mapping_begin_;
616  unsigned int ms_mapping_end_;
617 };
618 
619 
620 //
621 // Reporter_DeterministicTrajectories
622 //
623 
638 
639 
640 class Reporter_DeterministicTrajectories : public Reporter
641 {
642  public:
643 
644  Reporter_DeterministicTrajectories(const std::string& id,
645  double initial_allele_frequency = 0,
646  std::vector<double> w = std::vector<double>(3))
647  : Configurable(id), initial_allele_frequency_(initial_allele_frequency), w_(w), generation_count_(0)
648  {}
649 
650  virtual void update(size_t generation_number,
651  const PopulationPtrs& populations,
652  const PopulationDatas& population_datas,
653  bool is_final_generation);
654 
655  // Configurable interface
656 
657  virtual std::string class_name() const {return "Reporter_DeterministicTrajectories";}
658  virtual Parameters parameters() const;
659  virtual void configure(const Parameters& parameters, const Registry& registry);
660  virtual void initialize(const SimulatorConfig& config);
661 
662  private:
663 
664  double initial_allele_frequency_;
665  std::vector<double> w_;
666  double generation_count_;
667 };
668 
669 
670 #endif // _REPORTERIMPLEMENTATION_HPP_
671