Commit 7883799b9fd8ab9530f440f9af9541516879e9e1

Authored by Jürgen Knödlseder
1 parent c51109f5

Add GResponse::use_source() method (#3312)

include/GResponse.hpp
... ... @@ -119,6 +119,9 @@ protected:
119 119 const bool& grad) const;
120 120  
121 121 // Virtual protected methods
  122 + virtual bool use_source(const GEvent& event,
  123 + const GSource& source,
  124 + const GObservation& obs) const;
122 125 virtual double irf_ptsrc(const GEvent& event,
123 126 const GSource& source,
124 127 const GObservation& obs) const;
... ...
src/obs/GResponse.cpp
... ... @@ -308,50 +308,55 @@ double GResponse::irf_spatial(const GEvent& event,
308 308 // Initialise IRF value
309 309 double irf = 0.0;
310 310  
311   - // Set IRF value attributes
312   - std::string name = obs.id() + "::" + source.name();
313   - const GInstDir& dir = event.dir();
314   - const GEnergy& ereco = event.energy();
315   - const GEnergy& etrue = source.energy();
316   -
317   - // Signal if spatial model has free parameters
318   - bool has_free_pars = source.model()->has_free_pars();
319   -
320   - // If the spatial model component has free parameters, or the response
321   - // cache should not be used, or the cache does not contain the requested
322   - // IRF value then compute the IRF value for the spatial model.
323   - if (has_free_pars ||
324   - !m_use_irf_cache ||
325   - !m_irf_cache.contains(name, dir, ereco, etrue, &irf)) {
326   -
327   - // Compute IRF for spatial model
328   - switch (source.model()->code()) {
329   - case GMODEL_SPATIAL_POINT_SOURCE:
330   - irf = irf_ptsrc(event, source, obs);
331   - break;
332   - case GMODEL_SPATIAL_RADIAL:
333   - irf = irf_radial(event, source, obs);
334   - break;
335   - case GMODEL_SPATIAL_ELLIPTICAL:
336   - irf = irf_elliptical(event, source, obs);
337   - break;
338   - case GMODEL_SPATIAL_DIFFUSE:
339   - irf = irf_diffuse(event, source, obs);
340   - break;
341   - case GMODEL_SPATIAL_COMPOSITE:
342   - irf = irf_composite(event, source, obs);
343   - break;
344   - default:
345   - break;
346   - }
  311 + // Continue only if source should be used
  312 + if (use_source(event, source, obs)) {
  313 +
  314 + // Set IRF value attributes
  315 + std::string name = obs.id() + "::" + source.name();
  316 + const GInstDir& dir = event.dir();
  317 + const GEnergy& ereco = event.energy();
  318 + const GEnergy& etrue = source.energy();
  319 +
  320 + // Signal if spatial model has free parameters
  321 + bool has_free_pars = source.model()->has_free_pars();
  322 +
  323 + // If the spatial model component has free parameters, or the response
  324 + // cache should not be used, or the cache does not contain the requested
  325 + // IRF value then compute the IRF value for the spatial model.
  326 + if (has_free_pars ||
  327 + !m_use_irf_cache ||
  328 + !m_irf_cache.contains(name, dir, ereco, etrue, &irf)) {
  329 +
  330 + // Compute IRF for spatial model
  331 + switch (source.model()->code()) {
  332 + case GMODEL_SPATIAL_POINT_SOURCE:
  333 + irf = irf_ptsrc(event, source, obs);
  334 + break;
  335 + case GMODEL_SPATIAL_RADIAL:
  336 + irf = irf_radial(event, source, obs);
  337 + break;
  338 + case GMODEL_SPATIAL_ELLIPTICAL:
  339 + irf = irf_elliptical(event, source, obs);
  340 + break;
  341 + case GMODEL_SPATIAL_DIFFUSE:
  342 + irf = irf_diffuse(event, source, obs);
  343 + break;
  344 + case GMODEL_SPATIAL_COMPOSITE:
  345 + irf = irf_composite(event, source, obs);
  346 + break;
  347 + default:
  348 + break;
  349 + }
347 350  
348   - } // endif: computed spatial model
  351 + } // endif: computed spatial model
349 352  
350   - // If the spatial model has no free parameters and the response cache
351   - // should be used then put the IRF value in the response cache.
352   - if (!has_free_pars && m_use_irf_cache) {
353   - m_irf_cache.set(name, dir, ereco, etrue, irf);
354   - }
  353 + // If the spatial model has no free parameters and the response cache
  354 + // should be used then put the IRF value in the response cache.
  355 + if (!has_free_pars && m_use_irf_cache) {
  356 + m_irf_cache.set(name, dir, ereco, etrue, irf);
  357 + }
  358 +
  359 + } // endif: source was used
355 360  
356 361 // Return IRF value
357 362 return irf;
... ... @@ -439,6 +444,30 @@ void GResponse::free_members(void)
439 444  
440 445  
441 446 /***********************************************************************//**
  447 + * @brief Check if source should be used
  448 + *
  449 + * @param[in] event Observed event.
  450 + * @param[in] source Source.
  451 + * @param[in] obs Observation.
  452 + * @return True if source should be used.
  453 + *
  454 + * Returns true if the source should be used.
  455 + *
  456 + * This method is a hook. The base class version of this method returns
  457 + * always true, but derived classes may implement a version of this method
  458 + * that actually evaluates whether a source should be used or not for a given
  459 + * event.
  460 + ***************************************************************************/
  461 +bool GResponse::use_source(const GEvent& event,
  462 + const GSource& source,
  463 + const GObservation& obs) const
  464 +{
  465 + // Return true
  466 + return true;
  467 +}
  468 +
  469 +
  470 +/***********************************************************************//**
442 471 * @brief Return instrument response to point source
443 472 *
444 473 * @param[in] event Observed event.
... ...