Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
minuit2FitBench.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_fit
3 /// \notebook
4 /// Demonstrate performance and usage of Minuit2 and Fumili2 for monodimensional fits.
5 ///
6 /// \macro_image
7 /// \macro_output
8 /// \macro_code
9 ///
10 /// \author Lorenzo Moneta
11 
12 #include "TH1.h"
13 #include "TF1.h"
14 #include "TCanvas.h"
15 #include "TStopwatch.h"
16 #include "TSystem.h"
17 #include "TRandom3.h"
18 #include "Math/MinimizerOptions.h"
19 #include "TPaveLabel.h"
20 #include "TStyle.h"
21 #include "TMath.h"
22 #include "TROOT.h"
23 #include "TFrame.h"
24 /*#include "Fit/FitConfig.h"*/
25 
26 
27 TF1 *fitFcn;
28 TH1 *histo;
29 
30 // Quadratic background function
31 Double_t background(Double_t *x, Double_t *par) {
32  return par[0] + par[1]*x[0] + par[2]*x[0]*x[0];
33 }
34 
35 // Lorenzian Peak function
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]);
39 }
40 
41 // Sum of background and peak function
42 Double_t fitFunction(Double_t *x, Double_t *par) {
43  return background(x,par) + lorentzianPeak(x,&par[3]);
44 }
45 
46 bool DoFit(const char* fitter, TVirtualPad *pad, Int_t npass) {
47  printf("\n*********************************************************************************\n");
48  printf("\t %s \n",fitter);
49  printf("*********************************************************************************\n");
50 
51  gRandom = new TRandom3();
52  TStopwatch timer;
53  // timer.Start();
54  ROOT::Math::MinimizerOptions::SetDefaultMinimizer(fitter);
55  pad->SetGrid();
56  pad->SetLogy();
57  fitFcn->SetParameters(1,1,1,6,.03,1);
58  fitFcn->Update();
59  std::string title = std::string(fitter) + " fit bench";
60  histo = new TH1D(fitter,title.c_str(),200,0,3);
61 
62  TString fitterType(fitter);
63 
64  timer.Start();
65  bool ok = true;
66  // fill histogram many times
67  // every time increase its statistics and re-use previous fitted
68  // parameter values as starting point
69  for (Int_t pass=0;pass<npass;pass++) {
70  if (pass%100 == 0) printf("pass : %d\n",pass);
71  else printf(".");
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());
75  }
76  int iret = histo->Fit(fitFcn,"Q0");
77  ok &= (iret == 0);
78  if (iret!=0) Error("DoFit","Fit pass %d failed !",pass);
79  }
80  // do last fit computing Minos Errors (except for Fumili)
81  if (!fitterType.Contains("Fumili")) // Fumili does not implement Error options (MINOS)
82  histo->Fit(fitFcn,"E");
83  else
84  histo->Fit(fitFcn,"");
85  timer.Stop();
86 
87  (histo->GetFunction("fitFcn"))->SetLineColor(kRed+3);
88  gPad->SetFillColor(kYellow-10);
89 
90 
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");
94  p->Draw();
95  p->SetTextColor(kRed+3);
96  p->SetFillColor(kYellow-8);
97  pad->Update();
98  return ok;
99 }
100 
101 int minuit2FitBench(Int_t npass=20) {
102  TH1::AddDirectory(kFALSE);
103  TCanvas *c1 = new TCanvas("FitBench","Fitting Demo",10,10,900,900);
104  c1->Divide(2,2);
105  c1->SetFillColor(kYellow-9);
106  // create a TF1 with the range from 0 to 3 and 6 parameters
107  fitFcn = new TF1("fitFcn",fitFunction,0,3,6);
108  fitFcn->SetNpx(200);
109  gStyle->SetOptFit();
110  gStyle->SetStatY(0.6);
111 
112  bool ok = true;
113  //with Minuit
114  c1->cd(1);
115  ok &= DoFit("Minuit",gPad,npass);
116 
117  //with Fumili
118  c1->cd(2);
119  ok &= DoFit("Fumili",gPad,npass);
120 
121  //with Minuit2
122  c1->cd(3);
123  ok &= DoFit("Minuit2",gPad,npass);
124 
125  //with Fumili2
126  c1->cd(4);
127  ok &= DoFit("Fumili2",gPad,npass);
128 
129  c1->SaveAs("FitBench.root");
130  return (ok) ? 0 : 1;
131 }