Commit dd903c61b36f94853461a6e1c6a9b4e39b7db1c2

Authored by Jürgen Knödlseder
1 parent 05643325

Add caldb and irf parameters to ctskymap, and store background and significance map

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&amp; 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  
... ...