Commit f12b32d12afccf3e833c6e5988797084cf7900b2

Authored by Jürgen Knödlseder
1 parent c5d689f9

Add GAUSS(E) model to csbkgmodel (#2868)

ChangeLog
1   -2019-04-03
  1 +2019-04-14
2 2  
3 3 * Version 1.6.0 released
4 4 ========================
5 5  
  6 + Add GAUSS(E) model to csbkgmodel (#2868)
6 7 Move ctool::set_obs_bounds() to ctobservation::set_obs_bounds()
7 8 Log warning if edisp=no (#2842)
8 9 Fix ring background computation in ctskymap for small roiradius (#2839)
... ...
1 1 New Features and Important Changes in ctools 1.6.0
2 2  
3   -3 April 2019
  3 +14 April 2019
4 4  
5 5  
6 6 Introduction
... ... @@ -270,6 +270,9 @@ None
270 270  
271 271 csbkgmodel - Generate background model for 3D analysis
272 272 ------------------------------------------------------
  273 +A model named GAUSS(E) was added to implement an energy-dependent Gaussian
  274 +spatial function (#2868).
  275 +
273 276 Introduced the script that generates a background for a 3D analysis. This
274 277 script is particularly useful to generate a background model for the analysis
275 278 of the H.E.S.S. public data release (#2694).
... ...
cscripts/csbkgmodel.par
... ... @@ -25,13 +25,16 @@ outmodel, f, a, model.xml,,, "Output model definition XML file"
25 25 # Script parameters
26 26 #==================
27 27 instrument, s, a, CTA,,, "Instrument name (for multi-instrument analysis)"
28   -spatial, s, a, GAUSS,IRF|AEFF|GAUSS,, "Spatial model component"
  28 +spatial, s, a, GAUSS,IRF|AEFF|GAUSS|GAUSS(E),, "Spatial model component"
  29 +snumbins, i, a, 3,1,200, "Number of energy nodes for sigma(E)"
  30 +smin, r, a, 0.1,,, "Lower energy limit for sigma(E) energy nodes (TeV)"
  31 +smax, r, a, 10.0,,, "Upper energy limit for sigma(E) energy nodes (TeV)"
29 32 gradient, b, a, yes,,, "Allow for spatial gradient?"
30 33 spectral, s, a, NODES,PLAW|NODES,, "Spectral model component"
31   -ebinalg, s, a, LOG,FILE|LIN|LOG,, "Algorithm for defining energy nodes"
  34 +ebinalg, s, a, LOG,FILE|LIN|LOG,, "Algorithm for defining spectral energy nodes"
32 35 emin, r, a, 0.1,,, "Lower energy limit (TeV)"
33 36 emax, r, a, 100.0,,, "Upper energy limit (TeV)"
34   -enumbins, i, a, 8,1,200, "Number of energy nodes"
  37 +enumbins, i, a, 8,1,200, "Number of spectral energy nodes"
35 38 ebinfile, f, a, NONE,,, "Name of the file containing the energy node definition"
36 39 runwise, b, a, yes,,, "Generate runwise background model?"
37 40 rad, r, h, 2.0,,, "Radius for event selection (degrees)"
... ...
cscripts/csbkgmodel.py
... ... @@ -95,10 +95,15 @@ class csbkgmodel(ctools.csobservation):
95 95  
96 96 # Query input parameters
97 97 spatial = self['spatial'].string()
98   - if spatial == 'GAUSS':
  98 + if spatial == 'GAUSS(E)':
  99 + snumbins = self['snumbins'].integer()
  100 + if snumbins > 1:
  101 + self['smin'].real()
  102 + self['smax'].real()
  103 + if spatial == 'GAUSS' or spatial == 'GAUSS(E)':
99 104 self['gradient'].boolean()
100   - self['spectral'].string()
101   - if spatial == 'NODES':
  105 + spectral = self['spectral'].string()
  106 + if spectral == 'NODES':
102 107 self._create_energies()
103 108 self['runwise'].boolean()
104 109 self['emin'].real()
... ... @@ -142,10 +147,17 @@ class csbkgmodel(ctools.csobservation):
142 147 # Return instrument
143 148 return instrument
144 149  
145   - def _generate_initial_model(self):
  150 + def _generate_initial_model(self, sigma_min=2.0, sigma_max=1000.0):
146 151 """
147 152 Generate initial background model
148 153  
  154 + Parameters
  155 + ----------
  156 + sigma_min : float, optional
  157 + Minimum sigma
  158 + sigma_max : float, optional
  159 + Maximum sigma
  160 +
149 161 Returns
150 162 -------
151 163 model : `~gammalib.GModelData()`
... ... @@ -165,22 +177,65 @@ class csbkgmodel(ctools.csobservation):
165 177  
166 178 # Handle GAUSS model
167 179 elif self['spatial'].string() == 'GAUSS':
  180 +
  181 + # Set spatial model
  182 + factor1 = gammalib.GCTAModelRadialGauss(3.0)
  183 + factor1['Sigma'].min(sigma_min)
  184 + factor1['Sigma'].max(sigma_max)
  185 +
  186 + # Optionally add gradient
168 187 if self['gradient'].boolean():
169 188 spatial = gammalib.GCTAModelSpatialMultiplicative()
  189 + factor2 = gammalib.GCTAModelSpatialGradient()
  190 + spatial.append(factor1)
  191 + spatial.append(factor2)
  192 + else:
  193 + spatial = factor1
  194 +
  195 + # Set spectral model
  196 + epivot = gammalib.GEnergy(1.0, 'TeV')
  197 + spectral = gammalib.GModelSpectralPlaw(3.0e-4, -1.5, epivot)
  198 + spectral['Prefactor'].min(1.0e-8)
  199 +
  200 + # Set background model
  201 + model = gammalib.GCTAModelBackground(spatial, spectral)
  202 +
  203 + # Handle GAUSS(E) model
  204 + elif self['spatial'].string() == 'GAUSS(E)':
  205 +
  206 + # Set spatial model
  207 + if self['snumbins'].integer() == 1:
170 208 factor1 = gammalib.GCTAModelRadialGauss(3.0)
171   - factor1['Sigma'].min(1.5)
172   - factor1['Sigma'].max(10.0)
  209 + factor1['Sigma'].min(sigma_min)
  210 + factor1['Sigma'].max(sigma_max)
  211 + else:
  212 + emin = gammalib.GEnergy(self['smin'].real(), 'TeV')
  213 + emax = gammalib.GEnergy(self['smax'].real(), 'TeV')
  214 + energies = gammalib.GEnergies(self['snumbins'].integer(), emin, emax)
  215 + spectrum = gammalib.GModelSpectralConst(3.0)
  216 + nodes = gammalib.GModelSpectralNodes(spectrum, energies)
  217 + for i in range(nodes.nodes()):
  218 + nodes[i*2+1].min(sigma_min)
  219 + nodes[i*2+1].max(sigma_max)
  220 + nodes.autoscale()
  221 + factor1 = gammalib.GCTAModelSpatialGaussSpectrum(nodes)
  222 +
  223 + # Optionally add gradient
  224 + if self['gradient'].boolean():
  225 + spatial = gammalib.GCTAModelSpatialMultiplicative()
173 226 factor2 = gammalib.GCTAModelSpatialGradient()
174 227 spatial.append(factor1)
175 228 spatial.append(factor2)
176 229 else:
177   - spatial = gammalib.GCTAModelRadialGauss(3.0)
178   - spatial['Sigma'].min(1.5)
179   - spatial['Sigma'].max(10.0)
  230 + spatial = factor1
  231 +
  232 + # Set spectral model
180 233 epivot = gammalib.GEnergy(1.0, 'TeV')
181 234 spectral = gammalib.GModelSpectralPlaw(3.0e-4, -1.5, epivot)
182 235 spectral['Prefactor'].min(1.0e-8)
183   - model = gammalib.GCTAModelBackground(spatial, spectral)
  236 +
  237 + # Set background model
  238 + model = gammalib.GCTAModelBackground(spatial, spectral)
184 239  
185 240 # Any other strings (should never occur)
186 241 else:
... ...
doc/source/admin/release_history/1.6.rst
... ... @@ -46,6 +46,8 @@ Bug fixes
46 46 Improvements
47 47 ------------
48 48  
  49 +* [`2868 <https://cta-redmine.irap.omp.eu/issues/2868>`_] -
  50 + Add ``GAUSS(E)`` model to :ref:`csbkgmodel`
49 51 * [`2842 <https://cta-redmine.irap.omp.eu/issues/2842>`_] -
50 52 Log warning if ``edisp=no``
51 53 * Add ``max_iter`` parameter to :ref:`ctbutterfly`, :ref:`cterror`,
... ...