Commit dd903c61b36f94853461a6e1c6a9b4e39b7db1c2
1 parent
05643325
Add caldb and irf parameters to ctskymap, and store background and significance map
Showing
5 changed files
with
163 additions
and
68 deletions
doc/source/users/reference_manual/ctskymap.rst
| ... | ... | @@ -21,56 +21,68 @@ If ``IRF`` is selected, the background template that are shipped with the |
| 21 | 21 | Instrument Response Functions will be used for background subtraction. |
| 22 | 22 | |
| 23 | 23 | ctskymap generates a FITS file comprising a sky map as primary extension. |
| 24 | +If a background subtraction method was selected, the FITS file will contain | |
| 25 | +the additional extensions ``BACKGRAOUND`` and ``SIGNIFICANCE`` that contain | |
| 26 | +the background map and a significance map, respectively. For the latter, the | |
| 27 | +significance of the signal is computed for each sky map pixel. | |
| 24 | 28 | |
| 25 | 29 | |
| 26 | 30 | General parameters |
| 27 | 31 | ------------------ |
| 28 | 32 | |
| 29 | 33 | ``inobs [file]`` |
| 30 | - Input event list or observation definition XML file | |
| 31 | - | |
| 34 | + Input event list or observation definition XML file. | |
| 35 | + | |
| 36 | +``caldb [string]`` | |
| 37 | + Calibration database (only required for IRF background subtraction if no | |
| 38 | + response information is provided by ``inobs``). | |
| 39 | + | |
| 40 | +``irf [string]`` | |
| 41 | + Instrument response function (only required for IRF background subtraction | |
| 42 | + if no response information is provided by ``inobs``). | |
| 43 | + | |
| 32 | 44 | ``outmap [file]`` |
| 33 | - Output sky map file | |
| 45 | + Output sky map file. | |
| 34 | 46 | |
| 35 | 47 | ``emin [real]`` |
| 36 | - Minimum energy in map (in TeV) | |
| 48 | + Minimum energy in map (in TeV). | |
| 37 | 49 | |
| 38 | 50 | ``emax [real]`` |
| 39 | - Maximum energy in map (in TeV) | |
| 51 | + Maximum energy in map (in TeV). | |
| 40 | 52 | |
| 41 | 53 | ``(usepnt = no) [boolean]`` |
| 42 | 54 | Use pointing instead of xref/yref parameters? |
| 43 | 55 | |
| 44 | 56 | ``nxpix [integer]`` |
| 45 | - Size of the Right Ascension / Galactic longitude axis (in pixels) | |
| 57 | + Size of the Right Ascension / Galactic longitude axis (in pixels). | |
| 46 | 58 | |
| 47 | 59 | ``nypix [integer]`` |
| 48 | - Size of the Declination / Galactic latitude axis (in pixels) | |
| 60 | + Size of the Declination / Galactic latitude axis (in pixels). | |
| 49 | 61 | |
| 50 | 62 | ``binsz [real]`` |
| 51 | 63 | Pixel size (in degrees/pixel). |
| 52 | 64 | |
| 53 | 65 | ``coordsys <CEL|GAL> [string]`` |
| 54 | - Coordinate system (CEL - celestial, GAL - galactic) | |
| 66 | + Coordinate system (CEL - celestial, GAL - galactic). | |
| 55 | 67 | |
| 56 | 68 | ``proj <AIT|AZP|CAR|MER|STG|TAN> [string]`` |
| 57 | - Projection method | |
| 69 | + Projection method. | |
| 58 | 70 | |
| 59 | 71 | ``xref [real]`` |
| 60 | - Right Ascension / Galactic longitude of image centre (J2000, in degrees) | |
| 72 | + Right Ascension / Galactic longitude of image centre (J2000, in degrees). | |
| 61 | 73 | |
| 62 | 74 | ``yref [real]`` |
| 63 | - Declination / Galactic latitude of image centre (J2000, in degrees) | |
| 75 | + Declination / Galactic latitude of image centre (J2000, in degrees). | |
| 64 | 76 | |
| 65 | 77 | ``bkgsubtract <NONE|IRF> [string]`` |
| 66 | - Background subtraction method | |
| 78 | + Background subtraction method. | |
| 67 | 79 | |
| 68 | 80 | |
| 69 | 81 | Standard parameters |
| 70 | 82 | ------------------- |
| 71 | 83 | |
| 72 | 84 | ``(publish = no) [boolean]`` |
| 73 | - Specifies whether the sky map should be published on VO Hub | |
| 85 | + Specifies whether the sky map should be published on VO Hub. | |
| 74 | 86 | |
| 75 | 87 | ``(chatter = 2) [integer]`` |
| 76 | 88 | Verbosity of the executable: |
| ... | ... | @@ -85,16 +97,17 @@ Standard parameters |
| 85 | 97 | chatter = 4: detailed report about the task execution |
| 86 | 98 | |
| 87 | 99 | ``(clobber = yes) [boolean]`` |
| 88 | - Specifies whether an existing output sky map file should be overwritten | |
| 100 | + Specifies whether an existing output sky map file should be overwritten. | |
| 89 | 101 | |
| 90 | 102 | ``(debug = no) [boolean]`` |
| 91 | - Enables debug mode. In debug mode the executable will dump any log file output to the console. | |
| 103 | + Enables debug mode. In debug mode the executable will dump any log file | |
| 104 | + output to the console. | |
| 92 | 105 | |
| 93 | 106 | ``(mode = ql) [string]`` |
| 94 | - Mode of automatic parameters (default is "ql", i.e. "query and learn") | |
| 107 | + Mode of automatic parameters (default is "ql", i.e. "query and learn"). | |
| 95 | 108 | |
| 96 | 109 | ``(logfile = ctskymap.log) [string]`` |
| 97 | - Name of log file | |
| 110 | + Name of log file. | |
| 98 | 111 | |
| 99 | 112 | |
| 100 | 113 | Related tools or scripts | ... | ... |
src/ctskymap/ctskymap.cpp
| ... | ... | @@ -233,11 +233,23 @@ void ctskymap::run(void) |
| 233 | 233 | // Map events into sky map |
| 234 | 234 | map_events(obs); |
| 235 | 235 | |
| 236 | - // Subtract background from sky map | |
| 237 | - bkg_subtract(obs); | |
| 236 | + // Compute background sky map | |
| 237 | + map_background(obs); | |
| 238 | 238 | |
| 239 | 239 | } // endfor: looped over observations |
| 240 | 240 | |
| 241 | + // If background subtract was required then compute significance map | |
| 242 | + // and subtract background map from counts map | |
| 243 | + if (m_bkgsubtract != "NONE") { | |
| 244 | + | |
| 245 | + // Compute significance map | |
| 246 | + m_sigmap = (m_skymap - m_bkgmap) / sqrt(m_skymap); | |
| 247 | + | |
| 248 | + // Subtract background map from counts map | |
| 249 | + m_skymap -= m_bkgmap; | |
| 250 | + | |
| 251 | + } // endif: background subtraction was requested | |
| 252 | + | |
| 241 | 253 | // Optionally publish sky map |
| 242 | 254 | if (m_publish) { |
| 243 | 255 | publish(); |
| ... | ... | @@ -271,6 +283,24 @@ void ctskymap::save(void) |
| 271 | 283 | // Write sky map into FITS file |
| 272 | 284 | m_skymap.write(fits); |
| 273 | 285 | |
| 286 | + // If background subtraction is requested then write background map | |
| 287 | + // and significance map to FITS file | |
| 288 | + if (m_bkgsubtract != "NONE") { | |
| 289 | + | |
| 290 | + // Write background map into FITS file | |
| 291 | + m_bkgmap.write(fits); | |
| 292 | + | |
| 293 | + // Set background map extension name | |
| 294 | + fits[fits.size()-1]->extname("BACKGROUND"); | |
| 295 | + | |
| 296 | + // Write significance map into FITS file | |
| 297 | + m_sigmap.write(fits); | |
| 298 | + | |
| 299 | + // Set significance map extension name | |
| 300 | + fits[fits.size()-1]->extname("SIGNIFICANCE"); | |
| 301 | + | |
| 302 | + } // endif: background subtraction was requested | |
| 303 | + | |
| 274 | 304 | // Save FITS file to disk |
| 275 | 305 | fits.saveto(m_outmap, clobber()); |
| 276 | 306 | |
| ... | ... | @@ -328,6 +358,8 @@ void ctskymap::init_members(void) |
| 328 | 358 | { |
| 329 | 359 | // Initialise members |
| 330 | 360 | m_skymap.clear(); |
| 361 | + m_bkgmap.clear(); | |
| 362 | + m_sigmap.clear(); | |
| 331 | 363 | m_emin = 0.0; |
| 332 | 364 | m_emax = 0.0; |
| 333 | 365 | m_bkgsubtract = "NONE"; |
| ... | ... | @@ -348,6 +380,8 @@ void ctskymap::copy_members(const ctskymap& app) |
| 348 | 380 | { |
| 349 | 381 | // Copy attributes |
| 350 | 382 | m_skymap = app.m_skymap; |
| 383 | + m_bkgmap = app.m_bkgmap; | |
| 384 | + m_sigmap = app.m_sigmap; | |
| 351 | 385 | m_emin = app.m_emin; |
| 352 | 386 | m_emax = app.m_emax; |
| 353 | 387 | m_bkgsubtract = app.m_bkgsubtract; |
| ... | ... | @@ -387,10 +421,18 @@ void ctskymap::get_parameters(void) |
| 387 | 421 | // Create sky map based on task parameters |
| 388 | 422 | m_skymap = create_map(m_obs); |
| 389 | 423 | |
| 390 | - // Get remaining parameters | |
| 424 | + // Get further parameters | |
| 391 | 425 | m_emin = (*this)["emin"].real(); |
| 392 | 426 | m_emax = (*this)["emax"].real(); |
| 393 | 427 | m_bkgsubtract = (*this)["bkgsubtract"].string(); |
| 428 | + | |
| 429 | + // If IRF background subtraction is requested then make sure that the | |
| 430 | + // CTA observations in the observation container have response information | |
| 431 | + if (m_bkgsubtract == "IRF") { | |
| 432 | + set_response(m_obs); | |
| 433 | + } | |
| 434 | + | |
| 435 | + // Get remaining parameters | |
| 394 | 436 | m_publish = (*this)["publish"].boolean(); |
| 395 | 437 | m_chatter = static_cast<GChatter>((*this)["chatter"].integer()); |
| 396 | 438 | |
| ... | ... | @@ -399,6 +441,13 @@ void ctskymap::get_parameters(void) |
| 399 | 441 | m_outmap = (*this)["outmap"].filename(); |
| 400 | 442 | } |
| 401 | 443 | |
| 444 | + // Create background map and significance map if background subtraction | |
| 445 | + // is requested | |
| 446 | + if (m_bkgsubtract != "NONE") { | |
| 447 | + m_bkgmap = create_map(m_obs); | |
| 448 | + m_sigmap = create_map(m_obs); | |
| 449 | + } | |
| 450 | + | |
| 402 | 451 | // Write parameters into logger |
| 403 | 452 | log_parameters(TERSE); |
| 404 | 453 | |
| ... | ... | @@ -487,22 +536,23 @@ void ctskymap::map_events(GCTAObservation* obs) |
| 487 | 536 | |
| 488 | 537 | |
| 489 | 538 | /***********************************************************************//** |
| 490 | - * @brief Subtract background events from skymap | |
| 539 | + * @brief Estimates the background in sky map for observation | |
| 491 | 540 | * |
| 492 | 541 | * @param[in] obs CTA observation. |
| 493 | 542 | * |
| 494 | - * Subtracts background events from the sky map using various methods. The | |
| 495 | - * background subtraction method is specified by the "bkgsubtract" parameter | |
| 496 | - * which can take the following values: | |
| 543 | + * Estimates the background in the sky map for a given observation and adds | |
| 544 | + * this estimate to the background sky map. The background estimation method | |
| 545 | + * is specified by the "bkgsubtract" parameter which can take the following | |
| 546 | + * values: | |
| 497 | 547 | * |
| 498 | - * NONE - No background subtraction | |
| 499 | - * IRF - Background subtraction based on IRF template | |
| 548 | + * NONE - No background estimation | |
| 549 | + * IRF - Background estimation based on IRF template | |
| 500 | 550 | ***************************************************************************/ |
| 501 | -void ctskymap::bkg_subtract(GCTAObservation* obs) | |
| 551 | +void ctskymap::map_background(GCTAObservation* obs) | |
| 502 | 552 | { |
| 503 | - // Dispatch to apporpriate background subtraction method | |
| 553 | + // Dispatch to appropriate background estimation method | |
| 504 | 554 | if (m_bkgsubtract == "IRF") { |
| 505 | - bkg_subtract_irf(obs); | |
| 555 | + map_background_irf(obs); | |
| 506 | 556 | } |
| 507 | 557 | |
| 508 | 558 | // Return |
| ... | ... | @@ -511,7 +561,7 @@ void ctskymap::bkg_subtract(GCTAObservation* obs) |
| 511 | 561 | |
| 512 | 562 | |
| 513 | 563 | /***********************************************************************//** |
| 514 | - * @brief Subtract background events based on IRF template from sky map | |
| 564 | + * @brief Estimates the background in sky map based on IRF template | |
| 515 | 565 | * |
| 516 | 566 | * @param[in] obs CTA observation. |
| 517 | 567 | * |
| ... | ... | @@ -519,9 +569,10 @@ void ctskymap::bkg_subtract(GCTAObservation* obs) |
| 519 | 569 | * No response information available for observation. |
| 520 | 570 | * No background template available in instrument response function. |
| 521 | 571 | * |
| 522 | - * Subtracts background events from the sky map using the IRF template. | |
| 572 | + * Estimates the background in the sky map using the IRF template for a given | |
| 573 | + * observation and adds this estimate to the background sky map. | |
| 523 | 574 | ***************************************************************************/ |
| 524 | -void ctskymap::bkg_subtract_irf(GCTAObservation* obs) | |
| 575 | +void ctskymap::map_background_irf(GCTAObservation* obs) | |
| 525 | 576 | { |
| 526 | 577 | // Get IRF response |
| 527 | 578 | const GCTAResponseIrf* rsp = dynamic_cast<const GCTAResponseIrf*>(obs->response()); |
| ... | ... | @@ -563,11 +614,11 @@ void ctskymap::bkg_subtract_irf(GCTAObservation* obs) |
| 563 | 614 | // Setup energy nodes for computation |
| 564 | 615 | GEnergies energies(nebin, emin, emax); // More complicated nbins later |
| 565 | 616 | |
| 566 | - // Loop over all sky map pixels | |
| 567 | - for (int i = 0; i < m_skymap.npix(); ++i) { | |
| 617 | + // Loop over all background map pixels | |
| 618 | + for (int i = 0; i < m_bkgmap.npix(); ++i) { | |
| 568 | 619 | |
| 569 | 620 | // Get sky direction of pixel |
| 570 | - GSkyDir skydir = m_skymap.inx2dir(i); | |
| 621 | + GSkyDir skydir = m_bkgmap.inx2dir(i); | |
| 571 | 622 | |
| 572 | 623 | // Convert sky direction in instrument direction |
| 573 | 624 | GCTAInstDir instdir = obs->pointing().instdir(skydir); |
| ... | ... | @@ -587,12 +638,12 @@ void ctskymap::bkg_subtract_irf(GCTAObservation* obs) |
| 587 | 638 | } |
| 588 | 639 | |
| 589 | 640 | // Multiply background rate with livetime and solid angle |
| 590 | - value *= obs->livetime() * m_skymap.solidangle(i); | |
| 641 | + value *= obs->livetime() * m_bkgmap.solidangle(i); | |
| 591 | 642 | |
| 592 | - // Subtract background value from sky map | |
| 593 | - m_skymap(i,0) -= value; | |
| 643 | + // Add number of background events to background map | |
| 644 | + m_bkgmap(i,0) += value; | |
| 594 | 645 | |
| 595 | - } // endfor: looped over sky map pixels | |
| 646 | + } // endfor: looped over background map pixels | |
| 596 | 647 | |
| 597 | 648 | // Return |
| 598 | 649 | return; | ... | ... |
src/ctskymap/ctskymap.hpp
| ... | ... | @@ -70,8 +70,8 @@ protected: |
| 70 | 70 | void free_members(void); |
| 71 | 71 | void get_parameters(void); |
| 72 | 72 | void map_events(GCTAObservation* obs); |
| 73 | - void bkg_subtract(GCTAObservation* obs); | |
| 74 | - void bkg_subtract_irf(GCTAObservation* obs); | |
| 73 | + void map_background(GCTAObservation* obs); | |
| 74 | + void map_background_irf(GCTAObservation* obs); | |
| 75 | 75 | |
| 76 | 76 | // User parameters |
| 77 | 77 | GFilename m_outmap; //!< Output file name |
| ... | ... | @@ -83,6 +83,8 @@ protected: |
| 83 | 83 | |
| 84 | 84 | // Protected members |
| 85 | 85 | GSkyMap m_skymap; //!< Sky map |
| 86 | + GSkyMap m_bkgmap; //!< Background map | |
| 87 | + GSkyMap m_sigmap; //!< Significance map | |
| 86 | 88 | }; |
| 87 | 89 | |
| 88 | 90 | ... | ... |
src/ctskymap/ctskymap.par
| ... | ... | @@ -17,6 +17,8 @@ |
| 17 | 17 | # General parameters |
| 18 | 18 | #=================== |
| 19 | 19 | inobs, f, a, "events.fits",,, "Input event list or observation definition XML file" |
| 20 | +caldb, s, a, "prod2",,, "Calibration database" | |
| 21 | +irf, s, a, "South_0.5h",,, "Instrument response function" | |
| 20 | 22 | outmap, f, a, "skymap.fits",,, "Output skymap file" |
| 21 | 23 | |
| 22 | 24 | # | ... | ... |
test/test_ctskymap.py
| ... | ... | @@ -70,7 +70,7 @@ class Test(test): |
| 70 | 70 | ' outmap="ctskymap_cmd1.fits"'+ \ |
| 71 | 71 | ' emin=0.1 emax=100.0 nxpix=200 nypix=200'+ \ |
| 72 | 72 | ' binsz=0.02 coordsys="CEL" proj="CAR"'+ \ |
| 73 | - ' xref=83.63 yref=22.01'+ \ | |
| 73 | + ' xref=83.63 yref=22.01 bkgsubtract="NONE"'+ \ | |
| 74 | 74 | ' logfile="ctskymap_cmd1.log" chatter=1' |
| 75 | 75 | |
| 76 | 76 | # Check if execution of wrong command fails |
| ... | ... | @@ -89,7 +89,7 @@ class Test(test): |
| 89 | 89 | ' outmap="ctskymap_cmd2.fits"'+ \ |
| 90 | 90 | ' emin=0.1 emax=100.0 nxpix=200 nypix=200'+ \ |
| 91 | 91 | ' binsz=0.02 coordsys="CEL" proj="CAR"'+ \ |
| 92 | - ' xref=83.63 yref=22.01'+ \ | |
| 92 | + ' xref=83.63 yref=22.01 bkgsubtract="NONE"'+ \ | |
| 93 | 93 | ' logfile="ctskymap_cmd2.log" chatter=2' |
| 94 | 94 | |
| 95 | 95 | # Check if execution failed |
| ... | ... | @@ -134,19 +134,20 @@ class Test(test): |
| 134 | 134 | skymap.clear() |
| 135 | 135 | |
| 136 | 136 | # Now set ctskymap parameters |
| 137 | - skymap['inobs'] = self._events | |
| 138 | - skymap['emin'] = 0.1 | |
| 139 | - skymap['emax'] = 100 | |
| 140 | - skymap['nxpix'] = 200 | |
| 141 | - skymap['nypix'] = 200 | |
| 142 | - skymap['binsz'] = 0.02 | |
| 143 | - skymap['coordsys'] = 'CEL' | |
| 144 | - skymap['proj'] = 'CAR' | |
| 145 | - skymap['xref'] = 83.63 | |
| 146 | - skymap['yref'] = 22.01 | |
| 147 | - skymap['outmap'] = 'ctskymap_py1.fits' | |
| 148 | - skymap['logfile'] = 'ctskymap_py1.log' | |
| 149 | - skymap['chatter'] = 2 | |
| 137 | + skymap['inobs'] = self._events | |
| 138 | + skymap['emin'] = 0.1 | |
| 139 | + skymap['emax'] = 100 | |
| 140 | + skymap['nxpix'] = 200 | |
| 141 | + skymap['nypix'] = 200 | |
| 142 | + skymap['binsz'] = 0.02 | |
| 143 | + skymap['coordsys'] = 'CEL' | |
| 144 | + skymap['proj'] = 'CAR' | |
| 145 | + skymap['xref'] = 83.63 | |
| 146 | + skymap['yref'] = 22.01 | |
| 147 | + skymap['bkgsubtract'] = 'NONE' | |
| 148 | + skymap['outmap'] = 'ctskymap_py1.fits' | |
| 149 | + skymap['logfile'] = 'ctskymap_py1.log' | |
| 150 | + skymap['chatter'] = 2 | |
| 150 | 151 | |
| 151 | 152 | # Run ctskymap tool |
| 152 | 153 | skymap.logFileOpen() # Make sure we get a log file |
| ... | ... | @@ -190,18 +191,19 @@ class Test(test): |
| 190 | 191 | |
| 191 | 192 | # Allocate ctskymap tool from observation container |
| 192 | 193 | skymap = ctools.ctskymap(obs) |
| 193 | - skymap['emin'] = 0.1 | |
| 194 | - skymap['emax'] = 100 | |
| 195 | - skymap['nxpix'] = 200 | |
| 196 | - skymap['nypix'] = 200 | |
| 197 | - skymap['binsz'] = 0.02 | |
| 198 | - skymap['coordsys'] = 'GAL' | |
| 199 | - skymap['proj'] = 'CAR' | |
| 200 | - skymap['xref'] = 184.5575 | |
| 201 | - skymap['yref'] = -5.7844 | |
| 202 | - skymap['outmap'] = 'ctskymap_py3.fits' | |
| 203 | - skymap['logfile'] = 'ctskymap_py3.log' | |
| 204 | - skymap['chatter'] = 4 | |
| 194 | + skymap['emin'] = 0.1 | |
| 195 | + skymap['emax'] = 100 | |
| 196 | + skymap['nxpix'] = 200 | |
| 197 | + skymap['nypix'] = 200 | |
| 198 | + skymap['binsz'] = 0.02 | |
| 199 | + skymap['coordsys'] = 'GAL' | |
| 200 | + skymap['proj'] = 'CAR' | |
| 201 | + skymap['xref'] = 184.5575 | |
| 202 | + skymap['yref'] = -5.7844 | |
| 203 | + skymap['bkgsubtract'] = 'NONE' | |
| 204 | + skymap['outmap'] = 'ctskymap_py3.fits' | |
| 205 | + skymap['logfile'] = 'ctskymap_py3.log' | |
| 206 | + skymap['chatter'] = 4 | |
| 205 | 207 | |
| 206 | 208 | # Execute tool |
| 207 | 209 | skymap.logFileOpen() # Needed to get a new log file |
| ... | ... | @@ -213,6 +215,31 @@ class Test(test): |
| 213 | 215 | # Publish with name |
| 214 | 216 | skymap.publish('My sky map') |
| 215 | 217 | |
| 218 | + # Allocate ctskymap tool from observation container | |
| 219 | + skymap = ctools.ctskymap(obs) | |
| 220 | + skymap['emin'] = 0.1 | |
| 221 | + skymap['emax'] = 100 | |
| 222 | + skymap['nxpix'] = 200 | |
| 223 | + skymap['nypix'] = 200 | |
| 224 | + skymap['binsz'] = 0.02 | |
| 225 | + skymap['coordsys'] = 'GAL' | |
| 226 | + skymap['proj'] = 'CAR' | |
| 227 | + skymap['xref'] = 184.5575 | |
| 228 | + skymap['yref'] = -5.7844 | |
| 229 | + skymap['bkgsubtract'] = 'IRF' | |
| 230 | + skymap['caldb'] = self._caldb | |
| 231 | + skymap['irf'] = self._irf | |
| 232 | + skymap['outmap'] = 'ctskymap_py4.fits' | |
| 233 | + skymap['logfile'] = 'ctskymap_py4.log' | |
| 234 | + skymap['chatter'] = 4 | |
| 235 | + | |
| 236 | + # Execute tool | |
| 237 | + skymap.logFileOpen() # Needed to get a new log file | |
| 238 | + skymap.execute() | |
| 239 | + | |
| 240 | + # Check result file | |
| 241 | + self._check_result_file('ctskymap_py3.fits') | |
| 242 | + | |
| 216 | 243 | # Return |
| 217 | 244 | return |
| 218 | 245 | ... | ... |