Commit b33b0f65c74a9749628ce3d692abcae29ed28c1e

Authored by Jürgen Knödlseder
1 parent 45ed9e48

Correct MC simulations for normalized phase curves (#2172)

ChangeLog
1   -2017-07-27
  1 +2017-07-28
2 2  
3 3 * Version 1.4.0 released
4 4 =========================
5 5  
6 6 Add GCTAEventBin::ipix() and ieng() setter methods (#2171)
7 7 Write response information into simulated observation definition file (#2170)
8   - Normalise phase curves by default (#2154)
  8 + Normalise phase curves by default (#2154, #2172)
9 9 Support Python list slicing for container classes (#2128)
10 10 Add GSkyRegions::overlaps() and GSkyMap::overlaps() classes (#1980)
11 11  
... ...
include/GModelTemporalPhaseCurve.hpp
... ... @@ -144,9 +144,10 @@ protected:
144 144 bool m_has_normalize; //!< XML has normalize attribute
145 145  
146 146 // Protected members
147   - mutable GNodeArray m_nodes; //!< Phase values of nodes
148   - std::vector<double> m_values; //!< Function values at nodes
149   - GFilename m_filename; //!< Name of phase file function
  147 + mutable GNodeArray m_nodes; //!< Phase values of nodes
  148 + std::vector<double> m_values; //!< Function values at nodes
  149 + double m_scale; //!< Scale factor due to normalization
  150 + GFilename m_filename; //!< Name of phase file function
150 151 };
151 152  
152 153  
... ...
src/model/GModelTemporalPhaseCurve.cpp
... ... @@ -316,7 +316,7 @@ GTimes GModelTemporalPhaseCurve::mc(const double&amp; rate, const GTime&amp; tmin,
316 316 GTimes times;
317 317  
318 318 // Compute event rate (in events per seconds)
319   - double lambda = rate * norm();
  319 + double lambda = rate * norm() * m_scale;
320 320  
321 321 // Initialise start and stop times in seconds
322 322 double time = tmin.secs();
... ... @@ -341,7 +341,7 @@ GTimes GModelTemporalPhaseCurve::mc(const double&amp; rate, const GTime&amp; tmin,
341 341 double value = eval(srcTime);
342 342  
343 343 // Get uniform random number
344   - double uniform = ran.uniform();
  344 + double uniform = ran.uniform() * m_scale;
345 345  
346 346 // If the random number is not larger than the phase curve value
347 347 // then accept the time
... ... @@ -686,6 +686,7 @@ void GModelTemporalPhaseCurve::init_members(void)
686 686 m_nodes.clear();
687 687 m_values.clear();
688 688 m_filename.clear();
  689 + m_scale = 1.0;
689 690 m_normalize = true;
690 691 m_has_normalize = false;
691 692  
... ... @@ -711,6 +712,7 @@ void GModelTemporalPhaseCurve::copy_members(const GModelTemporalPhaseCurve&amp; mode
711 712 m_nodes = model.m_nodes;
712 713 m_values = model.m_values;
713 714 m_filename = model.m_filename;
  715 + m_scale = model.m_scale;
714 716 m_normalize = model.m_normalize;
715 717 m_has_normalize = model.m_has_normalize;
716 718  
... ... @@ -909,9 +911,12 @@ void GModelTemporalPhaseCurve::normalize_nodes(void)
909 911 throw GException::invalid_value(G_NORMALISE_NODES, msg);
910 912 }
911 913  
  914 + // Set scale factor
  915 + m_scale = 1.0 / sum;
  916 +
912 917 // Normalise the node values
913 918 for (int i = 0; i < m_values.size(); ++i) {
914   - m_values[i] /= sum;
  919 + m_values[i] *= m_scale;
915 920 }
916 921  
917 922 // Return
... ...