Commit 7ea034c7befae2fbc18209bb6b16118d77d581f2
1 parent
3c202bd5
Enhance unit test of ctprob and ctphase tools
Showing
4 changed files
with
109 additions
and
15 deletions
src/ctphase/ctphase.cpp
| ... | ... | @@ -504,8 +504,8 @@ void ctphase::get_parameters(void) |
| 504 | 504 | * @exception GException::invalid_value |
| 505 | 505 | * No events found in observation. |
| 506 | 506 | * |
| 507 | - * Append phase information to events from a FITS file by adding a "PHASE" | |
| 508 | - * column to the FITS file. | |
| 507 | + * Computes the phase for all events in an observation based on a temporal | |
| 508 | + * phase curve model. | |
| 509 | 509 | ***************************************************************************/ |
| 510 | 510 | void ctphase::phase_events(GCTAObservation* obs) |
| 511 | 511 | { |
| ... | ... | @@ -525,20 +525,29 @@ void ctphase::phase_events(GCTAObservation* obs) |
| 525 | 525 | // Continue only if there are events |
| 526 | 526 | if (events->size() > 0) { |
| 527 | 527 | |
| 528 | - // Print a warning into the log file if there are some precision concerns | |
| 528 | + // Get MJD information of observation | |
| 529 | 529 | GCTAEventAtom* event = (*events)[0]; |
| 530 | 530 | double dt = std::abs(event->time() - m_phase.mjd()); |
| 531 | - if (((m_phase.f1() * dt) > 1.0e8) || | |
| 532 | - (m_phase.f2() * dt * dt) > 1.0e8) { | |
| 533 | - log_string(NORMAL,"*** WARNING ***"); | |
| 534 | - log_string(NORMAL," Values supplied for reference MJD and/or f1 and/or f2"); | |
| 535 | - log_string(NORMAL," are large and may result in numerical precision issues."); | |
| 536 | - log_string(NORMAL," Consider using an ephemeris derived from a date closer"); | |
| 537 | - log_string(NORMAL," to the data being analyzed."); | |
| 538 | - log_value(NORMAL, " Observation ID", obs->obs_id()); | |
| 539 | - log_value(NORMAL, " Reference MJD", m_phase.mjd().mjd()); | |
| 540 | - log_value(NORMAL, " First event MJD", event->time().mjd()); | |
| 541 | - log_string(NORMAL,"*** WARNING ***"); | |
| 531 | + double f1 = m_phase.f1() * dt; | |
| 532 | + double f2 = m_phase.f2() * dt * dt; | |
| 533 | + | |
| 534 | + // Log information about MJD of the observation | |
| 535 | + log_value(NORMAL, "Reference MJD", m_phase.mjd().mjd()); | |
| 536 | + log_value(NORMAL, "First event MJD", event->time().mjd()); | |
| 537 | + log_value(NORMAL, "First event offset", gammalib::str(dt)+" s"); | |
| 538 | + log_value(NORMAL, "F1 * dt", gammalib::str(f1)+" Hz"); | |
| 539 | + log_value(NORMAL, "F2 * dt * dt", gammalib::str(f2)+" Hz"); | |
| 540 | + | |
| 541 | + // Print a warning into the log file if there are some precision | |
| 542 | + // concerns | |
| 543 | + if ((f1 > 1.0e8) || (f2 > 1.0e8)) { | |
| 544 | + std::string msg = "\nWARNING: Values supplied for reference MJD " | |
| 545 | + "and/or F1 and/or F2 are large and may\n" | |
| 546 | + " result in numerical precision issues. " | |
| 547 | + "Consider using an ephemeris derived\n" | |
| 548 | + " from a date closer to the data being " | |
| 549 | + "analyzed.\n"; | |
| 550 | + log_string(TERSE, msg); | |
| 542 | 551 | } |
| 543 | 552 | |
| 544 | 553 | // Compute the phase for all events | ... | ... |
test/test_ctbutterfly.py
| ... | ... | @@ -2,7 +2,7 @@ |
| 2 | 2 | # ========================================================================== |
| 3 | 3 | # This scripts performs unit tests for the ctbutterfly tool. |
| 4 | 4 | # |
| 5 | -# Copyright (C) 2014-2016 Michal Mayer | |
| 5 | +# Copyright (C) 2014-2017 Michal Mayer | |
| 6 | 6 | # |
| 7 | 7 | # This program is free software: you can redistribute it and/or modify |
| 8 | 8 | # it under the terms of the GNU General Public License as published by |
| ... | ... | @@ -144,6 +144,7 @@ class Test(test): |
| 144 | 144 | butterfly['srcname'] = 'Crab' |
| 145 | 145 | butterfly['caldb'] = self._caldb |
| 146 | 146 | butterfly['irf'] = self._irf |
| 147 | + butterfly['method'] = 'ENVELOPE' | |
| 147 | 148 | butterfly['emin'] = 0.1 |
| 148 | 149 | butterfly['emax'] = 100.0 |
| 149 | 150 | butterfly['fit'] = True | ... | ... |
test/test_ctphase.py
| ... | ... | @@ -191,6 +191,72 @@ class Test(test): |
| 191 | 191 | # Check result file |
| 192 | 192 | self._check_result_file('ctphase_py3.fits') |
| 193 | 193 | |
| 194 | + # Now run ctphase tool without a model file and a significant | |
| 195 | + # MJD offset | |
| 196 | + phase['inobs'] = self._events | |
| 197 | + phase['inmodel'] = 'NONE' | |
| 198 | + phase['srcname'] = 'NONE' | |
| 199 | + phase['mjd'] = 51500.0 | |
| 200 | + phase['phase'] = 0.0 | |
| 201 | + phase['f0'] = 1.0 | |
| 202 | + phase['f1'] = 0.1 | |
| 203 | + phase['f2'] = 0.0001 | |
| 204 | + phase['outobs'] = 'ctphase_py4.fits' | |
| 205 | + phase['logfile'] = 'ctphase_py4.log' | |
| 206 | + phase['chatter'] = 3 | |
| 207 | + | |
| 208 | + # Execute ctphase tool | |
| 209 | + phase.logFileOpen() # Make sure we get a log file | |
| 210 | + phase.execute() | |
| 211 | + | |
| 212 | + # Check result file | |
| 213 | + self._check_result_file('ctphase_py4.fits') | |
| 214 | + | |
| 215 | + # Test invalid source name | |
| 216 | + self.test_try('Test ctphase with invalid source name') | |
| 217 | + try: | |
| 218 | + test = ctools.ctphase() | |
| 219 | + test['inobs'] = self._events | |
| 220 | + test['inmodel'] = self._model_file | |
| 221 | + test['srcname'] = 'Venus' | |
| 222 | + test['outobs'] = 'ctphase_py5.fits' | |
| 223 | + test['logfile'] = 'ctphase_py5.log' | |
| 224 | + test.logFileOpen() | |
| 225 | + test.execute() | |
| 226 | + self.test_try_failure('Exception not thrown') | |
| 227 | + except (ValueError): | |
| 228 | + self.test_try_success() | |
| 229 | + | |
| 230 | + # Test invalid model type | |
| 231 | + self.test_try('Test ctphase with invalid model') | |
| 232 | + try: | |
| 233 | + test = ctools.ctphase() | |
| 234 | + test['inobs'] = self._events | |
| 235 | + test['inmodel'] = self._model | |
| 236 | + test['srcname'] = 'Background' | |
| 237 | + test['outobs'] = 'ctphase_py6.fits' | |
| 238 | + test['logfile'] = 'ctphase_py6.log' | |
| 239 | + test.logFileOpen() | |
| 240 | + test.execute() | |
| 241 | + self.test_try_failure('Exception not thrown') | |
| 242 | + except (ValueError): | |
| 243 | + self.test_try_success() | |
| 244 | + | |
| 245 | + # Test invalid model without temporal phase curve model | |
| 246 | + self.test_try('Test ctphase with invalid model') | |
| 247 | + try: | |
| 248 | + test = ctools.ctphase() | |
| 249 | + test['inobs'] = self._events | |
| 250 | + test['inmodel'] = self._model | |
| 251 | + test['srcname'] = 'Crab' | |
| 252 | + test['outobs'] = 'ctphase_py7.fits' | |
| 253 | + test['logfile'] = 'ctphase_py7.log' | |
| 254 | + test.logFileOpen() | |
| 255 | + test.execute() | |
| 256 | + self.test_try_failure('Exception not thrown') | |
| 257 | + except (ValueError): | |
| 258 | + self.test_try_success() | |
| 259 | + | |
| 194 | 260 | # Return |
| 195 | 261 | return |
| 196 | 262 | ... | ... |
test/test_ctprob.py
| ... | ... | @@ -139,6 +139,7 @@ class Test(test): |
| 139 | 139 | prob['caldb'] = self._caldb |
| 140 | 140 | prob['irf'] = self._irf |
| 141 | 141 | prob['edisp'] = False |
| 142 | + prob['publish'] = True | |
| 142 | 143 | prob['logfile'] = 'ctprob_py1.log' |
| 143 | 144 | prob['chatter'] = 2 |
| 144 | 145 | |
| ... | ... | @@ -189,6 +190,23 @@ class Test(test): |
| 189 | 190 | # Check result file |
| 190 | 191 | self._check_result_file('ctprob_py3_crab_events.fits') |
| 191 | 192 | |
| 193 | + # Copy ctprob tool | |
| 194 | + cpy_prob = prob.copy() | |
| 195 | + | |
| 196 | + # Clear phase tool | |
| 197 | + prob.clear() | |
| 198 | + | |
| 199 | + # Execute copy | |
| 200 | + cpy_prob['prefix'] = 'ctprob_py4_' | |
| 201 | + cpy_prob['outobs'] = 'ctprob_py4_obs.xml' | |
| 202 | + cpy_prob['logfile'] = 'ctprob_py4.log' | |
| 203 | + cpy_prob['chatter'] = 4 | |
| 204 | + cpy_prob.logFileOpen() # Needed to get a new log file | |
| 205 | + cpy_prob.execute() | |
| 206 | + | |
| 207 | + # Check result file | |
| 208 | + self._check_result_file('ctprob_py4_ctprob_py3_crab_events.fits') | |
| 209 | + | |
| 192 | 210 | # Return |
| 193 | 211 | return |
| 194 | 212 | ... | ... |