forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
Reporter.hpp
1 //
2 // Reporter.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 _REPORTER_HPP_
37 #define _REPORTER_HPP_
38 
39 
40 #include "PopulationData.hpp"
41 #include "Configurable.hpp"
42 #include "Simulator.hpp"
43 #include "boost/filesystem.hpp"
44 #include "boost/filesystem/fstream.hpp"
45 #include <ctime>
46 
47 
48 namespace bfs = boost::filesystem;
49 
50 
59 
60 
61 //
62 // Reporter
63 //
64 
68 
69 class Reporter : public virtual Configurable
70 {
71  public:
72 
73  virtual void update(size_t generation_index,
74  const PopulationPtrs& populations,
75  const PopulationDatas& population_datas,
76  bool is_final_generation) {}
77 
78  virtual Loci loci(size_t generation_index,
79  bool is_final_generation) const {return Loci();}
80 
81  // Configurable interface default implementation
82 
83  virtual std::string class_name() const;
84  virtual Parameters parameters() const;
85  virtual void initialize(const SimulatorConfig& config);
86  virtual void configure(const Parameters& parameters, const Registry& registry);
87 
88  virtual ~Reporter(){}
89 
90  protected:
91 
92  bfs::path output_directory_;
93 
94  // Note: the compiler needs this because Configurable has no default
95  // constructor (by design). However, this call to Configurable(id) never
96  // actually happens. Configurable is a virtual base, so derived classes
97  // must call Configurable(id) directly in their constructors, and this
98  // call is ignored by compiler.
99  Reporter() : Configurable("dummy_id_reporter") {}
100 };
101 
102 
103 typedef shared_ptr<Reporter> ReporterPtr;
104 typedef std::vector<ReporterPtr> ReporterPtrs;
105 
106 
107 //
108 // Reporter_Timer
109 //
110 
120 
121 class Reporter_Timer : public Reporter
122 {
123  public:
124 
125  Reporter_Timer(const std::string& id);
126 
127  const std::vector<double>& times() {return times_;}
128  double mean_generation_time() const;
129 
130  virtual void update(size_t generation_index,
131  const PopulationPtrs& populations,
132  const PopulationDatas& population_datas,
133  bool is_final_generation);
134 
135  // Configurable interface
136 
137  virtual std::string class_name() const {return "Reporter_Timer";}
138  virtual Parameters parameters() const;
139  virtual void configure(const Parameters& parameters, const Registry& registry);
140 
141  private:
142 
143  std::clock_t begin_;
144  std::vector<double> times_;
145 };
146 
147 
148 
149 //
150 // Reporter_Population
151 //
152 
164 
166 {
167  public:
168 
169  Reporter_Population(const std::string& id);
170 
171  virtual void update(size_t generation_index,
172  const PopulationPtrs& populations,
173  const PopulationDatas& population_datas,
174  bool is_final_generation);
175 
176  // Configurable interface
177 
178  virtual std::string class_name() const {return "Reporter_Population";}
179  virtual Parameters parameters() const;
180  virtual void configure(const Parameters& parameters, const Registry& registry);
181 
182  private:
183 
184  size_t update_step_;
185 };
186 
187 
188 //
189 // Reporter_AlleleFrequencies
190 //
191 
210 
212 {
213  // note: this handles binary SNPs only (0/1 values)
214 
215  public:
216 
217  Reporter_AlleleFrequencies(const std::string& id) : Configurable(id) {}
218 
219  virtual void update(size_t generation_index,
220  const PopulationPtrs& populations,
221  const PopulationDatas& population_datas,
222  bool is_final_generation);
223 
224  virtual Loci loci(size_t generation_index,
225  bool is_final_generation) const {return loci_;}
226 
227  // Configurable interface
228 
229  virtual std::string class_name() const {return "Reporter_AlleleFrequencies";}
230  virtual Parameters parameters() const;
231  virtual void configure(const Parameters& parameters, const Registry& registry);
232  virtual void initialize(const SimulatorConfig& config);
233  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
234 
235  private:
236 
237  Loci loci_;
238 
239  Loci loci_specified_;
240  LocusListPtrs locus_lists_specified_;
241  QuantitativeTraitPtrs qts_specified_;
242 
243  typedef shared_ptr<std::ostream> OstreamPtr;
244  typedef std::map<Locus, OstreamPtr> OstreamMap;
245  OstreamMap os_map_;
246 
247  std::string generate_filename(const Locus& locus) const;
248  void open_streams();
249 };
250 
251 
252 //
253 // Reporter_LD
254 //
255 
268 
269 class Reporter_LD : public Reporter
270 {
271  // note: this handles binary SNPs only (0/1 values)
272 
273  public:
274 
275  Reporter_LD(const std::string& id,
276  Locus locus_1 = Locus("id_dummy_1"),
277  Locus locus_2 = Locus("id_dummy_2"));
278 
279  virtual void update(size_t generation_index,
280  const PopulationPtrs& populations,
281  const PopulationDatas& population_datas,
282  bool is_final_generation);
283 
284  virtual Loci loci(size_t generation_index,
285  bool is_final_generation) const;
286 
287  // Configurable interface
288 
289  virtual std::string class_name() const {return "Reporter_LD";}
290  virtual Parameters parameters() const;
291  virtual void configure(const Parameters& parameters, const Registry& registry);
292  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
293 
294  private:
295 
296  Locus locus_1_;
297  Locus locus_2_;
298 
299  bfs::ofstream os_;
300 
301  void open_streams();
302 };
303 
304 
305 //
306 // Reporter_TraitValues
307 //
308 
322 
324 {
325  public:
326 
327  Reporter_TraitValues(const std::string& id,
328  const std::string& qtid = "");
329 
330  virtual void update(size_t generation_index,
331  const PopulationPtrs& populations,
332  const PopulationDatas& population_datas,
333  bool is_final_generation);
334 
335  // Configurable interface
336 
337  virtual std::string class_name() const {return "Reporter_TraitValues";}
338  virtual Parameters parameters() const;
339  virtual void configure(const Parameters& parameters, const Registry& registry);
340 
341  private:
342 
343  std::string qtid_;
344  bool write_full_;
345  bfs::ofstream os_mean_;
346 
347  void open_streams();
348 };
349 
350 
351 //
352 // Reporter_MeanFitnesses
353 //
354 
364 
366 {
367  public:
368 
369  Reporter_MeanFitnesses(const std::string& id);
370 
371  virtual void update(size_t generation_index,
372  const PopulationPtrs& populations,
373  const PopulationDatas& population_datas,
374  bool is_final_generation);
375 
376  // Configurable interface
377 
378  virtual std::string class_name() const {return "Reporter_MeanFitnesses";}
379  virtual Parameters parameters() const;
380  virtual void configure(const Parameters& parameters, const Registry& registry);
381 
382  private:
383 
384  bfs::ofstream os_;
385 
386  void open_streams();
387 };
388 
389 
390 //
391 // Reporter_HaplotypeDiversity
392 //
393 
394 // in development
395 //
396 // reports haplotype diversity for each population in each generation
397 //
398 // Parameters:
399 // - chromosome = <chromosome_pair_index> <length> <step>
400 //
401 // \ingroup Reporters
402 //
403 
405 {
406  public:
407 
409  {
410  size_t index;
411  size_t length;
412  size_t step;
413 
414  ChromosomeEntry(size_t i = 0, size_t l = 0, size_t s = 0);
415  ChromosomeEntry(const std::string& configuration);
416  std::string configuration() const;
417  };
418 
419  typedef std::map<size_t, ChromosomeEntry> ChromosomeEntries; // chromosome index -> ChromosomeEntry
420 
421  Reporter_HaplotypeDiversity(const std::string& id,
422  const ChromosomeEntries& chromosome_entries = ChromosomeEntries());
423 
424  virtual void update(size_t generation_index,
425  const PopulationPtrs& populations,
426  const PopulationDatas& population_datas,
427  bool is_final_generation);
428 
429  // Configurable interface
430 
431  virtual std::string class_name() const {return "Reporter_HaplotypeDiversity";}
432  virtual Parameters parameters() const;
433  virtual void configure(const Parameters& parameters, const Registry& registry);
434 
435  private:
436 
437  ChromosomeEntries chromosome_entries_;
438 
439  // map chromosome pair index -> vector<stream> (one stream for each population)
440  typedef std::map< size_t, std::vector< shared_ptr<bfs::ofstream> > > ChromosomeStreams;
441  ChromosomeStreams chromosome_streams_;
442 
443  void open_streams(size_t population_count);
444 };
445 
446 
447 
448 //
449 // HaplotypeGrouping
450 //
451 
452 
454 {
455  public:
456 
457  HaplotypeGrouping(const std::string& id) : Configurable(id) {}
458 
459  virtual size_t group_count() const = 0;
460  virtual size_t group(unsigned int chromosome_id) const = 0;
461  virtual ~HaplotypeGrouping() {}
462 
463  // Configurable interface
464 
465  virtual std::string class_name() const;
466  virtual Parameters parameters() const;
467  virtual void configure(const Parameters& parameters, const Registry& registry);
468 };
469 
470 
471 typedef shared_ptr<HaplotypeGrouping> HaplotypeGroupingPtr;
472 
473 
474 //
475 // HaplotypeGrouping_IDRange
476 //
477 
489 
490 
492 {
493  public:
494 
495  HaplotypeGrouping_IDRange(const std::string& id);
496 
497  virtual size_t group_count() const;
498  virtual size_t group(unsigned int chromosome_id) const;
499 
500  // Configurable interface
501 
502  virtual std::string class_name() const {return "HaplotypeGrouping_IDRange";}
503  virtual Parameters parameters() const;
504  virtual void configure(const Parameters& parameters, const Registry& registry);
505 
506  private:
507 
508  std::vector<unsigned int> id_starts_;
509  std::vector<unsigned int> id_counts_;
510 };
511 
512 
513 //
514 // HaplotypeGrouping_Uniform
515 //
516 
530 
531 
533 {
534  public:
535 
536  HaplotypeGrouping_Uniform(const std::string& id);
537 
538  virtual size_t group_count() const;
539  virtual size_t group(unsigned int chromosome_id) const;
540 
541  // Configurable interface
542 
543  virtual std::string class_name() const {return "HaplotypeGrouping_Uniform";}
544  virtual Parameters parameters() const;
545  virtual void configure(const Parameters& parameters, const Registry& registry);
546  virtual void initialize(const SimulatorConfig& config);
547 
548  private:
549  unsigned int ids_per_group_;
550  unsigned int id_offset_;
551  unsigned int id_count_;
552 };
553 
554 
555 //
556 // Reporter_HaplotypeFrequencies
557 //
558 
572 
573 
575 {
576  public:
577 
578  Reporter_HaplotypeFrequencies(const std::string& id,
579  HaplotypeGroupingPtr haplotype_grouping = HaplotypeGroupingPtr(),
580  size_t chromosome_step = 0,
581  size_t update_step = 0);
582 
583  virtual void update(size_t generation_index,
584  const PopulationPtrs& populations,
585  const PopulationDatas& population_datas,
586  bool is_final_generation);
587 
588  // Configurable interface
589 
590  virtual std::string class_name() const {return "Reporter_HaplotypeFrequencies";}
591  virtual Parameters parameters() const;
592  virtual void configure(const Parameters& parameters, const Registry& registry);
593  virtual void initialize(const SimulatorConfig& config);
594  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
595 
596  private:
597 
598  HaplotypeGroupingPtr haplotype_grouping_;
599  size_t chromosome_step_;
600  size_t update_step_;
601  std::vector<unsigned int> chromosome_lengths_;
602 
603  void write_haplotype_frequencies(std::ostream& os, const Population& population,
604  size_t chromosome_pair_index, unsigned int chromosome_length) const;
605 };
606 
607 
608 //
609 // Reporter_Regions
610 //
611 
623 
624 
626 {
627  public:
628 
629  struct Region
630  {
631  Locus locus;
632  size_t length;
633 
634  Region(const Locus& _locus = Locus("dummy_id"),
635  size_t _length = 0)
636  : locus(_locus), length(_length)
637  {}
638 
639  std::string configuration() const;
640  };
641 
642  typedef std::vector<Region> Regions;
643 
644  Reporter_Regions(const std::string& id,
645  const Regions& regions = Regions());
646 
647  virtual void update(size_t generation_index,
648  const PopulationPtrs& populations,
649  const PopulationDatas& population_datas,
650  bool is_final_generation);
651 
652  // Configurable interface
653 
654  virtual std::string class_name() const {return "Reporter_Regions";}
655  virtual Parameters parameters() const;
656  virtual void configure(const Parameters& parameters, const Registry& registry);
657  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
658 
659  private:
660 
661  Regions regions_;
662  unsigned int ms_mapping_begin_;
663  unsigned int ms_mapping_end_;
664 };
665 
666 
667 //
668 // Reporter_DeterministicTrajectories
669 //
670 
685 
686 
688 {
689  public:
690 
691  Reporter_DeterministicTrajectories(const std::string& id,
692  double initial_allele_frequency = 0,
693  std::vector<double> w = std::vector<double>(3))
694  : Configurable(id), initial_allele_frequency_(initial_allele_frequency), w_(w), generation_count_(0)
695  {}
696 
697  virtual void update(size_t generation_number,
698  const PopulationPtrs& populations,
699  const PopulationDatas& population_datas,
700  bool is_final_generation);
701 
702  // Configurable interface
703 
704  virtual std::string class_name() const {return "Reporter_DeterministicTrajectories";}
705  virtual Parameters parameters() const;
706  virtual void configure(const Parameters& parameters, const Registry& registry);
707  virtual void initialize(const SimulatorConfig& config);
708 
709  private:
710 
711  double initial_allele_frequency_;
712  std::vector<double> w_;
713  double generation_count_;
714 };
715 
716 
717 #endif // _REPORTER_HPP_
718