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 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) : Configurable(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 
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 PopulationDataPtrs& 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 
276 
277 class Reporter_TraitValues : public Reporter
278 {
279  public:
280 
281  Reporter_TraitValues(const std::string& id,
282  const std::string& qtid = "");
283 
284  virtual void update(size_t generation_index,
285  const PopulationPtrs& populations,
286  const PopulationDataPtrs& population_datas,
287  bool is_final_generation);
288 
289  // Configurable interface
290 
291  virtual std::string class_name() const {return "Reporter_TraitValues";}
292  virtual Parameters parameters() const;
293  virtual void configure(const Parameters& parameters, const Registry& registry);
294 
295  private:
296 
297  std::string qtid_;
298  bool write_full_;
299  bool ignore_zero_values_;
300  bfs::ofstream os_mean_;
301 
302  void open_streams();
303 };
304 
305 
306 //
307 // Reporter_HaplotypeDiversity
308 //
309 
310 // in development
311 //
312 // reports haplotype diversity for each population in each generation
313 //
314 // Parameters:
315 // - chromosome = <chromosome_pair_index> <length> <step>
316 //
317 // \ingroup Reporters
318 //
319 
320 class Reporter_HaplotypeDiversity : public Reporter
321 {
322  public:
323 
325  {
326  size_t index;
327  size_t length;
328  size_t step;
329 
330  ChromosomeEntry(size_t i = 0, size_t l = 0, size_t s = 0);
331  ChromosomeEntry(const std::string& configuration);
332  std::string configuration() const;
333  };
334 
335  typedef std::map<size_t, ChromosomeEntry> ChromosomeEntries; // chromosome index -> ChromosomeEntry
336 
337  Reporter_HaplotypeDiversity(const std::string& id,
338  const ChromosomeEntries& chromosome_entries = ChromosomeEntries());
339 
340  virtual void update(size_t generation_index,
341  const PopulationPtrs& populations,
342  const PopulationDataPtrs& population_datas,
343  bool is_final_generation);
344 
345  // Configurable interface
346 
347  virtual std::string class_name() const {return "Reporter_HaplotypeDiversity";}
348  virtual Parameters parameters() const;
349  virtual void configure(const Parameters& parameters, const Registry& registry);
350 
351  private:
352 
353  ChromosomeEntries chromosome_entries_;
354 
355  // map chromosome pair index -> vector<stream> (one stream for each population)
356  typedef std::map< size_t, std::vector< shared_ptr<bfs::ofstream> > > ChromosomeStreams;
357  ChromosomeStreams chromosome_streams_;
358 
359  void open_streams(size_t population_count);
360 };
361 
362 
363 
364 //
365 // HaplotypeGrouping
366 //
367 
368 
370 {
371  public:
372 
373  HaplotypeGrouping(const std::string& id) : Configurable(id) {}
374 
375  virtual size_t group_count() const = 0;
376  virtual size_t group(unsigned int chromosome_id) const = 0;
377  virtual ~HaplotypeGrouping() {}
378 
379  // Configurable interface
380 
381  virtual std::string class_name() const;
382  virtual Parameters parameters() const;
383  virtual void configure(const Parameters& parameters, const Registry& registry);
384 };
385 
386 
387 typedef shared_ptr<HaplotypeGrouping> HaplotypeGroupingPtr;
388 
389 
390 //
391 // HaplotypeGrouping_IDRange
392 //
393 
405 
406 
408 {
409  public:
410 
411  HaplotypeGrouping_IDRange(const std::string& id);
412 
413  virtual size_t group_count() const;
414  virtual size_t group(unsigned int chromosome_id) const;
415 
416  // Configurable interface
417 
418  virtual std::string class_name() const {return "HaplotypeGrouping_IDRange";}
419  virtual Parameters parameters() const;
420  virtual void configure(const Parameters& parameters, const Registry& registry);
421 
422  private:
423 
424  std::vector<unsigned int> id_starts_;
425  std::vector<unsigned int> id_counts_;
426 };
427 
428 
429 //
430 // HaplotypeGrouping_Uniform
431 //
432 
446 
447 
449 {
450  public:
451 
452  HaplotypeGrouping_Uniform(const std::string& id);
453 
454  virtual size_t group_count() const;
455  virtual size_t group(unsigned int chromosome_id) const;
456 
457  // Configurable interface
458 
459  virtual std::string class_name() const {return "HaplotypeGrouping_Uniform";}
460  virtual Parameters parameters() const;
461  virtual void configure(const Parameters& parameters, const Registry& registry);
462  virtual void initialize(const SimulatorConfig& config);
463 
464  private:
465  unsigned int ids_per_group_;
466  unsigned int id_offset_;
467  unsigned int id_count_;
468 };
469 
470 
471 //
472 // Reporter_HaplotypeFrequencies
473 //
474 
488 
489 
490 class Reporter_HaplotypeFrequencies : public Reporter
491 {
492  public:
493 
494  Reporter_HaplotypeFrequencies(const std::string& id,
495  HaplotypeGroupingPtr haplotype_grouping = HaplotypeGroupingPtr(),
496  size_t chromosome_step = 0,
497  size_t update_step = 0);
498 
499  virtual void update(size_t generation_index,
500  const PopulationPtrs& populations,
501  const PopulationDataPtrs& population_datas,
502  bool is_final_generation);
503 
504  // Configurable interface
505 
506  virtual std::string class_name() const {return "Reporter_HaplotypeFrequencies";}
507  virtual Parameters parameters() const;
508  virtual void configure(const Parameters& parameters, const Registry& registry);
509  virtual void initialize(const SimulatorConfig& config);
510  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
511 
512  private:
513 
514  HaplotypeGroupingPtr haplotype_grouping_;
515  size_t chromosome_step_;
516  size_t update_step_;
517  std::vector<unsigned int> chromosome_lengths_;
518 
519  void write_haplotype_frequencies(std::ostream& os, const Population& population,
520  size_t chromosome_pair_index, unsigned int chromosome_length) const;
521 };
522 
523 
524 //
525 // Reporter_Regions
526 //
527 
539 
540 
541 class Reporter_Regions : public Reporter
542 {
543  public:
544 
545  struct Region
546  {
547  Locus locus;
548  size_t length;
549 
550  Region(const Locus& _locus = Locus("dummy_id"),
551  size_t _length = 0)
552  : locus(_locus), length(_length)
553  {}
554 
555  std::string configuration() const;
556  };
557 
558  typedef std::vector<Region> Regions;
559 
560  Reporter_Regions(const std::string& id,
561  const Regions& regions = Regions());
562 
563  virtual void update(size_t generation_index,
564  const PopulationPtrs& populations,
565  const PopulationDataPtrs& population_datas,
566  bool is_final_generation);
567 
568  // Configurable interface
569 
570  virtual std::string class_name() const {return "Reporter_Regions";}
571  virtual Parameters parameters() const;
572  virtual void configure(const Parameters& parameters, const Registry& registry);
573  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
574 
575  private:
576 
577  Regions regions_;
578  unsigned int ms_mapping_begin_;
579  unsigned int ms_mapping_end_;
580 };
581 
582 
583 //
584 // Reporter_DeterministicTrajectories
585 //
586 
601 
602 
603 class Reporter_DeterministicTrajectories : public Reporter
604 {
605  public:
606 
607  Reporter_DeterministicTrajectories(const std::string& id,
608  double initial_allele_frequency = 0,
609  std::vector<double> w = std::vector<double>(3))
610  : Configurable(id), initial_allele_frequency_(initial_allele_frequency), w_(w), generation_count_(0)
611  {}
612 
613  virtual void update(size_t generation_number,
614  const PopulationPtrs& populations,
615  const PopulationDataPtrs& population_datas,
616  bool is_final_generation);
617 
618  // Configurable interface
619 
620  virtual std::string class_name() const {return "Reporter_DeterministicTrajectories";}
621  virtual Parameters parameters() const;
622  virtual void configure(const Parameters& parameters, const Registry& registry);
623  virtual void initialize(const SimulatorConfig& config);
624 
625  private:
626 
627  double initial_allele_frequency_;
628  std::vector<double> w_;
629  double generation_count_;
630 };
631 
632 
633 #endif // _REPORTERIMPLEMENTATION_HPP_
634