Likelihood and minimization: setting up a chi^2 fit to an unbinned dataset with X,Y,err(Y) values (and optionally err(X) values)
Author: Wouter Verkerke
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Wednesday, April 17, 2024 at 11:19 AM.
%%cpp -d
#include "RooRealVar.h"
#include "RooDataSet.h"
#include "RooPolyVar.h"
#include "TCanvas.h"
#include "TAxis.h"
#include "RooPlot.h"
#include "TRandom.h"
using namespace RooFit;
Make weighted XY dataset with asymmetric errors stored The StoreError() argument is essential as it makes the dataset store the error in addition to the values of the observables. If errors on one or more observables are asymmetric, one can store the asymmetric error using the StoreAsymError() argument
RooRealVar x("x", "x", -11, 11);
RooRealVar y("y", "y", -10, 200);
RooDataSet dxy("dxy", "dxy", {x, y}, StoreError({x, y}));
Fill an example dataset with X,err(X),Y,err(Y) values
for (int i = 0; i <= 10; i++) {
// Set X value and error
x = -10 + 2 * i;
x.setError(i < 5 ? 0.5 / 1. : 1.0 / 1.);
// Set Y value and error
y = x.getVal() * x.getVal() + 4 * fabs(gRandom->Gaus());
y.setError(sqrt(y.getVal()));
dxy.add({x, y});
}
Make fit function
RooRealVar a("a", "a", 0.0, -10, 10);
RooRealVar b("b", "b", 0.0, -100, 100);
RooRealVar c("c", "c", 0.0, -100, 100);
RooPolyVar f("f", "f", x, RooArgList(b, a, c));
Plot dataset in X-Y interpretation
RooPlot *frame = x.frame(Title("Chi^2 fit of function set of (X#pmdX,Y#pmdY) values"));
dxy.plotOnXY(frame, YVar(y));
Fit chi^2 using X and Y errors
std::unique_ptr<RooFitResult> fit1{f.chi2FitTo(dxy, YVar(y), Save(), PrintLevel(-1))};
fit1->Print();
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization RooFitResult: minimized FCN value: 1.17354, estimated distance to minimum: 3.83787e-05 covariance matrix quality: Full, accurate covariance matrix Status : MINIMIZE=0 HESSE=0 Floating Parameter FinalValue +/- Error -------------------- -------------------------- a -6.4539e-02 +/- 5.85e-01 b 2.9760e-01 +/- 4.74e-01 c 1.0442e+00 +/- 9.06e-02
Overlay fitted function
f.plotOn(frame);
Alternative: fit chi^2 integrating f(x) over ranges defined by X errors, rather than taking point at center of bin
std::unique_ptr<RooFitResult> fit2{f.chi2FitTo(dxy, YVar(y), Save(), PrintLevel(-1), Integrate(true))};
fit2->Print();
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization [#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: deactivating const optimization RooFitResult: minimized FCN value: 2.81819, estimated distance to minimum: 5.77434e-06 covariance matrix quality: Full, accurate covariance matrix Status : MINIMIZE=0 HESSE=0 Floating Parameter FinalValue +/- Error -------------------- -------------------------- a -5.5529e-02 +/- 3.37e-01 b 3.6741e-02 +/- 4.64e-01 c 1.0407e+00 +/- 4.98e-02
Overlay alternate fit result
f.plotOn(frame, LineStyle(kDashed), LineColor(kRed));
Draw the plot on a canvas
new TCanvas("rf609_xychi2fit", "rf609_xychi2fit", 600, 600);
gPad->SetLeftMargin(0.15);
frame->GetYaxis()->SetTitleOffset(1.4);
frame->Draw();
Draw all canvases
%jsroot on
gROOT->GetListOfCanvases()->Draw()