Commit 4a212ecef8f6651aba7ae5d800786a8d9f92ba03

Authored by Rolf Buehler
1 parent 30f87636

Added handling of stacked-binned ctlike - Issue 1503

Showing 1 changed file with 78 additions and 12 deletions
scripts/cspull.py
... ... @@ -44,11 +44,15 @@ class cspull(ctools.cscript):
44 44 self.version = "1.0.0"
45 45  
46 46 # Initialise some members
47   - self.obs = None
48   - self.model = None
49   - self.m_inmodel = None
50   - self.m_edisp = False
51   - self.m_profile = False
  47 + self.obs = None
  48 + self.model = None
  49 + self.m_inmodel = None
  50 + self.m_edisp = False
  51 + self.m_profile = False
  52 + self.m_exposure = None
  53 + self.m_psfcube = None
  54 + self.m_bckcube = None
  55 + self.m_stackmodels = None
52 56  
53 57 # Make sure that parfile exists
54 58 file = self.parfile()
... ... @@ -194,8 +198,63 @@ class cspull(ctools.cscript):
194 198  
195 199 # Return
196 200 return
197   -
198   -
  201 +
  202 + def set_stackedirf(self):
  203 + """
  204 + For stacked analysis prepare stacked irfs
  205 + """
  206 +
  207 + #Get stacked exposure
  208 + expcube = ctools.ctexpcube(self.obs)
  209 + expcube["incube"].filename("NONE")
  210 + expcube["usepnt"].boolean(True)
  211 + expcube["ebinalg"].string("LOG")
  212 + expcube["binsz"].real(self.m_binsz)
  213 + expcube["nxpix"].integer(self.m_npix)
  214 + expcube["nypix"].integer(self.m_npix)
  215 + expcube["enumbins"].integer(self.m_enumbins)
  216 + expcube["emin"].real(self["emin"].real())
  217 + expcube["emax"].real(self["emax"].real())
  218 + expcube["coordsys"].string("GAL")
  219 + expcube["proj"].string("TAN")
  220 + expcube.run()
  221 +
  222 + #Get stacked psf
  223 + psfcube = ctools.ctpsfcube(self.obs)
  224 + psfcube["incube"].filename("NONE")
  225 + psfcube["usepnt"].boolean(True)
  226 + psfcube["ebinalg"].string("LOG")
  227 + psfcube["binsz"].real(self.m_binsz)
  228 + psfcube["nxpix"].integer(self.m_npix)
  229 + psfcube["nypix"].integer(self.m_npix)
  230 + psfcube["enumbins"].integer(self.m_enumbins)
  231 + psfcube["emin"].real(self["emin"].real())
  232 + psfcube["emax"].real(self["emax"].real())
  233 + psfcube["coordsys"].string("GAL")
  234 + psfcube["proj"].string("TAN")
  235 + psfcube.run()
  236 +
  237 + #Get stacked background
  238 + bkgcube = ctools.ctbkgcube(self.obs)
  239 + bkgcube["incube"].filename("NONE")
  240 + bkgcube["usepnt"].boolean(True)
  241 + bkgcube["ebinalg"].string("LOG")
  242 + bkgcube["binsz"].real(self.m_binsz)
  243 + bkgcube["nxpix"].integer(self.m_npix)
  244 + bkgcube["nypix"].integer(self.m_npix)
  245 + bkgcube["enumbins"].integer(self.m_enumbins)
  246 + bkgcube["emin"].real(self["emin"].real())
  247 + bkgcube["emax"].real(self["emax"].real())
  248 + bkgcube["coordsys"].string("GAL")
  249 + bkgcube["proj"].string("TAN")
  250 + bkgcube.run()
  251 +
  252 + #Store results
  253 + self.m_exposure = expcube.expcube().copy()
  254 + self.m_psfcube = psfcube.psfcube().copy()
  255 + self.m_bckcube = bkgcube.bkgcube().copy()
  256 + self.m_stackmodels = bkgcube.models().copy()
  257 +
199 258 def run(self):
200 259 """
201 260 Run the script.
... ... @@ -207,6 +266,10 @@ class cspull(ctools.cscript):
207 266 # Get parameters
208 267 self.get_parameters()
209 268  
  269 + #If several observations and binned: prepare stacked irfs
  270 + if self.obs.size()>0 and self.m_enumbins>0:
  271 + self.set_stackedirf()
  272 +
210 273 # Write input parameters into logger
211 274 if self.logTerse():
212 275 self.log_parameters()
... ... @@ -276,6 +339,7 @@ class cspull(ctools.cscript):
276 339 Parameters:
277 340 seed - Random number generator seed
278 341 """
  342 +
279 343 # Write header
280 344 if self.logNormal():
281 345 self.log.header2("Trial "+str(seed+1))
... ... @@ -290,7 +354,12 @@ class cspull(ctools.cscript):
290 354 log=self.m_log, \
291 355 debug=self.m_debug, \
292 356 chatter=self.m_chatter)
293   -
  357 +
  358 + #If stacked, add stacked responses and model
  359 + if self.obs.size()>0 and self.m_enumbins>0:
  360 + obs[0].response(self.m_exposure,self.m_psfcube,self.m_bckcube)
  361 + obs.models(self.m_stackmodels)
  362 +
294 363 # Determine number of events in simulation
295 364 nevents = 0.0
296 365 for run in obs:
... ... @@ -305,16 +374,13 @@ class cspull(ctools.cscript):
305 374  
306 375 # Fit model
307 376 if self.m_profile:
308   - models = obs.models()
309   - new_models = gammalib.GModels()
  377 + models = obs.models()
310 378 for i in range(models.size()):
311 379 model_name = models[i].name()
312 380 like = obsutils.cterror(obs, model_name, \
313 381 log=self.m_log, \
314 382 debug=self.m_debug,
315 383 chatter=self.m_chatter)
316   - new_models.append(like.obs().models()[i])
317   - like.obs().models(new_models)
318 384 else:
319 385 like = obsutils.fit(obs, edisp=self.m_edisp, \
320 386 log=self.m_log, \
... ...