Commit f54762c925814a56be31968153ee9ffa16d9f68b
1 parent
bc5cda86
Implement specific cache for binned data at the level of GCTAResponseIrf (#3316)
By moving the specific cache from GCTAReponseCube to GResponseIrf, the specific cache is also available for binned analysis.
Showing
11 changed files
with
226 additions
and
220 deletions
ChangeLog
| ... | ... | @@ -3,7 +3,8 @@ |
| 3 | 3 | * Bug fix version 1.7.1 released |
| 4 | 4 | ================================ |
| 5 | 5 | |
| 6 | - Implement specific response cache for CTA stacked analysis (#3316) | |
| 6 | + Implement specific response cache for CTA binned and stacked | |
| 7 | + analysis (#3316) | |
| 7 | 8 | Speed up model definition XML file writing (#3308) |
| 8 | 9 | Fix automatic type casting in Python interface (#3295) |
| 9 | 10 | Make parameter file reading and writing thread safe (#3287) | ... | ... |
NEWS
| ... | ... | @@ -144,10 +144,10 @@ None |
| 144 | 144 | |
| 145 | 145 | 20. CTA interface |
| 146 | 146 | ----------------- |
| 147 | -A specific response cache was implemented for the stacked analysis that reduces | |
| 148 | -the memory requirements by at least a factor of 6. Instead of using the std::map | |
| 149 | -cache, the full data-space is cached, avoiding the need for any bookkeeping | |
| 150 | -(#3316). | |
| 147 | +A specific response cache was implemented for the binned and stacked analysis | |
| 148 | +that reduces the memory requirements by at least a factor of 6. Instead of | |
| 149 | +using the std::map cache, the full data cube is cached, avoiding the need for | |
| 150 | +any bookkeeping that takes a lot of memory in the traditional cache (#3316). | |
| 151 | 151 | |
| 152 | 152 | |
| 153 | 153 | 21. COMPTEL interface | ... | ... |
doc/source/admin/release_history/1.7.1.rst
| ... | ... | @@ -11,7 +11,7 @@ GammaLib 1.7.1 is a bug fix release for GammaLib release 1.7. |
| 11 | 11 | The following bugs were fixed: |
| 12 | 12 | |
| 13 | 13 | * [`3316 <https://cta-redmine.irap.omp.eu/issues/3316>`_] - |
| 14 | - Implement specific response cache for CTA stacked analysis | |
| 14 | + Implement specific response cache for CTA binned and stacked analysis | |
| 15 | 15 | * [`3308 <https://cta-redmine.irap.omp.eu/issues/3308>`_] - |
| 16 | 16 | Speed up model definition XML file writing |
| 17 | 17 | * [`3295 <https://cta-redmine.irap.omp.eu/issues/3295>`_] - | ... | ... |
inst/cta/include/GCTAResponse.hpp
| ... | ... | @@ -29,6 +29,7 @@ |
| 29 | 29 | |
| 30 | 30 | /* __ Includes ___________________________________________________________ */ |
| 31 | 31 | #include <string> |
| 32 | +#include "GNdarray.hpp" | |
| 32 | 33 | #include "GResponse.hpp" |
| 33 | 34 | |
| 34 | 35 | /* __ Type definitions ___________________________________________________ */ |
| ... | ... | @@ -84,11 +85,20 @@ public: |
| 84 | 85 | virtual void write(GXmlElement& xml) const = 0; |
| 85 | 86 | virtual std::string print(const GChatter& chatter = NORMAL) const = 0; |
| 86 | 87 | |
| 88 | + // Overloaded virtual base class methods | |
| 89 | + virtual double irf_spatial(const GEvent& event, | |
| 90 | + const GSource& source, | |
| 91 | + const GObservation& obs) const; | |
| 92 | + | |
| 87 | 93 | protected: |
| 88 | 94 | // Protected methods |
| 89 | 95 | void init_members(void); |
| 90 | 96 | void copy_members(const GCTAResponse& rsp); |
| 91 | 97 | void free_members(void); |
| 98 | + | |
| 99 | + // Kludge: cube response cache | |
| 100 | + mutable std::vector<std::string> m_cache_names; //!< Model names | |
| 101 | + mutable std::vector<GNdarray> m_cache_values; //!< Cached values | |
| 92 | 102 | }; |
| 93 | 103 | |
| 94 | 104 | #endif /* GCTARESPONSE_HPP */ | ... | ... |
inst/cta/include/GCTAResponseCube.hpp
| ... | ... | @@ -30,7 +30,6 @@ |
| 30 | 30 | /* __ Includes ___________________________________________________________ */ |
| 31 | 31 | #include <string> |
| 32 | 32 | #include <vector> |
| 33 | -#include "GNdarray.hpp" | |
| 34 | 33 | #include "GCTAResponse.hpp" |
| 35 | 34 | #include "GCTACubeExposure.hpp" |
| 36 | 35 | #include "GCTACubePsf.hpp" |
| ... | ... | @@ -98,11 +97,6 @@ public: |
| 98 | 97 | virtual void write(GXmlElement& xml) const; |
| 99 | 98 | virtual std::string print(const GChatter& chatter = NORMAL) const; |
| 100 | 99 | |
| 101 | - // Overloaded virtual base class methods | |
| 102 | - virtual double irf_spatial(const GEvent& event, | |
| 103 | - const GSource& source, | |
| 104 | - const GObservation& obs) const; | |
| 105 | - | |
| 106 | 100 | // Other Methods |
| 107 | 101 | const GCTACubeExposure& exposure(void) const; |
| 108 | 102 | void exposure(const GCTACubeExposure& exposure); |
| ... | ... | @@ -153,10 +147,6 @@ private: |
| 153 | 147 | GCTACubeEdisp m_edisp; //!< Energy dispersion cube |
| 154 | 148 | mutable bool m_apply_edisp; //!< Apply energy dispersion |
| 155 | 149 | mutable bool m_has_edisp; //!< Flag to indicate if energy |
| 156 | - | |
| 157 | - // Kludge: cube response cache | |
| 158 | - mutable std::vector<std::string> m_cache_names; //!< Model names | |
| 159 | - mutable std::vector<GNdarray> m_cache_values; //!< Cached values | |
| 160 | 150 | }; |
| 161 | 151 | |
| 162 | 152 | ... | ... |
inst/cta/pyext/GCTAResponse.i
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * GCTAResponse.i - CTA response abstract base class * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2019 by Juergen Knoedlseder * | |
| 4 | + * copyright (C) 2010-2020 by Juergen Knoedlseder * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software: you can redistribute it and/or modify * |
| ... | ... | @@ -58,7 +58,10 @@ public: |
| 58 | 58 | virtual void read(const GXmlElement& xml) = 0; |
| 59 | 59 | virtual void write(GXmlElement& xml) const = 0; |
| 60 | 60 | |
| 61 | - // Implemeted methods | |
| 61 | + // Overloaded virtual base class methods | |
| 62 | + virtual double irf_spatial(const GEvent& event, | |
| 63 | + const GSource& source, | |
| 64 | + const GObservation& obs) const; | |
| 62 | 65 | }; |
| 63 | 66 | |
| 64 | 67 | ... | ... |
inst/cta/pyext/GCTAResponseCube.i
| ... | ... | @@ -68,11 +68,6 @@ public: |
| 68 | 68 | virtual void read(const GXmlElement& xml); |
| 69 | 69 | virtual void write(GXmlElement& xml) const; |
| 70 | 70 | |
| 71 | - // Overloaded virtual base class methods | |
| 72 | - virtual double irf_spatial(const GEvent& event, | |
| 73 | - const GSource& source, | |
| 74 | - const GObservation& obs) const; | |
| 75 | - | |
| 76 | 71 | // Other Methods |
| 77 | 72 | const GCTACubeExposure& exposure(void) const; |
| 78 | 73 | void exposure(const GCTACubeExposure& exposure); | ... | ... |
inst/cta/pyext/GCTAResponseIrf.i
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * GCTAResponseIrf.i - CTA instrument response function class * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2018 by Juergen Knoedlseder * | |
| 4 | + * copyright (C) 2010-2020 by Juergen Knoedlseder * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software: you can redistribute it and/or modify * |
| ... | ... | @@ -60,8 +60,6 @@ public: |
| 60 | 60 | virtual void read(const GXmlElement& xml); |
| 61 | 61 | virtual void write(GXmlElement& xml) const; |
| 62 | 62 | |
| 63 | - // Overload virtual base class methods | |
| 64 | - | |
| 65 | 63 | // Other Methods |
| 66 | 64 | bool apply_edisp(void) const; |
| 67 | 65 | void apply_edisp(const bool& apply_edisp) const; | ... | ... |
inst/cta/src/GCTAResponse.cpp
| ... | ... | @@ -33,6 +33,8 @@ |
| 33 | 33 | #include "GObservations.hpp" |
| 34 | 34 | #include "GModelSpatial.hpp" |
| 35 | 35 | #include "GModelSpatialComposite.hpp" |
| 36 | +#include "GCTAEventCube.hpp" // Kludge | |
| 37 | +#include "GCTAEventBin.hpp" // Kludge | |
| 36 | 38 | #include "GCTAResponse.hpp" |
| 37 | 39 | #include "GCTASupport.hpp" |
| 38 | 40 | |
| ... | ... | @@ -151,6 +153,199 @@ GCTAResponse& GCTAResponse::operator=(const GCTAResponse& rsp) |
| 151 | 153 | = = |
| 152 | 154 | ==========================================================================*/ |
| 153 | 155 | |
| 156 | +/***********************************************************************//** | |
| 157 | + * @brief Return instrument response integrated over the spatial model | |
| 158 | + * | |
| 159 | + * @param[in] event Event. | |
| 160 | + * @param[in] source Source. | |
| 161 | + * @param[in] obs Observation. | |
| 162 | + * @return Instrument response to a spatial model. | |
| 163 | + * | |
| 164 | + * Returns the instrument response for a given event, source and observation | |
| 165 | + * integrated over the spatial model component. The method computes | |
| 166 | + * | |
| 167 | + * \f[ | |
| 168 | + * {\tt irf}(p', E', t') = \int_p M_{\rm S}(p | E, t) \, | |
| 169 | + * R(p', E', t' | p, E, t) \, d\,p | |
| 170 | + * \f] | |
| 171 | + * | |
| 172 | + * where | |
| 173 | + * * \f$M_{\rm S}(p | E, t)\f$ is the spatial model component, | |
| 174 | + * * \f$R(p', E', t' | p, E, t)\f$ is the Instrument Response Function (IRF), | |
| 175 | + * * \f$p'\f$ is the measured instrument direction, | |
| 176 | + * * \f$E'\f$ is the measured or reconstructed energy, | |
| 177 | + * * \f$t'\f$ is the measured arrival time, | |
| 178 | + * * \f$p\f$ is the true photon arrival direction, | |
| 179 | + * * \f$E\f$ is the true photon energy, and | |
| 180 | + * * \f$t\f$ is the true trigger time. | |
| 181 | + * | |
| 182 | + * The integration is done over all relevant true sky directions \f$p\f$. | |
| 183 | + * | |
| 184 | + * Depending on the type of the source model the method branches to the | |
| 185 | + * following methods to perform the actual computations | |
| 186 | + * | |
| 187 | + * irf_ptsrc() - for the handling of a point source | |
| 188 | + * irf_radial() - for radial models | |
| 189 | + * irf_elliptical() - for elliptical models | |
| 190 | + * irf_diffuse() - for diffuse models | |
| 191 | + * irf_composite() - for composite models | |
| 192 | + * | |
| 193 | + * The method implements a caching mechanism for spatial models that have all | |
| 194 | + * parameters fixed. For those models the instrument response for a given | |
| 195 | + * event and observation is only computed once and then stored in an internal | |
| 196 | + * cache from which it is fetched back in case that the method is called | |
| 197 | + * again for the same event and observation. | |
| 198 | + ***************************************************************************/ | |
| 199 | +double GCTAResponse::irf_spatial(const GEvent& event, | |
| 200 | + const GSource& source, | |
| 201 | + const GObservation& obs) const | |
| 202 | +{ | |
| 203 | + // Initialise IRF value | |
| 204 | + double irf = 0.0; | |
| 205 | + | |
| 206 | + // Set IRF value attributes | |
| 207 | + std::string name = obs.id() + "::" + source.name(); | |
| 208 | + const GInstDir& dir = event.dir(); | |
| 209 | + const GEnergy& ereco = event.energy(); | |
| 210 | + const GEnergy& etrue = source.energy(); | |
| 211 | + | |
| 212 | + // Signal if spatial model has free parameters | |
| 213 | + bool has_free_pars = source.model()->has_free_pars(); | |
| 214 | + | |
| 215 | + // Kludge: if the response cache should be used, the event is a bin, the | |
| 216 | + // model has no free parameters, and there is no energy dispersion then | |
| 217 | + // use the special cache for binned or stacked analysis | |
| 218 | + bool use_kludge = false; | |
| 219 | + if (m_use_irf_cache && event.is_bin() && !has_free_pars && !use_edisp()) { | |
| 220 | + | |
| 221 | + // Get reference to CTA event bin | |
| 222 | + const GCTAEventBin& bin = static_cast<const GCTAEventBin&>(event); | |
| 223 | + | |
| 224 | + // If pixel and energy indices are valid then proceed with the kludge | |
| 225 | + if (bin.ipix() >= 0 && bin.ieng() >=0) { | |
| 226 | + | |
| 227 | + // Signal that kludge will be used | |
| 228 | + use_kludge = true; | |
| 229 | + | |
| 230 | + // Build unique cache name | |
| 231 | + std::string name = obs.id() + "::" + source.name(); | |
| 232 | + | |
| 233 | + // Get index in cache, returns -1 if name is not found in cache | |
| 234 | + int index = -1; | |
| 235 | + for (int i = 0; i < m_cache_names.size(); ++i) { | |
| 236 | + if (m_cache_names[i] == name) { | |
| 237 | + index = i; | |
| 238 | + break; | |
| 239 | + } | |
| 240 | + } | |
| 241 | + | |
| 242 | + // If index was not found then allocate a new cache map | |
| 243 | + if (index == -1) { | |
| 244 | + | |
| 245 | + // Get pointer to event cube | |
| 246 | + const GCTAEventCube* cube = | |
| 247 | + static_cast<const GCTAEventCube*>(obs.events()); | |
| 248 | + | |
| 249 | + // Allocate cache | |
| 250 | + GNdarray cache(cube->nx()*cube->ny(), cube->ebins()); | |
| 251 | + | |
| 252 | + // Initialise all cache values with -1 (not set) | |
| 253 | + for (int i = 0; i < cache.size(); ++i) { | |
| 254 | + cache(i) = -1.0; | |
| 255 | + } | |
| 256 | + | |
| 257 | + // Insert cache | |
| 258 | + m_cache_names.push_back(name); | |
| 259 | + m_cache_values.push_back(cache); | |
| 260 | + | |
| 261 | + // Set index | |
| 262 | + index = m_cache_names.size()-1; | |
| 263 | + | |
| 264 | + } // endif: allocated new cache | |
| 265 | + | |
| 266 | + // Get cache value | |
| 267 | + irf = m_cache_values[index](bin.ipix(), bin.ieng()); | |
| 268 | + | |
| 269 | + // If cache value is not valid then compute IRF | |
| 270 | + if (irf < 0.0) { | |
| 271 | + | |
| 272 | + // Compute IRF for spatial model | |
| 273 | + switch (source.model()->code()) { | |
| 274 | + case GMODEL_SPATIAL_POINT_SOURCE: | |
| 275 | + irf = irf_ptsrc(event, source, obs); | |
| 276 | + break; | |
| 277 | + case GMODEL_SPATIAL_RADIAL: | |
| 278 | + irf = irf_radial(event, source, obs); | |
| 279 | + break; | |
| 280 | + case GMODEL_SPATIAL_ELLIPTICAL: | |
| 281 | + irf = irf_elliptical(event, source, obs); | |
| 282 | + break; | |
| 283 | + case GMODEL_SPATIAL_DIFFUSE: | |
| 284 | + irf = irf_diffuse(event, source, obs); | |
| 285 | + break; | |
| 286 | + case GMODEL_SPATIAL_COMPOSITE: | |
| 287 | + irf = irf_composite(event, source, obs); | |
| 288 | + break; | |
| 289 | + default: | |
| 290 | + break; | |
| 291 | + } | |
| 292 | + | |
| 293 | + // Set cache value | |
| 294 | + m_cache_values[index](bin.ipix(), bin.ieng()) = irf; | |
| 295 | + | |
| 296 | + } // endif: computed IRF | |
| 297 | + | |
| 298 | + } // endif: event bin was part of cube | |
| 299 | + | |
| 300 | + } // endif: kludge | |
| 301 | + | |
| 302 | + // If kludge was not used then use the release 1.7 response cache | |
| 303 | + if (!use_kludge) { | |
| 304 | + | |
| 305 | + // If the spatial model component has free parameters, or the response | |
| 306 | + // cache should not be used, or the cache does not contain the requested | |
| 307 | + // IRF value then compute the IRF value for the spatial model. | |
| 308 | + if (has_free_pars || | |
| 309 | + !m_use_irf_cache || | |
| 310 | + !m_irf_cache.contains(name, dir, ereco, etrue, &irf)) { | |
| 311 | + | |
| 312 | + // Compute IRF for spatial model | |
| 313 | + switch (source.model()->code()) { | |
| 314 | + case GMODEL_SPATIAL_POINT_SOURCE: | |
| 315 | + irf = irf_ptsrc(event, source, obs); | |
| 316 | + break; | |
| 317 | + case GMODEL_SPATIAL_RADIAL: | |
| 318 | + irf = irf_radial(event, source, obs); | |
| 319 | + break; | |
| 320 | + case GMODEL_SPATIAL_ELLIPTICAL: | |
| 321 | + irf = irf_elliptical(event, source, obs); | |
| 322 | + break; | |
| 323 | + case GMODEL_SPATIAL_DIFFUSE: | |
| 324 | + irf = irf_diffuse(event, source, obs); | |
| 325 | + break; | |
| 326 | + case GMODEL_SPATIAL_COMPOSITE: | |
| 327 | + irf = irf_composite(event, source, obs); | |
| 328 | + break; | |
| 329 | + default: | |
| 330 | + break; | |
| 331 | + } | |
| 332 | + | |
| 333 | + } // endif: computed spatial model | |
| 334 | + | |
| 335 | + // If the spatial model has no free parameters and the response cache | |
| 336 | + // should be used then put the IRF value in the response cache. | |
| 337 | + if (!has_free_pars && m_use_irf_cache) { | |
| 338 | + m_irf_cache.set(name, dir, ereco, etrue, irf); | |
| 339 | + } | |
| 340 | + | |
| 341 | + } // endelse: used release 1.7 response cache | |
| 342 | + | |
| 343 | + // Return IRF value | |
| 344 | + return irf; | |
| 345 | +} | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 154 | 349 | /*========================================================================== |
| 155 | 350 | = = |
| 156 | 351 | = Private methods = |
| ... | ... | @@ -162,6 +357,10 @@ GCTAResponse& GCTAResponse::operator=(const GCTAResponse& rsp) |
| 162 | 357 | ***************************************************************************/ |
| 163 | 358 | void GCTAResponse::init_members(void) |
| 164 | 359 | { |
| 360 | + // Kludge: Initialise cube response cache | |
| 361 | + m_cache_names.clear(); | |
| 362 | + m_cache_values.clear(); | |
| 363 | + | |
| 165 | 364 | // Return |
| 166 | 365 | return; |
| 167 | 366 | } |
| ... | ... | @@ -174,6 +373,10 @@ void GCTAResponse::init_members(void) |
| 174 | 373 | ***************************************************************************/ |
| 175 | 374 | void GCTAResponse::copy_members(const GCTAResponse& rsp) |
| 176 | 375 | { |
| 376 | + // Kludge: Copy cube response cache | |
| 377 | + m_cache_names = rsp.m_cache_names; | |
| 378 | + m_cache_values = rsp.m_cache_values; | |
| 379 | + | |
| 177 | 380 | // Return |
| 178 | 381 | return; |
| 179 | 382 | } | ... | ... |
inst/cta/src/GCTAResponseCube.cpp
| ... | ... | @@ -50,8 +50,6 @@ |
| 50 | 50 | #include "GCTAInstDir.hpp" |
| 51 | 51 | #include "GCTAEventBin.hpp" |
| 52 | 52 | #include "GCTASupport.hpp" |
| 53 | -#include "GCTAEventCube.hpp" // Kludge | |
| 54 | -#include "GCTAEventBin.hpp" // Kludge | |
| 55 | 53 | |
| 56 | 54 | /* __ Method name definitions ____________________________________________ */ |
| 57 | 55 | #define G_IRF "GCTAResponseCube::irf(GEvent&, GPhoton& GObservation&)" |
| ... | ... | @@ -445,188 +443,6 @@ GEbounds GCTAResponseCube::ebounds(const GEnergy& obsEng) const |
| 445 | 443 | |
| 446 | 444 | |
| 447 | 445 | /***********************************************************************//** |
| 448 | - * @brief Return instrument response integrated over the spatial model | |
| 449 | - * | |
| 450 | - * @param[in] event Event. | |
| 451 | - * @param[in] source Source. | |
| 452 | - * @param[in] obs Observation. | |
| 453 | - * @return Instrument response to a spatial model. | |
| 454 | - * | |
| 455 | - * Returns the instrument response for a given event, source and observation | |
| 456 | - * integrated over the spatial model component. The method computes | |
| 457 | - * | |
| 458 | - * \f[ | |
| 459 | - * {\tt irf}(p', E', t') = \int_p M_{\rm S}(p | E, t) \, | |
| 460 | - * R(p', E', t' | p, E, t) \, d\,p | |
| 461 | - * \f] | |
| 462 | - * | |
| 463 | - * where | |
| 464 | - * * \f$M_{\rm S}(p | E, t)\f$ is the spatial model component, | |
| 465 | - * * \f$R(p', E', t' | p, E, t)\f$ is the Instrument Response Function (IRF), | |
| 466 | - * * \f$p'\f$ is the measured instrument direction, | |
| 467 | - * * \f$E'\f$ is the measured or reconstructed energy, | |
| 468 | - * * \f$t'\f$ is the measured arrival time, | |
| 469 | - * * \f$p\f$ is the true photon arrival direction, | |
| 470 | - * * \f$E\f$ is the true photon energy, and | |
| 471 | - * * \f$t\f$ is the true trigger time. | |
| 472 | - * | |
| 473 | - * The integration is done over all relevant true sky directions \f$p\f$. | |
| 474 | - * | |
| 475 | - * Depending on the type of the source model the method branches to the | |
| 476 | - * following methods to perform the actual computations | |
| 477 | - * | |
| 478 | - * irf_ptsrc() - for the handling of a point source | |
| 479 | - * irf_radial() - for radial models | |
| 480 | - * irf_elliptical() - for elliptical models | |
| 481 | - * irf_diffuse() - for diffuse models | |
| 482 | - * irf_composite() - for composite models | |
| 483 | - * | |
| 484 | - * The method implements a caching mechanism for spatial models that have all | |
| 485 | - * parameters fixed. For those models the instrument response for a given | |
| 486 | - * event and observation is only computed once and then stored in an internal | |
| 487 | - * cache from which it is fetched back in case that the method is called | |
| 488 | - * again for the same event and observation. | |
| 489 | - ***************************************************************************/ | |
| 490 | -double GCTAResponseCube::irf_spatial(const GEvent& event, | |
| 491 | - const GSource& source, | |
| 492 | - const GObservation& obs) const | |
| 493 | -{ | |
| 494 | - // Initialise IRF value | |
| 495 | - double irf = 0.0; | |
| 496 | - | |
| 497 | - // Set IRF value attributes | |
| 498 | - std::string name = obs.id() + "::" + source.name(); | |
| 499 | - const GInstDir& dir = event.dir(); | |
| 500 | - const GEnergy& ereco = event.energy(); | |
| 501 | - const GEnergy& etrue = source.energy(); | |
| 502 | - | |
| 503 | - // Signal if spatial model has free parameters | |
| 504 | - bool has_free_pars = source.model()->has_free_pars(); | |
| 505 | - | |
| 506 | - // Kludge: the IRF response cache should be used, the model has no | |
| 507 | - // free parameters and there is no energy dispersion | |
| 508 | - if (m_use_irf_cache && !has_free_pars && !use_edisp()) { | |
| 509 | - | |
| 510 | - // Build unique cache name | |
| 511 | - std::string name = obs.id() + "::" + source.name(); | |
| 512 | - | |
| 513 | - // Get index in cache, returns -1 if name is not found in cache | |
| 514 | - int index = -1; | |
| 515 | - for (int i = 0; i < m_cache_names.size(); ++i) { | |
| 516 | - if (m_cache_names[i] == name) { | |
| 517 | - index = i; | |
| 518 | - break; | |
| 519 | - } | |
| 520 | - } | |
| 521 | - | |
| 522 | - // If index was not found then allocate a new cache map | |
| 523 | - if (index == -1) { | |
| 524 | - | |
| 525 | - // Get pointer to event cube | |
| 526 | - const GCTAEventCube* cube = | |
| 527 | - static_cast<const GCTAEventCube*>(obs.events()); | |
| 528 | - | |
| 529 | - // Allocate cache | |
| 530 | - GNdarray cache(cube->nx()*cube->ny(), cube->ebins()); | |
| 531 | - | |
| 532 | - // Initialise all cache values with -1 (not set) | |
| 533 | - for (int i = 0; i < cache.size(); ++i) { | |
| 534 | - cache(i) = -1.0; | |
| 535 | - } | |
| 536 | - | |
| 537 | - // Insert cache | |
| 538 | - m_cache_names.push_back(name); | |
| 539 | - m_cache_values.push_back(cache); | |
| 540 | - | |
| 541 | - // Set index | |
| 542 | - index = m_cache_names.size()-1; | |
| 543 | - | |
| 544 | - } // endif: allocated new cache | |
| 545 | - | |
| 546 | - // Get reference to CTA event bin | |
| 547 | - const GCTAEventBin& bin = static_cast<const GCTAEventBin&>(event); | |
| 548 | - | |
| 549 | - // Get cache value | |
| 550 | - irf = m_cache_values[index](bin.ipix(), bin.ieng()); | |
| 551 | - | |
| 552 | - // If cache value is not valid then copute IRF | |
| 553 | - if (irf < 0.0) { | |
| 554 | - | |
| 555 | - // Compute IRF for spatial model | |
| 556 | - switch (source.model()->code()) { | |
| 557 | - case GMODEL_SPATIAL_POINT_SOURCE: | |
| 558 | - irf = irf_ptsrc(event, source, obs); | |
| 559 | - break; | |
| 560 | - case GMODEL_SPATIAL_RADIAL: | |
| 561 | - irf = irf_radial(event, source, obs); | |
| 562 | - break; | |
| 563 | - case GMODEL_SPATIAL_ELLIPTICAL: | |
| 564 | - irf = irf_elliptical(event, source, obs); | |
| 565 | - break; | |
| 566 | - case GMODEL_SPATIAL_DIFFUSE: | |
| 567 | - irf = irf_diffuse(event, source, obs); | |
| 568 | - break; | |
| 569 | - case GMODEL_SPATIAL_COMPOSITE: | |
| 570 | - irf = irf_composite(event, source, obs); | |
| 571 | - break; | |
| 572 | - default: | |
| 573 | - break; | |
| 574 | - } | |
| 575 | - | |
| 576 | - // Set cache value | |
| 577 | - m_cache_values[index](bin.ipix(), bin.ieng()) = irf; | |
| 578 | - | |
| 579 | - } // endif: computed IRF | |
| 580 | - | |
| 581 | - } // endif: kludge | |
| 582 | - | |
| 583 | - // ... otherwise use release 1.7 response cache | |
| 584 | - else { | |
| 585 | - | |
| 586 | - // If the spatial model component has free parameters, or the response | |
| 587 | - // cache should not be used, or the cache does not contain the requested | |
| 588 | - // IRF value then compute the IRF value for the spatial model. | |
| 589 | - if (has_free_pars || | |
| 590 | - !m_use_irf_cache || | |
| 591 | - !m_irf_cache.contains(name, dir, ereco, etrue, &irf)) { | |
| 592 | - | |
| 593 | - // Compute IRF for spatial model | |
| 594 | - switch (source.model()->code()) { | |
| 595 | - case GMODEL_SPATIAL_POINT_SOURCE: | |
| 596 | - irf = irf_ptsrc(event, source, obs); | |
| 597 | - break; | |
| 598 | - case GMODEL_SPATIAL_RADIAL: | |
| 599 | - irf = irf_radial(event, source, obs); | |
| 600 | - break; | |
| 601 | - case GMODEL_SPATIAL_ELLIPTICAL: | |
| 602 | - irf = irf_elliptical(event, source, obs); | |
| 603 | - break; | |
| 604 | - case GMODEL_SPATIAL_DIFFUSE: | |
| 605 | - irf = irf_diffuse(event, source, obs); | |
| 606 | - break; | |
| 607 | - case GMODEL_SPATIAL_COMPOSITE: | |
| 608 | - irf = irf_composite(event, source, obs); | |
| 609 | - break; | |
| 610 | - default: | |
| 611 | - break; | |
| 612 | - } | |
| 613 | - | |
| 614 | - } // endif: computed spatial model | |
| 615 | - | |
| 616 | - // If the spatial model has no free parameters and the response cache | |
| 617 | - // should be used then put the IRF value in the response cache. | |
| 618 | - if (!has_free_pars && m_use_irf_cache) { | |
| 619 | - m_irf_cache.set(name, dir, ereco, etrue, irf); | |
| 620 | - } | |
| 621 | - | |
| 622 | - } // endelse: used release 1.7 response cache | |
| 623 | - | |
| 624 | - // Return IRF value | |
| 625 | - return irf; | |
| 626 | -} | |
| 627 | - | |
| 628 | - | |
| 629 | -/***********************************************************************//** | |
| 630 | 446 | * @brief Read response information from XML element |
| 631 | 447 | * |
| 632 | 448 | * @param[in] xml XML element. |
| ... | ... | @@ -820,10 +636,6 @@ void GCTAResponseCube::init_members(void) |
| 820 | 636 | m_apply_edisp = false; |
| 821 | 637 | m_has_edisp = false; |
| 822 | 638 | |
| 823 | - // Kludge: Initialise cube response cache | |
| 824 | - m_cache_names.clear(); | |
| 825 | - m_cache_values.clear(); | |
| 826 | - | |
| 827 | 639 | // Return |
| 828 | 640 | return; |
| 829 | 641 | } |
| ... | ... | @@ -844,10 +656,6 @@ void GCTAResponseCube::copy_members(const GCTAResponseCube& rsp) |
| 844 | 656 | m_apply_edisp = rsp.m_apply_edisp; |
| 845 | 657 | m_has_edisp = rsp.m_has_edisp; |
| 846 | 658 | |
| 847 | - // Kludge: Copy cube response cache | |
| 848 | - m_cache_names = rsp.m_cache_names; | |
| 849 | - m_cache_values = rsp.m_cache_values; | |
| 850 | - | |
| 851 | 659 | // Return |
| 852 | 660 | return; |
| 853 | 661 | } | ... | ... |
inst/cta/src/GCTAResponseIrf.cpp
| ... | ... | @@ -2131,8 +2131,6 @@ void GCTAResponseIrf::copy_members(const GCTAResponseIrf& rsp) |
| 2131 | 2131 | m_xml_caldb = rsp.m_xml_caldb; |
| 2132 | 2132 | m_xml_rspname = rsp.m_xml_rspname; |
| 2133 | 2133 | |
| 2134 | - // Copy nroi cache | |
| 2135 | - | |
| 2136 | 2134 | // Clone members |
| 2137 | 2135 | m_aeff = (rsp.m_aeff != NULL) ? rsp.m_aeff->clone() : NULL; |
| 2138 | 2136 | m_psf = (rsp.m_psf != NULL) ? rsp.m_psf->clone() : NULL; | ... | ... |