Commit 187bf8ee553a27eda9a72da72a3aad68014f0063

Authored by Jürgen Knödlseder
1 parent 4c6f4ae3

Add GModelTemporalPhaseCurve::value() method and add unit tests (#2154)

@@ -23,7 +23,8 @@ The following classes have been renamed: @@ -23,7 +23,8 @@ The following classes have been renamed:
23 The following methods have been added: 23 The following methods have been added:
24 - GSkyRegion::overlaps(GSkyRegions&) 24 - GSkyRegion::overlaps(GSkyRegions&)
25 - GSkyMap::overlaps(GSkyRegion&) 25 - GSkyMap::overlaps(GSkyRegion&)
26 -- GModelTemporalPhaseCurve::normalise() 26 +- GModelTemporalPhaseCurve::normalize()
  27 +- GModelTemporalPhaseCurve::value(double&)
27 28
28 The following methods have been removed: 29 The following methods have been removed:
29 - n.a. 30 - n.a.
include/GModelTemporalPhaseCurve.hpp
@@ -116,6 +116,7 @@ public: @@ -116,6 +116,7 @@ public:
116 double phase(void) const; 116 double phase(void) const;
117 double phase(const GTime& time) const; 117 double phase(const GTime& time) const;
118 void phase(const double& phase); 118 void phase(const double& phase);
  119 + double value(const double& phase) const;
119 double f0(void) const; 120 double f0(void) const;
120 void f0(const double& f0); 121 void f0(const double& f0);
121 double f1(void) const; 122 double f1(void) const;
@@ -130,7 +131,7 @@ protected: @@ -130,7 +131,7 @@ protected:
130 void copy_members(const GModelTemporalPhaseCurve& model); 131 void copy_members(const GModelTemporalPhaseCurve& model);
131 void free_members(void); 132 void free_members(void);
132 void load_nodes(const GFilename& filename); 133 void load_nodes(const GFilename& filename);
133 - void normalise_nodes(void); 134 + void normalize_nodes(void);
134 135
135 // Protected parameter members 136 // Protected parameter members
136 GModelPar m_norm; //!< Normalization factor 137 GModelPar m_norm; //!< Normalization factor
pyext/GModelTemporalPhaseCurve.i
@@ -73,6 +73,7 @@ public: @@ -73,6 +73,7 @@ public:
73 double phase(void) const; 73 double phase(void) const;
74 double phase(const GTime& time) const; 74 double phase(const GTime& time) const;
75 void phase(const double& phase); 75 void phase(const double& phase);
  76 + double value(const double& phase) const;
76 double f0(void) const; 77 double f0(void) const;
77 void f0(const double& f0); 78 void f0(const double& f0);
78 double f1(void) const; 79 double f1(void) const;
src/model/GModelTemporalPhaseCurve.cpp
@@ -47,7 +47,7 @@ const GModelTemporalRegistry g_temporal_phase_registry(&amp;g_temporal_phase_seed) @@ -47,7 +47,7 @@ const GModelTemporalRegistry g_temporal_phase_registry(&amp;g_temporal_phase_seed)
47 #define G_READ "GModelTemporalPhaseCurve::read(GXmlElement&)" 47 #define G_READ "GModelTemporalPhaseCurve::read(GXmlElement&)"
48 #define G_WRITE "GModelTemporalPhaseCurve::write(GXmlElement&)" 48 #define G_WRITE "GModelTemporalPhaseCurve::write(GXmlElement&)"
49 #define G_LOAD_NODES "GModelTemporalPhaseCurve::load_nodes(GFilename&)" 49 #define G_LOAD_NODES "GModelTemporalPhaseCurve::load_nodes(GFilename&)"
50 -#define G_NORMALISE_NODES "GModelTemporalPhaseCurve::normalise_nodes()" 50 +#define G_NORMALISE_NODES "GModelTemporalPhaseCurve::normalize_nodes()"
51 51
52 /* __ Macros _____________________________________________________________ */ 52 /* __ Macros _____________________________________________________________ */
53 53
@@ -522,6 +522,34 @@ double GModelTemporalPhaseCurve::phase(const GTime&amp; time) const @@ -522,6 +522,34 @@ double GModelTemporalPhaseCurve::phase(const GTime&amp; time) const
522 522
523 523
524 /***********************************************************************//** 524 /***********************************************************************//**
  525 + * @brief Evaluate phase curve value for a given phase
  526 + *
  527 + * @param[in] phase Phase.
  528 + * @return Value of phase curve.
  529 + *
  530 + * Computes
  531 + *
  532 + * \f[
  533 + * S_{\rm t}(\Phi) = r(\Phi) \times {\tt m\_norm}
  534 + * \f]
  535 + *
  536 + * where
  537 + *
  538 + * \f$r(\Phi)\f$ is the phase dependent rate, defined by linear interpolation
  539 + * between the nodes in a FITS file, \f$\Phi\f$ is the phase, and
  540 + * \f${\tt m\_norm}\f$ is a normalisation constant.
  541 + ***************************************************************************/
  542 +double GModelTemporalPhaseCurve::value(const double& phase) const
  543 +{
  544 + // Compute function value
  545 + double value = m_norm.value() * m_nodes.interpolate(phase, m_values);
  546 +
  547 + // Return
  548 + return value;
  549 +}
  550 +
  551 +
  552 +/***********************************************************************//**
525 * @brief Print phase curve information 553 * @brief Print phase curve information
526 * 554 *
527 * @param[in] chatter Chattiness. 555 * @param[in] chatter Chattiness.
@@ -833,9 +861,9 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename&amp; filename) @@ -833,9 +861,9 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename&amp; filename)
833 // Close FITS file 861 // Close FITS file
834 fits.close(); 862 fits.close();
835 863
836 - // Optionally normalise nodes 864 + // Optionally normalize nodes
837 if (m_normalize) { 865 if (m_normalize) {
838 - normalise_nodes(); 866 + normalize_nodes();
839 } 867 }
840 868
841 // Return 869 // Return
@@ -852,7 +880,7 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename&amp; filename) @@ -852,7 +880,7 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename&amp; filename)
852 * Normalise the node values so that the integral over the phase interval 880 * Normalise the node values so that the integral over the phase interval
853 * [0,1] gives an average normalisation of 1. 881 * [0,1] gives an average normalisation of 1.
854 ***************************************************************************/ 882 ***************************************************************************/
855 -void GModelTemporalPhaseCurve::normalise_nodes(void) 883 +void GModelTemporalPhaseCurve::normalize_nodes(void)
856 { 884 {
857 // Initialise node integral 885 // Initialise node integral
858 double sum = 0.0; 886 double sum = 0.0;
test/test_GModel.cpp
@@ -2322,52 +2322,78 @@ void TestGModel::test_temp_phasecurve(void) @@ -2322,52 +2322,78 @@ void TestGModel::test_temp_phasecurve(void)
2322 test_value(model2.f1(), 0.1); 2322 test_value(model2.f1(), 0.1);
2323 test_value(model2.f2(), 0.01); 2323 test_value(model2.f2(), 0.01);
2324 test_value(model2.norm(), 2.0); 2324 test_value(model2.norm(), 2.0);
2325 -  
2326 - // Test XML constructor  
2327 - GXml xml(m_xml_model_point_temp_phasecurve);  
2328 - GXmlElement* element = xml.element(0)->element(0)->element("temporal", 0);  
2329 - GModelTemporalPhaseCurve model3(*element);  
2330 - test_value(model3.size(), 6);  
2331 - test_value(model3.type(), "PhaseCurve", "Check model type"); 2325 + test_value(model2.value(0.1), 0.0);
  2326 + test_value(model2.value(0.2), 9.09090909090909);
  2327 + test_value(model2.value(0.6), 8.18181818181818);
  2328 + test_assert(model2.normalize(), "Check that phase curve is normalised");
  2329 +
  2330 + // Test value constructor without phase curve normalization
  2331 + GModelTemporalPhaseCurve model3(m_temp_phasecurve,
  2332 + GTime(3.0, "secs"),
  2333 + 0.0,
  2334 + 1.0,
  2335 + 0.1,
  2336 + 0.01,
  2337 + 2.0,
  2338 + false);
2332 test_value(model3.filename().url(), m_temp_phasecurve, 2339 test_value(model3.filename().url(), m_temp_phasecurve,
2333 "Check phase curve file name"); 2340 "Check phase curve file name");
2334 - test_value(model3.norm(), 1.0);  
2335 - test_value(model3.mjd().mjd(), 51544.5); 2341 + test_value(model3.mjd().secs(), 3.0);
2336 test_value(model3.phase(), 0.0); 2342 test_value(model3.phase(), 0.0);
2337 test_value(model3.f0(), 1.0); 2343 test_value(model3.f0(), 1.0);
2338 test_value(model3.f1(), 0.1); 2344 test_value(model3.f1(), 0.1);
2339 test_value(model3.f2(), 0.01); 2345 test_value(model3.f2(), 0.01);
  2346 + test_value(model3.norm(), 2.0);
  2347 + test_value(model3.value(0.1), 0.0);
  2348 + test_value(model3.value(0.2), 2.0);
  2349 + test_value(model3.value(0.6), 1.8);
  2350 + test_assert(!model3.normalize(), "Check that phase curve is not normalised");
  2351 +
  2352 + // Test XML constructor
  2353 + GXml xml(m_xml_model_point_temp_phasecurve);
  2354 + GXmlElement* element = xml.element(0)->element(0)->element("temporal", 0);
  2355 + GModelTemporalPhaseCurve model4(*element);
  2356 + test_value(model4.size(), 6);
  2357 + test_value(model4.type(), "PhaseCurve", "Check model type");
  2358 + test_value(model4.filename().url(), m_temp_phasecurve,
  2359 + "Check phase curve file name");
  2360 + test_value(model4.norm(), 1.0);
  2361 + test_value(model4.mjd().mjd(), 51544.5);
  2362 + test_value(model4.phase(), 0.0);
  2363 + test_value(model4.f0(), 1.0);
  2364 + test_value(model4.f1(), 0.1);
  2365 + test_value(model4.f2(), 0.01);
2340 2366
2341 // Test filename method 2367 // Test filename method
2342 - model3.filename(m_temp_phasecurve);  
2343 - test_value(model3.filename().url(), m_temp_phasecurve, 2368 + model4.filename(m_temp_phasecurve);
  2369 + test_value(model4.filename().url(), m_temp_phasecurve,
2344 "Check phase curve file name"); 2370 "Check phase curve file name");
2345 2371
2346 // Test parameter methods 2372 // Test parameter methods
2347 - model3.norm(3.0);  
2348 - test_value(model3.norm(), 3.0);  
2349 - model3.mjd(GTime(3.0, "s"));  
2350 - test_value(model3.mjd().secs(), 3.0);  
2351 - model3.phase(0.3);  
2352 - test_value(model3.phase(), 0.3);  
2353 - model3.f0(3.0);  
2354 - test_value(model3.f0(), 3.0);  
2355 - model3.f1(3.0);  
2356 - test_value(model3.f1(), 3.0);  
2357 - model3.f2(3.0);  
2358 - test_value(model3.f2(), 3.0); 2373 + model4.norm(3.0);
  2374 + test_value(model4.norm(), 3.0);
  2375 + model4.mjd(GTime(3.0, "s"));
  2376 + test_value(model4.mjd().secs(), 3.0);
  2377 + model4.phase(0.3);
  2378 + test_value(model4.phase(), 0.3);
  2379 + model4.f0(3.0);
  2380 + test_value(model4.f0(), 3.0);
  2381 + model4.f1(3.0);
  2382 + test_value(model4.f1(), 3.0);
  2383 + model4.f2(3.0);
  2384 + test_value(model4.f2(), 3.0);
2359 2385
2360 // Test operator access 2386 // Test operator access
2361 const char* strarray[] = {"Normalization", "MJD", "Phase", "F0", "F1", "F2"}; 2387 const char* strarray[] = {"Normalization", "MJD", "Phase", "F0", "F1", "F2"};
2362 for (int i = 0; i < 6; ++i) { 2388 for (int i = 0; i < 6; ++i) {
2363 std::string keyname(strarray[i]); 2389 std::string keyname(strarray[i]);
2364 - model3[keyname].remove_range(); // To allow setting of any value  
2365 - model3[keyname].value(2.1);  
2366 - model3[keyname].error(1.9);  
2367 - model3[keyname].gradient(0.8);  
2368 - test_value(model3[keyname].value(), 2.1);  
2369 - test_value(model3[keyname].error(), 1.9);  
2370 - test_value(model3[keyname].gradient(), 0.8); 2390 + model4[keyname].remove_range(); // To allow setting of any value
  2391 + model4[keyname].value(2.1);
  2392 + model4[keyname].error(1.9);
  2393 + model4[keyname].gradient(0.8);
  2394 + test_value(model4[keyname].value(), 2.1);
  2395 + test_value(model4[keyname].error(), 1.9);
  2396 + test_value(model4[keyname].gradient(), 0.8);
2371 } 2397 }
2372 2398
2373 // Return 2399 // Return