Example for fitting a signal + background model to a histogram found in a file.
enum ParIndex_t {
Bkg0=0, Bkg1=1, Bkg2,
SigScale, SigSigma, SigMean,
N_PAR};
const std::map<ParIndex_t,std::string> parNames{
{Bkg0, "Bkg0"}, {Bkg1, "Bkg1"}, {Bkg2, "Bkg2"},
{SigScale, "Gauss scale"}, {SigSigma, "Gauss #sigma"}, {SigMean, "Gauss #mu"}
};
double background(
double *
x,
double *par) {
return par[Bkg0] + par[Bkg1]*
x[0] + par[Bkg2]*
x[0]*
x[0];
}
double signal(
double *
x,
double *par) {
return par[SigScale]*
TMath::Gaus(
x[0], par[SigMean], par[SigSigma],
true);
}
double fitFunction(
double *
x,
double *par) {
return background(
x, par) + signal(
x, par);
}
TF1 fitFcn(
"fitFcn",fitFunction,fitxmin,fitxmax,N_PAR);
fitFcn.SetNpx(500);
fitFcn.SetLineWidth(2);
fitFcn.SetLineColor(
kBlue);
for (auto& idx_name : parNames) {
fitFcn.SetParName(idx_name.first, idx_name.second.c_str());
}
fitFcn.SetParameters(30,0,0,50.,0.1,1.);
histo->
Fit(
"fitFcn",
"VR+",
"ep");
TF1 backFcn(
"backFcn",background,fitxmin,fitxmax,N_PAR);
backFcn.SetLineColor(
kRed);
TF1 signalFcn(
"signalFcn",signal,fitxmin,fitxmax,N_PAR);
signalFcn.SetLineColor(
kBlue);
signalFcn.SetNpx(500);
double par[N_PAR];
fitFcn.GetParameters(par);
backFcn.SetParameters(par);
backFcn.DrawCopy("same");
signalFcn.SetParameters(par);
signalFcn.SetLineColor(
kGreen);
signalFcn.DrawCopy("same");
const double integral = signalFcn.Integral(0.,3.);
std::cout << "number of signal events = " << integral/binwidth << " " << binwidth<< std::endl;
TLegend legend(0.15,0.7,0.28,0.85);
legend.SetTextFont(72);
legend.SetTextSize(0.03);
legend.AddEntry(histo,"Data","lpe");
legend.AddEntry(&backFcn,"Bgd","l");
legend.AddEntry(&signalFcn,"Sig","l");
legend.AddEntry(&fitFcn,"Sig+Bgd","l");
legend.DrawClone();
}
void CreateRootFile(){
const int nBins = 60;
double data[nBins] = { 6, 1,10,12, 6,13,23,22,15,21,
23,26,36,25,27,35,40,44,66,81,
75,57,43,37,36,31,35,36,43,32,
40,37,38,33,36,44,42,37,32,32,
43,44,35,33,33,39,29,41,32,44,
26,39,29,35,32,21,21,15,25,15};
TFile*
f =
new TFile(
"exampleRootFile.root",
"RECREATE");
TH1D *histo =
new TH1D(
"histo",
"Gauss Peak on Quadratic Background;x;Events/0.05",60,0,3);
}
void FitHistoInFile() {
float fitxmin=0.2;
float fitxmax=2.7;
TCanvas *
c1 =
new TCanvas(
"c1",
"Fitting Demo of Histogram in File",10,10,700,500);
CreateRootFile();
f->GetObject(
"histo",histo);
if (!histo){
std::cout << "histo not found" << std::endl;
return;
}
FitRoutine(
c1,histo, fitxmin, fitxmax,
"FitHistoInFile.pdf");
}
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
virtual void SetRange(Int_t first=0, Int_t last=0)
Set the viewing range for the axis using bin numbers.
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
1-D histogram with a double per channel (see TH1 documentation)
TH1 is the base class of all histogram classes in ROOT.
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Double_t xmin=0, Double_t xmax=0)
void Draw(Option_t *option="") override
Default Draw method for all objects.
virtual void SetBinContent(Int_t bin, Double_t content)
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
Calculates a gaussian function with mean and sigma.