def plcLimit(obs_, poi_, model, ws, data, CL=0.95, verbose=False): # obs : observable variable or RooArgSet of observables # poi : parameter of interest or RooArgSet of parameters # model : RooAbsPdf of model to consider including any constraints # data : RooAbsData of the data # CL : confidence level for interval # returns a dictionary with the upper and lower limits for the first/only # parameter in poi_ as well as the interval object and status flag obs = RooArgSet(obs_) obs.setName('observables') poi = RooArgSet(poi_) poi.setName('poi') poi.setAttribAll('Constant', False) nuis = model.getParameters(obs) nuis.remove(poi) nuis.remove(nuis.selectByAttrib('Constant', True)) nuis.setName('nuisance') if verbose: print 'observables' obs.Print('v') print 'parameters of interest' poi.Print('v') print 'nuisance parameters' nuis.Print('v') mc = RooStats.ModelConfig('mc') mc.SetWorkspace(ws) mc.SetPdf(model) mc.SetObservables(obs) mc.SetParametersOfInterest(poi) mc.SetNuisanceParameters(nuis) plc = RooStats.ProfileLikelihoodCalculator(data, mc) plc.SetConfidenceLevel(CL) interval = plc.GetInterval() upperLimit = Double(999.) lowerLimit = Double(0.) Limits = {} paramIter = poi.createIterator() param = paramIter.Next() while param: ok = interval.FindLimits(param, lowerLimit, upperLimit) Limits[param.GetName()] = { 'ok': ok, 'upper': float(upperLimit), 'lower': float(lowerLimit) } param = paramIter.Next() if verbose: print '%.0f%% CL limits' % (interval.ConfidenceLevel() * 100) print Limits Limits['interval'] = interval return Limits
def transferResults(cfg, ws, rfr): """ Transfer results from the RooFitResult to the workspace, and make relevant snapshots """ mc = ws.obj("ModelConfig") np = RooArgSet(mc.GetNuisanceParameters(), mc.GetParametersOfInterest()) if logging.getLogger().isEnabledFor(logging.DEBUG): logging.debug("Expanded RooFit results") np.Print("v") # we want to be sure that the snapshot contains all we need, including POI ws.loadSnapshot("snapshot_paramsVals_initial") ws.saveSnapshot("vars_initial", np) fpf = rfr.floatParsFinal().Clone() cp = rfr.constPars() fpf.add( cp ) # add all const parameters of the RooFitResult to the floating ones if logging.getLogger().isEnabledFor(logging.DEBUG): logging.debug("Expanded RooFit results") fpf.Print() np.assignValueOnly( fpf ) # only sets the central value. Should be ok as VisualizeError uses errors from the RooFitResult, according to ROOT doc force_mu, mu_val = cfg.force_mu_value() if force_mu: # is_higgs_fit = True # it = np.createIterator() # n = it.Next() # while n: # if cfg.transferResults_fitName in n.GetName(): # n.setVal(0) # is_higgs_fit = False # break # n = it.Next() # cfg._muhat = 1 # if is_higgs_fit: # mc.GetParametersOfInterest().first().setVal(1) # cfg._muhat = mu_val mc.GetParametersOfInterest().first().setVal(mu_val) # else: # cfg._muhat = mc.GetParametersOfInterest().first().getVal() cfg._muhat = mc.GetParametersOfInterest().first().getVal() if logging.getLogger().isEnabledFor(logging.DEBUG): logging.debug("Expanded RooFit results") np.Print("v") ws.saveSnapshot("vars_final", np) ws.loadSnapshot("vars_final")