Commit 7f14ff4e9f73935886ad13f00f2c349a03971e55

Authored by Jürgen Knödlseder
1 parent 8b599758

Add obsutils.py unit tests

cscripts/Makefile.am
... ... @@ -147,6 +147,7 @@ testscripts = $(srcdir)/tests/__init__.py \
147 147 $(top_srcdir)/test/test_cstsmapsplit.py \
148 148 $(top_srcdir)/test/test_csviscube.py \
149 149 $(top_srcdir)/test/test_csworkflow.py \
  150 + $(top_srcdir)/test/test_obsutils.py \
150 151 $(top_srcdir)/test/test_csiactcopy.py \
151 152 $(top_srcdir)/test/test_csiactdata.py \
152 153 $(top_srcdir)/test/test_csiactobs.py
... ...
cscripts/obsutils.py
... ... @@ -399,9 +399,10 @@ def set_obs_patterns(pattern, ra=83.6331, dec=22.0145, offset=1.5):
399 399 pntdir.rotate_deg(phi, offset)
400 400 obsdeflist.append({'ra': pntdir.ra_deg(), 'dec': pntdir.dec_deg()})
401 401  
402   - # ... otherwise we have an unknown pattern
  402 + # ... otherwise raise an exception since we have an unknown pattern
403 403 else:
404   - print('Warning: Observation pattern "'+str(pattern)+'" not recognized.')
  404 + msg = 'Observation pattern "%s" not recognized.' % (pattern)
  405 + raise RuntimeError(msg)
405 406  
406 407 # Return observation definition list
407 408 return obsdeflist
... ... @@ -635,7 +636,7 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200,
635 636 response['bkgcube'] = bkgcube.bkgcube().copy()
636 637 response['models'] = bkgcube.models().copy()
637 638 if edisp:
638   - response['edispcube'] = edispcube.expcube().copy()
  639 + response['edispcube'] = edispcube.edispcube().copy()
639 640  
640 641 # Return response cubes
641 642 return response
... ...
test/test_obsutils.py 0 → 100755
  1 +#! /usr/bin/env python
  2 +# ==========================================================================
  3 +# This scripts performs unit tests for the obsutils module
  4 +#
  5 +# Copyright (C) 2017 Juergen Knoedlseder
  6 +#
  7 +# This program is free software: you can redistribute it and/or modify
  8 +# it under the terms of the GNU General Public License as published by
  9 +# the Free Software Foundation, either version 3 of the License, or
  10 +# (at your option) any later version.
  11 +#
  12 +# This program is distributed in the hope that it will be useful,
  13 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 +# GNU General Public License for more details.
  16 +#
  17 +# You should have received a copy of the GNU General Public License
  18 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  19 +#
  20 +# ==========================================================================
  21 +import gammalib
  22 +from cscripts import obsutils
  23 +from testing import test
  24 +
  25 +
  26 +# =============================== #
  27 +# Test class for csviscube script #
  28 +# =============================== #
  29 +class Test(test):
  30 + """
  31 + Test class for csviscube script
  32 + """
  33 +
  34 + # Constructor
  35 + def __init__(self):
  36 + """
  37 + Constructor
  38 + """
  39 + # Call base class constructor
  40 + test.__init__(self)
  41 +
  42 + # Return
  43 + return
  44 +
  45 + # Set test functions
  46 + def set(self):
  47 + """
  48 + Set all test functions
  49 + """
  50 + # Set test name
  51 + self.name('obsutils')
  52 +
  53 + # Append tests
  54 + self.append(self._test_sim_unbinned,
  55 + 'Test obsutils.sim() function in unbinned mode')
  56 + self.append(self._test_sim_binned,
  57 + 'Test obsutils.sim() function in binned mode')
  58 + self.append(self._test_sim_stacked,
  59 + 'Test obsutils.sim() function in stacked mode')
  60 + self.append(self._test_sim_stacked_edisp,
  61 + 'Test obsutils.sim() function in stacked mode with energy '
  62 + 'dispersion')
  63 + self.append(self._test_sim_log,
  64 + 'Test obsutils.sim() function with logging switched on')
  65 + self.append(self._test_set_obs,
  66 + 'Test obsutils.set_obs() function')
  67 + self.append(self._test_set_obs_list,
  68 + 'Test obsutils.set_obs_list() function')
  69 + self.append(self._test_set_obs_patterns,
  70 + 'Test obsutils.set_obs_patterns() function')
  71 + self.append(self._test_set_observations,
  72 + 'Test obsutils.set_observations() function')
  73 + self.append(self._test_get_stacked_response,
  74 + 'Test obsutils.get_stacked_response() function')
  75 + self.append(self._test_get_stacked_obs,
  76 + 'Test obsutils.get_stacked_obs() function')
  77 +
  78 + # Return
  79 + return
  80 +
  81 + # Setup method for sim() function test
  82 + def _setup_sim(self, two=False):
  83 + """
  84 + Setup method for sim() function test
  85 + """
  86 + # Set-up observation container
  87 + dir = gammalib.GSkyDir()
  88 + dir.radec_deg(83.6331, 22.0145)
  89 + obs = gammalib.GObservations()
  90 + run = obsutils.set_obs(dir, duration=100.0, emin=1.0, emax=10.0)
  91 + run.id('0')
  92 + obs.append(run)
  93 + if two:
  94 + run.id('1')
  95 + obs.append(run)
  96 +
  97 + # Append model
  98 + obs.models(gammalib.GModels(self._model))
  99 +
  100 + # Return
  101 + return obs
  102 +
  103 + # Test sim() function in unbinned mode
  104 + def _test_sim_unbinned(self):
  105 + """
  106 + Test sim() function in unbinned mode
  107 + """
  108 + # Simulate unbinned observations
  109 + res = obsutils.sim(self._setup_sim())
  110 +
  111 + # Check simulation results
  112 + self.test_value(res.size(), 1, 'Check number of observations')
  113 + self.test_value(res.models().size(), 2, 'Check number of models')
  114 + self.test_value(res.nobserved(), 40, 'Check number of observed events')
  115 + self.test_value(res.npred(), 0.0, 'Check number of predicted events')
  116 + self.test_value(res[0].eventtype(), 'EventList', 'Check event type')
  117 + self.test_value(res[0].events().ebounds().emin().TeV(), 1.0,
  118 + 'Check minimum energy')
  119 + self.test_value(res[0].events().ebounds().emax().TeV(), 10.0,
  120 + 'Check minimum energy')
  121 + self.test_value(res[0].events().number(), 40,
  122 + 'Check number of events in list')
  123 +
  124 + # Check energy dispersion flag
  125 + self.test_assert(not (res[0].response().use_edisp()),
  126 + 'Check energy dispersion usage')
  127 + res[0].response().apply_edisp(True)
  128 + self.test_assert(res[0].response().use_edisp(),
  129 + 'Check energy dispersion usage')
  130 +
  131 + # Return
  132 + return
  133 +
  134 + # Test sim() function in binned mode
  135 + def _test_sim_binned(self):
  136 + """
  137 + Test sim() function in binned mode
  138 + """
  139 + # Simulate binned observations
  140 + res = obsutils.sim(self._setup_sim(), nbins=5)
  141 +
  142 + # Check simulation results
  143 + self.test_value(res.size(), 1, 'Check number of observations')
  144 + self.test_value(res.models().size(), 2, 'Check number of models')
  145 + self.test_value(res.nobserved(), 40, 'Check number of observed events')
  146 + self.test_value(res.npred(), 0.0, 'Check number of predicted events')
  147 + self.test_value(res[0].eventtype(), 'CountsCube', 'Check event type')
  148 + self.test_value(res[0].events().ebounds().emin().TeV(), 1.0,
  149 + 'Check minimum energy')
  150 + self.test_value(res[0].events().ebounds().emax().TeV(), 10.0,
  151 + 'Check minimum energy')
  152 + self.test_value(res[0].events().ebounds().size(), 5,
  153 + 'Check number of energy bins')
  154 + self.test_value(res[0].events().number(), 40,
  155 + 'Check number of events in cube')
  156 +
  157 + # Check energy dispersion flag
  158 + self.test_assert(not (res[0].response().use_edisp()),
  159 + 'Check energy dispersion usage')
  160 + res[0].response().apply_edisp(True)
  161 + self.test_assert(res[0].response().use_edisp(),
  162 + 'Check energy dispersion usage')
  163 +
  164 + # Return
  165 + return
  166 +
  167 + # Test sim() function in stacked mode
  168 + def _test_sim_stacked(self):
  169 + """
  170 + Test sim() function in stacked mode
  171 + """
  172 + # Simulate stacked observations
  173 + res = obsutils.sim(self._setup_sim(two=True), nbins=5)
  174 +
  175 + # Check simulation results
  176 + self.test_value(res.size(), 1, 'Check number of observations')
  177 + self.test_value(res.models().size(), 2, 'Check number of models')
  178 + self.test_value(res.nobserved(), 86, 'Check number of observed events')
  179 + self.test_value(res.npred(), 0.0, 'Check number of predicted events')
  180 + self.test_value(res[0].eventtype(), 'CountsCube', 'Check event type')
  181 + self.test_value(res[0].events().ebounds().emin().TeV(), 1.0,
  182 + 'Check minimum energy')
  183 + self.test_value(res[0].events().ebounds().emax().TeV(), 10.0,
  184 + 'Check minimum energy')
  185 + self.test_value(res[0].events().ebounds().size(), 5,
  186 + 'Check number of energy bins')
  187 + self.test_value(res[0].events().number(), 86,
  188 + 'Check number of events in cube')
  189 +
  190 + # Check energy dispersion flag
  191 + self.test_assert(not (res[0].response().use_edisp()),
  192 + 'Check energy dispersion usage')
  193 + res[0].response().apply_edisp(True)
  194 + self.test_assert(not (res[0].response().use_edisp()),
  195 + 'Check energy dispersion usage')
  196 +
  197 + # Return
  198 + return
  199 +
  200 + # Test sim() function in stacked mode with energy dispersion
  201 + def _test_sim_stacked_edisp(self):
  202 + """
  203 + Test sim() function in stacked mode with energy dispersion
  204 + """
  205 + # Simulate binned observations
  206 + res = obsutils.sim(self._setup_sim(two=True), nbins=5, edisp=True,
  207 + log=True)
  208 +
  209 + # Check simulation results
  210 + self.test_value(res.size(), 1, 'Check number of observations')
  211 + self.test_value(res.models().size(), 2, 'Check number of models')
  212 + self.test_value(res.nobserved(), 82, 'Check number of observed events')
  213 + self.test_value(res.npred(), 0.0, 'Check number of predicted events')
  214 + self.test_value(res[0].eventtype(), 'CountsCube', 'Check event type')
  215 + self.test_value(res[0].events().ebounds().emin().TeV(), 1.0,
  216 + 'Check minimum energy')
  217 + self.test_value(res[0].events().ebounds().emax().TeV(), 10.0,
  218 + 'Check minimum energy')
  219 + self.test_value(res[0].events().ebounds().size(), 5,
  220 + 'Check number of energy bins')
  221 + self.test_value(res[0].events().number(), 82,
  222 + 'Check number of events in cube')
  223 +
  224 + # Check energy dispersion flag
  225 + self.test_assert(not (res[0].response().use_edisp()),
  226 + 'Check energy dispersion usage')
  227 + res[0].response().apply_edisp(True)
  228 + self.test_assert(res[0].response().use_edisp(),
  229 + 'Check energy dispersion usage')
  230 +
  231 + # Return
  232 + return
  233 +
  234 + # Test sim() function with logging switched on
  235 + def _test_sim_log(self):
  236 + """
  237 + Test sim() function with logging switched on
  238 + """
  239 + # Simulate unbinned observations
  240 + res = obsutils.sim(self._setup_sim(), log=True)
  241 +
  242 + # Check simulation results
  243 + self.test_value(res.size(), 1, 'Check number of observations')
  244 + self.test_value(res.models().size(), 2, 'Check number of models')
  245 + self.test_value(res.nobserved(), 40, 'Check number of observed events')
  246 + self.test_value(res.npred(), 0.0, 'Check number of predicted events')
  247 + self.test_value(res[0].eventtype(), 'EventList', 'Check event type')
  248 + self.test_value(res[0].events().ebounds().emin().TeV(), 1.0,
  249 + 'Check minimum energy')
  250 + self.test_value(res[0].events().ebounds().emax().TeV(), 10.0,
  251 + 'Check minimum energy')
  252 +
  253 + # Check energy dispersion flag
  254 + self.test_assert(not (res[0].response().use_edisp()),
  255 + 'Check energy dispersion usage')
  256 + res[0].response().apply_edisp(True)
  257 + self.test_assert(res[0].response().use_edisp(),
  258 + 'Check energy dispersion usage')
  259 +
  260 + # Return
  261 + return
  262 +
  263 + # Test set_obs() function
  264 + def _test_set_obs(self):
  265 + """
  266 + Test set_obs() function
  267 + """
  268 + # TODO: implement
  269 + # Return
  270 + return
  271 +
  272 + # Test set_obs_list() function
  273 + def _test_set_obs_list(self):
  274 + """
  275 + Test set_obs_list() function
  276 + """
  277 + # TODO: implement
  278 + # Return
  279 + return
  280 +
  281 + # Test set_obs_patterns() function
  282 + def _test_set_obs_patterns(self):
  283 + """
  284 + Test set_obs_pattern() function
  285 + """
  286 + # Get single observation pattern
  287 + res = obsutils.set_obs_patterns('single')
  288 + self.test_value(len(res), 1, 'Check number of observations for '
  289 + '"single" pattern')
  290 +
  291 + # Get four observation pattern
  292 + res = obsutils.set_obs_patterns('four')
  293 + self.test_value(len(res), 4, 'Check number of observations for "four"'
  294 + ' pattern')
  295 +
  296 + # Get invalud observations pattern
  297 + self.test_try('Check invalid pointing pattern')
  298 + try:
  299 + res = obsutils.set_obs_patterns('five')
  300 + self.test_try_failure('Exception not thrown')
  301 + except RuntimeError:
  302 + self.test_try_success()
  303 +
  304 + # Return
  305 + return
  306 +
  307 + # Test set_observations() function
  308 + def _test_set_observations(self):
  309 + """
  310 + Test set_observations() function
  311 + """
  312 + # TODO: implement
  313 + # Return
  314 + return
  315 +
  316 + # Test get_stacked_response() function
  317 + def _test_get_stacked_response(self):
  318 + """
  319 + Test get_stacked_response() function
  320 + """
  321 + # TODO: implement
  322 + # Return
  323 + return
  324 +
  325 + # Test get_stacked_obs() function
  326 + def _test_get_stacked_obs(self):
  327 + """
  328 + Test get_stacked_obs() function
  329 + """
  330 + # TODO: implement
  331 + # Return
  332 + return
  333 +
... ...
test/test_python_cscripts.py
... ... @@ -50,6 +50,7 @@ import test_cstsmapmerge
50 50 import test_cstsmapsplit
51 51 import test_csviscube
52 52 import test_csworkflow
  53 +import test_obsutils
53 54 import test_csiactcopy
54 55 import test_csiactdata
55 56 import test_csiactobs
... ... @@ -140,7 +141,8 @@ def test(installed=False, debug=False):
140 141 test_cstsmapmerge.Test(),
141 142 test_cstsmapsplit.Test(),
142 143 test_csviscube.Test(),
143   - test_csworkflow.Test()]
  144 + test_csworkflow.Test(),
  145 + test_obsutils.Test()]
144 146  
145 147 # Append tests for Python 2.6+ (the IACT cscripts depend on the json
146 148 # module which is only available since Python 2.6+)
... ...