Commit 7f14ff4e9f73935886ad13f00f2c349a03971e55
1 parent
8b599758
Add obsutils.py unit tests
Showing
4 changed files
with
341 additions
and
4 deletions
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+) | ... | ... |