Commit 430afcd8569bf21c62d03b4e67b035b1e4d469b2
Merge branch '1724-ctools-support-edisp-stacked' into integration
Showing
33 changed files
with
1126 additions
and
126 deletions
.gitignore
configure.ac
cscripts/cslightcrv.py
| ... | ... | @@ -40,7 +40,7 @@ class cslightcrv(ctools.cscript): |
| 40 | 40 | |
| 41 | 41 | # Set name |
| 42 | 42 | self.name = "cslightcrv" |
| 43 | - self.version = "1.0.0" | |
| 43 | + self.version = "1.1.0" | |
| 44 | 44 | |
| 45 | 45 | # Initialise some members |
| 46 | 46 | self.obs = None |
| ... | ... | @@ -104,7 +104,9 @@ class cslightcrv(ctools.cscript): |
| 104 | 104 | pars.append(gammalib.GApplicationPar("srcname","s","a","Crab","","","Source name")) |
| 105 | 105 | pars.append(gammalib.GApplicationPar("expcube","f","a","NONE","","","Input exposure cube file (only needed for stacked analysis)")) |
| 106 | 106 | pars.append(gammalib.GApplicationPar("psfcube","f","a","NONE","","","Input PSF cube file (only needed for stacked analysis)")) |
| 107 | + pars.append(gammalib.GApplicationPar("edispcube","f","a","NONE","","","Input energy dispersion cube file (only needed for stacked analysis)")) | |
| 107 | 108 | pars.append(gammalib.GApplicationPar("bkgcube","s","a","NONE","","","Input background cube file (only needed for stacked analysis)")) |
| 109 | + pars.append(gammalib.GApplicationPar("edisp","b","h","no","","","Apply energy dispersion?")) | |
| 108 | 110 | pars.append(gammalib.GApplicationPar("caldb","s","a","prod2","","","Calibration database")) |
| 109 | 111 | pars.append(gammalib.GApplicationPar("irf","s","a","South_0.5h","","","Instrument response function")) |
| 110 | 112 | pars.append(gammalib.GApplicationPar("outfile","f","a","lightcurve.fits","","","Output light curve file")) |
| ... | ... | @@ -190,6 +192,9 @@ class cslightcrv(ctools.cscript): |
| 190 | 192 | # Get source name |
| 191 | 193 | self.m_srcname = self["srcname"].string() |
| 192 | 194 | |
| 195 | + # Get energy dispersion flag | |
| 196 | + self.m_edisp = self["edisp"].boolean() | |
| 197 | + | |
| 193 | 198 | # Get time boundaries |
| 194 | 199 | self.create_tbounds() |
| 195 | 200 | |
| ... | ... | @@ -430,7 +435,7 @@ class cslightcrv(ctools.cscript): |
| 430 | 435 | |
| 431 | 436 | # Header |
| 432 | 437 | if self.logTerse(): |
| 433 | - self.log.header3("Creating PSF cube") | |
| 438 | + self.log.header3("Creating point spread function cube") | |
| 434 | 439 | |
| 435 | 440 | # Create psf cube |
| 436 | 441 | psfcube = ctools.ctpsfcube(select.obs()) |
| ... | ... | @@ -449,6 +454,30 @@ class cslightcrv(ctools.cscript): |
| 449 | 454 | psfcube["proj"] = self.m_proj |
| 450 | 455 | psfcube.run() |
| 451 | 456 | |
| 457 | + # Check if we need to include energy dispersion | |
| 458 | + if self.m_edisp: | |
| 459 | + | |
| 460 | + # Header | |
| 461 | + if self.logTerse(): | |
| 462 | + self.log.header3("Creating energy dispersion cube") | |
| 463 | + | |
| 464 | + # Create edisp cube | |
| 465 | + edispcube = ctools.ctedispcube(select.obs()) | |
| 466 | + edispcube["incube"] = "NONE" | |
| 467 | + edispcube["usepnt"] = False | |
| 468 | + edispcube["ebinalg"] = "LOG" | |
| 469 | + edispcube["xref"] = self.m_xref | |
| 470 | + edispcube["yref"] = self.m_yref | |
| 471 | + edispcube["binsz"] = self.m_binsz | |
| 472 | + edispcube["nxpix"] = self.m_nxpix | |
| 473 | + edispcube["nypix"] = self.m_nypix | |
| 474 | + edispcube["enumbins"] = self.m_ebins | |
| 475 | + edispcube["emin"] = self.m_emin | |
| 476 | + edispcube["emax"] = self.m_emax | |
| 477 | + edispcube["coordsys"] = self.m_coordsys | |
| 478 | + edispcube["proj"] = self.m_proj | |
| 479 | + edispcube.run() | |
| 480 | + | |
| 452 | 481 | # Header |
| 453 | 482 | if self.logTerse(): |
| 454 | 483 | self.log.header3("Creating background cube") |
| ... | ... | @@ -472,12 +501,17 @@ class cslightcrv(ctools.cscript): |
| 472 | 501 | |
| 473 | 502 | # Set new binned observation |
| 474 | 503 | obs = bin.obs() |
| 475 | - | |
| 476 | - # Set precomputed binned response | |
| 477 | - obs[0].response(expcube.expcube(), psfcube.psfcube(), bkgcube.bkgcube()) | |
| 478 | - | |
| 504 | + | |
| 479 | 505 | # Get new models |
| 480 | 506 | models = bkgcube.models() |
| 507 | + | |
| 508 | + # Set precomputed binned response | |
| 509 | + if self.m_edisp: | |
| 510 | + obs[0].response(expcube.expcube(), psfcube.psfcube(), | |
| 511 | + edispcube.edispcube(), bkgcube.bkgcube()) | |
| 512 | + else: | |
| 513 | + obs[0].response(expcube.expcube(), psfcube.psfcube(), | |
| 514 | + bkgcube.bkgcube()) | |
| 481 | 515 | |
| 482 | 516 | # Fix background models if required |
| 483 | 517 | if self.m_fix_bkg: |
| ... | ... | @@ -495,6 +529,7 @@ class cslightcrv(ctools.cscript): |
| 495 | 529 | |
| 496 | 530 | # Likelihood |
| 497 | 531 | like = ctools.ctlike(obs) |
| 532 | + like["edisp"] = self.m_edisp | |
| 498 | 533 | like.run() |
| 499 | 534 | |
| 500 | 535 | # Skip bin if no event was present | ... | ... |
cscripts/cspull.py
| ... | ... | @@ -52,6 +52,7 @@ class cspull(ctools.cscript): |
| 52 | 52 | self.m_exposure = None |
| 53 | 53 | self.m_psfcube = None |
| 54 | 54 | self.m_bckcube = None |
| 55 | + self.m_edispcube = None | |
| 55 | 56 | self.m_stackmodels = None |
| 56 | 57 | self.m_coordsys = "CEL" |
| 57 | 58 | self.m_proj = "TAN" |
| ... | ... | @@ -250,6 +251,29 @@ class cspull(ctools.cscript): |
| 250 | 251 | if self.logTerse(): |
| 251 | 252 | self.log("Computed Psf cube\n") |
| 252 | 253 | |
| 254 | + # Optionally get stacked Edisp | |
| 255 | + if self.m_edisp: | |
| 256 | + edispcube = ctools.edispcube(self.obs) | |
| 257 | + edispcube["incube"] = "NONE" | |
| 258 | + edispcube["usepnt"] = True | |
| 259 | + edispcube["ebinalg"] = "LOG" | |
| 260 | + edispcube["binsz"] = self.m_binsz*10.0 | |
| 261 | + edispcube["nxpix"] = self.m_npix/10 | |
| 262 | + edispcube["nypix"] = self.m_npix/10 | |
| 263 | + edispcube["enumbins"] = self.m_enumbins | |
| 264 | + edispcube["emin"] = self["emin"].real() | |
| 265 | + edispcube["emax"] = self["emax"].real() | |
| 266 | + edispcube["coordsys"] = self.m_coordsys | |
| 267 | + edispcube["proj"] = self.m_proj | |
| 268 | + edispcube.run() | |
| 269 | + | |
| 270 | + # Store result | |
| 271 | + self.m_edispcube = edispcube.edispcube().copy() | |
| 272 | + | |
| 273 | + # Logging | |
| 274 | + if self.logTerse(): | |
| 275 | + self.log("Computed energy dispersion cube\n") | |
| 276 | + | |
| 253 | 277 | # Get stacked background |
| 254 | 278 | bkgcube = ctools.ctbkgcube(self.obs) |
| 255 | 279 | bkgcube["incube"] = "NONE" |
| ... | ... | @@ -325,7 +349,6 @@ class cspull(ctools.cscript): |
| 325 | 349 | for n in result['colnames']: |
| 326 | 350 | headers[n] = n |
| 327 | 351 | writer.writerow(headers) |
| 328 | - #writer.writerow(dict((_,_) for _ in result['colnames'])) | |
| 329 | 352 | else: |
| 330 | 353 | file = open(self.m_outfile.url(), 'a') |
| 331 | 354 | writer = csv.DictWriter(file, result['colnames']) |
| ... | ... | @@ -391,7 +414,12 @@ class cspull(ctools.cscript): |
| 391 | 414 | |
| 392 | 415 | # If stacked, add stacked responses and model |
| 393 | 416 | if self.obs.size() > 1 and self.m_enumbins > 0: |
| 394 | - obs[0].response(self.m_exposure, self.m_psfcube, self.m_bckcube) | |
| 417 | + if self.m_edisp: | |
| 418 | + obs[0].response(self.m_exposure, self.m_psfcube, | |
| 419 | + self.m_edispcube, self.m_bckcube) | |
| 420 | + else: | |
| 421 | + obs[0].response(self.m_exposure, self.m_psfcube, | |
| 422 | + self.m_bckcube) | |
| 395 | 423 | obs.models(self.m_stackmodels) |
| 396 | 424 | |
| 397 | 425 | # Determine number of events in simulation | ... | ... |
cscripts/csresmap.py
| ... | ... | @@ -108,6 +108,7 @@ class csresmap(ctools.cscript): |
| 108 | 108 | pars.append(gammalib.GApplicationPar("modcube","f","a","NONE","","","Input model cube file (generated with ctmodel)")) |
| 109 | 109 | pars.append(gammalib.GApplicationPar("expcube","f","a","NONE","","","Input exposure cube file (only needed for stacked analysis)")) |
| 110 | 110 | pars.append(gammalib.GApplicationPar("psfcube","f","a","NONE","","","Input PSF cube file (only needed for stacked analysis)")) |
| 111 | + pars.append(gammalib.GApplicationPar("edispcube","f","a","NONE","","","Input energy dispersion cube file (only needed for stacked analysis)")) | |
| 111 | 112 | pars.append(gammalib.GApplicationPar("bkgcube","f","a","NONE","","","Input background cube file (only needed for stacked analysis)")) |
| 112 | 113 | pars.append(gammalib.GApplicationPar("inmodel","f","a","$CTOOLS/share/models/crab.xml","","","Input model XML file")) |
| 113 | 114 | pars.append(gammalib.GApplicationPar("caldb","s","a","prod2","","","Calibration database")) |
| ... | ... | @@ -174,7 +175,6 @@ class csresmap(ctools.cscript): |
| 174 | 175 | # Skip ctbin step later on |
| 175 | 176 | self.m_skip_binning = True |
| 176 | 177 | |
| 177 | - | |
| 178 | 178 | # Set models if we have none |
| 179 | 179 | if self.obs.models().size() == 0: |
| 180 | 180 | self.obs.models(self["inmodel"].filename()) |
| ... | ... | @@ -371,7 +371,6 @@ class csresmap(ctools.cscript): |
| 371 | 371 | # Get model map into GSkyMap object |
| 372 | 372 | modelmap = model.cube().map().copy() |
| 373 | 373 | |
| 374 | - | |
| 375 | 374 | # Store counts map as residual map. Note that we need a |
| 376 | 375 | # special construct here to avoid memory leaks. This seems |
| 377 | 376 | # to be a SWIG feature as SWIG creates a new object when | ... | ... |
cscripts/csspec.py
| ... | ... | @@ -2,7 +2,7 @@ |
| 2 | 2 | # ========================================================================== |
| 3 | 3 | # Spectral points generation script. |
| 4 | 4 | # |
| 5 | -# Copyright (C) 2014-2015 Michael Mayer | |
| 5 | +# Copyright (C) 2014-2016 Michael 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 |
| ... | ... | @@ -40,7 +40,7 @@ class csspec(ctools.cscript): |
| 40 | 40 | |
| 41 | 41 | # Set name |
| 42 | 42 | self.name = "csspec" |
| 43 | - self.version = "1.0.0" | |
| 43 | + self.version = "1.1.0" | |
| 44 | 44 | |
| 45 | 45 | # Initialise some members |
| 46 | 46 | self.obs = gammalib.GObservations() |
| ... | ... | @@ -105,6 +105,7 @@ class csspec(ctools.cscript): |
| 105 | 105 | pars.append(gammalib.GApplicationPar("srcname","s","a","Crab","","","Source name")) |
| 106 | 106 | pars.append(gammalib.GApplicationPar("expcube","f","a","NONE","","","Input exposure cube file (only needed for stacked analysis)")) |
| 107 | 107 | pars.append(gammalib.GApplicationPar("psfcube","f","a","NONE","","","Input PSF cube file (only needed for stacked analysis)")) |
| 108 | + pars.append(gammalib.GApplicationPar("edispcube","f","a","NONE","","","Input energy dispersion cube file (only needed for stacked analysis)")) | |
| 108 | 109 | pars.append(gammalib.GApplicationPar("bkgcube","f","a","NONE","","","Input background cube file (only needed for stacked analysis)")) |
| 109 | 110 | pars.append(gammalib.GApplicationPar("caldb","s","a","prod2","","","Calibration database")) |
| 110 | 111 | pars.append(gammalib.GApplicationPar("irf","s","a","South_0.5h","","","Instrument response function")) | ... | ... |
cscripts/cstsdist.py
| ... | ... | @@ -42,7 +42,7 @@ class cstsdist(ctools.cscript): |
| 42 | 42 | """ |
| 43 | 43 | # Set name |
| 44 | 44 | self.name = "cstsdist" |
| 45 | - self.version = "1.0.0" | |
| 45 | + self.version = "1.1.0" | |
| 46 | 46 | |
| 47 | 47 | # Initialise some members |
| 48 | 48 | self.obs = None |
| ... | ... | @@ -99,6 +99,7 @@ class cstsdist(ctools.cscript): |
| 99 | 99 | pars.append(gammalib.GApplicationPar("srcname","s","a","Crab","","","Source name")) |
| 100 | 100 | pars.append(gammalib.GApplicationPar("expcube","s","a","NONE","","","Input exposure cube file (only needed for stacked analysis)")) |
| 101 | 101 | pars.append(gammalib.GApplicationPar("psfcube","s","a","NONE","","","Input PSF cube file (only needed for stacked analysis)")) |
| 102 | + pars.append(gammalib.GApplicationPar("edispcube","f","a","NONE","","","Input energy dispersion cube file (only needed for stacked analysis)")) | |
| 102 | 103 | pars.append(gammalib.GApplicationPar("bkgcube","s","a","NONE","","","Input background cube file (only needed for stacked analysis)")) |
| 103 | 104 | pars.append(gammalib.GApplicationPar("caldb","s","a","prod2","","","Calibration database")) |
| 104 | 105 | pars.append(gammalib.GApplicationPar("irf","s","a","South_0.5h","","","Instrument response function")) | ... | ... |
doc/source/reference_manual/ctedispcube.rst
0 → 100644
| 1 | +.. _ctedispcube: | |
| 2 | + | |
| 3 | +ctedispcube | |
| 4 | +========= | |
| 5 | + | |
| 6 | +Generate energy dispersion cube for a counts cube. | |
| 7 | + | |
| 8 | + | |
| 9 | +Synopsis | |
| 10 | +-------- | |
| 11 | + | |
| 12 | +This tool generates an energy dispersion cube for a counts cube. An energy | |
| 13 | +dispersion cube is a 4-dimensional cube spanned by Right Ascension or | |
| 14 | +Galactic longitude, Declination or Galactic latitude, energy, and fraction | |
| 15 | +between recontructed and true photon energy. The energy binning of the cube | |
| 16 | +may be either linear, logarithmic, or custom defined using an input file. | |
| 17 | + | |
| 18 | +ctedispcube requires on input the event list or observation definition file | |
| 19 | +that has been used in the generation of the counts cube using :doc:`ctbin`. | |
| 20 | + | |
| 21 | +It is not recommended to use the counts cube for the energy dispersion | |
| 22 | +cube definition, although this is formally possible by specifying the counts | |
| 23 | +cube as ``incube`` parameter. This leads however to a large FITS file on | |
| 24 | +output since the number of bins in the counts cube will be multiplied by | |
| 25 | +the number of offset angle bins (typically 200). Since the energy dispersion | |
| 26 | +varies only little over the field of view of the camera it is | |
| 27 | +recommended to use a rather coarse spatial binning to keep the file size | |
| 28 | +manageable (with a typical value of ``binsz=1.0``). | |
| 29 | + | |
| 30 | +ctedispcube generates an energy dispersion cube FITS file comprising three | |
| 31 | +extensions. The primary extension contains a 3-dimensional image that contains | |
| 32 | +the energy disperison values. The energy and fraction dimensions of the enrgy | |
| 33 | +dispersion cube are folded into the 3rd dimension of the FITS image. The next | |
| 34 | +extension named ``EBOUNDS`` contains a binary table that defines the energy | |
| 35 | +boundaries of the exposure cube. The last extension named ``DELTAS`` contains | |
| 36 | +a binary table that defines the fraction between recontructed and true photon | |
| 37 | +energy. | |
| 38 | + | |
| 39 | + | |
| 40 | +General parameters | |
| 41 | +------------------ | |
| 42 | + | |
| 43 | +``inobs [file]`` | |
| 44 | + Input event list or observation definition XML file. | |
| 45 | + | |
| 46 | +``incube [file]`` | |
| 47 | + Input counts cube file to extract energy dispersion cube definition. | |
| 48 | + | |
| 49 | +``caldb [string]`` | |
| 50 | + Calibration database. | |
| 51 | + | |
| 52 | +``irf [string]`` | |
| 53 | + Instrument response function. | |
| 54 | + | |
| 55 | +``(edisp = no) [boolean]`` | |
| 56 | + Apply energy dispersion for response computation. | |
| 57 | + | |
| 58 | +``outcube [file]`` | |
| 59 | + Output energy dispersion cube file. | |
| 60 | + | |
| 61 | +``ebinalg <FILE|LIN|LOG> [string]`` | |
| 62 | + Algorithm for defining energy bins. | |
| 63 | + | |
| 64 | +``emin [real]`` | |
| 65 | + Lower energy value for first energy bin (in TeV). | |
| 66 | + | |
| 67 | +``emax [real]`` | |
| 68 | + Upper energy value for last energy bin (in TeV). | |
| 69 | + | |
| 70 | +``enumbins [integer]`` | |
| 71 | + Number of energy bins. | |
| 72 | + | |
| 73 | +``ebinfile [file]`` | |
| 74 | + Name of the file containing the energy bin definition. | |
| 75 | + | |
| 76 | +``(usepnt = no) [boolean]`` | |
| 77 | + Use CTA pointing direction for cube centre instead of xref/yref parameters? | |
| 78 | + | |
| 79 | +``nxpix [integer]`` | |
| 80 | + Number of cube bins in Right Ascension or Galactic longitude. | |
| 81 | + | |
| 82 | +``nypix [integer]`` | |
| 83 | + Number of cube bins in Declination or Galactic latitude. | |
| 84 | + | |
| 85 | +``binsz [real]`` | |
| 86 | + Cube bin size (in degrees/pixel). | |
| 87 | + | |
| 88 | +``coordsys <CEL|GAL> [string]`` | |
| 89 | + Coordinate system (CEL - celestial, GAL - galactic). | |
| 90 | + | |
| 91 | +``xref [real]`` | |
| 92 | + Right Ascension / Galactic longitude of cube centre (J2000, in degrees). | |
| 93 | + | |
| 94 | +``yref [real]`` | |
| 95 | + Declination / Galactic latitude of cube centre (J2000, in degrees). | |
| 96 | + | |
| 97 | +``proj <AIT|AZP|CAR|MER|MOL|STG|TAN> [string]`` | |
| 98 | + Projection method. | |
| 99 | + | |
| 100 | +``(mmax = 10.0) [real]`` | |
| 101 | + Upper bound of fraction between recontructed and true photon energy. | |
| 102 | + | |
| 103 | +``(migrabins = 200) [integer]`` | |
| 104 | + Number of migration bins. | |
| 105 | + | |
| 106 | + | |
| 107 | +Standard parameters | |
| 108 | +------------------- | |
| 109 | + | |
| 110 | +``(chatter = 2) [integer]`` | |
| 111 | + Verbosity of the executable: | |
| 112 | + chatter = 0: no information will be logged | |
| 113 | + | |
| 114 | + chatter = 1: only errors will be logged | |
| 115 | + | |
| 116 | + chatter = 2: errors and actions will be logged | |
| 117 | + | |
| 118 | + chatter = 3: report about the task execution | |
| 119 | + | |
| 120 | + chatter = 4: detailed report about the task execution | |
| 121 | + | |
| 122 | +``(clobber = yes) [boolean]`` | |
| 123 | + Specifies whether an existing output energy dispersion cube file should be overwritten. | |
| 124 | + | |
| 125 | +``(debug = no) [boolean]`` | |
| 126 | + Enables debug mode. In debug mode the executable will dump any log file output to the console. | |
| 127 | + | |
| 128 | +``(mode = ql) [string]`` | |
| 129 | + Mode of automatic parameters (default is "ql", i.e. "query and learn"). | |
| 130 | + | |
| 131 | +``(logfile = ctedispcube.log) [string]`` | |
| 132 | + Name of log file. | |
| 133 | + | |
| 134 | + | |
| 135 | +Related tools or scripts | |
| 136 | +------------------------ | |
| 137 | + | |
| 138 | +:doc:`ctbin` | ... | ... |
doc/source/reference_manual/ctpsfcube.rst
| ... | ... | @@ -20,7 +20,7 @@ ctpsfcube requires on input the event list or observation definition file |
| 20 | 20 | that has been used in the generation of the counts cube using :doc:`ctbin`. |
| 21 | 21 | |
| 22 | 22 | It is not recommended to use the counts cube for the point spread function |
| 23 | -cube definition, although this is formally possibly by specifying the counts | |
| 23 | +cube definition, although this is formally possible by specifying the counts | |
| 24 | 24 | cube as ``incube`` parameter. This leads however to a large FITS file on |
| 25 | 25 | output since the number of bins in the counts cube will be multiplied by |
| 26 | 26 | the number of offset angle bins (typically 200). Since the point spread | ... | ... |
doc/source/reference_manual/index.rst
| ... | ... | @@ -19,6 +19,7 @@ ctools |
| 19 | 19 | ctbkgcube --- Generates background cube <ctbkgcube> |
| 20 | 20 | ctbutterfly --- Compute butterfly <ctbutterfly> |
| 21 | 21 | ctcubemask --- Filter counts cube <ctcubemask> |
| 22 | + ctedispcube --- Generates energy dispersion cube <ctedispcube> | |
| 22 | 23 | ctexpcube --- Generates exposure cube <ctexpcube> |
| 23 | 24 | ctlike --- Performs maximum likelihood fitting <ctlike> |
| 24 | 25 | ctmodel --- Computes model counts cube <ctmodel> | ... | ... |
src/Makefile.am
| ... | ... | @@ -14,6 +14,7 @@ SUBDIRS = support \ |
| 14 | 14 | ctskymap \ |
| 15 | 15 | ctexpcube \ |
| 16 | 16 | ctpsfcube \ |
| 17 | + ctedispcube \ | |
| 17 | 18 | ctbkgcube \ |
| 18 | 19 | ctcubemask \ |
| 19 | 20 | cttsmap \ |
| ... | ... | @@ -40,6 +41,7 @@ libctools_la_LIBADD = support/libsupport.la \ |
| 40 | 41 | ctskymap/libctskymap.la \ |
| 41 | 42 | ctexpcube/libctexpcube.la \ |
| 42 | 43 | ctpsfcube/libctpsfcube.la \ |
| 44 | + ctedispcube/libctedispcube.la \ | |
| 43 | 45 | ctbkgcube/libctbkgcube.la \ |
| 44 | 46 | ctcubemask/libctcubemask.la \ |
| 45 | 47 | cttsmap/libcttsmap.la \ | ... | ... |
src/ctbutterfly/ctbutterfly.par
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | # ------------------------------------------------------------------------- # |
| 6 | 6 | # # |
| 7 | 7 | # File: ctbutterfly # |
| 8 | -# Version: 1.0.0 # | |
| 8 | +# Version: 1.1.0 # | |
| 9 | 9 | # # |
| 10 | 10 | # Author: Michael Mayer # |
| 11 | 11 | # michael.mayer@physik.hu-berlin.de # |
| ... | ... | @@ -22,6 +22,7 @@ inmodel, f, a, "$CTOOLS/share/models/crab.xml",,, "Input model XML file" |
| 22 | 22 | srcname, s, a, "Crab",,,"Source of interest" |
| 23 | 23 | expcube, f, a, "NONE",,, "Input exposure cube file (only needed for stacked analysis)" |
| 24 | 24 | psfcube, f, a, "NONE",,, "Input PSF cube file (only needed for stacked analysis)" |
| 25 | +edispcube, f, a, "NONE",,, "Input energy dispersion cube file (only needed for stacked analysis)" | |
| 25 | 26 | bkgcube, f, a, "NONE",,, "Input background cube file (only needed for stacked analysis)" |
| 26 | 27 | caldb, s, a, "prod2",,, "Calibration database" |
| 27 | 28 | irf, s, a, "South_0.5h",,, "Instrument response function" | ... | ... |
src/ctedispcube/Makefile.am
0 → 100644
| 1 | +## Process this file with automake to produce Makefile.in | |
| 2 | + | |
| 3 | +# Set include directories | |
| 4 | +INCLUDES = -I$(top_srcdir)/src/support | |
| 5 | + | |
| 6 | +# Program name | |
| 7 | +bin_PROGRAMS = ctedispcube | |
| 8 | + | |
| 9 | +# Sources | |
| 10 | +sources = ctedispcube.cpp | |
| 11 | + | |
| 12 | +# Libtool library | |
| 13 | +noinst_LTLIBRARIES = libctedispcube.la | |
| 14 | +libctedispcube_la_SOURCES = $(sources) | |
| 15 | +libctedispcube_la_LDFLAGS = @OPENMP_LIB_LDFLAGS@ | |
| 16 | + | |
| 17 | +# Program definition | |
| 18 | +ctedispcube_SOURCES = main.cpp | |
| 19 | +ctedispcube_LDFLAGS = $(LIB_LINK_OPTION) @LDFLAGS@ | |
| 20 | +ctedispcube_CPPFLAGS = @CPPFLAGS@ | |
| 21 | +ctedispcube_LDADD = libctedispcube.la $(top_srcdir)/src/support/libsupport.la | |
| 22 | + | |
| 23 | +# Parameter files | |
| 24 | +pfilesdir = $(prefix)/syspfiles | |
| 25 | +pfiles_DATA = ctedispcube.par | ... | ... |
src/ctedispcube/ctedispcube.cpp
0 → 100644
| 1 | +/*************************************************************************** | |
| 2 | + * ctedispcube - Energy dispersion cube generation tool * | |
| 3 | + * ----------------------------------------------------------------------- * | |
| 4 | + * copyright (C) 2016 by Maria Haupt * | |
| 5 | + * ----------------------------------------------------------------------- * | |
| 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 | +/** | |
| 22 | + * @file ctedispcube.cpp | |
| 23 | + * @brief Energy dispersion cube generation tool implementation | |
| 24 | + * @author Maria Haupt | |
| 25 | + */ | |
| 26 | + | |
| 27 | +/* __ Includes ___________________________________________________________ */ | |
| 28 | +#ifdef HAVE_CONFIG_H | |
| 29 | +#include <config.h> | |
| 30 | +#endif | |
| 31 | +#include <cstdio> | |
| 32 | +#include "ctedispcube.hpp" | |
| 33 | +#include "GTools.hpp" | |
| 34 | +#include "GWcs.hpp" | |
| 35 | + | |
| 36 | +/* __ Method name definitions ____________________________________________ */ | |
| 37 | +#define G_GET_PARAMETERS "ctedispcube::get_parameters()" | |
| 38 | + | |
| 39 | +/* __ Debug definitions __________________________________________________ */ | |
| 40 | + | |
| 41 | +/* __ Coding definitions _________________________________________________ */ | |
| 42 | + | |
| 43 | + | |
| 44 | +/*========================================================================== | |
| 45 | + = = | |
| 46 | + = Constructors/destructors = | |
| 47 | + = = | |
| 48 | + ==========================================================================*/ | |
| 49 | + | |
| 50 | +/***********************************************************************//** | |
| 51 | + * @brief Void constructor | |
| 52 | + * | |
| 53 | + * Constructs an empty energy dispersion tool. | |
| 54 | + ***************************************************************************/ | |
| 55 | +ctedispcube::ctedispcube(void) : ctool(CTEDISPCUBE_NAME, CTEDISPCUBE_VERSION) | |
| 56 | +{ | |
| 57 | + // Initialise members | |
| 58 | + init_members(); | |
| 59 | + | |
| 60 | + // Return | |
| 61 | + return; | |
| 62 | +} | |
| 63 | + | |
| 64 | + | |
| 65 | +/***********************************************************************//** | |
| 66 | + * @brief Observations constructor | |
| 67 | + * | |
| 68 | + * @param[in] obs Observation container. | |
| 69 | + * | |
| 70 | + * Constructs an energy dispersion tool from the information that is provided | |
| 71 | + * in an observation container @p obs. | |
| 72 | + ***************************************************************************/ | |
| 73 | +ctedispcube::ctedispcube(const GObservations& obs) : | |
| 74 | + ctool(CTEDISPCUBE_NAME, CTEDISPCUBE_VERSION) | |
| 75 | +{ | |
| 76 | + // Initialise members | |
| 77 | + init_members(); | |
| 78 | + | |
| 79 | + // Set observations | |
| 80 | + m_obs = obs; | |
| 81 | + | |
| 82 | + // Return | |
| 83 | + return; | |
| 84 | +} | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | +/***********************************************************************//** | |
| 89 | + * @brief Command line constructor | |
| 90 | + * | |
| 91 | + * @param[in] argc Number of arguments in command line. | |
| 92 | + * @param[in] argv Array of command line arguments. | |
| 93 | + * | |
| 94 | + * Constructs an energy dispersion tool by parsing the arguments provided | |
| 95 | + * on the command line. | |
| 96 | + ***************************************************************************/ | |
| 97 | +ctedispcube::ctedispcube(int argc, char *argv[]) : | |
| 98 | + ctool(CTEDISPCUBE_NAME, CTEDISPCUBE_VERSION, argc, argv) | |
| 99 | +{ | |
| 100 | + // Initialise members | |
| 101 | + init_members(); | |
| 102 | + | |
| 103 | + // Return | |
| 104 | + return; | |
| 105 | +} | |
| 106 | + | |
| 107 | + | |
| 108 | +/***********************************************************************//** | |
| 109 | + * @brief Copy constructor | |
| 110 | + * | |
| 111 | + * @param[in] app Energy dispersion tool. | |
| 112 | + * | |
| 113 | + * Constructs an energy dispersion tool by copying anothere energy | |
| 114 | + * dispersion tool. | |
| 115 | + ***************************************************************************/ | |
| 116 | +ctedispcube::ctedispcube(const ctedispcube& app) : ctool(app) | |
| 117 | +{ | |
| 118 | + // Initialise members | |
| 119 | + init_members(); | |
| 120 | + | |
| 121 | + // Copy members | |
| 122 | + copy_members(app); | |
| 123 | + | |
| 124 | + // Return | |
| 125 | + return; | |
| 126 | +} | |
| 127 | + | |
| 128 | + | |
| 129 | +/***********************************************************************//** | |
| 130 | + * @brief Destructor | |
| 131 | + * | |
| 132 | + * Desctructs an energy dispersion tool. | |
| 133 | + ***************************************************************************/ | |
| 134 | +ctedispcube::~ctedispcube(void) | |
| 135 | +{ | |
| 136 | + // Free members | |
| 137 | + free_members(); | |
| 138 | + | |
| 139 | + // Return | |
| 140 | + return; | |
| 141 | +} | |
| 142 | + | |
| 143 | + | |
| 144 | +/*========================================================================== | |
| 145 | + = = | |
| 146 | + = Operators = | |
| 147 | + = = | |
| 148 | + ==========================================================================*/ | |
| 149 | + | |
| 150 | +/***********************************************************************//** | |
| 151 | + * @brief Assignment operator | |
| 152 | + * | |
| 153 | + * @param[in] app Energy dispersion tool. | |
| 154 | + * @return Energy dispersion tool. | |
| 155 | + * | |
| 156 | + * Assigns energy dispersion tool. | |
| 157 | + ***************************************************************************/ | |
| 158 | +ctedispcube& ctedispcube::operator=(const ctedispcube& app) | |
| 159 | +{ | |
| 160 | + // Execute only if object is not identical | |
| 161 | + if (this != &app) { | |
| 162 | + | |
| 163 | + // Copy base class members | |
| 164 | + this->ctool::operator=(app); | |
| 165 | + | |
| 166 | + // Free members | |
| 167 | + free_members(); | |
| 168 | + | |
| 169 | + // Initialise members | |
| 170 | + init_members(); | |
| 171 | + | |
| 172 | + // Copy members | |
| 173 | + copy_members(app); | |
| 174 | + | |
| 175 | + } // endif: object was not identical | |
| 176 | + | |
| 177 | + // Return this object | |
| 178 | + return *this; | |
| 179 | +} | |
| 180 | + | |
| 181 | + | |
| 182 | +/*========================================================================== | |
| 183 | + = = | |
| 184 | + = Public methods = | |
| 185 | + = = | |
| 186 | + ==========================================================================*/ | |
| 187 | + | |
| 188 | +/***********************************************************************//** | |
| 189 | + * @brief Clear energy dispersion tool | |
| 190 | + * | |
| 191 | + * Set the energy disperison tool to an empty tool. | |
| 192 | + ***************************************************************************/ | |
| 193 | +void ctedispcube::clear(void) | |
| 194 | +{ | |
| 195 | + // Free members | |
| 196 | + free_members(); | |
| 197 | + this->ctool::free_members(); | |
| 198 | + this->GApplication::free_members(); | |
| 199 | + | |
| 200 | + // Initialise members | |
| 201 | + this->GApplication::init_members(); | |
| 202 | + this->ctool::init_members(); | |
| 203 | + init_members(); | |
| 204 | + | |
| 205 | + // Return | |
| 206 | + return; | |
| 207 | +} | |
| 208 | + | |
| 209 | + | |
| 210 | +/***********************************************************************//** | |
| 211 | + * @brief Generate the energy dispersion cube | |
| 212 | + * | |
| 213 | + * Generates the energy dispersion cube by looping over all unbinned CTA | |
| 214 | + * observations in the observation container. | |
| 215 | + ***************************************************************************/ | |
| 216 | +void ctedispcube::run(void) | |
| 217 | +{ | |
| 218 | + // If we're in debug mode then all output is also dumped on the screen | |
| 219 | + if (logDebug()) { | |
| 220 | + log.cout(true); | |
| 221 | + } | |
| 222 | + | |
| 223 | + // Get task parameters | |
| 224 | + get_parameters(); | |
| 225 | + | |
| 226 | + // Write parameters into logger | |
| 227 | + if (logTerse()) { | |
| 228 | + log_parameters(); | |
| 229 | + log << std::endl; | |
| 230 | + } | |
| 231 | + | |
| 232 | + // Write observation(s) into logger | |
| 233 | + if (logTerse()) { | |
| 234 | + log << std::endl; | |
| 235 | + if (m_obs.size() > 1) { | |
| 236 | + log.header1("Observations"); | |
| 237 | + } | |
| 238 | + else { | |
| 239 | + log.header1("Observation"); | |
| 240 | + } | |
| 241 | + log << m_obs << std::endl; | |
| 242 | + } | |
| 243 | + | |
| 244 | + // Write header | |
| 245 | + if (logTerse()) { | |
| 246 | + log << std::endl; | |
| 247 | + log.header1("Generate energy dispersion cube"); | |
| 248 | + } | |
| 249 | + | |
| 250 | + // Fill Edisp | |
| 251 | + m_edispcube.fill(m_obs, &log); | |
| 252 | + | |
| 253 | + // Return | |
| 254 | + return; | |
| 255 | +} | |
| 256 | + | |
| 257 | + | |
| 258 | +/***********************************************************************//** | |
| 259 | + * @brief Save energy dispersion cube | |
| 260 | + * | |
| 261 | + * Saves the energy dispersion cube in a FITS file. The FITS filename is | |
| 262 | + * provided by the "outcube" parameter. | |
| 263 | + ***************************************************************************/ | |
| 264 | +void ctedispcube::save(void) | |
| 265 | +{ | |
| 266 | + // Write header | |
| 267 | + if (logTerse()) { | |
| 268 | + log << std::endl; | |
| 269 | + log.header1("Save Edisp cube"); | |
| 270 | + } | |
| 271 | + | |
| 272 | + // Get output filename | |
| 273 | + m_outcube = (*this)["outcube"].filename(); | |
| 274 | + | |
| 275 | + // Save only if filename is non-empty | |
| 276 | + if (!m_outcube.is_empty()) { | |
| 277 | + | |
| 278 | + // Log filename | |
| 279 | + if (logTerse()) { | |
| 280 | + log << "Save energy dispersion cube into file \""+m_outcube+"\"."; | |
| 281 | + log << std::endl; | |
| 282 | + } | |
| 283 | + | |
| 284 | + // Save energy dispersion cube | |
| 285 | + m_edispcube.save(m_outcube, clobber()); | |
| 286 | + | |
| 287 | + } | |
| 288 | + | |
| 289 | + // Return | |
| 290 | + return; | |
| 291 | +} | |
| 292 | + | |
| 293 | + | |
| 294 | +/*========================================================================== | |
| 295 | + = = | |
| 296 | + = Private methods = | |
| 297 | + = = | |
| 298 | + ==========================================================================*/ | |
| 299 | + | |
| 300 | +/***********************************************************************//** | |
| 301 | + * @brief Initialise class members | |
| 302 | + ***************************************************************************/ | |
| 303 | +void ctedispcube::init_members(void) | |
| 304 | +{ | |
| 305 | + // Initialise members | |
| 306 | + m_outcube.clear(); | |
| 307 | + m_obs.clear(); | |
| 308 | + m_edispcube.clear(); | |
| 309 | + | |
| 310 | + // Return | |
| 311 | + return; | |
| 312 | +} | |
| 313 | + | |
| 314 | + | |
| 315 | +/***********************************************************************//** | |
| 316 | + * @brief Copy class members | |
| 317 | + * | |
| 318 | + * @param[in] app Energy dispersion cube. | |
| 319 | + ***************************************************************************/ | |
| 320 | +void ctedispcube::copy_members(const ctedispcube& app) | |
| 321 | +{ | |
| 322 | + // Copy members | |
| 323 | + m_outcube = app.m_outcube; | |
| 324 | + m_obs = app.m_obs; | |
| 325 | + m_edispcube = app.m_edispcube; | |
| 326 | + | |
| 327 | + // Return | |
| 328 | + return; | |
| 329 | +} | |
| 330 | + | |
| 331 | + | |
| 332 | +/***********************************************************************//** | |
| 333 | + * @brief Delete class members | |
| 334 | + ***************************************************************************/ | |
| 335 | +void ctedispcube::free_members(void) | |
| 336 | +{ | |
| 337 | + // Return | |
| 338 | + return; | |
| 339 | +} | |
| 340 | + | |
| 341 | + | |
| 342 | +/***********************************************************************//** | |
| 343 | + * @brief Get application parameters | |
| 344 | + * | |
| 345 | + * Get all task parameters from parameter file or (if required) by querying | |
| 346 | + * the user. The parameters are read in the correct order. | |
| 347 | + ***************************************************************************/ | |
| 348 | +void ctedispcube::get_parameters(void) | |
| 349 | +{ | |
| 350 | + // If there are no observations in container then load them via user | |
| 351 | + // parameters | |
| 352 | + if (m_obs.size() == 0) { | |
| 353 | + | |
| 354 | + // Throw exception if no input observation file is given | |
| 355 | + require_inobs(G_GET_PARAMETERS); | |
| 356 | + | |
| 357 | + // Throw exception if counts cube is given | |
| 358 | + require_inobs_nocube(G_GET_PARAMETERS); | |
| 359 | + | |
| 360 | + // Build observation container | |
| 361 | + m_obs = get_observations(); | |
| 362 | + | |
| 363 | + } // endif: there was no observation in the container | |
| 364 | + | |
| 365 | + // Get the incube filename | |
| 366 | + std::string incube = (*this)["incube"].filename(); | |
| 367 | + | |
| 368 | + // Get additional binning parameters | |
| 369 | + double migramax = (*this)["migramax"].real(); | |
| 370 | + int migrabins = (*this)["migrabins"].integer(); | |
| 371 | + | |
| 372 | + // Check for filename validity | |
| 373 | + if ((incube == "NONE") || (gammalib::strip_whitespace(incube) == "")) { | |
| 374 | + | |
| 375 | + // Create an event cube based on task parameters | |
| 376 | + GCTAEventCube cube = create_cube(m_obs); | |
| 377 | + | |
| 378 | + // Define edisp cube | |
| 379 | + m_edispcube = GCTACubeEdisp(cube, migramax, migrabins); | |
| 380 | + | |
| 381 | + } | |
| 382 | + | |
| 383 | + // ... otherwise setup the exposure cube from the counts map | |
| 384 | + else { | |
| 385 | + | |
| 386 | + // Load event cube from filename | |
| 387 | + GCTAEventCube cube(incube); | |
| 388 | + | |
| 389 | + // Define Edisp cube | |
| 390 | + m_edispcube = GCTACubeEdisp(cube, migramax, migrabins); | |
| 391 | + | |
| 392 | + } // endelse: cube loaded from file | |
| 393 | + | |
| 394 | + // Read output filename (if needed) | |
| 395 | + if (read_ahead()) { | |
| 396 | + m_outcube = (*this)["outcube"].filename(); | |
| 397 | + } | |
| 398 | + | |
| 399 | + // Return | |
| 400 | + return; | |
| 401 | +} | ... | ... |
src/ctedispcube/ctedispcube.hpp
0 → 100644
| 1 | +/*************************************************************************** | |
| 2 | + * ctedispcube - Energy dispersion cube generation tool * | |
| 3 | + * ----------------------------------------------------------------------- * | |
| 4 | + * copyright (C) 2016 by Maria Haupt * | |
| 5 | + * ----------------------------------------------------------------------- * | |
| 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 | +/** | |
| 22 | + * @file ctedispcube.hpp | |
| 23 | + * @brief Energy dispersion cube generation tool definition | |
| 24 | + * @author Chia-Chun Lu | |
| 25 | + */ | |
| 26 | + | |
| 27 | +#ifndef CTEDISPCUBE_HPP | |
| 28 | +#define CTEDISPCUBE_HPP | |
| 29 | + | |
| 30 | +/* __ Includes ___________________________________________________________ */ | |
| 31 | +#include "GammaLib.hpp" | |
| 32 | +#include "GCTALib.hpp" | |
| 33 | +#include "ctool.hpp" | |
| 34 | + | |
| 35 | +/* __Definitions _________________________________________________________ */ | |
| 36 | +#define CTEDISPCUBE_NAME "ctedispcube" | |
| 37 | +#define CTEDISPCUBE_VERSION "1.1.0" | |
| 38 | + | |
| 39 | + | |
| 40 | +/***********************************************************************//** | |
| 41 | + * @class ctedispcube | |
| 42 | + * | |
| 43 | + * @brief Energy dispersion cube generation tool | |
| 44 | + ***************************************************************************/ | |
| 45 | +class ctedispcube : public ctool { | |
| 46 | + | |
| 47 | +public: | |
| 48 | + // Constructors and destructors | |
| 49 | + ctedispcube(void); | |
| 50 | + explicit ctedispcube(const GObservations& obs); | |
| 51 | + ctedispcube(int argc, char *argv[]); | |
| 52 | + ctedispcube(const ctedispcube& app); | |
| 53 | + virtual ~ctedispcube(void); | |
| 54 | + | |
| 55 | + // Operators | |
| 56 | + ctedispcube& operator=(const ctedispcube& app); | |
| 57 | + | |
| 58 | + // Methods | |
| 59 | + void clear(void); | |
| 60 | + void run(void); | |
| 61 | + void save(void); | |
| 62 | + const GCTACubeEdisp& edispcube(void) const; | |
| 63 | + | |
| 64 | +protected: | |
| 65 | + // Protected methods | |
| 66 | + void init_members(void); | |
| 67 | + void copy_members(const ctedispcube& app); | |
| 68 | + void free_members(void); | |
| 69 | + void get_parameters(void); | |
| 70 | + | |
| 71 | + // User parameters | |
| 72 | + GFilename m_outcube; //!< Output energy dispersion cube file name | |
| 73 | + | |
| 74 | + // Protected members | |
| 75 | + GObservations m_obs; //!< Observation container | |
| 76 | + GCTACubeEdisp m_edispcube; //!< Energy dispersion cube | |
| 77 | +}; | |
| 78 | + | |
| 79 | + | |
| 80 | +/***********************************************************************//** | |
| 81 | + * @brief Return energy dispersion cube | |
| 82 | + * | |
| 83 | + * @return Energy dispersion cube | |
| 84 | + ***************************************************************************/ | |
| 85 | +inline | |
| 86 | +const GCTACubeEdisp& ctedispcube::edispcube(void) const | |
| 87 | +{ | |
| 88 | + return (m_edispcube); | |
| 89 | +} | |
| 90 | + | |
| 91 | +#endif /* CTEDISPCUBE_HPP */ | ... | ... |
src/ctedispcube/ctedispcube.par
0 → 100644
| 1 | +############################################################################# | |
| 2 | +# # | |
| 3 | +# CTA Science Analysis Tools # | |
| 4 | +# # | |
| 5 | +# ------------------------------------------------------------------------- # | |
| 6 | +# # | |
| 7 | +# File: ctedispcube.par # | |
| 8 | +# Version: 1.1.0 # | |
| 9 | +# # | |
| 10 | +# Author: Maria Haupt # | |
| 11 | +# maria.haupt@desy.de # | |
| 12 | +# DESY # | |
| 13 | +# # | |
| 14 | +# Purpose: Parameter file for the ctedispcube application # | |
| 15 | +# # | |
| 16 | +############################################################################# | |
| 17 | +# | |
| 18 | +# Observational parameters | |
| 19 | +#=================== | |
| 20 | +inobs, f, a, "NONE",,, "Input event list or observation definition XML file" | |
| 21 | +incube, f, a, "NONE",,, "Input counts cube file to extract energy dispersion cube definition" | |
| 22 | +caldb, s, a, "prod2",,, "Calibration database" | |
| 23 | +irf, s, a, "South_0.5h",,, "Instrument response function" | |
| 24 | +outcube, f, a, "edispcube.fits",,, "Output energy dispersion cube file" | |
| 25 | + | |
| 26 | +# | |
| 27 | +# Energy binning parameters | |
| 28 | +#========================== | |
| 29 | +ebinalg, s, h, "LOG", FILE|LIN|LOG,, "Algorithm for defining energy bins" | |
| 30 | +emin, r, a, 0.1,,, "Lower energy limit (TeV)" | |
| 31 | +emax, r, a, 100.0,,, "Upper energy limit (TeV)" | |
| 32 | +enumbins, i, a, 20,,, "Number of energy bins" | |
| 33 | +ebinfile, f, h, "NONE",,, "Name of the file containing the energy bin definition" | |
| 34 | + | |
| 35 | +# | |
| 36 | +# Spatial binning parameters | |
| 37 | +#=========================== | |
| 38 | +usepnt, b, h, no,,, "Use pointing instead of xref/yref parameters?" | |
| 39 | +nxpix, i, a, 10,,, "Size of the X axis in pixels" | |
| 40 | +nypix, i, a, 10,,, "Size of the Y axis in pixels" | |
| 41 | +binsz, r, a, 1.0,,, "Image scale (in degrees/pixel)" | |
| 42 | +coordsys, s, a, "CEL", CEL|GAL,,"Coordinate system (CEL - celestial, GAL - galactic)" | |
| 43 | +xref, r, a, 83.63,0,360, "First coordinate of image center in degrees (RA or galactic l)" | |
| 44 | +yref, r, a, 22.01,-90,90, "Second coordinate of image center in degrees (DEC or galactic b)" | |
| 45 | +proj, s, a, "CAR", AIT|AZP|CAR|MER|MOL|STG|TAN,, "Projection method" | |
| 46 | + | |
| 47 | +# | |
| 48 | +# Angular separation binning parameters | |
| 49 | +#====================================== | |
| 50 | +migramax, r, h, 2.0,,, "Upper bound of ratio of recontructed to true photon energy" | |
| 51 | +migrabins, i, h, 100,,, "Number of migration bins" | |
| 52 | + | |
| 53 | +# | |
| 54 | +# Standard parameters | |
| 55 | +#==================== | |
| 56 | +chatter, i, h, 2,0,4, "Chattiness of output" | |
| 57 | +clobber, b, h, yes,,, "Overwrite existing output files with new output files?" | |
| 58 | +debug, b, h, no,,, "Debugging mode activated" | |
| 59 | +mode, s, h, "ql",,, "Mode of automatic parameters" | |
| 60 | +logfile, f, h, "ctedispcube.log",,, "Log filename" | ... | ... |
src/ctedispcube/main.cpp
0 → 100644
| 1 | +/*************************************************************************** | |
| 2 | + * ctedispcube - Energy dispersion cube generation tool * | |
| 3 | + * ----------------------------------------------------------------------- * | |
| 4 | + * copyright (C) 2016 by Maria Haupt * | |
| 5 | + * ----------------------------------------------------------------------- * | |
| 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 | +/** | |
| 22 | + * @file ctedispcube/main.cpp | |
| 23 | + * @brief Energy dispersion cube tool main code | |
| 24 | + * @author Maria Haupt | |
| 25 | + */ | |
| 26 | + | |
| 27 | +/* __ Includes ___________________________________________________________ */ | |
| 28 | +#ifdef HAVE_CONFIG_H | |
| 29 | +#include <config.h> | |
| 30 | +#endif | |
| 31 | +#include <cstdio> | |
| 32 | +#include "ctedispcube.hpp" | |
| 33 | + | |
| 34 | + | |
| 35 | +/***********************************************************************//** | |
| 36 | + * @brief Main entry point of application | |
| 37 | + * | |
| 38 | + * @param[in] argc Number of command line arguments. | |
| 39 | + * @param[in] argv Command line arguments. | |
| 40 | + * | |
| 41 | + * This is the main entry point of the ctedispcube application. It allocates a | |
| 42 | + * ctedispcube object and runs the application. | |
| 43 | + ***************************************************************************/ | |
| 44 | +int main (int argc, char *argv[]) | |
| 45 | +{ | |
| 46 | + // Initialise return code | |
| 47 | + int rc = 1; | |
| 48 | + | |
| 49 | + // Create instance of application | |
| 50 | + ctedispcube application(argc, argv); | |
| 51 | + | |
| 52 | + // Run application | |
| 53 | + try { | |
| 54 | + // Execute application | |
| 55 | + application.execute(); | |
| 56 | + | |
| 57 | + // Signal success | |
| 58 | + rc = 0; | |
| 59 | + } | |
| 60 | + catch (std::exception &e) { | |
| 61 | + | |
| 62 | + // Extract error message | |
| 63 | + std::string message = e.what(); | |
| 64 | + std::string signal = "*** ERROR encounterted in the execution of" | |
| 65 | + " ctedispcube. Run aborted ..."; | |
| 66 | + | |
| 67 | + // Write error in logger | |
| 68 | + application.log << signal << std::endl; | |
| 69 | + application.log << message << std::endl; | |
| 70 | + | |
| 71 | + // Write error on standard output | |
| 72 | + std::cout << signal << std::endl; | |
| 73 | + std::cout << message << std::endl; | |
| 74 | + | |
| 75 | + } // endcatch: catched any application error | |
| 76 | + | |
| 77 | + // Return | |
| 78 | + return rc; | |
| 79 | +} | ... | ... |
src/cterror/cterror.par
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | # ------------------------------------------------------------------------- # |
| 7 | 7 | # # |
| 8 | 8 | # File: cterror.par # |
| 9 | -# Version: 1.0.0 # | |
| 9 | +# Version: 1.1.0 # | |
| 10 | 10 | # # |
| 11 | 11 | # Author: Florent Forest # |
| 12 | 12 | # florent.forest@isae.fr # |
| ... | ... | @@ -23,6 +23,7 @@ inmodel, f, a, "$CTOOLS/share/models/crab.xml",,, "Input model XML file" |
| 23 | 23 | srcname, s, a, "Crab",,, "Source of interest" |
| 24 | 24 | expcube, f, a, "NONE",,, "Input exposure cube file (only needed for stacked analysis)" |
| 25 | 25 | psfcube, f, a, "NONE",,, "Input PSF cube file (only needed for stacked analysis)" |
| 26 | +edispcube,f, a, "NONE",,, "Input energy dispersion cube file (only needed for stacked analysis)" | |
| 26 | 27 | bkgcube, f, a, "NONE",,, "Input background cube file (only needed for stacked analysis)" |
| 27 | 28 | caldb, s, a, "prod2",,, "Calibration database" |
| 28 | 29 | irf, s, a, "South_0.5h",,, "Instrument response function" | ... | ... |
src/ctexpcube/ctexpcube.cpp
| ... | ... | @@ -217,18 +217,6 @@ void ctexpcube::run(void) |
| 217 | 217 | log << std::endl; |
| 218 | 218 | } |
| 219 | 219 | |
| 220 | - // Set energy dispersion flag for all CTA observations and save old | |
| 221 | - // values in save_edisp vector | |
| 222 | - std::vector<bool> save_edisp; | |
| 223 | - save_edisp.assign(m_obs.size(), false); | |
| 224 | - for (int i = 0; i < m_obs.size(); ++i) { | |
| 225 | - GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[i]); | |
| 226 | - if (obs != NULL) { | |
| 227 | - save_edisp[i] = obs->response()->apply_edisp(); | |
| 228 | - obs->response()->apply_edisp(m_apply_edisp); | |
| 229 | - } | |
| 230 | - } | |
| 231 | - | |
| 232 | 220 | // Write observation(s) into logger |
| 233 | 221 | if (logTerse()) { |
| 234 | 222 | log << std::endl; |
| ... | ... | @@ -250,14 +238,6 @@ void ctexpcube::run(void) |
| 250 | 238 | // Fill exposure |
| 251 | 239 | m_expcube.fill(m_obs, &log); |
| 252 | 240 | |
| 253 | - // Restore energy dispersion flag for all CTA observations | |
| 254 | - for (int i = 0; i < m_obs.size(); ++i) { | |
| 255 | - GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[i]); | |
| 256 | - if (obs != NULL) { | |
| 257 | - obs->response()->apply_edisp(save_edisp[i]); | |
| 258 | - } | |
| 259 | - } | |
| 260 | - | |
| 261 | 241 | // Optionally publish exposure cube |
| 262 | 242 | if (m_publish) { |
| 263 | 243 | publish(); |
| ... | ... | @@ -348,7 +328,6 @@ void ctexpcube::init_members(void) |
| 348 | 328 | { |
| 349 | 329 | // Initialise members |
| 350 | 330 | m_outcube.clear(); |
| 351 | - m_apply_edisp = false; | |
| 352 | 331 | m_publish = false; |
| 353 | 332 | |
| 354 | 333 | // Initialise protected members |
| ... | ... | @@ -369,7 +348,6 @@ void ctexpcube::copy_members(const ctexpcube& app) |
| 369 | 348 | { |
| 370 | 349 | // Copy attributes |
| 371 | 350 | m_outcube = app.m_outcube; |
| 372 | - m_apply_edisp = app.m_apply_edisp; | |
| 373 | 351 | m_publish = app.m_publish; |
| 374 | 352 | |
| 375 | 353 | // Copy protected members |
| ... | ... | @@ -414,9 +392,6 @@ void ctexpcube::get_parameters(void) |
| 414 | 392 | |
| 415 | 393 | } // endif: there was no observation in the container |
| 416 | 394 | |
| 417 | - // Read energy dispersion flag | |
| 418 | - m_apply_edisp = (*this)["edisp"].boolean(); | |
| 419 | - | |
| 420 | 395 | // Get the incube filename |
| 421 | 396 | std::string incube = (*this)["incube"].filename(); |
| 422 | 397 | ... | ... |
src/ctexpcube/ctexpcube.hpp
src/ctexpcube/ctexpcube.par
| ... | ... | @@ -21,7 +21,6 @@ inobs, f, a, "NONE",,, "Input event list or observation definition XML file" |
| 21 | 21 | incube, f, a, "NONE",,, "Input counts cube file to extract exposure cube definition" |
| 22 | 22 | caldb, s, a, "prod2",,, "Calibration database" |
| 23 | 23 | irf, s, a, "South_0.5h",,, "Instrument response function" |
| 24 | -edisp, b, h, no,,, "Apply energy dispersion?" | |
| 25 | 24 | outcube, f, a, "expcube.fits",,, "Output exposure cube file" |
| 26 | 25 | |
| 27 | 26 | # | ... | ... |
src/ctlike/ctlike.par
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | # ------------------------------------------------------------------------- # |
| 6 | 6 | # # |
| 7 | 7 | # File: ctlike.par # |
| 8 | -# Version: 1.0.0 # | |
| 8 | +# Version: 1.1.0 # | |
| 9 | 9 | # # |
| 10 | 10 | # Author: Jurgen Knodlseder # |
| 11 | 11 | # Jurgen.Knodlseder@irap.omp.eu # |
| ... | ... | @@ -21,6 +21,7 @@ inobs, f, a, "events.fits",,, "Input event list, counts cube or observ |
| 21 | 21 | inmodel, f, a, "$CTOOLS/share/models/crab.xml",,, "Input model XML file" |
| 22 | 22 | expcube, f, a, "NONE",,, "Input exposure cube file (only needed for stacked analysis)" |
| 23 | 23 | psfcube, f, a, "NONE",,, "Input PSF cube file (only needed for stacked analysis)" |
| 24 | +edispcube, f, a, "NONE",,, "Input energy dispersion cube file (only needed for stacked analysis)" | |
| 24 | 25 | bkgcube, f, a, "NONE",,, "Input background cube file (only needed for stacked analysis)" |
| 25 | 26 | caldb, s, a, "prod2",,, "Calibration database" |
| 26 | 27 | irf, s, a, "South_0.5h",,, "Instrument response function" | ... | ... |
src/ctmodel/ctmodel.par
| ... | ... | @@ -22,6 +22,7 @@ incube, f, a, "NONE",,, "Input counts cube file to extract model cube definiti |
| 22 | 22 | inmodel, f, a, "$CTOOLS/share/models/crab.xml",,, "Input model XML file" |
| 23 | 23 | expcube, f, a, "NONE",,, "Input exposure cube file (only needed for stacked analysis)" |
| 24 | 24 | psfcube, f, a, "NONE",,, "Input PSF cube file (only needed for stacked analysis)" |
| 25 | +edispcube,f, a, "NONE",,, "Input energy dispersion cube file (only needed for stacked analysis)" | |
| 25 | 26 | bkgcube, f, a, "NONE",,, "Input background cube file (only needed for stacked analysis)" |
| 26 | 27 | caldb, s, a, "prod2",,, "Calibration database" |
| 27 | 28 | irf, s, a, "South_0.5h",,, "Instrument response function" | ... | ... |
src/ctpsfcube/ctpsfcube.cpp
| ... | ... | @@ -216,18 +216,6 @@ void ctpsfcube::run(void) |
| 216 | 216 | log << std::endl; |
| 217 | 217 | } |
| 218 | 218 | |
| 219 | - // Set energy dispersion flag for all CTA observations and save old | |
| 220 | - // values in save_edisp vector | |
| 221 | - std::vector<bool> save_edisp; | |
| 222 | - save_edisp.assign(m_obs.size(), false); | |
| 223 | - for (int i = 0; i < m_obs.size(); ++i) { | |
| 224 | - GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[i]); | |
| 225 | - if (obs != NULL) { | |
| 226 | - save_edisp[i] = obs->response()->apply_edisp(); | |
| 227 | - obs->response()->apply_edisp(m_apply_edisp); | |
| 228 | - } | |
| 229 | - } | |
| 230 | - | |
| 231 | 219 | // Write observation(s) into logger |
| 232 | 220 | if (logTerse()) { |
| 233 | 221 | log << std::endl; |
| ... | ... | @@ -249,14 +237,6 @@ void ctpsfcube::run(void) |
| 249 | 237 | // Fill PSF |
| 250 | 238 | m_psfcube.fill(m_obs, &log); |
| 251 | 239 | |
| 252 | - // Restore energy dispersion flag for all CTA observations | |
| 253 | - for (int i = 0; i < m_obs.size(); ++i) { | |
| 254 | - GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[i]); | |
| 255 | - if (obs != NULL) { | |
| 256 | - obs->response()->apply_edisp(save_edisp[i]); | |
| 257 | - } | |
| 258 | - } | |
| 259 | - | |
| 260 | 240 | // Return |
| 261 | 241 | return; |
| 262 | 242 | } |
| ... | ... | @@ -308,7 +288,6 @@ void ctpsfcube::init_members(void) |
| 308 | 288 | { |
| 309 | 289 | // Initialise members |
| 310 | 290 | m_outcube.clear(); |
| 311 | - m_apply_edisp = false; | |
| 312 | 291 | |
| 313 | 292 | // Initialise protected members |
| 314 | 293 | m_obs.clear(); |
| ... | ... | @@ -328,7 +307,6 @@ void ctpsfcube::copy_members(const ctpsfcube& app) |
| 328 | 307 | { |
| 329 | 308 | // Copy attributes |
| 330 | 309 | m_outcube = app.m_outcube; |
| 331 | - m_apply_edisp = app.m_apply_edisp; | |
| 332 | 310 | |
| 333 | 311 | // Copy protected members |
| 334 | 312 | m_obs = app.m_obs; |
| ... | ... | @@ -401,9 +379,6 @@ void ctpsfcube::get_parameters(void) |
| 401 | 379 | |
| 402 | 380 | } // endelse: cube loaded from file |
| 403 | 381 | |
| 404 | - // Read energy dispersion flag | |
| 405 | - m_apply_edisp = (*this)["edisp"].boolean(); | |
| 406 | - | |
| 407 | 382 | // Read output filename (if needed) |
| 408 | 383 | if (read_ahead()) { |
| 409 | 384 | m_outcube = (*this)["outcube"].filename(); | ... | ... |
src/ctpsfcube/ctpsfcube.hpp
src/ctpsfcube/ctpsfcube.par
| ... | ... | @@ -21,7 +21,6 @@ inobs, f, a, "NONE",,, "Input event list or observation definition XML file" |
| 21 | 21 | incube, f, a, "NONE",,, "Input counts cube file to extract PSF cube definition" |
| 22 | 22 | caldb, s, a, "prod2",,, "Calibration database" |
| 23 | 23 | irf, s, a, "South_0.5h",,, "Instrument response function" |
| 24 | -edisp, b, h, no,,, "Apply energy dispersion?" | |
| 25 | 24 | outcube, f, a, "psfcube.fits",,, "Output PSF cube file" |
| 26 | 25 | |
| 27 | 26 | # | ... | ... |
src/cttsmap/cttsmap.par
| ... | ... | @@ -17,35 +17,36 @@ |
| 17 | 17 | # |
| 18 | 18 | # General parameters |
| 19 | 19 | #=================== |
| 20 | -inobs, f, a, "events.fits",,, "Input event list, counts cube or observation definition XML file" | |
| 21 | -inmodel, f, a, "$CTOOLS/share/models/crab.xml",,, "Input model XML file" | |
| 22 | -srcname, s, a, "Crab",,, "Test source name" | |
| 23 | -expcube, f, a, "NONE",,, "Input exposure cube file (only needed for stacked analysis)" | |
| 24 | -psfcube, f, a, "NONE",,, "Input PSF cube file (only needed for stacked analysis)" | |
| 25 | -bkgcube, f, a, "NONE",,, "Input background cube file (only needed for stacked analysis)" | |
| 26 | -caldb, s, a, "prod2",,, "Calibration database" | |
| 27 | -irf, s, a, "South_0.5h",,, "Instrument response function" | |
| 28 | -edisp, b, h, no,,, "Apply energy dispersion?" | |
| 29 | -outmap, f, a, "tsmap.fits",,, "Output Test Statistic map file" | |
| 20 | +inobs, f, a, "events.fits",,, "Input event list, counts cube or observation definition XML file" | |
| 21 | +inmodel, f, a, "$CTOOLS/share/models/crab.xml",,, "Input model XML file" | |
| 22 | +srcname, s, a, "Crab",,, "Test source name" | |
| 23 | +expcube, f, a, "NONE",,, "Input exposure cube file (only needed for stacked analysis)" | |
| 24 | +psfcube, f, a, "NONE",,, "Input PSF cube file (only needed for stacked analysis)" | |
| 25 | +edispcube, f, a, "NONE",,, "Input energy dispersion cube file (only needed for stacked analysis)" | |
| 26 | +bkgcube, f, a, "NONE",,, "Input background cube file (only needed for stacked analysis)" | |
| 27 | +caldb, s, a, "prod2",,, "Calibration database" | |
| 28 | +irf, s, a, "South_0.5h",,, "Instrument response function" | |
| 29 | +edisp, b, h, no,,, "Apply energy dispersion?" | |
| 30 | +outmap, f, a, "tsmap.fits",,, "Output Test Statistic map file" | |
| 30 | 31 | |
| 31 | 32 | # |
| 32 | 33 | # Spatial binning parameters |
| 33 | 34 | #=========================== |
| 34 | -usepnt, b, h, no,,, "Use pointing instead of xref/yref parameters?" | |
| 35 | -nxpix, i, a, 200,,, "Size of the X axis in pixels" | |
| 36 | -nypix, i, a, 200,,, "Size of the Y axis in pixels" | |
| 37 | -binsz, r, a, 0.02,,, "Image scale (in degrees/pixel)" | |
| 38 | -coordsys, s, a, "CEL", CEL|GAL,,"Coordinate system (CEL - celestial, GAL - galactic)" | |
| 39 | -xref, r, a, 83.63,0,360, "First coordinate of image center in degrees (RA or galactic l)" | |
| 40 | -yref, r, a, 22.01,-90,90, "Second coordinate of image center in degrees (DEC or galactic b)" | |
| 41 | -proj, s, a, "CAR", AIT|AZP|CAR|MER|MOL|STG|TAN,, "Projection method" | |
| 35 | +usepnt, b, h, no,,, "Use pointing instead of xref/yref parameters?" | |
| 36 | +nxpix, i, a, 200,,, "Size of the X axis in pixels" | |
| 37 | +nypix, i, a, 200,,, "Size of the Y axis in pixels" | |
| 38 | +binsz, r, a, 0.02,,, "Image scale (in degrees/pixel)" | |
| 39 | +coordsys, s, a, "CEL", CEL|GAL,,"Coordinate system (CEL - celestial, GAL - galactic)" | |
| 40 | +xref, r, a, 83.63,0,360, "First coordinate of image center in degrees (RA or galactic l)" | |
| 41 | +yref, r, a, 22.01,-90,90, "Second coordinate of image center in degrees (DEC or galactic b)" | |
| 42 | +proj, s, a, "CAR", AIT|AZP|CAR|MER|MOL|STG|TAN,, "Projection method" | |
| 42 | 43 | |
| 43 | 44 | # |
| 44 | 45 | # Parameters for splitting and speed purpose |
| 45 | 46 | #=========================== |
| 46 | -binmin, i, h, -1,,, "First bin to compute" | |
| 47 | -binmax, i, h, -1,,, "Last bin to compute" | |
| 48 | -logL0, r, h, 0.0,,, "LogLikelihood value of null hypothesis" | |
| 47 | +binmin, i, h, -1,,, "First bin to compute" | |
| 48 | +binmax, i, h, -1,,, "Last bin to compute" | |
| 49 | +logL0, r, h, 0.0,,, "LogLikelihood value of null hypothesis" | |
| 49 | 50 | |
| 50 | 51 | # |
| 51 | 52 | # Standard parameters | ... | ... |
src/ctulimit/ctulimit.par
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | # ------------------------------------------------------------------------- # |
| 6 | 6 | # # |
| 7 | 7 | # File: ctulimit.par # |
| 8 | -# Version: 01-00-00 # | |
| 8 | +# Version: 1.1.0 # | |
| 9 | 9 | # # |
| 10 | 10 | # Author: Michael Mayer # |
| 11 | 11 | # michael.mayer@physik.hu-berlin.de # |
| ... | ... | @@ -22,6 +22,7 @@ inmodel, f, a, "$CTOOLS/share/models/crab.xml",,, "Input model XML file" |
| 22 | 22 | srcname, s, a, "Crab",,, "Source of interest" |
| 23 | 23 | expcube, f, a, "NONE",,, "Input exposure cube file (only needed for stacked analysis)" |
| 24 | 24 | psfcube, f, a, "NONE",,, "Input PSF cube file (only needed for stacked analysis)" |
| 25 | +edispcube,f, a, "NONE",,, "Input energy dispersion cube file (only needed for stacked analysis)" | |
| 25 | 26 | bkgcube, f, a, "NONE",,, "Input background cube file (only needed for stacked analysis)" |
| 26 | 27 | caldb, s, a, "prod2",,, "Calibration database" |
| 27 | 28 | irf, s, a, "South_0.5h",,, "Instrument response function" | ... | ... |
src/support/ctool.cpp
| ... | ... | @@ -862,15 +862,18 @@ void ctool::set_obs_response(GCTAObservation* obs) |
| 862 | 862 | // If the observation contains a counts cube, then first check whether |
| 863 | 863 | // the expcube and psfcube parameters exist and are not NONE |
| 864 | 864 | if (dynamic_cast<const GCTAEventCube*>(obs->events()) != NULL) { |
| 865 | - if (has_par("expcube") && has_par("psfcube") && has_par("bkgcube")) { | |
| 865 | + if (has_par("expcube") && has_par("psfcube") && | |
| 866 | + has_par("edispcube") && has_par("bkgcube")) { | |
| 866 | 867 | |
| 867 | 868 | // Get filenames |
| 868 | - std::string expcube = (*this)["expcube"].filename(); | |
| 869 | - std::string psfcube = (*this)["psfcube"].filename(); | |
| 870 | - std::string bkgcube = (*this)["bkgcube"].filename(); | |
| 869 | + std::string expcube = (*this)["expcube"].filename(); | |
| 870 | + std::string psfcube = (*this)["psfcube"].filename(); | |
| 871 | + std::string edispcube = (*this)["edispcube"].filename(); | |
| 872 | + std::string bkgcube = (*this)["bkgcube"].filename(); | |
| 871 | 873 | |
| 872 | 874 | // Extract response information if available |
| 873 | - if ((expcube != "NONE") && (psfcube != "NONE") && (bkgcube != "NONE") && | |
| 875 | + if ((expcube != "NONE") && (psfcube != "NONE") && | |
| 876 | + (bkgcube != "NONE") && | |
| 874 | 877 | (gammalib::strip_whitespace(expcube) != "") && |
| 875 | 878 | (gammalib::strip_whitespace(psfcube) != "") && |
| 876 | 879 | (gammalib::strip_whitespace(bkgcube) != "")) { |
| ... | ... | @@ -880,8 +883,16 @@ void ctool::set_obs_response(GCTAObservation* obs) |
| 880 | 883 | GCTACubePsf psf(psfcube); |
| 881 | 884 | GCTACubeBackground background(bkgcube); |
| 882 | 885 | |
| 883 | - // Set reponse | |
| 884 | - obs->response(exposure, psf, background); | |
| 886 | + // Optionally load energy dispersion cube | |
| 887 | + if ((edispcube != "NONE") && | |
| 888 | + (gammalib::strip_whitespace(edispcube) != "")) { | |
| 889 | + GCTACubeEdisp edisp(edispcube); | |
| 890 | + obs->response(exposure, psf, edisp, background); | |
| 891 | + } | |
| 892 | + else { | |
| 893 | + // Set reponse | |
| 894 | + obs->response(exposure, psf, background); | |
| 895 | + } | |
| 885 | 896 | |
| 886 | 897 | // Signal response availability |
| 887 | 898 | has_response = true; |
| ... | ... | @@ -904,8 +915,9 @@ void ctool::set_obs_response(GCTAObservation* obs) |
| 904 | 915 | // to the observation definition XML file, in case an observation |
| 905 | 916 | // definition XML file is written. |
| 906 | 917 | std::string parameter = "parameter name=\"Calibration\"" |
| 907 | - " database=\""+database+"\"" | |
| 908 | - " response=\""+irf+"\""; | |
| 918 | + " database=\""+database+"\"" | |
| 919 | + " response=\""+irf+"\""; | |
| 920 | + | |
| 909 | 921 | GXmlElement xml; |
| 910 | 922 | xml.append(parameter); |
| 911 | 923 | |
| ... | ... | @@ -915,22 +927,6 @@ void ctool::set_obs_response(GCTAObservation* obs) |
| 915 | 927 | // Attach response to observation |
| 916 | 928 | obs->response(response); |
| 917 | 929 | |
| 918 | - // Set calibration database. If "database" is a valid directory then use | |
| 919 | - // this as the pathname to the calibration database. Otherwise, interpret | |
| 920 | - // "database" as the instrument name, the mission being "cta" | |
| 921 | - /* | |
| 922 | - GCaldb caldb; | |
| 923 | - if (gammalib::dir_exists(database)) { | |
| 924 | - caldb.rootdir(database); | |
| 925 | - } | |
| 926 | - else { | |
| 927 | - caldb.open("cta", database); | |
| 928 | - } | |
| 929 | - */ | |
| 930 | - | |
| 931 | - // Set reponse | |
| 932 | - //obs->response(irf, caldb); | |
| 933 | - | |
| 934 | 930 | // Signal response availability |
| 935 | 931 | has_response = true; |
| 936 | 932 | |
| ... | ... | @@ -967,11 +963,13 @@ void ctool::set_obs_bounds(GObservations& obs) |
| 967 | 963 | // parameters and add them |
| 968 | 964 | if (list->ebounds().is_empty()) { |
| 969 | 965 | |
| 970 | - // If there are "emin" and "emax" parameters then use them | |
| 966 | + // If there are "emin" and "emax" parameters then use | |
| 967 | + // them | |
| 971 | 968 | if (has_par("emin") && has_par("emax")) { |
| 972 | 969 | double emin = (*this)["emin"].real(); |
| 973 | 970 | double emax = (*this)["emax"].real(); |
| 974 | - GEbounds ebounds(GEnergy(emin, "TeV"), GEnergy(emax, "TeV")); | |
| 971 | + GEbounds ebounds(GEnergy(emin, "TeV"), | |
| 972 | + GEnergy(emax, "TeV")); | |
| 975 | 973 | list->ebounds(ebounds); |
| 976 | 974 | } |
| 977 | 975 | |
| ... | ... | @@ -996,7 +994,6 @@ void ctool::set_obs_bounds(GObservations& obs) |
| 996 | 994 | |
| 997 | 995 | } // endfor: looped over observations |
| 998 | 996 | |
| 999 | - | |
| 1000 | 997 | // Return |
| 1001 | 998 | return; |
| 1002 | 999 | } |
| ... | ... | @@ -1126,7 +1123,7 @@ void ctool::provide_help(void) const |
| 1126 | 1123 | char* ptr = std::getenv("CTOOLS"); |
| 1127 | 1124 | if (ptr == NULL) { |
| 1128 | 1125 | std::string msg = "CTOOLS environment variable not set, cannot " |
| 1129 | - "display help file. Please define CTOOLS " | |
| 1126 | + "display help file. Please set the CTOOLS " | |
| 1130 | 1127 | "environment variable."; |
| 1131 | 1128 | throw GException::invalid_value(G_PROVIDE_HELP, msg); |
| 1132 | 1129 | } | ... | ... |
test/data/crab_edispcube.fits.gz
0 → 100644
No preview for this file type
test/test_cscripts.sh.in
| ... | ... | @@ -405,6 +405,7 @@ fi |
| 405 | 405 | inobs="data/crab_cntmap_small.fits.gz" \ |
| 406 | 406 | expcube="data/crab_expcube.fits.gz" \ |
| 407 | 407 | psfcube="data/crab_psfcube.fits.gz" \ |
| 408 | + edispcube="data/crab_edispcube.fits.gz" \ | |
| 408 | 409 | bkgcube="data/crab_bkgcube.fits.gz" \ |
| 409 | 410 | inmodel="data/crab_bkgcube.xml" \ |
| 410 | 411 | ebinalg="LOG" \ | ... | ... |
test/test_ctedispcube.py
0 → 100755
| 1 | +#! /usr/bin/env python | |
| 2 | +# ========================================================================== | |
| 3 | +# This scripts performs unit tests for the ctedispcube tool. | |
| 4 | +# | |
| 5 | +# Copyright (C) 2016 Maria Haupt | |
| 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 | +import ctools | |
| 23 | + | |
| 24 | + | |
| 25 | +# ============================= # | |
| 26 | +# Test class for ctedispcube tool # | |
| 27 | +# ============================= # | |
| 28 | +class Test(gammalib.GPythonTestSuite): | |
| 29 | + """ | |
| 30 | + Test class for ctedispcube tool. | |
| 31 | + """ | |
| 32 | + # Constructor | |
| 33 | + def __init__(self): | |
| 34 | + """ | |
| 35 | + Constructor. | |
| 36 | + """ | |
| 37 | + # Call base class constructor | |
| 38 | + gammalib.GPythonTestSuite.__init__(self) | |
| 39 | + | |
| 40 | + # Set members | |
| 41 | + self.events_name = "data/crab_events.fits" | |
| 42 | + self.caldb = "irf" | |
| 43 | + self.irf = "cta_dummy_irf" | |
| 44 | + | |
| 45 | + # Return | |
| 46 | + return | |
| 47 | + | |
| 48 | + # Set test functions | |
| 49 | + def set(self): | |
| 50 | + """ | |
| 51 | + Set all test functions. | |
| 52 | + """ | |
| 53 | + # Set test name | |
| 54 | + self.name("ctedispcube") | |
| 55 | + | |
| 56 | + # Append tests | |
| 57 | + self.append(self.test_functional, "Test ctedispcube functionality") | |
| 58 | + | |
| 59 | + # Return | |
| 60 | + return | |
| 61 | + | |
| 62 | + # Test ctedispcube functionnality | |
| 63 | + def test_functional(self): | |
| 64 | + """ | |
| 65 | + Test ctedispcube functionnality. | |
| 66 | + """ | |
| 67 | + # Set-up ctedispcube | |
| 68 | + edispcube = ctools.ctedispcube() | |
| 69 | + edispcube["inobs"] = self.events_name | |
| 70 | + edispcube["incube"] = "NONE" | |
| 71 | + edispcube["outcube"] = "edispcube.fits" | |
| 72 | + edispcube["caldb"] = self.caldb | |
| 73 | + edispcube["irf"] = self.irf | |
| 74 | + edispcube["ebinalg"] = "LOG" | |
| 75 | + edispcube["emin"] = 0.1 | |
| 76 | + edispcube["emax"] = 100 | |
| 77 | + edispcube["enumbins"] = 20 | |
| 78 | + edispcube["nxpix"] = 10 | |
| 79 | + edispcube["nypix"] = 10 | |
| 80 | + edispcube["binsz"] = 0.4 | |
| 81 | + edispcube["coordsys"] = "CEL" | |
| 82 | + edispcube["proj"] = "CAR" | |
| 83 | + edispcube["xref"] = 83.63 | |
| 84 | + edispcube["yref"] = 22.01 | |
| 85 | + edispcube["migramax"] = 2.0 | |
| 86 | + edispcube["migrabins"] = 10 | |
| 87 | + | |
| 88 | + # Run tool | |
| 89 | + self.test_try("Run ctedispcube") | |
| 90 | + try: | |
| 91 | + edispcube.run() | |
| 92 | + self.test_try_success() | |
| 93 | + #except Exception as e: | |
| 94 | + # msg = "Exception occured in ctedispcube: %s." % (e,) | |
| 95 | + except: | |
| 96 | + msg = "Exception occured in ctedispcube." | |
| 97 | + self.test_try_failure(msg) | |
| 98 | + | |
| 99 | + # Save EDISP cube | |
| 100 | + self.test_try("Save EDISP cube") | |
| 101 | + try: | |
| 102 | + edispcube.save() | |
| 103 | + self.test_try_success() | |
| 104 | + #except Exception as e: | |
| 105 | + # msg = "Exception occured in saving EDISP cube: %s." % (e,) | |
| 106 | + except: | |
| 107 | + msg = "Exception occured in saving EDISP cubes." | |
| 108 | + self.test_try_failure(msg) | |
| 109 | + | |
| 110 | + # Return | |
| 111 | + return | ... | ... |
test/test_ctools.sh
| ... | ... | @@ -2,7 +2,7 @@ |
| 2 | 2 | # ========================================================================== |
| 3 | 3 | # This script tests all ctools |
| 4 | 4 | # |
| 5 | -# Copyright (C) 2011-2015 Juergen Knoedlseder | |
| 5 | +# Copyright (C) 2011-2016 Juergen Knoedlseder | |
| 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 |
| ... | ... | @@ -43,6 +43,7 @@ ctselect=../src/ctselect/ctselect |
| 43 | 43 | ctskymap=../src/ctskymap/ctskymap |
| 44 | 44 | ctexpcube=../src/ctexpcube/ctexpcube |
| 45 | 45 | ctpsfcube=../src/ctpsfcube/ctpsfcube |
| 46 | +ctedispcube=../src/ctedispcube/ctedispcube | |
| 46 | 47 | ctbkgcube=../src/ctbkgcube/ctbkgcube |
| 47 | 48 | ctcubemask=../src/ctcubemask/ctcubemask |
| 48 | 49 | ctbutterfly=../src/ctbutterfly/ctbutterfly |
| ... | ... | @@ -272,6 +273,57 @@ $ECHO " ok" |
| 272 | 273 | |
| 273 | 274 | |
| 274 | 275 | # |
| 276 | +# Test ctedispcube | |
| 277 | +# ============== | |
| 278 | +$ECHO -n "Test ctedispcube: " | |
| 279 | +# | |
| 280 | +# Run 1 | |
| 281 | +$ctedispcube inobs="data/crab_events.fits" \ | |
| 282 | + incube="NONE" \ | |
| 283 | + outcube="edispcube1.fits" \ | |
| 284 | + caldb="irf" \ | |
| 285 | + irf="cta_dummy_irf" \ | |
| 286 | + emin=0.1 \ | |
| 287 | + emax=100.0 \ | |
| 288 | + enumbins=20 \ | |
| 289 | + nxpix=10 \ | |
| 290 | + nypix=10 \ | |
| 291 | + binsz=0.4 \ | |
| 292 | + coordsys="CEL" \ | |
| 293 | + xref=83.63 \ | |
| 294 | + yref=22.01 \ | |
| 295 | + proj="CAR" \ | |
| 296 | + migramax=3.0 \ | |
| 297 | + migrabins=10 | |
| 298 | +$ECHO -n "." | |
| 299 | +if [ -s "edispcube1.fits" ] | |
| 300 | +then | |
| 301 | +$ECHO -n "." | |
| 302 | +else | |
| 303 | +$ECHO " edispcube1.fits file is not found" | |
| 304 | +exit 1 | |
| 305 | +fi | |
| 306 | +# | |
| 307 | +# Run 2 | |
| 308 | +$ctedispcube inobs="events.fits" \ | |
| 309 | + incube="cntmap2.fits" \ | |
| 310 | + outcube="edispcube2.fits" \ | |
| 311 | + caldb="irf" \ | |
| 312 | + irf="cta_dummy_irf" \ | |
| 313 | + migramax=3.0 \ | |
| 314 | + migrabins=3 | |
| 315 | +$ECHO -n "." | |
| 316 | +if [ -s "edispcube2.fits" ] | |
| 317 | +then | |
| 318 | +$ECHO -n "." | |
| 319 | +else | |
| 320 | +$ECHO " edispcube2.fits file is not found" | |
| 321 | +exit 1 | |
| 322 | +fi | |
| 323 | +$ECHO " ok" | |
| 324 | + | |
| 325 | + | |
| 326 | +# | |
| 275 | 327 | # Test ctbkgcube |
| 276 | 328 | # ============== |
| 277 | 329 | $ECHO -n "Test ctbkgcube: " |
| ... | ... | @@ -336,7 +388,6 @@ fi |
| 336 | 388 | $ECHO " ok" |
| 337 | 389 | |
| 338 | 390 | |
| 339 | - | |
| 340 | 391 | # |
| 341 | 392 | # Test ctmodel |
| 342 | 393 | # ============ |
| ... | ... | @@ -349,6 +400,7 @@ $ctmodel inobs="cntmap1.fits" \ |
| 349 | 400 | expcube="NONE" \ |
| 350 | 401 | psfcube="NONE" \ |
| 351 | 402 | bkgcube="NONE" \ |
| 403 | + edispcube="NONE" \ | |
| 352 | 404 | caldb="irf" \ |
| 353 | 405 | irf="cta_dummy_irf" \ |
| 354 | 406 | inmodel="data/crab.xml" |
| ... | ... | @@ -368,6 +420,7 @@ $ctmodel inobs="cntmap2.fits" \ |
| 368 | 420 | outcube="modmap2.fits" \ |
| 369 | 421 | expcube="expcube2.fits" \ |
| 370 | 422 | psfcube="psfcube2.fits" \ |
| 423 | + edispcube="edispcube2.fits" \ | |
| 371 | 424 | bkgcube="bkgcube2.fits" \ |
| 372 | 425 | caldb="irf" \ |
| 373 | 426 | irf="cta_dummy_irf" \ |
| ... | ... | @@ -388,6 +441,7 @@ $ctmodel inobs="NONE" \ |
| 388 | 441 | outcube="modmap3.fits" \ |
| 389 | 442 | expcube="NONE" \ |
| 390 | 443 | psfcube="NONE" \ |
| 444 | + edispcube="NONE" \ | |
| 391 | 445 | bkgcube="NONE" \ |
| 392 | 446 | caldb="irf" \ |
| 393 | 447 | irf="cta_dummy_irf" \ |
| ... | ... | @@ -453,6 +507,7 @@ $ctlike inobs="cntmap1.fits" \ |
| 453 | 507 | outmodel="results_binned.xml" \ |
| 454 | 508 | expcube="NONE" \ |
| 455 | 509 | psfcube="NONE" \ |
| 510 | + edispcube="NONE" \ | |
| 456 | 511 | bkgcube="NONE" \ |
| 457 | 512 | caldb="irf" \ |
| 458 | 513 | irf="cta_dummy_irf" |
| ... | ... | @@ -487,6 +542,7 @@ $ctlike inobs="cntmap2.fits" \ |
| 487 | 542 | outmodel="results_binned_cube_background.xml" \ |
| 488 | 543 | expcube="expcube2.fits" \ |
| 489 | 544 | psfcube="psfcube2.fits" \ |
| 545 | + edispcube="NONE" \ | |
| 490 | 546 | bkgcube="bkgcube2.fits" \ |
| 491 | 547 | caldb="irf" \ |
| 492 | 548 | irf="cta_dummy_irf" |
| ... | ... | @@ -498,6 +554,28 @@ else |
| 498 | 554 | $ECHO " results_binned_cube_background.xml file is not found" |
| 499 | 555 | exit 1 |
| 500 | 556 | fi |
| 557 | + | |
| 558 | + | |
| 559 | +# | |
| 560 | +# Run 4 | |
| 561 | +$ctlike inobs="cntmap2.fits" \ | |
| 562 | + inmodel="bkgcube2.xml" \ | |
| 563 | + outmodel="results_binned_cube_background_edisp.xml" \ | |
| 564 | + expcube="expcube2.fits" \ | |
| 565 | + psfcube="psfcube2.fits" \ | |
| 566 | + edispcube="edispcube2.fits" \ | |
| 567 | + bkgcube="bkgcube2.fits" \ | |
| 568 | + edisp="yes" | |
| 569 | + caldb="irf" \ | |
| 570 | + irf="cta_dummy_irf" | |
| 571 | +$ECHO -n "." | |
| 572 | +if [ -s "results_binned_cube_background_edisp.xml" ] | |
| 573 | +then | |
| 574 | + $ECHO -n "." | |
| 575 | +else | |
| 576 | + $ECHO " results_binned_cube_background_edisp.xml file is not found" | |
| 577 | + exit 1 | |
| 578 | +fi | |
| 501 | 579 | $ECHO " ok" |
| 502 | 580 | |
| 503 | 581 | |
| ... | ... | @@ -529,8 +607,6 @@ fi |
| 529 | 607 | $ECHO " ok" |
| 530 | 608 | |
| 531 | 609 | |
| 532 | - | |
| 533 | - | |
| 534 | 610 | # |
| 535 | 611 | # Test ctcubemask |
| 536 | 612 | # =============== | ... | ... |