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 | 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
src/model/GModelTemporalPhaseCurve.cpp
| ... | ... | @@ -47,7 +47,7 @@ const GModelTemporalRegistry g_temporal_phase_registry(&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& 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& 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& 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 | ... | ... |