Commit 187bf8ee553a27eda9a72da72a3aad68014f0063
1 parent
4c6f4ae3
Add GModelTemporalPhaseCurve::value() method and add unit tests (#2154)
Showing
5 changed files
with
93 additions
and
36 deletions
NEWS
| @@ -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(&g_temporal_phase_seed) | @@ -47,7 +47,7 @@ const GModelTemporalRegistry g_temporal_phase_registry(&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& time) const | @@ -522,6 +522,34 @@ double GModelTemporalPhaseCurve::phase(const GTime& 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& filename) | @@ -833,9 +861,9 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename& 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& filename) | @@ -852,7 +880,7 @@ void GModelTemporalPhaseCurve::load_nodes(const GFilename& 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 |