Commit f12b32d12afccf3e833c6e5988797084cf7900b2
1 parent
c5d689f9
Add GAUSS(E) model to csbkgmodel (#2868)
Showing
5 changed files
with
79 additions
and
15 deletions
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) | ... | ... |
NEWS
| 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`, | ... | ... |