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; | ... | ... |