Commit c7a508a50fb0ccd40bb19837f1f285edd0cbbeed
1 parent
4dc6a2e5
Added functionality to read energy boundaries from IRF Fits file as well from ob…
…servation definition XML files
Showing
6 changed files
with
119 additions
and
2 deletions
inst/cta/include/GCTAObservation.hpp
| @@ -120,6 +120,8 @@ public: | @@ -120,6 +120,8 @@ public: | ||
| 120 | void eventfile(const std::string& filename); | 120 | void eventfile(const std::string& filename); |
| 121 | const std::string& eventfile(void) const; | 121 | const std::string& eventfile(void) const; |
| 122 | void dispose_events(void); | 122 | void dispose_events(void); |
| 123 | + double lo_user_thres(void) const; | ||
| 124 | + double hi_user_thres(void) const; | ||
| 123 | 125 | ||
| 124 | protected: | 126 | protected: |
| 125 | // Protected methods | 127 | // Protected methods |
| @@ -143,6 +145,10 @@ protected: | @@ -143,6 +145,10 @@ protected: | ||
| 143 | double m_ra_obj; //!< Right Ascension of object (degrees) | 145 | double m_ra_obj; //!< Right Ascension of object (degrees) |
| 144 | double m_dec_obj; //!< Declination of object (degrees) | 146 | double m_dec_obj; //!< Declination of object (degrees) |
| 145 | 147 | ||
| 148 | + // User defined energy thresholds | ||
| 149 | + double m_lo_user_thres; //!< user defined lower energy threshold | ||
| 150 | + double m_hi_user_thres; //!< user defined upper energy boundary | ||
| 151 | + | ||
| 146 | // Special protected member for GCTAModelCubeBackground friend | 152 | // Special protected member for GCTAModelCubeBackground friend |
| 147 | std::string m_bgdfile; //!< Background filename | 153 | std::string m_bgdfile; //!< Background filename |
| 148 | }; | 154 | }; |
| @@ -387,4 +393,30 @@ const std::string& GCTAObservation::eventfile(void) const | @@ -387,4 +393,30 @@ const std::string& GCTAObservation::eventfile(void) const | ||
| 387 | return m_eventfile; | 393 | return m_eventfile; |
| 388 | } | 394 | } |
| 389 | 395 | ||
| 396 | + | ||
| 397 | +/***********************************************************************//** | ||
| 398 | + * @brief Return low energy threshold from IRF | ||
| 399 | + * | ||
| 400 | + * @return return low energy threshold | ||
| 401 | + ***************************************************************************/ | ||
| 402 | +inline | ||
| 403 | +double GCTAObservation::lo_user_thres(void) const | ||
| 404 | +{ | ||
| 405 | + return m_lo_user_thres; | ||
| 406 | +} | ||
| 407 | + | ||
| 408 | +/***********************************************************************//** | ||
| 409 | + * @brief Return high energy threshold from IRF | ||
| 410 | + * | ||
| 411 | + * @return return low energy threshold | ||
| 412 | + ***************************************************************************/ | ||
| 413 | +inline | ||
| 414 | +double GCTAObservation::hi_user_thres(void) const | ||
| 415 | +{ | ||
| 416 | + return m_hi_user_thres; | ||
| 417 | +} | ||
| 418 | + | ||
| 419 | + | ||
| 420 | + | ||
| 421 | + | ||
| 390 | #endif /* GCTAOBSERVATION_HPP */ | 422 | #endif /* GCTAOBSERVATION_HPP */ |
inst/cta/include/GCTAResponse.hpp
| @@ -93,6 +93,7 @@ protected: | @@ -93,6 +93,7 @@ protected: | ||
| 93 | const GObservation& obs) const; | 93 | const GObservation& obs) const; |
| 94 | const GCTAInstDir& retrieve_dir(const std::string& origin, | 94 | const GCTAInstDir& retrieve_dir(const std::string& origin, |
| 95 | const GEvent& event) const; | 95 | const GEvent& event) const; |
| 96 | + | ||
| 96 | }; | 97 | }; |
| 97 | 98 | ||
| 98 | #endif /* GCTARESPONSE_HPP */ | 99 | #endif /* GCTARESPONSE_HPP */ |
inst/cta/include/GCTAResponseIrf.hpp
| @@ -128,6 +128,9 @@ public: | @@ -128,6 +128,9 @@ public: | ||
| 128 | const GCTABackground* background(void) const; | 128 | const GCTABackground* background(void) const; |
| 129 | void background(GCTABackground* background); | 129 | void background(GCTABackground* background); |
| 130 | 130 | ||
| 131 | + double lo_save_thres(void) const; | ||
| 132 | + double hi_save_thres(void) const; | ||
| 133 | + | ||
| 131 | // Low-level response methods | 134 | // Low-level response methods |
| 132 | double aeff(const double& theta, | 135 | double aeff(const double& theta, |
| 133 | const double& phi, | 136 | const double& phi, |
| @@ -178,6 +181,10 @@ private: | @@ -178,6 +181,10 @@ private: | ||
| 178 | GCTABackground* m_background; //!< Energy dispersion | 181 | GCTABackground* m_background; //!< Energy dispersion |
| 179 | mutable bool m_apply_edisp; //!< Apply energy dispersion | 182 | mutable bool m_apply_edisp; //!< Apply energy dispersion |
| 180 | 183 | ||
| 184 | + // Energy thresholds | ||
| 185 | + double m_lo_save_thres;//!< save energy threshold | ||
| 186 | + double m_hi_save_thres;//!< save maximum energy | ||
| 187 | + | ||
| 181 | // XML response filename | 188 | // XML response filename |
| 182 | std::string m_xml_caldb; //!< Calibration database string in XML file | 189 | std::string m_xml_caldb; //!< Calibration database string in XML file |
| 183 | std::string m_xml_rspname; //!< Response name in XML file | 190 | std::string m_xml_rspname; //!< Response name in XML file |
| @@ -398,4 +405,28 @@ void GCTAResponseIrf::background(GCTABackground* background) | @@ -398,4 +405,28 @@ void GCTAResponseIrf::background(GCTABackground* background) | ||
| 398 | return; | 405 | return; |
| 399 | } | 406 | } |
| 400 | 407 | ||
| 408 | +/***********************************************************************//** | ||
| 409 | + * @brief Return low energy threshold from IRF | ||
| 410 | + * | ||
| 411 | + * @return return low energy threshold | ||
| 412 | + ***************************************************************************/ | ||
| 413 | +inline | ||
| 414 | +double GCTAResponseIrf::lo_save_thres(void) const | ||
| 415 | +{ | ||
| 416 | + return m_lo_save_thres; | ||
| 417 | +} | ||
| 418 | + | ||
| 419 | +/***********************************************************************//** | ||
| 420 | + * @brief Return high energy threshold from IRF | ||
| 421 | + * | ||
| 422 | + * @return return low energy threshold | ||
| 423 | + ***************************************************************************/ | ||
| 424 | +inline | ||
| 425 | +double GCTAResponseIrf::hi_save_thres(void) const | ||
| 426 | +{ | ||
| 427 | + return m_hi_save_thres; | ||
| 428 | +} | ||
| 429 | + | ||
| 430 | + | ||
| 431 | + | ||
| 401 | #endif /* GCTARESPONSEIRF_HPP */ | 432 | #endif /* GCTARESPONSEIRF_HPP */ |
inst/cta/src/GCTAObservation.cpp
| @@ -652,6 +652,17 @@ void GCTAObservation::read(const GXmlElement& xml) | @@ -652,6 +652,17 @@ void GCTAObservation::read(const GXmlElement& xml) | ||
| 652 | 652 | ||
| 653 | // Extract instrument name | 653 | // Extract instrument name |
| 654 | m_instrument = xml.attribute("instrument"); | 654 | m_instrument = xml.attribute("instrument"); |
| 655 | +// m_name = xml.attribute("name"); | ||
| 656 | +// m_id = xml.attribute("id"); | ||
| 657 | + | ||
| 658 | + // Read in user defined energy boundaries of this observation | ||
| 659 | + if (xml.attribute("emin") != "") { | ||
| 660 | + m_lo_user_thres = gammalib::todouble(xml.attribute("emin")); | ||
| 661 | + } | ||
| 662 | + | ||
| 663 | + if (xml.attribute("emax") != "") { | ||
| 664 | + m_hi_user_thres = gammalib::todouble(xml.attribute("emax")); | ||
| 665 | + } | ||
| 655 | 666 | ||
| 656 | // Determine number of parameter nodes in XML element | 667 | // Determine number of parameter nodes in XML element |
| 657 | int npars = xml.elements("parameter"); | 668 | int npars = xml.elements("parameter"); |
| @@ -813,6 +824,13 @@ void GCTAObservation::write(GXmlElement& xml) const | @@ -813,6 +824,13 @@ void GCTAObservation::write(GXmlElement& xml) const | ||
| 813 | throw GException::invalid_value(G_WRITE, msg); | 824 | throw GException::invalid_value(G_WRITE, msg); |
| 814 | } | 825 | } |
| 815 | 826 | ||
| 827 | + if (m_lo_user_thres > 0.0) { | ||
| 828 | + xml.attribute("emin",gammalib::str(m_lo_user_thres)); | ||
| 829 | + } | ||
| 830 | + if (m_hi_user_thres > 0.0) { | ||
| 831 | + xml.attribute("emax",gammalib::str(m_hi_user_thres)); | ||
| 832 | + } | ||
| 833 | + | ||
| 816 | // If XML element has 0 nodes then add the required parameter nodes | 834 | // If XML element has 0 nodes then add the required parameter nodes |
| 817 | if (xml.elements() == 0) { | 835 | if (xml.elements() == 0) { |
| 818 | std::string text = "parameter name=\""+m_eventtype+"\""; | 836 | std::string text = "parameter name=\""+m_eventtype+"\""; |
| @@ -1033,6 +1051,7 @@ void GCTAObservation::load(const std::string& cntcube, | @@ -1033,6 +1051,7 @@ void GCTAObservation::load(const std::string& cntcube, | ||
| 1033 | ***************************************************************************/ | 1051 | ***************************************************************************/ |
| 1034 | void GCTAObservation::save(const std::string& filename, const bool& clobber) const | 1052 | void GCTAObservation::save(const std::string& filename, const bool& clobber) const |
| 1035 | { | 1053 | { |
| 1054 | + | ||
| 1036 | // Create FITS file | 1055 | // Create FITS file |
| 1037 | GFits fits; | 1056 | GFits fits; |
| 1038 | 1057 | ||
| @@ -1227,6 +1246,8 @@ void GCTAObservation::init_members(void) | @@ -1227,6 +1246,8 @@ void GCTAObservation::init_members(void) | ||
| 1227 | m_deadc = 0.0; | 1246 | m_deadc = 0.0; |
| 1228 | m_ra_obj = 0.0; | 1247 | m_ra_obj = 0.0; |
| 1229 | m_dec_obj = 0.0; | 1248 | m_dec_obj = 0.0; |
| 1249 | + m_lo_user_thres = 0.0; | ||
| 1250 | + m_hi_user_thres = 0.0; | ||
| 1230 | 1251 | ||
| 1231 | // Return | 1252 | // Return |
| 1232 | return; | 1253 | return; |
| @@ -1252,6 +1273,8 @@ void GCTAObservation::copy_members(const GCTAObservation& obs) | @@ -1252,6 +1273,8 @@ void GCTAObservation::copy_members(const GCTAObservation& obs) | ||
| 1252 | m_deadc = obs.m_deadc; | 1273 | m_deadc = obs.m_deadc; |
| 1253 | m_ra_obj = obs.m_ra_obj; | 1274 | m_ra_obj = obs.m_ra_obj; |
| 1254 | m_dec_obj = obs.m_dec_obj; | 1275 | m_dec_obj = obs.m_dec_obj; |
| 1276 | + m_lo_user_thres = obs.m_lo_user_thres; | ||
| 1277 | + m_hi_user_thres = obs.m_hi_user_thres; | ||
| 1255 | 1278 | ||
| 1256 | // Clone members | 1279 | // Clone members |
| 1257 | m_response = (obs.m_response != NULL) ? obs.m_response->clone() : NULL; | 1280 | m_response = (obs.m_response != NULL) ? obs.m_response->clone() : NULL; |
inst/cta/src/GCTAResponseIrf.cpp
| @@ -948,6 +948,17 @@ void GCTAResponseIrf::load_aeff(const std::string& filename) | @@ -948,6 +948,17 @@ void GCTAResponseIrf::load_aeff(const std::string& filename) | ||
| 948 | // If file contains an "EFFECTIVE AREA" extension then load it | 948 | // If file contains an "EFFECTIVE AREA" extension then load it |
| 949 | // as CTA response table | 949 | // as CTA response table |
| 950 | if (file.contains("EFFECTIVE AREA")) { | 950 | if (file.contains("EFFECTIVE AREA")) { |
| 951 | + | ||
| 952 | + const GFitsHDU* hdu = file.at("EFFECTIVE AREA"); | ||
| 953 | + | ||
| 954 | + // Read save energy threshold if available | ||
| 955 | + if (hdu->has_card("LO_THRES")) { | ||
| 956 | + m_lo_save_thres = hdu->real("LO_THRES"); | ||
| 957 | + } | ||
| 958 | + if (hdu->has_card("HI_THRES")) { | ||
| 959 | + m_hi_save_thres = hdu->real("HI_THRES"); | ||
| 960 | + } | ||
| 961 | + | ||
| 951 | file.close(); | 962 | file.close(); |
| 952 | m_aeff = new GCTAAeff2D(filename); | 963 | m_aeff = new GCTAAeff2D(filename); |
| 953 | } | 964 | } |
| @@ -955,6 +966,17 @@ void GCTAResponseIrf::load_aeff(const std::string& filename) | @@ -955,6 +966,17 @@ void GCTAResponseIrf::load_aeff(const std::string& filename) | ||
| 955 | // ... else if file contains a "SPECRESP" extension then load it | 966 | // ... else if file contains a "SPECRESP" extension then load it |
| 956 | // as ARF | 967 | // as ARF |
| 957 | else if (file.contains("SPECRESP")) { | 968 | else if (file.contains("SPECRESP")) { |
| 969 | + | ||
| 970 | + const GFitsHDU* hdu = file.at("SPECRESP"); | ||
| 971 | + | ||
| 972 | + // Read save energy threshold if available | ||
| 973 | + if (hdu->has_card("LO_THRES")) { | ||
| 974 | + m_lo_save_thres = file["SPECRESP"]->real("LO_THRES"); | ||
| 975 | + } | ||
| 976 | + if (hdu->has_card("LO_THRES")) { | ||
| 977 | + m_hi_save_thres = file["SPECRESP"]->real("HI_THRES"); | ||
| 978 | + } | ||
| 979 | + | ||
| 958 | file.close(); | 980 | file.close(); |
| 959 | m_aeff = new GCTAAeffArf(filename); | 981 | m_aeff = new GCTAAeffArf(filename); |
| 960 | } | 982 | } |
| @@ -2911,6 +2933,10 @@ void GCTAResponseIrf::init_members(void) | @@ -2911,6 +2933,10 @@ void GCTAResponseIrf::init_members(void) | ||
| 2911 | m_background = NULL; | 2933 | m_background = NULL; |
| 2912 | m_apply_edisp = false; //!< Switched off by default | 2934 | m_apply_edisp = false; //!< Switched off by default |
| 2913 | 2935 | ||
| 2936 | + // Energy thresholds | ||
| 2937 | + m_lo_save_thres = 0.0; | ||
| 2938 | + m_hi_save_thres = 0.0; | ||
| 2939 | + | ||
| 2914 | // XML response filenames | 2940 | // XML response filenames |
| 2915 | m_xml_caldb.clear(); | 2941 | m_xml_caldb.clear(); |
| 2916 | m_xml_rspname.clear(); | 2942 | m_xml_rspname.clear(); |
| @@ -2942,6 +2968,10 @@ void GCTAResponseIrf::copy_members(const GCTAResponseIrf& rsp) | @@ -2942,6 +2968,10 @@ void GCTAResponseIrf::copy_members(const GCTAResponseIrf& rsp) | ||
| 2942 | m_rspname = rsp.m_rspname; | 2968 | m_rspname = rsp.m_rspname; |
| 2943 | m_apply_edisp = rsp.m_apply_edisp; | 2969 | m_apply_edisp = rsp.m_apply_edisp; |
| 2944 | 2970 | ||
| 2971 | + // Copy energy thresholds | ||
| 2972 | + m_lo_save_thres = rsp.m_lo_save_thres; | ||
| 2973 | + m_hi_save_thres = rsp.m_hi_save_thres; | ||
| 2974 | + | ||
| 2945 | // Copy response filenames | 2975 | // Copy response filenames |
| 2946 | m_xml_caldb = rsp.m_xml_caldb; | 2976 | m_xml_caldb = rsp.m_xml_caldb; |
| 2947 | m_xml_rspname = rsp.m_xml_rspname; | 2977 | m_xml_rspname = rsp.m_xml_rspname; |
src/obs/GObservations.cpp
| @@ -646,7 +646,7 @@ void GObservations::write(GXml& xml) const | @@ -646,7 +646,7 @@ void GObservations::write(GXml& xml) const | ||
| 646 | 646 | ||
| 647 | // Write all observations into library | 647 | // Write all observations into library |
| 648 | for (int i = 0; i < size(); ++i) { | 648 | for (int i = 0; i < size(); ++i) { |
| 649 | - | 649 | + |
| 650 | // Initialise pointer on observation | 650 | // Initialise pointer on observation |
| 651 | GXmlElement* obs = NULL; | 651 | GXmlElement* obs = NULL; |
| 652 | 652 | ||
| @@ -670,7 +670,7 @@ void GObservations::write(GXml& xml) const | @@ -670,7 +670,7 @@ void GObservations::write(GXml& xml) const | ||
| 670 | obs->attribute("id", m_obs[i]->id()); | 670 | obs->attribute("id", m_obs[i]->id()); |
| 671 | obs->attribute("instrument", m_obs[i]->instrument()); | 671 | obs->attribute("instrument", m_obs[i]->instrument()); |
| 672 | } | 672 | } |
| 673 | - | 673 | + |
| 674 | // Write now observation | 674 | // Write now observation |
| 675 | m_obs[i]->write(*obs); | 675 | m_obs[i]->write(*obs); |
| 676 | 676 |