Example #1
0
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
Example #2
0
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")