Likelihood and minimization: fitting with constraints
Author: Wouter Verkerke
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 19, 2024 at 07:16 PM.
%%cpp -d
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooGaussian.h"
#include "RooPolynomial.h"
#include "RooAddPdf.h"
#include "RooProdPdf.h"
#include "RooFitResult.h"
#include "RooPlot.h"
#include "TCanvas.h"
#include "TAxis.h"
#include "TH1.h"
using namespace RooFit;
Construct a Gaussian pdf
RooRealVar x("x", "x", -10, 10);
RooRealVar m("m", "m", 0, -10, 10);
RooRealVar s("s", "s", 2, 0.1, 10);
RooGaussian gauss("gauss", "gauss(x,m,s)", x, m, s);
Construct a flat pdf (polynomial of 0th order)
RooPolynomial poly("poly", "poly(x)", x);
Construct model = fgauss + (1-f)poly
RooRealVar f("f", "f", 0.5, 0., 1.);
RooAddPdf model("model", "model", RooArgSet(gauss, poly), f);
Generate small dataset for use in fitting below
std::unique_ptr<RooDataSet> d{model.generate(x, 50)};
Construct Gaussian constraint pdf on parameter f at 0.8 with resolution of 0.1
RooGaussian fconstraint("fconstraint", "fconstraint", f, 0.8, 0.2);
Multiply constraint term with regular pdf using RooProdPdf Specify in fitTo() that internal constraints on parameter f should be used
Multiply constraint with pdf
RooProdPdf modelc("modelc", "model with constraint", RooArgSet(model, fconstraint));
Fit model (without use of constraint term)
std::unique_ptr<RooFitResult> r1{model.fitTo(*d, Save(), PrintLevel(-1))};
[#1] INFO:Fitting -- RooAbsPdf::fitTo(model) fixing normalization set for coefficient determination to observables in data [#1] INFO:Fitting -- using CPU computation library compiled with -mavx2 [#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
Fit modelc with constraint term on parameter f
std::unique_ptr<RooFitResult> r2{modelc.fitTo(*d, Constrain(f), Save(), PrintLevel(-1))};
[#1] INFO:Minimization -- Including the following constraint terms in minimization: (fconstraint) [#1] INFO:Minimization -- The global observables are not defined , normalize constraints with respect to the parameters (f) [#1] INFO:Fitting -- RooAbsPdf::fitTo(modelc) fixing normalization set for coefficient determination to observables in data [#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_modelc_modelData) Summation contains a RooNLLVar, using its error level [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
Construct another Gaussian constraint pdf on parameter f at 0.2 with resolution of 0.1
RooGaussian fconstext("fconstext", "fconstext", f, 0.2, 0.1);
Fit with external constraint
std::unique_ptr<RooFitResult> r3{model.fitTo(*d, ExternalConstraints(fconstext), Save(), PrintLevel(-1))};
[#1] INFO:Minimization -- Including the following constraint terms in minimization: (fconstext) [#1] INFO:Minimization -- The global observables are not defined , normalize constraints with respect to the parameters (f,m,s) [#1] INFO:Fitting -- RooAbsPdf::fitTo(model) fixing normalization set for coefficient determination to observables in data [#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization
Print the fit results
cout << "fit result without constraint (data generated at f=0.5)" << endl;
r1->Print("v");
cout << "fit result with internal constraint (data generated at f=0.5, constraint is f=0.8+/-0.2)" << endl;
r2->Print("v");
cout << "fit result with (another) external constraint (data generated at f=0.5, constraint is f=0.2+/-0.1)" << endl;
r3->Print("v");
fit result without constraint (data generated at f=0.5) RooFitResult: minimized FCN value: 134.849, estimated distance to minimum: 2.11658e-05 covariance matrix quality: Full, accurate covariance matrix Status : MINIMIZE=0 HESSE=0 Floating Parameter InitialValue FinalValue +/- Error GblCorr. -------------------- ------------ -------------------------- -------- f 5.0000e-01 6.4987e-01 +/- 1.21e-01 <none> m 0.0000e+00 7.1824e-01 +/- 4.97e-01 <none> s 2.0000e+00 2.1880e+00 +/- 4.61e-01 <none> fit result with internal constraint (data generated at f=0.5, constraint is f=0.8+/-0.2) RooFitResult: minimized FCN value: 134.191, estimated distance to minimum: 0.000427811 covariance matrix quality: Full, accurate covariance matrix Status : MINIMIZE=0 HESSE=0 Floating Parameter InitialValue FinalValue +/- Error GblCorr. -------------------- ------------ -------------------------- -------- f 6.4987e-01 6.8952e-01 +/- 1.01e-01 <none> m 7.1824e-01 7.0939e-01 +/- 4.97e-01 <none> s 2.1880e+00 2.2657e+00 +/- 4.74e-01 <none> fit result with (another) external constraint (data generated at f=0.5, constraint is f=0.2+/-0.1) RooFitResult: minimized FCN value: 137.195, estimated distance to minimum: 0.000256905 covariance matrix quality: Full, accurate covariance matrix Status : MINIMIZE=0 HESSE=0 Floating Parameter InitialValue FinalValue +/- Error GblCorr. -------------------- ------------ -------------------------- -------- f 6.8952e-01 3.6252e-01 +/- 8.15e-02 <none> m 7.0939e-01 7.1394e-01 +/- 5.87e-01 <none> s 2.2657e+00 1.7027e+00 +/- 4.74e-01 <none>