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 23 The following methods have been added:
24 24 - GSkyRegion::overlaps(GSkyRegions&)
25 25 - GSkyMap::overlaps(GSkyRegion&)
26   -- GModelTemporalPhaseCurve::normalise()
  26 +- GModelTemporalPhaseCurve::normalize()
  27 +- GModelTemporalPhaseCurve::value(double&)
27 28  
28 29 The following methods have been removed:
29 30 - n.a.
... ...
include/GModelTemporalPhaseCurve.hpp
... ... @@ -116,6 +116,7 @@ public:
116 116 double phase(void) const;
117 117 double phase(const GTime& time) const;
118 118 void phase(const double& phase);
  119 + double value(const double& phase) const;
119 120 double f0(void) const;
120 121 void f0(const double& f0);
121 122 double f1(void) const;
... ... @@ -130,7 +131,7 @@ protected:
130 131 void copy_members(const GModelTemporalPhaseCurve& model);
131 132 void free_members(void);
132 133 void load_nodes(const GFilename& filename);
133   - void normalise_nodes(void);
  134 + void normalize_nodes(void);
134 135  
135 136 // Protected parameter members
136 137 GModelPar m_norm; //!< Normalization factor
... ...
pyext/GModelTemporalPhaseCurve.i
... ... @@ -73,6 +73,7 @@ public:
73 73 double phase(void) const;
74 74 double phase(const GTime& time) const;
75 75 void phase(const double& phase);
  76 + double value(const double& phase) const;
76 77 double f0(void) const;
77 78 void f0(const double& f0);
78 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 47 #define G_READ "GModelTemporalPhaseCurve::read(GXmlElement&)"
48 48 #define G_WRITE "GModelTemporalPhaseCurve::write(GXmlElement&)"
49 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 52 /* __ Macros _____________________________________________________________ */
53 53  
... ... @@ -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 553 * @brief Print phase curve information
526 554 *
527 555 * @param[in] chatter Chattiness.
... ... @@ -833,9 +861,9 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename&amp; filename)
833 861 // Close FITS file
834 862 fits.close();
835 863  
836   - // Optionally normalise nodes
  864 + // Optionally normalize nodes
837 865 if (m_normalize) {
838   - normalise_nodes();
  866 + normalize_nodes();
839 867 }
840 868  
841 869 // Return
... ... @@ -852,7 +880,7 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename&amp; filename)
852 880 * Normalise the node values so that the integral over the phase interval
853 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 885 // Initialise node integral
858 886 double sum = 0.0;
... ...
test/test_GModel.cpp
... ... @@ -2322,52 +2322,78 @@ void TestGModel::test_temp_phasecurve(void)
2322 2322 test_value(model2.f1(), 0.1);
2323 2323 test_value(model2.f2(), 0.01);
2324 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 2339 test_value(model3.filename().url(), m_temp_phasecurve,
2333 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 2342 test_value(model3.phase(), 0.0);
2337 2343 test_value(model3.f0(), 1.0);
2338 2344 test_value(model3.f1(), 0.1);
2339 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 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 2370 "Check phase curve file name");
2345 2371  
2346 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 2386 // Test operator access
2361 2387 const char* strarray[] = {"Normalization", "MJD", "Phase", "F0", "F1", "F2"};
2362 2388 for (int i = 0; i < 6; ++i) {
2363 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 2399 // Return
... ...