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 _REPORTERIMPLEMENTATION_HPP_
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 PopulationDataPtrs& 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 PopulationDataPtrs& 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);
171 
172  virtual void update(size_t generation_index,
173  const PopulationPtrs& populations,
174  const PopulationDataPtrs& 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  bool report_D_;
204 };
205 
206 
207 //
208 // Reporter_LD
209 //
210 
223 
224 class Reporter_LD : public Reporter
225 {
226  // note: this handles binary SNPs only (0/1 values)
227 
228  public:
229 
230  Reporter_LD(const std::string& id,
231  Locus locus_1 = Locus("id_dummy_1"),
232  Locus locus_2 = Locus("id_dummy_2"));
233 
234  virtual void update(size_t generation_index,
235  const PopulationPtrs& populations,
236  const PopulationDataPtrs& population_datas,
237  bool is_final_generation);
238 
239  virtual Loci loci(size_t generation_index,
240  bool is_final_generation) const;
241 
242  // Configurable interface
243 
244  virtual std::string class_name() const {return "Reporter_LD";}
245  virtual Parameters parameters() const;
246  virtual void configure(const Parameters& parameters, const Registry& registry);
247  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
248 
249  private:
250 
251  Locus locus_1_;
252  Locus locus_2_;
253 
254  bfs::ofstream os_;
255 
256  void open_streams();
257 };
258 
259 
260 //
261 // Reporter_TraitValues
262 //
263 
279 
280 class Reporter_TraitValues : public Reporter
281 {
282  public:
283 
284  Reporter_TraitValues(const std::string& id);
285 
286  virtual void update(size_t generation_index,
287  const PopulationPtrs& populations,
288  const PopulationDataPtrs& population_datas,
289  bool is_final_generation);
290 
291  // Configurable interface
292 
293  virtual std::string class_name() const {return "Reporter_TraitValues";}
294  virtual Parameters parameters() const;
295  virtual void configure(const Parameters& parameters, const Registry& registry);
296 
297  private:
298 
299  std::vector<std::string> qtids_;
300  std::set<std::string> qtids_ignore_zero_values_;
301  bool write_full_;
302  std::string filetag_;
303 
304  typedef shared_ptr<std::ostream> OstreamPtr;
305  typedef std::vector<OstreamPtr> OstreamPtrs;
306  OstreamPtrs os_means_;
307 
308  void open_streams();
309 };
310 
311 
312 //
313 // Reporter_HaplotypeDiversity
314 //
315 
316 // in development
317 //
318 // reports haplotype diversity for each population in each generation
319 //
320 // Parameters:
321 // - chromosome = <chromosome_pair_index> <length> <step>
322 //
323 // \ingroup Reporters
324 //
325 
326 class Reporter_HaplotypeDiversity : public Reporter
327 {
328  public:
329 
331  {
332  size_t index;
333  size_t length;
334  size_t step;
335 
336  ChromosomeEntry(size_t i = 0, size_t l = 0, size_t s = 0);
337  ChromosomeEntry(const std::string& configuration);
338  std::string configuration() const;
339  };
340 
341  typedef std::map<size_t, ChromosomeEntry> ChromosomeEntries; // chromosome index -> ChromosomeEntry
342 
343  Reporter_HaplotypeDiversity(const std::string& id,
344  const ChromosomeEntries& chromosome_entries = ChromosomeEntries());
345 
346  virtual void update(size_t generation_index,
347  const PopulationPtrs& populations,
348  const PopulationDataPtrs& population_datas,
349  bool is_final_generation);
350 
351  // Configurable interface
352 
353  virtual std::string class_name() const {return "Reporter_HaplotypeDiversity";}
354  virtual Parameters parameters() const;
355  virtual void configure(const Parameters& parameters, const Registry& registry);
356 
357  private:
358 
359  ChromosomeEntries chromosome_entries_;
360 
361  // map chromosome pair index -> vector<stream> (one stream for each population)
362  typedef std::map< size_t, std::vector< shared_ptr<bfs::ofstream> > > ChromosomeStreams;
363  ChromosomeStreams chromosome_streams_;
364 
365  void open_streams(size_t population_count);
366 };
367 
368 
369 
370 //
371 // HaplotypeGrouping
372 //
373 
374 
376 {
377  public:
378 
379  HaplotypeGrouping(const std::string& id) : Configurable(id) {}
380 
381  virtual size_t group_count() const = 0;
382  virtual size_t group(unsigned int chromosome_id) const = 0;
383  virtual ~HaplotypeGrouping() {}
384 
385  // Configurable interface
386 
387  virtual std::string class_name() const;
388  virtual Parameters parameters() const;
389  virtual void configure(const Parameters& parameters, const Registry& registry);
390 };
391 
392 
393 typedef shared_ptr<HaplotypeGrouping> HaplotypeGroupingPtr;
394 
395 
396 //
397 // HaplotypeGrouping_IDRange
398 //
399 
411 
412 
414 {
415  public:
416 
417  HaplotypeGrouping_IDRange(const std::string& id);
418 
419  virtual size_t group_count() const;
420  virtual size_t group(unsigned int chromosome_id) const;
421 
422  // Configurable interface
423 
424  virtual std::string class_name() const {return "HaplotypeGrouping_IDRange";}
425  virtual Parameters parameters() const;
426  virtual void configure(const Parameters& parameters, const Registry& registry);
427 
428  private:
429 
430  std::vector<unsigned int> id_starts_;
431  std::vector<unsigned int> id_counts_;
432 };
433 
434 
435 //
436 // HaplotypeGrouping_Uniform
437 //
438 
452 
453 
455 {
456  public:
457 
458  HaplotypeGrouping_Uniform(const std::string& id);
459 
460  virtual size_t group_count() const;
461  virtual size_t group(unsigned int chromosome_id) const;
462 
463  // Configurable interface
464 
465  virtual std::string class_name() const {return "HaplotypeGrouping_Uniform";}
466  virtual Parameters parameters() const;
467  virtual void configure(const Parameters& parameters, const Registry& registry);
468  virtual void initialize(const SimulatorConfig& config);
469 
470  private:
471  unsigned int ids_per_group_;
472  unsigned int id_offset_;
473  unsigned int id_count_;
474 };
475 
476 
477 //
478 // Reporter_HaplotypeFrequencies
479 //
480 
494 
495 
496 class Reporter_HaplotypeFrequencies : public Reporter
497 {
498  public:
499 
500  Reporter_HaplotypeFrequencies(const std::string& id,
501  HaplotypeGroupingPtr haplotype_grouping = HaplotypeGroupingPtr(),
502  size_t chromosome_step = 0,
503  size_t update_step = 0);
504 
505  virtual void update(size_t generation_index,
506  const PopulationPtrs& populations,
507  const PopulationDataPtrs& population_datas,
508  bool is_final_generation);
509 
510  // Configurable interface
511 
512  virtual std::string class_name() const {return "Reporter_HaplotypeFrequencies";}
513  virtual Parameters parameters() const;
514  virtual void configure(const Parameters& parameters, const Registry& registry);
515  virtual void initialize(const SimulatorConfig& config);
516  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
517 
518  private:
519 
520  HaplotypeGroupingPtr haplotype_grouping_;
521  size_t chromosome_step_;
522  size_t update_step_;
523  std::vector<unsigned int> chromosome_lengths_;
524 
525  void write_haplotype_frequencies(std::ostream& os, const Population& population,
526  size_t chromosome_pair_index, unsigned int chromosome_length) const;
527 };
528 
529 
530 //
531 // Reporter_Regions
532 //
533 
545 
546 
547 class Reporter_Regions : public Reporter
548 {
549  public:
550 
551  struct Region
552  {
553  Locus locus;
554  size_t length;
555 
556  Region(const Locus& _locus = Locus("dummy_id"),
557  size_t _length = 0)
558  : locus(_locus), length(_length)
559  {}
560 
561  std::string configuration() const;
562  };
563 
564  typedef std::vector<Region> Regions;
565 
566  Reporter_Regions(const std::string& id,
567  const Regions& regions = Regions());
568 
569  virtual void update(size_t generation_index,
570  const PopulationPtrs& populations,
571  const PopulationDataPtrs& population_datas,
572  bool is_final_generation);
573 
574  // Configurable interface
575 
576  virtual std::string class_name() const {return "Reporter_Regions";}
577  virtual Parameters parameters() const;
578  virtual void configure(const Parameters& parameters, const Registry& registry);
579  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
580 
581  private:
582 
583  Regions regions_;
584  unsigned int ms_mapping_begin_;
585  unsigned int ms_mapping_end_;
586 };
587 
588 
589 //
590 // Reporter_DeterministicTrajectories
591 //
592 
614 
615 
616 class Reporter_DeterministicTrajectories : public Reporter
617 {
618  public:
619 
620  Reporter_DeterministicTrajectories(const std::string& id,
621  double initial_allele_frequency = 0,
622  std::vector<double> w = std::vector<double>(3))
623  : Configurable(id), initial_allele_frequency_(initial_allele_frequency), w_(w), generation_count_(0)
624  {}
625 
626  virtual void update(size_t generation_number,
627  const PopulationPtrs& populations,
628  const PopulationDataPtrs& population_datas,
629  bool is_final_generation);
630 
631  // Configurable interface
632 
633  virtual std::string class_name() const {return "Reporter_DeterministicTrajectories";}
634  virtual Parameters parameters() const;
635  virtual void configure(const Parameters& parameters, const Registry& registry);
636  virtual void initialize(const SimulatorConfig& config);
637 
638  private:
639 
640  double initial_allele_frequency_;
641  std::vector<double> w_;
642  double generation_count_;
643 };
644 
645 
646 //
647 // Reporter_Variants
648 //
649 
661 
662 class Reporter_Variants : public Reporter
663 {
664  public:
665 
666  Reporter_Variants(const std::string& id);
667 
668  virtual void update(size_t generation_index,
669  const PopulationPtrs& populations,
670  const PopulationDataPtrs& population_datas,
671  bool is_final_generation);
672 
673  virtual Loci loci(size_t generation_index, bool is_final_generation) const;
674 
675  // Configurable interface
676 
677  virtual std::string class_name() const {return "Reporter_Variants";}
678  virtual Parameters parameters() const;
679  virtual void configure(const Parameters& parameters, const Registry& registry);
680  virtual void initialize(const SimulatorConfig& config);
681  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
682 
683  private:
684 
685  std::vector<std::string> locus_ids_;
686  size_t update_step_;
687  std::vector<Locus> loci_;
688  ConfigurablePtrs children_;
689  QuantitativeTraitPtrs qts_specified_;
690 };
691 
692 
693 #endif // _REPORTERIMPLEMENTATION_HPP_
694