Example #1
0
def GetPLRInterval(filename="workspace.root",
                   wsname='myWS',
                   interactive=False):
    # this function loads a workspace and computes
    # a Bayesian upper limit

    pInFile = ROOT.TFile(filename, "read")

    # load workspace
    pWs = pInFile.Get(wsname)
    if not pWs:
        print "workspace ", wsname, " not found"
        return -1

    # printout workspace content
    pWs.Print()

    # load and print data from workspace
    data = pWs.data("data")
    data.Print()

    # load and print S+B Model Config
    pSbHypo = pWs.obj("SbHypo")
    pSbHypo.Print()

    # create RooStats Profiled Likelihood ratio calculator and set parameters
    bCalc = RooStats.ProfileLikelihoodCalculator(data, pSbHypo)
    bCalc.SetConfidenceLevel(0.95)

    # estimate credible interval
    # NOTE: unfortunate notation: the UpperLimit() name refers
    #       to the upper boundary of an interval,
    #       NOT to the upper limit on the parameter of interest
    #       (it just happens to be the same for the one-sided
    #       interval starting at 0)
    pSInt = bCalc.GetInterval()
    upper_bound = pSInt.UpperLimit(pWs.var('xsec'))
    lower_bound = pSInt.LowerLimit(pWs.var('xsec'))

    print "one-sided 95%.C.L. interval for xsec: ", "[", lower_bound, ", ", upper_bound, "]"

    # make posterior PDF plot for POI
    c1 = ROOT.TCanvas("plr", "likelihood furnction")
    pPlot = RooStats.LikelihoodIntervalPlot(pSInt)
    pPlot.SetRange(0., 0.006)
    pPlot.SetMaximum(5.)
    pPlot.SetNPoints(50)
    pPlot.Draw()
    ROOT.gPad.Update()
    c1.SaveAs("plr_plot.pdf")

    if interactive:
        raw_input("\npress <enter> to continue")
Example #2
0
    def execute(self, ws, debug = 0):
        print self.legend, 'Profile Likelihood calculation started...'

        # time the action
        t = TStopwatch()
        t.Start()

        # model config is guaranteed to be here
        # the action won't configure without it
        # and this code will never run unless valid model config is found
        mconf = ws.obj(self._model_config_name)
            
        _poi = mconf.GetParametersOfInterest()

        plcInt = self._plc.GetInterval()

        # stop watch and print how long it took to get the interval
        t.Print()

        # iterate over all parameters of interest and print out the intervals
        # (could there be more than one?)
        _iter = _poi.createIterator()
        while True:
            _poi_name = _iter().GetTitle()
            
            lower_limit = plcInt.LowerLimit( _poi[_poi_name] )
            upper_limit = plcInt.UpperLimit( _poi[_poi_name] )
            
            print self.legend, 'Profile Likelihood interval for', _poi_name, 'is ['+ \
                  str(lower_limit) + ', ' + \
                  str(upper_limit) + ']'

            if _iter.Next() == None:
                break
            

        if self._scan_plot:
            # draw scan plot

            print self.legend, 'making the likelihood scan plot'
            _plot_name = _poi_name+'_plc_scan_exost.'+self._plot_format
            c1 = TCanvas("c1", "c1", 600, 600)
            plcPlot = RooStats.LikelihoodIntervalPlot(plcInt)
            gROOT.SetStyle("Plain")
            plcPlot.Draw()
            c1.SaveAs(_plot_name)
            
        return (lower_limit, upper_limit)
Example #3
0
def plotProfiles():

    f = TFile("./data/fitWorkspace.root")
    fitWorkspace = f.Get("fitWorkspace")
    fData = fitWorkspace.allData().front()
    fEnergy = fitWorkspace.var("energy_keV")
    model = fitWorkspace.pdf("model")
    fitResult = fitWorkspace.allGenericObjects().front()
    fitValsFinal = getRooArgDict(fitResult.floatParsFinal())
    print "Fit Cov Qual:", fitResult.covQual()

    nameList = ["amp-axion"]
    # nameList = []
    # for key in sorted(fitValsFinal):
    #     if "amp-" in key:
    #         nameList.append(key)

    print "Generating profiles ..."
    c = TCanvas("c", "c", 800, 600)
    for name in nameList:

        fitVal = fitValsFinal[name]
        thisVar = fitWorkspace.var(name)

        # Brian & Clint method
        plc = RS.ProfileLikelihoodCalculator(fData, model,
                                             ROOT.RooArgSet(thisVar))
        plc.SetConfidenceLevel(0.90)
        interval = plc.GetInterval()
        lower = interval.LowerLimit(thisVar)
        upper = interval.UpperLimit(thisVar)
        print "%-10s = lo %-7.3f  best %-7.3f  hi %.3f" % (name, lower, fitVal,
                                                           upper)
        plot = RS.LikelihoodIntervalPlot(interval)
        # p1, pltHi = fitVal - 1.5*(fitVal - lower), fitVal + 1.5*(upper - fitVal)
        # plot.SetRange(pltLo,pltHi)
        plot.SetTitle("%s: lo %.3f  fit %.3f  hi %.3f" %
                      (name, lower, fitVal, upper))
        plot.SetNPoints(50)
        plot.Draw("tf1")
        """
        # Lukas method
        # note: lukas uses ModelConfig, to explicitly set observables, constraints, and nuisance parameters
        # https://root-forum.cern.ch/t/access-toy-datasets-generated-by-roostat-frequentistcalculator/24465/8

        mc = RS.ModelConfig('mc', fitWorkspace)
        mc.SetPdf( model )
        mc.SetParametersOfInterest( ROOT.RooArgSet(thisVar) )
        mc.SetObservables( ROOT.RooArgSet(fEnergy) )

        # lukas example
        # mc.SetConstraintParameters( ROOT.RooArgSet(mean, sigma) )
        # mc.SetNuisanceParameters( ROOT.RooArgSet(mean, sigma, n_bkg) )
        # mc.SetGlobalObservables( ROOT.RooArgSet(mean_obs, sigma_obs) )

        # need to make some RooArgSets from RooRealVars
        # constraints, nuisances, globalobs = ROOT.RooArgSet(), ROOT.RooArgSet(), ROOT.RooArgSet()
        # for parName in sorted(fitValsFinal):
        #     rrv = fitWorkspace.var(parName)
        #     if parName != name:
        #         constraints.add(rrv)
        #         # .. etc.

        # pl = RS.ProfileLikelihoodCalculator(fData, mc)
        # pl.SetConfidenceLevel(0.683) # lukas used 0.90
        # interval = pl.GetInterval()
        # plot = RS.LikelihoodIntervalPlot(interval)
        # plot.SetNPoints(50)
        # plot.Draw("")
        """
        c.Print("./plots/profile_%s.pdf" % name)
Example #4
0
def getProfile(idx=None, update=False):
    from ROOT import TFile, TCanvas
    from ROOT import RooStats as RS

    f = TFile("%s/data/fitWorkspace.root" % dsi.latSWDir)
    fitWorkspace = f.Get("fitWorkspace")
    fData = fitWorkspace.allData().front()
    hitE = fitWorkspace.var("trapENFCal")
    model = fitWorkspace.pdf("model")
    fitResult = fitWorkspace.allGenericObjects().front()
    fPars = fitResult.floatParsFinal()
    nPars = fPars.getSize()

    # === get fit results: {name : [nCts, err]} ===
    fitVals = {}
    for i in range(nPars):
        fp = fitResult.floatParsFinal()
        name = fp.at(i).GetName()
        fitVal, fitErr = fp.at(i).getValV(), fp.at(i).getError()
        if "amp" in name:
            # fitVals[name.split('-')[1]] = [fitVal, fitErr]
            fitVals[name] = [fitVal, fitErr, name.split('-')[1]]

    # for f in fitVals:
    # print(f, fitVals[f])

    # === get "true" counts (reverse efficiency correction based on fit value) ===
    hAx = getHistList("axion")
    x, y, xpb = wl.npTH1D(hAx)
    x, y = normPDF(x, y, eLo, eHi)
    nCts, nErr, _ = fitVals["amp-axion"]  # fit result
    yc = nCts * getEffCorr(x, y, inv=True)
    nCorr = np.sum(yc)
    effCorr = nCorr / nCts
    print("nCts %d  nCorr %.2f  effCorr %.2f" % (nCts, nCorr, effCorr))

    # thesis plot, don't delete
    # plt.step(x, y * nCts * (epb/xpb), c='r', lw=2, label="Eff-weighted: %.1f" % (nCts))
    # plt.step(x, yc * (epb/xpb), c='b', lw=2, label="True counts: %.1f" % (nCorr))
    # plt.xlabel("Energy (keV)", ha='right', x=1)
    # plt.ylabel("Counts / keV", ha='right', y=1)
    # plt.legend(loc=1)
    # plt.tight_layout()
    # plt.show()

    tMode = "UPDATE" if update else "RECREATE"
    tOut = TFile("%s/data/rs-plc.root" % dsi.latSWDir, "UPDATE")

    start = time.clock()

    name = "amp-axion"
    fitVal = fitVals[name][0]
    thisVar = fitWorkspace.var(name)

    pCL = 0.9
    plc = RS.ProfileLikelihoodCalculator(fData, model, ROOT.RooArgSet(thisVar))
    plc.SetConfidenceLevel(0.90)
    interval = plc.GetInterval()
    lower = interval.LowerLimit(thisVar)
    upper = interval.UpperLimit(thisVar)
    plot = RS.LikelihoodIntervalPlot(interval)
    plot.SetNPoints(50)
    plot.Draw("tf1")

    pName = "hP_%d" if idx is not None else "hP"
    hProfile = plot.GetPlottedObject()
    hProfile.SetName(pName)
    hProfile.SetTitle("PL %.2f  %s  lo %.3f  mid %.3f  hi %.3f  eC %.3f" %
                      (pCL, name, lower, fitVal, upper, effCorr))
    hProfile.Write()
    print(hProfile.GetTitle())

    tOut.Close()

    print("elapsed:", time.clock() - start)
Example #5
0
#bplot . Draw()
#c1 . SaveAs("posterior_pdf.png")

# query interval
#print "Bayesian interval on s = [",
#print bInt.LowerLimit( ), ",",
#print bInt.UpperLimit( ), "]"


# Profile Likelihood Calculator
plc = RooStats.ProfileLikelihoodCalculator(data, modelConfig)

# run Profile Likelihood Calculator
plc.SetConfidenceLevel(0.95)
plInt = plc.GetInterval();

# make plots
c1 = TCanvas("c1")
lrplot = RooStats.LikelihoodIntervalPlot(plInt)
lrplot.Draw()
c1 . SaveAs("likelihood_interval.png")

# query interval
plc_lower = plInt.LowerLimit( wspace.var("s") )
plc_upper = plInt.UpperLimit( wspace.var("s") )
print "Profile Likelihood interval on s = [",
print plc_lower, ",",
print plc_upper, "]"


Example #6
0
def main():
    # ROOT settings
    ROOT.Math.MinimizerOptions.SetDefaultMinimizer('Minuit')

    # Workspace
    w = ROOT.RooWorkspace('w')

    # Observable
    E = w.factory('E[0.,100.]')

    # Constrained parameters and constraint PDF
    mean = w.factory('mean[50.,49.,51.]')
    mean_obs = w.factory('mean_obs[50.,49.,51.]')
    mean_obs.setConstant(True)
    mean_err = w.factory('mean_err[0.2]')
    cpdf_mean = w.factory('Gaussian::cpdf_mean(mean,mean_obs,mean_err)')

    print type(mean), type(mean_obs), type(mean_err), type(cpdf_mean)

    return

    sigma = w.factory('sigma[1.,0.5,1.5]')
    sigma_obs = w.factory('sigma_obs[1.,0.5,1.5]')
    sigma_obs.setConstant(True)
    sigma_err = w.factory('sigma_err[0.1]')
    cpdf_sigma = w.factory('Gaussian::cpdf_sigma(sigma,sigma_obs,sigma_err)')

    # Signal
    n_sig = w.factory('n_sig[0.,0.,10.]')
    pdf_sig = w.factory('Gaussian::pdf_sig(E,mean,sigma)')

    # Background
    n_bkg = w.factory('n_bkg[10.,0.,50.]')
    pdf_bkg = w.factory('Polynomial::pdf_bkg(E,{})')

    # PDF
    pdf_sum = w.factory('SUM::pdf_sum(n_sig*pdf_sig,n_bkg*pdf_bkg)')
    pdf_const = w.factory('PROD::pdf_const({pdf_sum,cpdf_mean,cpdf_sigma})')

    # ModelConfig
    mc = RS.ModelConfig('mc', w)
    mc.SetPdf(pdf_const)
    mc.SetParametersOfInterest(ROOT.RooArgSet(n_sig))
    mc.SetObservables(ROOT.RooArgSet(E))
    mc.SetConstraintParameters(ROOT.RooArgSet(mean, sigma))
    mc.SetNuisanceParameters(ROOT.RooArgSet(mean, sigma, n_bkg))
    mc.SetGlobalObservables(ROOT.RooArgSet(mean_obs, sigma_obs))

    # Create empty dataset
    data = ROOT.RooDataSet('data', 'data', ROOT.RooArgSet(E))

    # Profile Likelihood
    pl = RS.ProfileLikelihoodCalculator(data, mc)
    pl.SetConfidenceLevel(0.90)

    interval = pl.GetInterval()
    print(interval.LowerLimit(n_sig), interval.UpperLimit(n_sig))

    plot = RS.LikelihoodIntervalPlot(interval)
    plot.SetNPoints(50)

    c = ROOT.TCanvas("c", "c", 800, 1100)
    plot.Draw("")
    c.Print("plotLukasPLC.pdf")