BmnRoot 26.10.0-19-g6979a6c6
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
fitSpectrum.C
Go to the documentation of this file.
1#include <Rtypes.h>
2#include <TCanvas.h>
3#include <TF1.h>
4#include <TFile.h>
5#include <TH1.h>
6#include <TString.h>
7#include <vector>
8R__ADD_INCLUDE_PATH($VMCWORKDIR)
9#include "macro/run/bmnloadlibs.C"
10
11using namespace std;
12
13// Background function ...
14
16{
17 Double_t fA = 1.07;
18 Double_t fB = 1.22;
19
20 vector<Double_t> fT;
21 fT.resize(6); // polynomial
22
23 Double_t x = (2.0 * xx[0] - fA - fB) / (fB - fA);
24 int order = fT.size();
25 if (order == 1)
26 return p[0];
27 if (order == 2)
28 return p[0] + x * p[1];
29 // build the polynomials
30 fT[0] = 1;
31 fT[1] = x;
32 for (Int_t i = 1; i < order; ++i) {
33 fT[i + 1] = 2 * x * fT[i] - fT[i - 1];
34 }
35 Double_t sum = p[0] * fT[0];
36 for (int i = 1; i <= order; ++i) {
37 sum += p[i] * fT[i];
38 }
39 return sum;
40}
41
42// Signal function ...
43
45{
46 Double_t arg = (xx[0] - p[1]) / p[2];
47 Double_t fitval = p[0] * TMath::Exp(-0.5 * arg * arg);
48 return fitval;
49}
50
51// Lorentzian Peak function
52
54{
55 return (0.5 * par[0] * par[1] / TMath::Pi())
56 / TMath::Max(1.e-10, (x[0] - par[2]) * (x[0] - par[2]) + .25 * par[1] * par[1]);
57}
58
59// Sum of background and peak function
60
62{
63 return background(x, &par[0]) + signal(x, &par[7]);
64}
65
66// A useful macro that can be used for fit of mass spectrum to extract signal and background ...
67// All necessary procedures are described there and can be used in chain just passing a file containing spectrum ...
68// inFile is a .root file where spectrum is saved ...
69
70void fitSpectrum(TString inFile, TString spectrumName)
71{
72 TFile* f = new TFile(inFile.Data());
73 if (!f->IsOpen())
74 return;
75
76 TH1F* h = (TH1F*)f->Get(spectrumName.Data()); // get histo with spectrum ...
77
78 if (!h)
79 return;
80 h->GetXaxis()->SetLabelSize(.05);
81 h->GetXaxis()->SetTitleOffset(-.6);
82 h->GetYaxis()->SetLabelSize(.05);
83 h->GetYaxis()->SetTitle("");
84 h->GetXaxis()->SetTitle("M_{(p + #pi^{-})} [GeV/c^{2}]");
85 h->GetXaxis()->SetTitleSize(0.06);
86 h->GetXaxis()->CenterTitle();
87
88 // Bin signal range ...
89 const Int_t binMin = 20; // 20;
90 const Int_t binMax = 26; // 27;
91
92 vector<Double_t> binErrorsAll;
93 vector<Double_t> binErrorsSignal;
94
95 // Saving bin errors for all bins ...
96 for (Int_t iBin = 1; iBin < h->GetNbinsX() + 1; iBin++)
97 binErrorsAll.push_back(h->GetBinError(iBin));
98
99 // Saving bin errors for signal region ...
100 for (Int_t iBin = binMin; iBin < binMax + 1; iBin++)
101 binErrorsSignal.push_back(h->GetBinError(iBin));
102
103 // Setting zero errors for signal region ...
104 for (Int_t iBin = binMin; iBin < binMax + 1; iBin++)
105 h->SetBinError(iBin, 0.);
106
107 Double_t xmin = 1.08;
108 Double_t xmax = 1.22;
109 Double_t n = 6;
110
111 TF1* fitBackground = new TF1("f1", background, xmin, xmax, n + 1);
112 fitBackground->SetLineColor(kBlue);
113 fitBackground->SetLineStyle(kDashed);
114 TFitResultPtr backRes = h->Fit(fitBackground, "SR+", "", xmin, xmax);
115
116 // Setting zero error for all range ...
117 for (Int_t iBin = 1; iBin < h->GetNbinsX() + 1; iBin++)
118 h->SetBinError(iBin, 0.);
119
120 // Restoring errors for signal range ...
121 for (Int_t iBin = binMin; iBin < binMax + 1; iBin++)
122 h->SetBinError(iBin, binErrorsSignal[iBin - binMin]);
123
124 TF1* fitSignal = new TF1("f2", signal, xmin, xmax, 3);
125
126 fitSignal->SetParameter(0, 2000.);
127 fitSignal->SetParameter(1, 1.115);
128 fitSignal->SetParameter(2, 0.002);
129 fitSignal->SetNpx(500);
130
131 fitSignal->SetLineColor(kRed);
132 TFitResultPtr sigRes = h->Fit(fitSignal, "SR0+", "", h->GetBinCenter(binMin), h->GetBinCenter(binMax));
133
134 // Restoring all bin errors ...
135 for (Int_t iBin = 1; iBin < h->GetNbinsX() + 1; iBin++)
136 h->SetBinError(iBin, binErrorsAll[iBin]);
137
138 TF1* fitSpectrum = new TF1("f", fitFunction, xmin, xmax, 10);
139 fitSpectrum->SetLineColor(kMagenta);
140 fitSpectrum->SetNpx(500);
141 fitSpectrum->SetParameter(0, backRes->Parameter(0));
142 fitSpectrum->SetParameter(1, backRes->Parameter(1));
143 fitSpectrum->SetParameter(2, backRes->Parameter(2));
144 fitSpectrum->SetParameter(3, backRes->Parameter(3));
145 fitSpectrum->SetParameter(4, backRes->Parameter(4));
146 fitSpectrum->SetParameter(5, backRes->Parameter(5));
147 fitSpectrum->SetParameter(6, backRes->Parameter(6));
148 fitSpectrum->SetParameter(7, sigRes->Parameter(0));
149 fitSpectrum->SetParameter(8, sigRes->Parameter(1));
150 fitSpectrum->SetParameter(9, sigRes->Parameter(2));
151
152 TFitResultPtr res = h->Fit(fitSpectrum, "SR+", "", xmin, xmax);
153
154 h->Draw("PE1X0");
155
156 TLegend* legend = new TLegend(0.6, 0.25, 0.61, 0.45);
157 legend->SetTextFont(72);
158 legend->SetTextSize(0.04);
159
160 Double_t mean = res->Parameter(8);
161 Double_t sigma = TMath::Abs(res->Parameter(9));
162
163 legend->AddEntry("", Form("Mass = %.4f", mean), 0);
164 legend->AddEntry("", Form("Sigma = %.4f", sigma), 0);
165
166 // Calculating signal ...
167 // Double_t T = h->Integral(h->FindBin(mean - 3 * sigma), h->FindBin(mean + 3 * sigma));
168 Double_t T = fitSpectrum->Integral(mean - 3 * sigma, mean + 3 * sigma) / h->GetBinWidth(1);
169 Double_t B = fitBackground->Integral(mean - 3 * sigma, mean + 3 * sigma) / h->GetBinWidth(1);
170
171 legend->AddEntry("", Form("All, %d", Int_t(T)), 0);
172 legend->AddEntry("", Form("Background, %d", Int_t(B)), 0);
173
174 legend->AddEntry("", Form("Numb. of #Lambda^{0} = %d", Int_t(T - B)), 0);
175 legend->SetLineColor(0);
176 legend->Draw();
177}
int i
Definition P4_F32vec4.h:22
int Int_t
double Double_t
#define R__ADD_INCLUDE_PATH(PATH)
kRed
kMagenta
kBlue
kDashed
char * Form(const char *fmt,...)
double Parameter(unsigned int i) const
virtual void SetTitleOffset(Float_t offset=1)
virtual void SetLabelSize(Float_t size=0.04)
virtual void SetTitleSize(Float_t size=0.04)
virtual void SetLineStyle(Style_t lstyle)
virtual void SetLineColor(Color_t lcolor)
virtual void SetTextFont(Font_t tfont=62)
virtual void SetTextSize(Float_t tsize=1)
void CenterTitle(Bool_t center=kTRUE)
virtual Double_t Integral(Double_t a, Double_t b, Double_t epsrel=1.e-12)
virtual void SetNpx(Int_t npx=100)
virtual void SetParameter(const TString &name, Double_t value)
virtual Double_t GetBinCenter(Int_t bin) const
virtual Double_t GetBinError(Int_t bin) const
TAxis * GetXaxis()
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Double_t xmin=0, Double_t xmax=0)
virtual Int_t GetNbinsX() const
virtual void SetBinError(Int_t bin, Double_t error)
TAxis * GetYaxis()
void Draw(Option_t *option="") override
virtual Double_t GetBinWidth(Int_t bin) const
void Draw(Option_t *option="") override
TLegendEntry * AddEntry(const char *name, const char *label="", Option_t *option="lpf")
virtual void SetTitle(const char *title="")
const char * Data() const
Double_t lorentzianPeak(Double_t *x, Double_t *par)
Definition fitSpectrum.C:53
Double_t signal(Double_t *xx, Double_t *p)
Definition fitSpectrum.C:44
void fitSpectrum(TString inFile, TString spectrumName)
Definition fitSpectrum.C:70
Double_t background(Double_t *xx, Double_t *p)
Definition fitSpectrum.C:15
Double_t fitFunction(Double_t *x, Double_t *par)
Definition fitSpectrum.C:61
Double_t Exp(Double_t x)
constexpr Double_t Pi()
Double_t Abs(Double_t d)
Double_t Max(Double_t a, Double_t b)