def processAllObs(self, fix_shape=True, delete_below_ts=None, ul_flux_dflux=0, ul_chi2_ts=None, ul_bayes_ts=4.0, ul_cl=0.95, verbosity=0, emin=0, emax=0, interim_save_filename=None): self.logger.info("Processing all observations.") for f in self.obsfiles: lc = dict() lc['config'] = dict() lc['config']['fix_shape'] = fix_shape lc['config']['delete_below_ts'] = delete_below_ts lc['config']['ul_flux_dflux'] = ul_flux_dflux lc['config']['ul_chi2_ts'] = ul_chi2_ts lc['config']['ul_bayes_ts'] = ul_bayes_ts lc['config']['ul_cl'] = ul_cl lc['config']['emin'] = emin lc['config']['emax'] = emax lc['config']['files'] = f #lc['config']['argv'] = sys.argv lc['e_min'] = emin; lc['e_max'] = emax; if type(f) != list: [ obs, like ] = self.loadObs(f,verbosity) lc['t_min'] = obs.roiCuts().minTime() lc['t_max'] = obs.roiCuts().maxTime() if (emin == 0 or emax == 0): lc['e_min'] = obs.roiCuts().getEnergyCuts()[0]; lc['e_max'] = obs.roiCuts().getEnergyCuts()[1]; else: lc['t_min'] = None lc['t_max'] = None like = SL.SummedLikelihood(self.optimizer) for ff in f: [ obs, like1 ] = self.loadObs(ff,verbosity) tmin = obs.roiCuts().minTime() tmax = obs.roiCuts().maxTime() if lc['t_min'] == None or tmin<lc['t_min']: lc['t_min'] = tmin if lc['t_max'] == None or tmax>lc['t_max']: lc['t_max'] = tmax if (lc['e_min'] == 0 or lc['e_max'] == 0): ecuts = obs.roiCuts().getEnergyCuts() lc['e_min'] = ecuts[0] lc['e_max'] = ecuts[1] elif (emin == 0 or emax == 0): ecuts = obs.roiCuts().getEnergyCuts() lc['e_min'] = max(lc['e_min'], ecuts[0]) lc['e_max'] = min(lc['e_max'], ecuts[1]) like.addComponent(like1) emin = lc['e_min'] emax = lc['e_max'] like.tol = like.tol*0.01; if verbosity > 1: print '- Time:',lc['t_min'],'to',lc['t_max'] src = like[self.likelihoodConf['sourcename']] if src == None: raise NameError("No source \""+self.likelihoodConf['sourcename']+"\" in model "+ self.model) srcfreepar=like.freePars(self.likelihoodConf['sourcename']) srcnormpar=like.normPar(self.likelihoodConf['sourcename']) if len(srcfreepar)>0: like.setFreeFlag(self.likelihoodConf['sourcename'], srcfreepar, 0) like.syncSrcParams(self.likelihoodConf['sourcename']) meanvalue = srcnormpar.getValue() meanerror = srcnormpar.error() if meanerror == 0: self.logger.critical("The error on the normalization for your source is 0! You need to do a global fit first (with quickLike) and provide the final XML file (<basename>_likeMinuit.xml) with errors included before you run compute.") return lc['original']=dict() lc['original']['normpar_init_value'] = meanvalue lc['original']['normpar_name'] = srcnormpar.getName() lc['original']['nfree'] = len(like.freePars(self.likelihoodConf['sourcename'])) lc['original']['flux'] = like[self.likelihoodConf['sourcename']].flux(emin, emax) lc['original']['logL'] = like.logLike.value() if verbosity > 1: print '- Original log Like:',lc['original']['logL'] if fix_shape: if verbosity > 1: print '- Fixing spectral shape parameters' sync_name = "" for p in like.params(): if sync_name != "" and sync_name != p.srcName: like.syncSrcParams(sync_name) sync_name = "" if(p.isFree() and p.srcName!=self.likelihoodConf['sourcename'] and p.getName()!=like.normPar(p.srcName).getName()): if verbosity > 2: print '-- '+p.srcName+'.'+p.getName() p.setFree(False) sync_name = p.srcName if sync_name != "" and sync_name != p.srcName: like.syncSrcParams(sync_name) sync_name = "" # ----------------------------- FIT 1 ----------------------------- if verbosity > 1: print '- Fit 1 - All parameters of',self.likelihoodConf['sourcename'],'fixed' like.fit(max(verbosity-3, 0)) lc['allfixed'] = dict() lc['allfixed']['logL'] = like.logLike.value() fitstat = like.optObject.getRetCode() if verbosity > 1 and fitstat != 0: print "- Fit 1 - Minimizer returned with code: ", fitstat lc['allfixed']['fitstat'] = fitstat if verbosity > 1: print '- Fit 1 - log Like:',lc['allfixed']['logL'] if delete_below_ts: frozensrc = [] if verbosity > 1: print '- Deleting point sources with TS<'+str(delete_below_ts) deletesrc = [] for s in like.sourceNames(): freepars = like.freePars(s) if(s!=self.likelihoodConf['sourcename'] and like[s].src.getType() == 'Point' and len(freepars)>0): ts = like.Ts(s) if ts<delete_below_ts: deletesrc.append(s) if verbosity > 2: print '--',s,'(TS='+str(ts)+')' if deletesrc: for s in deletesrc: like.deleteSource(s) if verbosity > 1: print '- Fit 1 - refitting model' like.fit(max(verbosity-3, 0)) lc['allfixed']['fitstat_initial'] = \ lc['allfixed']['fitstat'] fitstat = like.optObject.getRetCode() if verbosity > 1 and fitstat != 0: print "- Fit 1 - Minimizer returned with code: ",\ fitstat lc['allfixed']['fitstat'] = fitstat lc['allfixed']['logL'] = like.logLike.value() if verbosity > 1: print '- Fit 1 - log Like:',lc['allfixed']['logL'] lc['allfixed']['flux']=like[self.likelihoodConf['sourcename']].flux(emin, emax) pars = dict() for pn in like[self.likelihoodConf['sourcename']].funcs['Spectrum'].paramNames: p = like[self.likelihoodConf['sourcename']].funcs['Spectrum'].getParam(pn) pars[p.getName()] = dict(name = p.getName(), value = p.getTrueValue(), error = p.error()*p.getScale(), free = p.isFree()) lc['allfixed']['pars'] = pars # ------------------ N SIGMA PROFILE LIKELIHOOD ------------------- prof_sigma = (-1,-0.5,0,0.5,1.0) lc['profile'] = dict(); lc['profile']['sigma'] = [] lc['profile']['value'] = [] lc['profile']['logL'] = [] lc['profile']['flux'] = [] lc['profile']['fitstat'] = [] if verbosity > 1: print '- Fit 1 - generating %d point likelihood profile'%\ len(prof_sigma) for sigma in prof_sigma: val = sigma*meanerror+meanvalue if val < srcnormpar.getBounds()[0]: val = srcnormpar.getBounds()[0] if (lc['profile']['value'] and lc['profile']['value'][-1]==val): continue lc['profile']['value'].append(val) lc['profile']['sigma'].append((val-meanvalue)/meanerror) if(val == meanvalue): lc['profile']['logL'].append(lc['allfixed']['logL']) lc['profile']['flux'].append(lc['allfixed']['flux']) else: srcnormpar.setValue(val) like.syncSrcParams(self.likelihoodConf['sourcename']) like.fit(max(verbosity-3, 0)) fitstat = like.optObject.getRetCode() if verbosity > 2 and fitstat != 0: print "- Fit 1 - profile: Minimizer returned code: ",\ fitstat lc['profile']['fitstat'].append(fitstat) lc['profile']['logL'].append(like.logLike.value()) lc['profile']['flux'].append(like[self.likelihoodConf['sourcename']].\ flux(emin, emax)) if verbosity > 2: print '- Fit 1 - profile: %+g, %f -> %f'%\ (sigma,lc['profile']['value'][-1], lc['profile']['logL'][-1]-lc['allfixed']['logL']) srcnormpar.setValue(meanvalue) like.syncSrcParams(self.likelihoodConf['sourcename']) # ----------------------------- FIT 2 ----------------------------- if verbosity > 1: print '- Fit 2 - Normalization parameter of',\ self.likelihoodConf['sourcename'],'free' srcnormpar.setFree(1) like.syncSrcParams(self.likelihoodConf['sourcename']) like.fit(max(verbosity-3, 0)) lc['normfree'] = dict() fitstat = like.optObject.getRetCode() if verbosity > 1 and fitstat != 0: print "- Fit 2 - Minimizer returned with code: ", fitstat lc['normfree']['fitstat'] = fitstat lc['normfree']['logL'] = like.logLike.value() lc['normfree']['ts'] = like.Ts(self.likelihoodConf['sourcename']) lc['normfree']['flux_dflux'] = \ srcnormpar.getValue()/srcnormpar.error() if verbosity > 1: print '- Fit 2 - log Like:',lc['normfree']['logL'],\ '(TS='+str(lc['normfree']['ts'])+')' lc['normfree']['nfree']=len(like.freePars(self.likelihoodConf['sourcename'])) lc['normfree']['flux']=like[self.likelihoodConf['sourcename']].flux(emin, emax) pars = dict() for pn in like[self.likelihoodConf['sourcename']].funcs['Spectrum'].paramNames: p = like[self.likelihoodConf['sourcename']].funcs['Spectrum'].getParam(pn) pars[p.getName()] = dict(name = p.getName(), value = p.getTrueValue(), error = p.error()*p.getScale(), free = p.isFree()) lc['normfree']['pars'] = pars ul_type = None if ul_bayes_ts != None and lc['normfree']['ts'] < ul_bayes_ts: ul_type = 'bayesian' [ul_flux, ul_results] = \ IUL.calc_int(like,self.likelihoodConf['sourcename'],cl=ul_cl, skip_global_opt=True, verbosity = max(verbosity-2,0), emin=emin, emax=emax, poi_values = lc['profile']['value']) elif ( ul_flux_dflux != None and \ lc['normfree']['flux_dflux'] < ul_flux_dflux ) or \ ( ul_chi2_ts != None and lc['normfree']['ts'] < ul_chi2_ts): ul_type = 'chi2' [ul_flux, ul_results] = \ IUL.calc_chi2(like,self.likelihoodConf['sourcename'],cl=ul_cl, skip_global_opt=True, verbosity = max(verbosity-2,0), emin=emin, emax=emax) if ul_type != None: lc['normfree']['ul'] = dict(flux = ul_flux, results = ul_results, type = ul_type) # ----------------------------- FIT 3 ----------------------------- if verbosity > 1: print '- Fit 3 - All parameters of',self.likelihoodConf['sourcename'],'free' like.setFreeFlag(self.likelihoodConf['sourcename'], srcfreepar, 1) like.syncSrcParams(self.likelihoodConf['sourcename']) like.fit(max(verbosity-3, 0)) lc['allfree'] = dict() fitstat = like.optObject.getRetCode() if verbosity > 1 and fitstat != 0: print "- Fit 3 - Minimizer returned with code: ", fitstat lc['allfree']['fitstat'] = fitstat lc['allfree']['logL'] = like.logLike.value() lc['allfree']['ts'] = like.Ts(self.likelihoodConf['sourcename']) if verbosity > 1: print '- Fit 3 - log Like:',lc['allfree']['logL'],\ '(TS='+str(lc['allfree']['ts'])+')' lc['allfree']['nfree']=len(like.freePars(self.likelihoodConf['sourcename'])) lc['allfree']['flux']=like[self.likelihoodConf['sourcename']].flux(emin, emax) pars = dict() for pn in like[self.likelihoodConf['sourcename']].funcs['Spectrum'].paramNames: p = like[self.likelihoodConf['sourcename']].funcs['Spectrum'].getParam(pn) pars[p.getName()] = dict(name = p.getName(), value = p.getTrueValue(), error = p.error()*p.getScale(), free = p.isFree()) lc['allfree']['pars'] = pars self.lc.append(lc) if interim_save_filename != None: self.saveProcessedObs(interim_save_filename)
def processAllObs(self, fix_shape=True, delete_below_ts=None, ul_flux_dflux=0,ul_chi2_ts=None, ul_bayes_ts=4.0, ul_cl = 0.95, verbosity=0, ul_optimizer=None): for f in self.obsfiles: spect = dict() spect['config']=dict() spect['config']['fix_shape'] = fix_shape spect['config']['delete_below_ts'] = delete_below_ts spect['config']['ul_flux_dflux'] = ul_flux_dflux spect['config']['ul_chi2_ts'] = ul_chi2_ts spect['config']['ul_bayes_ts'] = ul_bayes_ts spect['config']['ul_cl'] = ul_cl spect['config']['files'] = f [ obs, like ] = self.loadObs(f,verbosity) spect['t_min'] = obs.roiCuts().minTime() spect['t_max'] = obs.roiCuts().maxTime() [emin, emax] = obs.roiCuts().getEnergyCuts() spect['e_min'] = emin spect['e_max'] = emax if verbosity > 1: print '- Time:',spect['t_min'],'to',spect['t_max'] print '- Energy:',emin,'to',emax,'MeV' src = like[self.srcName] if src == None: raise NameError("No source \""+self.srcName+"\" in model "+ self.model) srcnormpar=like.normPar(self.srcName) spect['original']=dict() spect['original']['normpar_init_value'] = srcnormpar.getValue() spect['original']['normpar_name'] = srcnormpar.getName() spect['original']['flux'] = like[self.srcName].flux(emin, emax) spect['original']['logL'] = like.logLike.value() if verbosity > 1: print '- Original log Like:',spect['original']['logL'] if fix_shape: if verbosity > 1: print '- Fixing spectral shape parameters' sync_name = "" for p in like.params(): if sync_name != "" and sync_name != p.srcName: like.syncSrcParams(sync_name) sync_name = "" if(p.isFree() and #p.srcName!=self.srcName and p.getName()!=like.normPar(p.srcName).getName()): if verbosity > 2: print '-- '+p.srcName+'.'+p.getName() p.setFree(False) sync_name = p.srcName if sync_name != "" and sync_name != p.srcName: like.syncSrcParams(sync_name) sync_name = "" # ------------------------------ FIT ------------------------------ if verbosity > 1: print '- Fit - starting' like.fit(max(verbosity-3, 0)) spect['fit'] = dict() spect['fit']['logL'] = like.logLike.value() if verbosity > 1: print '- Fit - log Like:',spect['fit']['logL'] if delete_below_ts: frozensrc = [] if verbosity > 1: print '- Deleting point sources with TS<'+str(delete_below_ts) deletesrc = [] for s in like.sourceNames(): freepars = like.freePars(s) if(s!=self.srcName and like[s].type == 'PointSource' and len(freepars)>0): ts = like.Ts(s) if ts<delete_below_ts: deletesrc.append(s) if verbosity > 2: print '--',s,'(TS='+str(ts)+')' if deletesrc: for s in deletesrc: like.deleteSource(s) if verbosity > 1: print '- Fit - refitting model' like.fit(max(verbosity-3, 0)) spect['fit']['logL'] = like.logLike.value() if verbosity > 1: print '- Fit - log Like:',spect['fit']['logL'] spect['fit']['ts']=like.Ts(self.srcName) if verbosity > 1: print '- TS of %s: %f'%(self.srcName,spect['fit']['ts']) spect['fit']['flux']=like[self.srcName].flux(emin, emax) emid = math.sqrt(emin*emax) spect['fit']['e_mid']=emid # Note: be careful about the meaning here - it is the # differential flux in the middle of the energy bin, not a # flux error. This contradicts the meaning in 'flux_dflux' spect['fit']['dflux'] = \ like[self.srcName].flux(emid*(1-0.001),emid*(1+0.001))/(emid*0.002) spect['fit']['flux_dflux'] = \ srcnormpar.getValue()/srcnormpar.error() pars = dict() for pn in like[self.srcName].funcs['Spectrum'].paramNames: p = like[self.srcName].funcs['Spectrum'].getParam(pn) pars[p.getName()] = dict(name = p.getName(), value = p.getTrueValue(), error = p.error()*p.getScale(), free = p.isFree()) spect['fit']['pars'] = pars ul_type = None if ul_bayes_ts != None and spect['fit']['ts'] < ul_bayes_ts: ul_type = 'bayesian' [ul_flux, ul_results] = \ IntegralUpperLimit.calc_int(like,self.srcName,cl=ul_cl, skip_global_opt=True, verbosity = max(verbosity-2,0), emin=emin, emax=emax, profile_optimizer=ul_optimizer) elif ( ul_flux_dflux != None and \ spect['fit']['flux_dflux'] < ul_flux_dflux ) or \ ( ul_chi2_ts != None and spect['fit']['ts'] < ul_chi2_ts): ul_type = 'chi2' [ul_flux, ul_results] = \ IntegralUpperLimit.calc_chi2(like,self.srcName,cl=ul_cl, skip_global_opt=True, verbosity = max(verbosity-2,0), emin=emin, emax=emax, profile_optimizer=ul_optimizer) if ul_type != None: spect['fit']['ul'] = dict(flux = ul_flux, results = ul_results, type = ul_type) self.spectra.append(spect)