Commit 0ffbb73c6488a74dc3316a2daaeacc676f5e749c
1 parent
ff3e3615
Reduce code duplication
Showing
6 changed files
with
142 additions
and
174 deletions
cscripts/cslightcrv.py
| ... | ... | @@ -106,30 +106,10 @@ class cslightcrv(ctools.cscript): |
| 106 | 106 | # Get time boundaries |
| 107 | 107 | self._tbins = self._create_tbounds() |
| 108 | 108 | |
| 109 | - # Set stacked analysis flag to True if the requested number of | |
| 110 | - # energy bins is positive. Otherwise an unbinned analysis will | |
| 111 | - # be done and the stacked analysis flag will be set to False. | |
| 112 | - if self['enumbins'].integer() > 0: | |
| 113 | - self._stacked = True | |
| 114 | - else: | |
| 115 | - self._stacked = False | |
| 116 | - | |
| 117 | - # Make sure that remaining user parameters are queried now. We | |
| 118 | - # do not store the actual parameter values as we do not want | |
| 119 | - # too many instance attributes with enhances the maintenance | |
| 120 | - # costs. | |
| 121 | - self['emin'].real() | |
| 122 | - self['emax'].real() | |
| 123 | - if self._stacked: | |
| 124 | - self['coordsys'].string() | |
| 125 | - self['proj'].string() | |
| 126 | - self['xref'].real() | |
| 127 | - self['yref'].real() | |
| 128 | - self['nxpix'].integer() | |
| 129 | - self['nypix'].integer() | |
| 130 | - self['binsz'].real() | |
| 131 | - | |
| 132 | - # Do the same for the hidden parameters, just in case | |
| 109 | + # Set stacked analysis flag and query relevant user parameters | |
| 110 | + self._stacked = self._is_stacked() | |
| 111 | + | |
| 112 | + # Query the hidden parameters, just in case | |
| 133 | 113 | self['edisp'].boolean() |
| 134 | 114 | self['calc_ulim'].boolean() |
| 135 | 115 | self['calc_ts'].boolean() |
| ... | ... | @@ -428,57 +408,11 @@ class cslightcrv(ctools.cscript): |
| 428 | 408 | obs : `~gammalib.GObservations` |
| 429 | 409 | Observation container where the first observation is a binned observation |
| 430 | 410 | """ |
| 431 | - # Header | |
| 432 | - if self._logExplicit(): | |
| 433 | - self._log.header3('Binning events') | |
| 434 | - | |
| 435 | - # Bin events | |
| 436 | - cntcube = ctools.ctbin(obs) | |
| 437 | - cntcube['usepnt'] = False | |
| 438 | - cntcube['ebinalg'] = 'LOG' | |
| 439 | - cntcube['xref'] = self['xref'].real() | |
| 440 | - cntcube['yref'] = self['yref'].real() | |
| 441 | - cntcube['binsz'] = self['binsz'].real() | |
| 442 | - cntcube['nxpix'] = self['nxpix'].integer() | |
| 443 | - cntcube['nypix'] = self['nypix'].integer() | |
| 444 | - cntcube['enumbins'] = self['enumbins'].integer() | |
| 445 | - cntcube['emin'] = self['emin'].real() | |
| 446 | - cntcube['emax'] = self['emax'].real() | |
| 447 | - cntcube['coordsys'] = self['coordsys'].string() | |
| 448 | - cntcube['proj'] = self['proj'].string() | |
| 449 | - cntcube.run() | |
| 450 | - | |
| 451 | - # Header | |
| 452 | - if self._logExplicit(): | |
| 453 | - self._log.header3('Creating stacked response') | |
| 454 | - | |
| 455 | - # Get stacked response | |
| 456 | - response = obsutils.get_stacked_response(obs, | |
| 457 | - self['xref'].real(), | |
| 458 | - self['yref'].real(), | |
| 459 | - binsz=self['binsz'].real(), | |
| 460 | - nxpix=self['nxpix'].integer(), | |
| 461 | - nypix=self['nypix'].integer(), | |
| 462 | - emin=self['emin'].real(), | |
| 463 | - emax=self['emax'].real(), | |
| 464 | - enumbins=self['enumbins'].integer(), | |
| 465 | - edisp=self['edisp'].boolean(), | |
| 466 | - coordsys=self['coordsys'].string(), | |
| 467 | - proj=self['proj'].string()) | |
| 468 | - | |
| 469 | - # Retrieve a new oberservation container | |
| 470 | - new_obs = cntcube.obs().copy() | |
| 471 | - | |
| 472 | - # Set stacked response | |
| 473 | - if self['edisp'].boolean(): | |
| 474 | - new_obs[0].response(response['expcube'], response['psfcube'], | |
| 475 | - response['edispcube'], response['bkgcube']) | |
| 476 | - else: | |
| 477 | - new_obs[0].response(response['expcube'], response['psfcube'], | |
| 478 | - response['bkgcube']) | |
| 479 | - | |
| 480 | - # Get new models | |
| 481 | - models = response['models'] | |
| 411 | + # Get new observation container with binned observation | |
| 412 | + new_obs = obsutils.get_stacked_obs(self, obs) | |
| 413 | + | |
| 414 | + # Extract models | |
| 415 | + models = new_obs.models() | |
| 482 | 416 | |
| 483 | 417 | # Fix background models if required |
| 484 | 418 | if self['fix_bkg'].boolean(): |
| ... | ... | @@ -487,7 +421,7 @@ class cslightcrv(ctools.cscript): |
| 487 | 421 | for par in model: |
| 488 | 422 | par.fix() |
| 489 | 423 | |
| 490 | - # Set models for new oberservation container | |
| 424 | + # Put back models | |
| 491 | 425 | new_obs.models(models) |
| 492 | 426 | |
| 493 | 427 | # Return new oberservation container | ... | ... |
cscripts/csphasecrv.py
| ... | ... | @@ -91,33 +91,13 @@ class csphasecrv(ctools.cscript): |
| 91 | 91 | # Get source name |
| 92 | 92 | self._srcname = self['srcname'].string() |
| 93 | 93 | |
| 94 | - # Get time boundaries | |
| 94 | + # Get phase boundaries | |
| 95 | 95 | self._phbins = self._create_tbounds() |
| 96 | 96 | |
| 97 | - # Set stacked analysis flag to True if the requested number of | |
| 98 | - # energy bins is positive. Otherwise an unbinned analysis will | |
| 99 | - # be done and the stacked analysis flag will be set to False. | |
| 100 | - if self['enumbins'].integer() > 0: | |
| 101 | - self._stacked = True | |
| 102 | - else: | |
| 103 | - self._stacked = False | |
| 104 | - | |
| 105 | - # Make sure that remaining user parameters are queried now. We | |
| 106 | - # do not store the actual parameter values as we do not want | |
| 107 | - # too many instance attributes with enhances the maintenance | |
| 108 | - # costs. | |
| 109 | - self['emin'].real() | |
| 110 | - self['emax'].real() | |
| 111 | - if self._stacked: | |
| 112 | - self['coordsys'].string() | |
| 113 | - self['proj'].string() | |
| 114 | - self['xref'].real() | |
| 115 | - self['yref'].real() | |
| 116 | - self['nxpix'].integer() | |
| 117 | - self['nypix'].integer() | |
| 118 | - self['binsz'].real() | |
| 119 | - | |
| 120 | - # Do the same for the hidden parameters, just in case | |
| 97 | + # Set stacked analysis flag and query relevant user parameters | |
| 98 | + self._stacked = self._is_stacked() | |
| 99 | + | |
| 100 | + # Query the hidden parameters, just in case | |
| 121 | 101 | self['edisp'].boolean() |
| 122 | 102 | |
| 123 | 103 | # Read ahead output parameters |
| ... | ... | @@ -181,78 +161,6 @@ class csphasecrv(ctools.cscript): |
| 181 | 161 | # Return Good Time Intervals |
| 182 | 162 | return phbins |
| 183 | 163 | |
| 184 | - def _bin_observation(self, obs): | |
| 185 | - """ | |
| 186 | - Bin an observation if a binned analysis was requested | |
| 187 | - | |
| 188 | - Parameters | |
| 189 | - ---------- | |
| 190 | - obs : `~gammalib.GObservations` | |
| 191 | - Observation container | |
| 192 | - | |
| 193 | - Returns | |
| 194 | - ------- | |
| 195 | - obs : `~gammalib.GObservations` | |
| 196 | - Observation container where the first observation is a binned observation | |
| 197 | - """ | |
| 198 | - # Header | |
| 199 | - if self._logExplicit(): | |
| 200 | - self._log.header3('Binning events') | |
| 201 | - | |
| 202 | - # Bin events | |
| 203 | - cntcube = ctools.ctbin(obs) | |
| 204 | - cntcube['usepnt'] = False | |
| 205 | - cntcube['ebinalg'] = 'LOG' | |
| 206 | - cntcube['xref'] = self['xref'].real() | |
| 207 | - cntcube['yref'] = self['yref'].real() | |
| 208 | - cntcube['binsz'] = self['binsz'].real() | |
| 209 | - cntcube['nxpix'] = self['nxpix'].integer() | |
| 210 | - cntcube['nypix'] = self['nypix'].integer() | |
| 211 | - cntcube['enumbins'] = self['enumbins'].integer() | |
| 212 | - cntcube['emin'] = self['emin'].real() | |
| 213 | - cntcube['emax'] = self['emax'].real() | |
| 214 | - cntcube['coordsys'] = self['coordsys'].string() | |
| 215 | - cntcube['proj'] = self['proj'].string() | |
| 216 | - cntcube.run() | |
| 217 | - | |
| 218 | - # Header | |
| 219 | - if self._logExplicit(): | |
| 220 | - self._log.header3('Creating stacked response') | |
| 221 | - | |
| 222 | - # Get stacked response | |
| 223 | - response = obsutils.get_stacked_response(obs, | |
| 224 | - self['xref'].real(), | |
| 225 | - self['yref'].real(), | |
| 226 | - binsz=self['binsz'].real(), | |
| 227 | - nxpix=self['nxpix'].integer(), | |
| 228 | - nypix=self['nypix'].integer(), | |
| 229 | - emin=self['emin'].real(), | |
| 230 | - emax=self['emax'].real(), | |
| 231 | - enumbins=self['enumbins'].integer(), | |
| 232 | - edisp=self['edisp'].boolean(), | |
| 233 | - coordsys=self['coordsys'].string(), | |
| 234 | - proj=self['proj'].string()) | |
| 235 | - | |
| 236 | - # Retrieve a new oberservation container | |
| 237 | - new_obs = cntcube.obs().copy() | |
| 238 | - | |
| 239 | - # Set stacked response | |
| 240 | - if self['edisp'].boolean(): | |
| 241 | - new_obs[0].response(response['expcube'], response['psfcube'], | |
| 242 | - response['edispcube'], response['bkgcube']) | |
| 243 | - else: | |
| 244 | - new_obs[0].response(response['expcube'], response['psfcube'], | |
| 245 | - response['bkgcube']) | |
| 246 | - | |
| 247 | - # Get new models | |
| 248 | - models = response['models'] | |
| 249 | - | |
| 250 | - # Set models for new oberservation container | |
| 251 | - new_obs.models(models) | |
| 252 | - | |
| 253 | - # Return new oberservation container | |
| 254 | - return new_obs | |
| 255 | - | |
| 256 | 164 | def _get_free_par_names(self): |
| 257 | 165 | """ |
| 258 | 166 | Return list of free parameter names |
| ... | ... | @@ -469,7 +377,8 @@ class csphasecrv(ctools.cscript): |
| 469 | 377 | # and compute the stacked response functions and setup |
| 470 | 378 | # an observation container with a single stacked observation. |
| 471 | 379 | if self._stacked: |
| 472 | - obs = self._bin_observation(select.obs()) | |
| 380 | + #obs = self._bin_observation(select.obs()) | |
| 381 | + obs = obsutils.get_stacked_obs(self, select.obs()) | |
| 473 | 382 | |
| 474 | 383 | # Header |
| 475 | 384 | if self._logExplicit(): | ... | ... |
cscripts/obsutils.py
| ... | ... | @@ -639,3 +639,82 @@ def get_stacked_response(obs, xref, yref, binsz=0.05, nxpix=200, nypix=200, |
| 639 | 639 | |
| 640 | 640 | # Return response cubes |
| 641 | 641 | return response |
| 642 | + | |
| 643 | + | |
| 644 | +# ================================= # | |
| 645 | +# Get stacked observation container # | |
| 646 | +# ================================= # | |
| 647 | +def get_stacked_obs(cls, obs): | |
| 648 | + """ | |
| 649 | + Bin an observation and return an observation container with a single | |
| 650 | + binned observation | |
| 651 | + | |
| 652 | + Parameters | |
| 653 | + ---------- | |
| 654 | + cls : `~ctools.cscript` | |
| 655 | + cscript class | |
| 656 | + obs : `~gammalib.GObservations` | |
| 657 | + Observation container | |
| 658 | + | |
| 659 | + Returns | |
| 660 | + ------- | |
| 661 | + obs : `~gammalib.GObservations` | |
| 662 | + Observation container where the first observation is a binned observation | |
| 663 | + """ | |
| 664 | + # Write header | |
| 665 | + if cls._logExplicit(): | |
| 666 | + cls._log.header3('Binning events') | |
| 667 | + | |
| 668 | + # Bin events | |
| 669 | + cntcube = ctools.ctbin(obs) | |
| 670 | + cntcube['usepnt'] = False | |
| 671 | + cntcube['ebinalg'] = 'LOG' | |
| 672 | + cntcube['xref'] = cls['xref'].real() | |
| 673 | + cntcube['yref'] = cls['yref'].real() | |
| 674 | + cntcube['binsz'] = cls['binsz'].real() | |
| 675 | + cntcube['nxpix'] = cls['nxpix'].integer() | |
| 676 | + cntcube['nypix'] = cls['nypix'].integer() | |
| 677 | + cntcube['enumbins'] = cls['enumbins'].integer() | |
| 678 | + cntcube['emin'] = cls['emin'].real() | |
| 679 | + cntcube['emax'] = cls['emax'].real() | |
| 680 | + cntcube['coordsys'] = cls['coordsys'].string() | |
| 681 | + cntcube['proj'] = cls['proj'].string() | |
| 682 | + cntcube.run() | |
| 683 | + | |
| 684 | + # Write header | |
| 685 | + if cls._logExplicit(): | |
| 686 | + cls._log.header3('Creating stacked response') | |
| 687 | + | |
| 688 | + # Get stacked response | |
| 689 | + response = get_stacked_response(obs, | |
| 690 | + cls['xref'].real(), | |
| 691 | + cls['yref'].real(), | |
| 692 | + binsz=cls['binsz'].real(), | |
| 693 | + nxpix=cls['nxpix'].integer(), | |
| 694 | + nypix=cls['nypix'].integer(), | |
| 695 | + emin=cls['emin'].real(), | |
| 696 | + emax=cls['emax'].real(), | |
| 697 | + enumbins=cls['enumbins'].integer(), | |
| 698 | + edisp=cls['edisp'].boolean(), | |
| 699 | + coordsys=cls['coordsys'].string(), | |
| 700 | + proj=cls['proj'].string()) | |
| 701 | + | |
| 702 | + # Retrieve a new oberservation container | |
| 703 | + new_obs = cntcube.obs().copy() | |
| 704 | + | |
| 705 | + # Set stacked response | |
| 706 | + if cls['edisp'].boolean(): | |
| 707 | + new_obs[0].response(response['expcube'], response['psfcube'], | |
| 708 | + response['edispcube'], response['bkgcube']) | |
| 709 | + else: | |
| 710 | + new_obs[0].response(response['expcube'], response['psfcube'], | |
| 711 | + response['bkgcube']) | |
| 712 | + | |
| 713 | + # Get new models | |
| 714 | + models = response['models'] | |
| 715 | + | |
| 716 | + # Set models for new oberservation container | |
| 717 | + new_obs.models(models) | |
| 718 | + | |
| 719 | + # Return new oberservation container | |
| 720 | + return new_obs | ... | ... |
pyext/ctool.i
| ... | ... | @@ -99,6 +99,7 @@ public: |
| 99 | 99 | %rename(_get_pointing) get_pointing; |
| 100 | 100 | %rename(_get_skydir) get_skydir; |
| 101 | 101 | %rename(_set_outfile_name) set_outfile_name; |
| 102 | + %rename(_is_stacked) is_stacked; | |
| 102 | 103 | %rename(_set_response) set_response; |
| 103 | 104 | %rename(_set_edisp) set_edisp; |
| 104 | 105 | %rename(_restore_edisp) restore_edisp; |
| ... | ... | @@ -143,6 +144,9 @@ public: |
| 143 | 144 | GSkyDir get_skydir(void); |
| 144 | 145 | std::string set_outfile_name(const std::string& filename); |
| 145 | 146 | |
| 147 | + // Protected methods that query user parameters | |
| 148 | + bool is_stacked(void); | |
| 149 | + | |
| 146 | 150 | // Protected support methods |
| 147 | 151 | void set_response(GObservations& obs); |
| 148 | 152 | std::vector<bool> set_edisp(GObservations& obs, const bool& edisp) const; | ... | ... |
src/support/ctool.cpp
| ... | ... | @@ -1156,6 +1156,45 @@ std::string ctool::set_outfile_name(const std::string& filename) |
| 1156 | 1156 | |
| 1157 | 1157 | |
| 1158 | 1158 | /***********************************************************************//** |
| 1159 | + * @brief Query user parameters for stacked analysis | |
| 1160 | + * | |
| 1161 | + * @return True if a stacked analysis should be done. | |
| 1162 | + * | |
| 1163 | + * Queries the user parameters "emin", "emax" and "enumbins", and if | |
| 1164 | + * "enumbins" is positive, signal that a stacked analysis is requested. In | |
| 1165 | + * that case, also the "coordsys", "proj", "xref", "yref", "nxpix", "nypix" | |
| 1166 | + * and "binsz" parameters are queried. | |
| 1167 | + * | |
| 1168 | + * Using this method assures that the parameters are always queried in the | |
| 1169 | + * same order. | |
| 1170 | + ***************************************************************************/ | |
| 1171 | +bool ctool::is_stacked(void) | |
| 1172 | +{ | |
| 1173 | + // First query the minimum and maximum energies | |
| 1174 | + (*this)["emin"].real(); | |
| 1175 | + (*this)["emax"].real(); | |
| 1176 | + | |
| 1177 | + // Now query the number of energy bins and set the stacked flag | |
| 1178 | + bool stacked = ((*this)["enumbins"].integer() > 0) ? true : false; | |
| 1179 | + | |
| 1180 | + // If a stacked analysis is requested then query the spatial definition | |
| 1181 | + // of the cube | |
| 1182 | + if (stacked) { | |
| 1183 | + (*this)["coordsys"].string(); | |
| 1184 | + (*this)["proj"].string(); | |
| 1185 | + (*this)["xref"].real(); | |
| 1186 | + (*this)["yref"].real(); | |
| 1187 | + (*this)["nxpix"].integer(); | |
| 1188 | + (*this)["nypix"].integer(); | |
| 1189 | + (*this)["binsz"].real(); | |
| 1190 | + } | |
| 1191 | + | |
| 1192 | + // Return stacked flag | |
| 1193 | + return stacked; | |
| 1194 | +} | |
| 1195 | + | |
| 1196 | + | |
| 1197 | +/***********************************************************************//** | |
| 1159 | 1198 | * @brief Set response for all CTA observations in container |
| 1160 | 1199 | * |
| 1161 | 1200 | * @param[in,out] obs Observation container | ... | ... |
src/support/ctool.hpp
| ... | ... | @@ -102,6 +102,9 @@ protected: |
| 102 | 102 | GSkyDir get_skydir(void); |
| 103 | 103 | std::string set_outfile_name(const std::string& filename); |
| 104 | 104 | |
| 105 | + // Protected methods that query user parameters | |
| 106 | + bool is_stacked(void); | |
| 107 | + | |
| 105 | 108 | // Protected methods for logging |
| 106 | 109 | void log_observations(const GChatter& chatter, |
| 107 | 110 | const GObservations& obs, | ... | ... |