31 Double_t background(Double_t *x, Double_t *par) {
32 return par[0] + par[1]*x[0] + par[2]*x[0]*x[0];
36 Double_t lorentzianPeak(Double_t *x, Double_t *par) {
37 return (0.5*par[0]*par[1]/TMath::Pi()) /
38 TMath::Max( 1.e-10,(x[0]-par[2])*(x[0]-par[2]) + .25*par[1]*par[1]);
42 Double_t fitFunction(Double_t *x, Double_t *par) {
43 return background(x,par) + lorentzianPeak(x,&par[3]);
46 bool DoFit(
const char* fitter, TVirtualPad *pad, Int_t npass) {
47 printf(
"\n*********************************************************************************\n");
48 printf(
"\t %s \n",fitter);
49 printf(
"*********************************************************************************\n");
51 gRandom =
new TRandom3();
54 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(fitter);
57 fitFcn->SetParameters(1,1,1,6,.03,1);
59 std::string title = std::string(fitter) +
" fit bench";
60 histo =
new TH1D(fitter,title.c_str(),200,0,3);
62 TString fitterType(fitter);
69 for (Int_t pass=0;pass<npass;pass++) {
70 if (pass%100 == 0) printf(
"pass : %d\n",pass);
72 if (pass == 0)fitFcn->SetParameters(1,1,1,6,.03,1);
73 for (Int_t i=0;i<5000;i++) {
74 histo->Fill(fitFcn->GetRandom());
76 int iret = histo->Fit(fitFcn,
"Q0");
78 if (iret!=0) Error(
"DoFit",
"Fit pass %d failed !",pass);
81 if (!fitterType.Contains(
"Fumili"))
82 histo->Fit(fitFcn,
"E");
84 histo->Fit(fitFcn,
"");
87 (histo->GetFunction(
"fitFcn"))->SetLineColor(kRed+3);
88 gPad->SetFillColor(kYellow-10);
91 Double_t cputime = timer.CpuTime();
92 printf(
"%s, npass=%d : RT=%7.3f s, Cpu=%7.3f s\n",fitter,npass,timer.RealTime(),cputime);
93 TPaveLabel *p =
new TPaveLabel(0.45,0.7,0.88,0.8,Form(
"%s CPU= %g s",fitter,cputime),
"brNDC");
95 p->SetTextColor(kRed+3);
96 p->SetFillColor(kYellow-8);
101 int minuit2FitBench(Int_t npass=20) {
102 TH1::AddDirectory(kFALSE);
103 TCanvas *c1 =
new TCanvas(
"FitBench",
"Fitting Demo",10,10,900,900);
105 c1->SetFillColor(kYellow-9);
107 fitFcn =
new TF1(
"fitFcn",fitFunction,0,3,6);
110 gStyle->SetStatY(0.6);
115 ok &= DoFit(
"Minuit",gPad,npass);
119 ok &= DoFit(
"Fumili",gPad,npass);
123 ok &= DoFit(
"Minuit2",gPad,npass);
127 ok &= DoFit(
"Fumili2",gPad,npass);
129 c1->SaveAs(
"FitBench.root");