Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RF] RooStats.BayesianCalculator calculates the credibility interval on prior rather than on posterior #17567

Open
1 task done
capriotti opened this issue Jan 29, 2025 · 0 comments

Comments

@capriotti
Copy link

Check duplicate issues.

  • Checked for duplicates

Description

The RooStats::BayesianCalculator class seems to calculate the credibility interval based on the the prior PDF rather than on the posterior PDF unless RooStats::BayesianCalculator::SetScanOfPosterior(N) is explicitly called.

Reproducer

#import some modules
from ROOT import RooRealVar, RooFormulaVar, RooGaussian, RooExponential, RooAddPdf, RooFit
from ROOT import RooMinimizer, RooDataHist, RooDataSet, RooPlot, RooGenericPdf, RooArgSet, RooArgList
from RooFit import *

#declare the observable
mass = RooRealVar("mass","mass",6500,7500)

#make a toy MC: exponential
slope_gen = RooRealVar("slope_gen","slope_gen",-0.0008)
expo_gen = RooExponential("expo_gen","expo_gen",mass,slope_gen)

#declare the number of generated events
ngen = 1e3

#generate ngen events according to the total PDF
data = expo_gen.generate(RooArgSet(mass), ngen)

#declare the observable
mass = RooRealVar("mass","mass",6500,7500)

#create the model: Tbc signal
mean = RooRealVar("mean","mean",7024,6800,7200)
sigma = RooRealVar("sigma","sigma",44, 20, 60)
gauss = RooGaussian("gauss","gauss",mass,mean,sigma)

#create the model: background
slope = RooRealVar("slope","slope",-0.0008, -0.001, -0.0001)
expo = RooExponential("expo","expo",mass,slope)

#declare the signal and background yields
ngauss = RooRealVar("ngauss","ngauss",10,0,50)
nexpo = RooRealVar("nexpo","nexpo",1e3,5e2,2e6)

#sum the two PDFs to create the total gauss+expo PDF
pdftot = RooAddPdf("pdftot","pdftot",RooArgList(gauss,expo),RooArgList(ngauss,nexpo))

w = ROOT.RooWorkspace("ws")
w.Import(data)
w.Import(pdftot)
w.defineSet("poi", "ngauss")
w.defineSet("obs", "mass")
w.var("mean").setConstant(1)
w.var("sigma").setConstant(1)
w.var("slope").setConstant(1)
w.var("nexpo").setConstant(1)

# Create the ModelConfig for the signal + background hypothesis
sbModel = ROOT.RooStats.ModelConfig("sig+bkg model")
# Import the RooWorkspace
sbModel.SetWorkspace(w)
# Set the meaning of the workspace objects
sbModel.SetPdf(w["pdftot"])
sbModel.SetParametersOfInterest(w.set("poi"))
sbModel.SetObservables(w.set("obs"))

# Create the ModelConfig for the background only hypothesis
bModel = sbModel.Clone("bkg-only model")
# Set the meaning of the workspace objects
bModel.SetPdf(w["pdftot"])
poi = bModel.GetParametersOfInterest().first()
poi.setVal(0)
bModel.SetSnapshot(poi)

from ROOT import RooUniform
prior = RooUniform("prior","prior",ngauss)

#Construct the bayesian calculator
bc = ROOT.RooStats.BayesianCalculator(w.data("expo_genData"), sbModel)
#bc = ROOT.RooStats.BayesianCalculator(data, pdftot, {ngauss}, prior, 0)
bc.SetConfidenceLevel(0.95)
bc.SetIntegrationType("Gauss")
bc.SetLeftSideTailFraction(0.) # for upper limit
#bc.SetScanOfPosterior(50)
#
bcInterval = bc.GetInterval()

ROOT version

root_v6.32.04.Linux-ubuntu22.04-x86_64-gcc11.4

Installation method

pre-built binary

Operating system

Ubuntu 22.04.3

Additional context

This has been tested on Google Colab using python 3.11

@capriotti capriotti added the bug label Jan 29, 2025
@guitargeek guitargeek changed the title RooStats.BayesianCalculator calculates the credibility interval on prior rather than on posterior [RF] RooStats.BayesianCalculator calculates the credibility interval on prior rather than on posterior Jan 31, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants