Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
rf709_BarlowBeeston.C File Reference

Detailed Description

View in nbviewer Open in SWAN
Implementing the Barlow-Beeston method for taking into account the statistical uncertainty of a Monte-Carlo fit template.

#include "RooRealVar.h"
#include "RooGaussian.h"
#include "RooUniform.h"
#include "RooDataSet.h"
#include "RooDataHist.h"
#include "RooHistFunc.h"
#include "RooRealSumPdf.h"
#include "RooProdPdf.h"
#include "RooPlot.h"
#include "TCanvas.h"
#include "TPaveText.h"
#include <iostream>
#include <memory>
using namespace RooFit;
{
// First, construct a likelihood model with a Gaussian signal on top of a uniform background
RooRealVar x("x", "x", -20, 20);
x.setBins(25);
RooRealVar meanG("meanG", "meanG", 1, -10, 10);
RooRealVar sigG("sigG", "sigG", 1.5, -10, 10);
RooGaussian g("g", "Gauss", x, meanG, sigG);
RooUniform u("u", "Uniform", x);
// Generate the data to be fitted
std::unique_ptr<RooDataSet> sigData(g.generate(x, 50));
std::unique_ptr<RooDataSet> bkgData(u.generate(x, 1000));
RooDataSet sumData("sumData", "Gauss + Uniform", x);
sumData.append(*sigData);
sumData.append(*bkgData);
// Make histogram templates for signal and background.
// Let's take a signal distribution with low statistics and a more accurate
// background distribution.
// Normally, these come from Monte Carlo simulations, but we will just generate them.
std::unique_ptr<RooDataHist> dh_sig( g.generateBinned(x, 50) );
std::unique_ptr<RooDataHist> dh_bkg( u.generateBinned(x, 10000) );
// ***** Case 0 - 'Rigid templates' *****
// Construct histogram shapes for signal and background
RooHistFunc p_h_sig("p_h_sig","p_h_sig",x,*dh_sig);
RooHistFunc p_h_bkg("p_h_bkg","p_h_bkg",x,*dh_bkg);
// Construct scale factors for adding the two distributions
RooRealVar Asig0("Asig","Asig",1,0.01,5000);
RooRealVar Abkg0("Abkg","Abkg",1,0.01,5000);
// Construct the sum model
RooRealSumPdf model0("model0","model0",
RooArgList(p_h_sig,p_h_bkg),
RooArgList(Asig0,Abkg0),
true);
// ***** Case 1 - 'Barlow Beeston' *****
// Construct parameterized histogram shapes for signal and background
RooParamHistFunc p_ph_sig1("p_ph_sig","p_ph_sig",*dh_sig);
RooParamHistFunc p_ph_bkg1("p_ph_bkg","p_ph_bkg",*dh_bkg);
RooRealVar Asig1("Asig","Asig",1,0.01,5000);
RooRealVar Abkg1("Abkg","Abkg",1,0.01,5000);
// Construct the sum of these
RooRealSumPdf model_tmp("sp_ph", "sp_ph",
RooArgList(p_ph_sig1,p_ph_bkg1),
RooArgList(Asig1,Abkg1),
true);
// Construct the subsidiary poisson measurements constraining the histogram parameters
// These ensure that the bin contents of the histograms are only allowed to vary within
// the statistical uncertainty of the Monte Carlo.
RooHistConstraint hc_sig("hc_sig","hc_sig",p_ph_sig1);
RooHistConstraint hc_bkg("hc_bkg","hc_bkg",p_ph_bkg1);
// Construct the joint model with template PDFs and constraints
RooProdPdf model1("model1","model1",RooArgSet(hc_sig,hc_bkg),Conditional(model_tmp,x));
// ***** Case 2 - 'Barlow Beeston' light (one parameter per bin for all samples) *****
// Construct the histogram shapes, using the same parameters for signal and background
// This requires passing the first histogram to the second, so that their common parameters
// can be re-used.
// The first ParamHistFunc will create one parameter per bin, such as `p_ph_sig2_gamma_bin_0`.
// This allows bin 0 to fluctuate up and down.
// Then, the SAME parameters are connected to the background histogram, so the bins fluctuate
// synchronously. This reduces the number of parameters.
RooParamHistFunc p_ph_sig2("p_ph_sig2", "p_ph_sig2", *dh_sig);
RooParamHistFunc p_ph_bkg2("p_ph_bkg2", "p_ph_bkg2", *dh_bkg, p_ph_sig2, true);
RooRealVar Asig2("Asig","Asig",1,0.01,5000);
RooRealVar Abkg2("Abkg","Abkg",1,0.01,5000);
// As before, construct the sum of signal2 and background2
RooRealSumPdf model2_tmp("sp_ph","sp_ph",
RooArgList(p_ph_sig2,p_ph_bkg2),
RooArgList(Asig2,Abkg2),
true);
// Construct the subsidiary poisson measurements constraining the statistical fluctuations
RooHistConstraint hc_sigbkg("hc_sigbkg","hc_sigbkg",RooArgSet(p_ph_sig2,p_ph_bkg2));
// Construct the joint model
RooProdPdf model2("model2","model2",hc_sigbkg, RooFit::Conditional(model2_tmp,x));
// ************ Fit all models to data and plot *********************
auto result0 = model0.fitTo(sumData, PrintLevel(0), Save());
auto result1 = model1.fitTo(sumData, PrintLevel(0), Save());
auto result2 = model2.fitTo(sumData, PrintLevel(0), Save());
TCanvas* can = new TCanvas("can", "", 1500, 600);
can->Divide(3,1);
TPaveText pt(-19.5, 1, -2, 25);
can->cd(1);
auto frame = x.frame(Title("No template uncertainties"));
// Plot data to enable automatic determination of model0 normalisation:
sumData.plotOn(frame);
model0.plotOn(frame, LineColor(kBlue), VisualizeError(*result0));
// Plot data again to show it on top of model0 error bands:
sumData.plotOn(frame);
// Plot model components
model0.plotOn(frame, LineColor(kBlue));
model0.plotOn(frame, Components(p_h_sig), LineColor(kAzure));
model0.plotOn(frame, Components(p_h_bkg), LineColor(kRed));
model0.paramOn(frame);
sigData->plotOn(frame, MarkerColor(kBlue));
frame->Draw();
for (auto text : {
"No template uncertainties",
"are taken into account.",
"This leads to low errors",
"for the parameters A, since",
"the only source of errors",
"are the data statistics."}) {
}
can->cd(2);
frame = x.frame(Title("Barlow Beeston for Sig & Bkg separately"));
sumData.plotOn(frame);
model1.plotOn(frame, LineColor(kBlue), VisualizeError(*result1));
// Plot data again to show it on top of error bands:
sumData.plotOn(frame);
model1.plotOn(frame, LineColor(kBlue));
model1.plotOn(frame, Components(p_ph_sig1), LineColor(kAzure));
model1.plotOn(frame, Components(p_ph_bkg1), LineColor(kRed));
model1.paramOn(frame, Parameters(RooArgSet(Asig1, Abkg1)));
sigData->plotOn(frame, MarkerColor(kBlue));
frame->Draw();
pt.Clear();
for (auto text : {
"With gamma parameters, the",
"signal & background templates",
"can adapt to the data.",
"Note how the blue signal",
"template changes its shape.",
"This leads to higher errors",
"of the scale parameters A."}) {
}
can->cd(3);
frame = x.frame(Title("Barlow Beeston light for (Sig+Bkg)"));
sumData.plotOn(frame);
model2.plotOn(frame, LineColor(kBlue), VisualizeError(*result2));
// Plot data again to show it on top of model0 error bands:
sumData.plotOn(frame);
model2.plotOn(frame, LineColor(kBlue));
model2.plotOn(frame, Components(p_ph_sig2), LineColor(kAzure));
model2.plotOn(frame, Components(p_ph_bkg2), LineColor(kRed));
model2.paramOn(frame, Parameters(RooArgSet(Asig2, Abkg2)));
sigData->plotOn(frame, MarkerColor(kBlue));
frame->Draw();
pt.Clear();
for (auto text : {
"When signal and background",
"template share one gamma para-",
"meter per bin, they adapt less.",
"The errors of the A parameters",
"also shrink slightly."}) {
}
std::cout << "Asig [normal ] = " << Asig0.getVal() << " +/- " << Asig0.getError() << std::endl;
std::cout << "Asig [BB ] = " << Asig1.getVal() << " +/- " << Asig1.getError() << std::endl;
std::cout << "Asig [BBlight] = " << Asig2.getVal() << " +/- " << Asig2.getError() << std::endl;
}
#define g(i)
Definition RSha256.hxx:105
@ kRed
Definition Rtypes.h:66
@ kBlue
Definition Rtypes.h:66
@ kAzure
Definition Rtypes.h:67
Option_t Option_t TPoint TPoint const char text
RooArgList is a container object that can hold multiple RooAbsArg objects.
Definition RooArgList.h:22
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:55
RooDataSet is a container class to hold unbinned data.
Definition RooDataSet.h:57
Plain Gaussian p.d.f.
Definition RooGaussian.h:24
The RooHistConstraint implements constraint terms for a binned PDF with statistical uncertainties.
RooHistFunc implements a real-valued function sampled from a multidimensional histogram.
Definition RooHistFunc.h:31
A histogram function that assigns scale parameters to every bin.
Efficient implementation of a product of PDFs of the form.
Definition RooProdPdf.h:33
Implements a PDF constructed from a sum of functions:
RooRealVar represents a variable that can be changed from the outside.
Definition RooRealVar.h:37
Flat p.d.f.
Definition RooUniform.h:24
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
Definition TAttFill.h:39
The Canvas class.
Definition TCanvas.h:23
TVirtualPad * cd(Int_t subpadnumber=0) override
Set current canvas & pad.
Definition TCanvas.cxx:716
virtual TObject * DrawClone(Option_t *option="") const
Draw a clone of this object in the current selected pad with: gROOT->SetSelectedPad(c1).
Definition TObject.cxx:299
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
Automatic pad generation by division.
Definition TPad.cxx:1153
A Pave (see TPave) with text, lines or/and boxes inside.
Definition TPaveText.h:21
virtual TText * AddText(Double_t x1, Double_t y1, const char *label)
Add a new Text line to this pavetext at given coordinates.
void Clear(Option_t *option="") override
Clear all lines in this pavetext.
virtual void SetBorderSize(Int_t bordersize=4)
Definition TPave.h:73
void Draw(Option_t *option="") override=0
Default Draw method for all objects.
TPaveText * pt
RooCmdArg Parameters(const RooArgSet &params)
RooCmdArg Conditional(const RooArgSet &pdfSet, const RooArgSet &depSet, bool depsAreCond=false)
RooCmdArg MarkerColor(Color_t color)
RooCmdArg Components(Args_t &&... argsOrArgSet)
RooCmdArg VisualizeError(const RooDataSet &paramData, double Z=1)
RooCmdArg LineColor(Color_t color)
Double_t x[n]
Definition legend1.C:17
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
Definition JSONIO.h:26
const char * Title
Definition TXMLSetup.cxx:68
[#0] WARNING:InputArguments -- The parameter 'sigG' with range [-10, 10] of the RooGaussian 'g' exceeds the safe range of (0, inf). Advise to limit its range.
[#1] INFO:Minimization -- p.d.f. provides expected number of events, including extended term in likelihood.
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
[#1] INFO:Minimization -- The following expressions have been identified as constant and will be precalculated and cached: (p_h_sig,p_h_bkg)
Minuit2Minimizer: Minimize with max-calls 1000 convergence for edm < 1 strategy 1
Minuit2Minimizer : Valid minimum - status = 0
FVAL = -2388.31039421315518
Edm = 3.25299757922590944e-06
Nfcn = 60
Abkg = 0.0614547 +/- 0.00211669 (limited)
Asig = 0.833778 +/- 0.1898 (limited)
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
[#1] INFO:Minimization -- p.d.f. provides expected number of events, including extended term in likelihood.
[#1] INFO:Minimization -- Including the following constraint terms in minimization: (hc_sig,hc_bkg)
[#1] INFO:Minimization -- The global observables are not defined , normalize constraints with respect to the parameters (Abkg,Asig,p_ph_bkg_gamma_bin_0,p_ph_bkg_gamma_bin_1,p_ph_bkg_gamma_bin_10,p_ph_bkg_gamma_bin_11,p_ph_bkg_gamma_bin_12,p_ph_bkg_gamma_bin_13,p_ph_bkg_gamma_bin_14,p_ph_bkg_gamma_bin_15,p_ph_bkg_gamma_bin_16,p_ph_bkg_gamma_bin_17,p_ph_bkg_gamma_bin_18,p_ph_bkg_gamma_bin_19,p_ph_bkg_gamma_bin_2,p_ph_bkg_gamma_bin_20,p_ph_bkg_gamma_bin_21,p_ph_bkg_gamma_bin_22,p_ph_bkg_gamma_bin_23,p_ph_bkg_gamma_bin_24,p_ph_bkg_gamma_bin_3,p_ph_bkg_gamma_bin_4,p_ph_bkg_gamma_bin_5,p_ph_bkg_gamma_bin_6,p_ph_bkg_gamma_bin_7,p_ph_bkg_gamma_bin_8,p_ph_bkg_gamma_bin_9,p_ph_sig_gamma_bin_0,p_ph_sig_gamma_bin_1,p_ph_sig_gamma_bin_10,p_ph_sig_gamma_bin_11,p_ph_sig_gamma_bin_12,p_ph_sig_gamma_bin_13,p_ph_sig_gamma_bin_14,p_ph_sig_gamma_bin_15,p_ph_sig_gamma_bin_16,p_ph_sig_gamma_bin_17,p_ph_sig_gamma_bin_18,p_ph_sig_gamma_bin_19,p_ph_sig_gamma_bin_2,p_ph_sig_gamma_bin_20,p_ph_sig_gamma_bin_21,p_ph_sig_gamma_bin_22,p_ph_sig_gamma_bin_23,p_ph_sig_gamma_bin_24,p_ph_sig_gamma_bin_3,p_ph_sig_gamma_bin_4,p_ph_sig_gamma_bin_5,p_ph_sig_gamma_bin_6,p_ph_sig_gamma_bin_7,p_ph_sig_gamma_bin_8,p_ph_sig_gamma_bin_9)
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model1_sumData_with_constr) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
[#1] INFO:Minimization -- The following expressions will be evaluated in cache-and-track mode: (p_ph_sig,p_ph_bkg)
Minuit2Minimizer: Minimize with max-calls 16000 convergence for edm < 1 strategy 1
Minuit2Minimizer : Valid minimum - status = 0
FVAL = -2282.22801982066039
Edm = 9.75046667922085591e-08
Nfcn = 1365
Abkg = 0.061372 +/- 0.00222727 (limited)
Asig = 0.850643 +/- 0.234541 (limited)
p_ph_bkg_gamma_bin_0 = 0.998055 +/- 0.0474272 (limited)
p_ph_bkg_gamma_bin_1 = 1.0003 +/- 0.0474806 (limited)
p_ph_bkg_gamma_bin_10 = 0.980305 +/- 0.0456254 (limited)
p_ph_bkg_gamma_bin_11 = 1.00631 +/- 0.0508601 (limited)
p_ph_bkg_gamma_bin_12 = 1.00477 +/- 0.0510228 (limited)
p_ph_bkg_gamma_bin_13 = 0.991229 +/- 0.0489466 (limited)
p_ph_bkg_gamma_bin_14 = 0.99605 +/- 0.0497199 (limited)
p_ph_bkg_gamma_bin_15 = 1.00899 +/- 0.0476474 (limited)
p_ph_bkg_gamma_bin_16 = 1.02997 +/- 0.0492181 (limited)
p_ph_bkg_gamma_bin_17 = 1.00769 +/- 0.0467483 (limited)
p_ph_bkg_gamma_bin_18 = 1.01965 +/- 0.0509664 (limited)
p_ph_bkg_gamma_bin_19 = 0.975013 +/- 0.045874 (limited)
p_ph_bkg_gamma_bin_2 = 0.996158 +/- 0.0468678 (limited)
p_ph_bkg_gamma_bin_20 = 0.999858 +/- 0.0473542 (limited)
p_ph_bkg_gamma_bin_21 = 0.998271 +/- 0.0474906 (limited)
p_ph_bkg_gamma_bin_22 = 0.998324 +/- 0.0487672 (limited)
p_ph_bkg_gamma_bin_23 = 0.98395 +/- 0.0461929 (limited)
p_ph_bkg_gamma_bin_24 = 1.02664 +/- 0.047986 (limited)
p_ph_bkg_gamma_bin_3 = 1.00554 +/- 0.0495906 (limited)
p_ph_bkg_gamma_bin_4 = 0.990585 +/- 0.0483895 (limited)
p_ph_bkg_gamma_bin_5 = 0.992304 +/- 0.0482458 (limited)
p_ph_bkg_gamma_bin_6 = 1.01041 +/- 0.0497109 (limited)
p_ph_bkg_gamma_bin_7 = 0.997207 +/- 0.0460182 (limited)
p_ph_bkg_gamma_bin_8 = 0.980295 +/- 0.0463258 (limited)
p_ph_bkg_gamma_bin_9 = 1.00976 +/- 0.0478226 (limited)
p_ph_sig_gamma_bin_11 = 1.09508 +/- 0.337672 (limited)
p_ph_sig_gamma_bin_12 = 1.07036 +/- 0.220991 (limited)
p_ph_sig_gamma_bin_13 = 0.890729 +/- 0.20285 (limited)
p_ph_sig_gamma_bin_14 = 0.947873 +/- 0.35799 (limited)
p_ph_sig_gamma_bin_15 = 1.14083 +/- 1.11115 (limited)
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
[#1] INFO:Minimization -- p.d.f. provides expected number of events, including extended term in likelihood.
[#1] INFO:Minimization -- Including the following constraint terms in minimization: (hc_sigbkg)
[#1] INFO:Minimization -- The global observables are not defined , normalize constraints with respect to the parameters (Abkg,Asig,p_ph_sig2_gamma_bin_0,p_ph_sig2_gamma_bin_1,p_ph_sig2_gamma_bin_10,p_ph_sig2_gamma_bin_11,p_ph_sig2_gamma_bin_12,p_ph_sig2_gamma_bin_13,p_ph_sig2_gamma_bin_14,p_ph_sig2_gamma_bin_15,p_ph_sig2_gamma_bin_16,p_ph_sig2_gamma_bin_17,p_ph_sig2_gamma_bin_18,p_ph_sig2_gamma_bin_19,p_ph_sig2_gamma_bin_2,p_ph_sig2_gamma_bin_20,p_ph_sig2_gamma_bin_21,p_ph_sig2_gamma_bin_22,p_ph_sig2_gamma_bin_23,p_ph_sig2_gamma_bin_24,p_ph_sig2_gamma_bin_3,p_ph_sig2_gamma_bin_4,p_ph_sig2_gamma_bin_5,p_ph_sig2_gamma_bin_6,p_ph_sig2_gamma_bin_7,p_ph_sig2_gamma_bin_8,p_ph_sig2_gamma_bin_9)
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model2_sumData_with_constr) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
[#1] INFO:Minimization -- The following expressions will be evaluated in cache-and-track mode: (p_ph_sig2,p_ph_bkg2)
Minuit2Minimizer: Minimize with max-calls 13500 convergence for edm < 1 strategy 1
Minuit2Minimizer : Valid minimum - status = 0
FVAL = -2291.45127145603146
Edm = 2.76473089713644995e-05
Nfcn = 1119
Abkg = 0.0614393 +/- 0.00221881 (limited)
Asig = 0.834401 +/- 0.203008 (limited)
p_ph_sig2_gamma_bin_0 = 0.997977 +/- 0.0474184 (limited)
p_ph_sig2_gamma_bin_1 = 1.00022 +/- 0.0474718 (limited)
p_ph_sig2_gamma_bin_10 = 0.980256 +/- 0.045617 (limited)
p_ph_sig2_gamma_bin_11 = 1.01067 +/- 0.0488754 (limited)
p_ph_sig2_gamma_bin_12 = 1.01175 +/- 0.0483914 (limited)
p_ph_sig2_gamma_bin_13 = 0.983606 +/- 0.0466986 (limited)
p_ph_sig2_gamma_bin_14 = 0.9948 +/- 0.0483051 (limited)
p_ph_sig2_gamma_bin_15 = 1.00965 +/- 0.0473307 (limited)
p_ph_sig2_gamma_bin_16 = 1.02983 +/- 0.0492085 (limited)
p_ph_sig2_gamma_bin_17 = 1.00759 +/- 0.0467394 (limited)
p_ph_sig2_gamma_bin_18 = 1.01954 +/- 0.0509568 (limited)
p_ph_sig2_gamma_bin_19 = 0.974972 +/- 0.0458656 (limited)
p_ph_sig2_gamma_bin_2 = 0.996083 +/- 0.0468591 (limited)
p_ph_sig2_gamma_bin_20 = 0.999777 +/- 0.0473454 (limited)
p_ph_sig2_gamma_bin_21 = 0.998193 +/- 0.0474818 (limited)
p_ph_sig2_gamma_bin_22 = 0.998245 +/- 0.0487583 (limited)
p_ph_sig2_gamma_bin_23 = 0.983895 +/- 0.0461844 (limited)
p_ph_sig2_gamma_bin_24 = 1.02651 +/- 0.0479766 (limited)
p_ph_sig2_gamma_bin_3 = 1.00545 +/- 0.0495815 (limited)
p_ph_sig2_gamma_bin_4 = 0.990519 +/- 0.0483808 (limited)
p_ph_sig2_gamma_bin_5 = 0.992236 +/- 0.048237 (limited)
p_ph_sig2_gamma_bin_6 = 1.01031 +/- 0.0497017 (limited)
p_ph_sig2_gamma_bin_7 = 0.99713 +/- 0.0460096 (limited)
p_ph_sig2_gamma_bin_8 = 0.980245 +/- 0.0463173 (limited)
p_ph_sig2_gamma_bin_9 = 1.00966 +/- 0.0478136 (limited)
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model0) directly selected PDF components: (p_h_sig)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model0) indirectly selected PDF components: ()
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model0) directly selected PDF components: (p_h_bkg)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model0) indirectly selected PDF components: ()
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 50 will supersede previous event count of 1050 for normalization of PDF projections
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model1) directly selected PDF components: (p_ph_sig)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model1) indirectly selected PDF components: (sp_ph)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model1) directly selected PDF components: (p_ph_bkg)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model1) indirectly selected PDF components: (sp_ph)
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 50 will supersede previous event count of 1050 for normalization of PDF projections
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model2) directly selected PDF components: (p_ph_sig2)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model2) indirectly selected PDF components: (sp_ph)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model2) directly selected PDF components: (p_ph_bkg2)
[#1] INFO:Plotting -- RooAbsPdf::plotOn(model2) indirectly selected PDF components: (sp_ph)
[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 50 will supersede previous event count of 1050 for normalization of PDF projections
Asig [normal ] = 0.833778 +/- 0.189814
Asig [BB ] = 0.850643 +/- 0.235845
Asig [BBlight] = 0.834401 +/- 0.202972

Based on a demo by Wouter Verkerke

Definition in file rf709_BarlowBeeston.C.