Author: Lorenzo Moneta
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Monday, March 27, 2023 at 09:47 AM.
%%cpp -d
#include "TH1.h"
#include "TF1.h"
#include "TH2D.h"
#include "TF2.h"
#include "TCanvas.h"
#include "TStopwatch.h"
#include "TSystem.h"
#include "TRandom3.h"
#include "TVirtualFitter.h"
#include "TPaveLabel.h"
#include "TStyle.h"
TF2 *fitFcn;
TH2D *histo;
Quadratic background function
%%cpp -d
double gaus2D(double *x, double *par) {
double t1 = x[0] - par[1];
double t2 = x[1] - par[2];
return par[0]* exp( - 0.5 * ( t1*t1/( par[3]*par[3]) + t2*t2 /( par[4]*par[4] ) ) ) ;
}
Sum of background and peak function
%%cpp -d
double fitFunction(double *x, double *par) {
return gaus2D(x,par);
}
Definition of a helper function:
%%cpp -d
void fillHisto(int n =10000) {
gRandom = new TRandom3();
for (int i = 0; i < n; ++i) {
double x = gRandom->Gaus(2,3);
double y = gRandom->Gaus(-1,4);
histo->Fill(x,y,1.);
}
}
Definition of a helper function:
%%cpp -d
void DoFit(const char* fitter, TVirtualPad *pad, int npass) {
TStopwatch timer;
TVirtualFitter::SetDefaultFitter(fitter);
pad->SetGrid();
fitFcn->SetParameters(100,0,0,2,7);
fitFcn->Update();
timer.Start();
histo->Fit("fitFcn","0");
timer.Stop();
histo->Draw();
double cputime = timer.CpuTime();
printf("%s, npass=%d : RT=%7.3f s, Cpu=%7.3f s\n",fitter,npass,timer.RealTime(),cputime);
TPaveLabel *p = new TPaveLabel(0.5,0.7,0.85,0.8,Form("%s CPU= %g s",fitter,cputime),"brNDC");
p->Draw();
pad->Update();
}
Arguments are defined.
int n = 100000;
TH1::AddDirectory(false);
TCanvas *c1 = new TCanvas("c1","Fitting Demo",10,10,900,900);
c1->Divide(2,2);
create a TF1 with the range from 0 to 3 and 6 parameters
fitFcn = new TF2("fitFcn",fitFunction,-10,10,-10,10,5);
fitFcn->SetNpx(200);
gStyle->SetOptFit();
gStyle->SetStatY(0.6);
histo = new TH2D("h2","2D Gauss",100,-10,10,100,-10,10);
fillHisto(n);
int npass=0;
with Minuit
c1->cd(1);
DoFit("Minuit",gPad,npass);
FCN=7196.63 FROM MIGRAD STATUS=CONVERGED 169 CALLS 170 TOTAL EDM=3.06509e-09 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 2.0 per cent EXT PARAMETER STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 p0 5.28670e+01 2.67227e-01 1.71567e-03 1.41590e-04 2 p1 2.00562e+00 9.99521e-03 -6.72962e-05 -5.71949e-03 3 p2 -1.02279e+00 1.35440e-02 3.22465e-05 2.77027e-03 4 p3 2.89928e+00 7.94099e-03 -9.38703e-05 -4.55759e-03 5 p4 3.86656e+00 1.13330e-02 1.06568e-05 -2.11126e-03 Minuit, npass=0 : RT= 0.207 s, Cpu= 0.200 s
with Fumili
c1->cd(2);
DoFit("Fumili",gPad,npass);
**************************************** Minimizer is Fumili Chi2 = 7196.63 NDf = 7366 NCalls = 30 p0 = 52.8672 +/- 0.262932 p1 = 2.00562 +/- 0.00992527 p2 = -1.02279 +/- 0.0135821 p3 = 2.89927 +/- 0.00781808 p4 = 3.86655 +/- 0.011235 Fumili, npass=0 : RT= 0.067 s, Cpu= 0.070 s
with Minuit2
c1->cd(3);
DoFit("Minuit2",gPad,npass);
**************************************** Minimizer is Minuit2 / Migrad Chi2 = 7196.63 NDf = 7366 Edm = 4.35806e-08 NCalls = 176 p0 = 52.867 +/- 0.264728 p1 = 2.00562 +/- 0.00995152 p2 = -1.0228 +/- 0.0137398 p3 = 2.89928 +/- 0.00798634 p4 = 3.86656 +/- 0.0112306 Minuit2, npass=0 : RT= 0.124 s, Cpu= 0.130 s
with Fumili2
c1->cd(4);
DoFit("Fumili2",gPad,npass);
**************************************** Minimizer is Minuit2 / Fumili Chi2 = 7196.63 NDf = 7366 Edm = 2.49758e-07 NCalls = 99 p0 = 52.8669 +/- 0.265504 p1 = 2.00562 +/- 0.00992463 p2 = -1.0228 +/- 0.0135834 p3 = 2.89928 +/- 0.00792724 p4 = 3.86656 +/- 0.0113104 Fumili2, npass=0 : RT= 0.065 s, Cpu= 0.060 s
Draw all canvases
%jsroot on
gROOT->GetListOfCanvases()->Draw()