BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
EvalQA.C
Go to the documentation of this file.
1#include <Rtypes.h>
2#include <TCanvas.h>
3#include <TChain.h>
4#include <TClonesArray.h>
5#include <TF1.h>
6#include <TH1.h>
7#include <TH2.h>
8#include <TMath.h>
9#include <TPad.h>
10#include <TString.h>
11#include <TVirtualPad.h>
12R__ADD_INCLUDE_PATH($VMCWORKDIR)
13#include "macro/run/bmnloadlibs.C"
14
15using namespace std;
16using namespace TMath;
17
18const Int_t dim = 2;
19// Redefine histo limits (supposing exclusion - less(idx0) or more(idx1)) due to cuts obtained (useCutHistoLimits should
20// be kTRUE)
21
22// Ramin background function
24{
25 return par[0] * TMath::Sqrt(x[0] - par[2]) * TMath::Exp(-par[1] * (x[0] - par[2]));
26}
27// signal
29{
30 // return par[0] * Exp(-0.5 * pow((x[0] - par[1]) / par[2], 2))/(par[2] * sqrt(2 * M_PI)) ;
31 return par[0] * Exp(-0.5 * pow((x[0] - par[1]) / par[2], 2)) /*/(par[2] * sqrt(2 * M_PI))*/;
32}
33
34void EvalQA(TString fileName = "tmp.root",
35 Bool_t useCuts = true,
36 Bool_t drawFit = true,
37 TString outNameInvMass = "im.pdf",
38 TString outNameFitRes = "fr.root",
39 Double_t thr = 150.0,
40 int32_t pdg = 3122) // Lambda0 3122, K_S0 310
41{
42 gStyle->SetOptStat(1);
43 // ----- Timer ---------------------------------------------------------
44 TStopwatch timer;
45 timer.Start();
46
48 Double_t mass = particle->Mass();
49 Double_t width = 0.004; // particle->Width();
50 Double_t rL_Resonance = mass - 3 * width; // 1.1;
51 Double_t rR_Resonance = mass + 3 * width; // 1.13;
52 // particle->DecayChannel()
53 printf("m %f w %f l %f r %f\n", mass, width, rL_Resonance, rR_Resonance);
54
55 // TChain* out = new TChain("bmndata");
56 // out->Add(fileName.Data());
57 // cout << "#recorded entries = " << out->GetEntries() << endl;
58 // if (out->GetEntries() == 0) {
59 // cout << "Something is wrong! Please, check file you passed as input!" << endl;
60 // exit(-1);
61 // }
62
63 Double_t rL = 1.08;
64 Double_t rR = 1.2;
65 // invMassSpectrum->SetTitle("Invariant mass: #Lambda^{0} #rightarrow p + #pi^{-}");
66 unique_ptr<TFile> file{TFile::Open(fileName, "READ")};
67 TTree* tree = dynamic_cast<TTree*>(file->Get("event"));
68 // TH1F* invMassSpectrum = dynamic_cast<TH1F*>(file->Get("h"));
69 TH1F* invMassSpectrum = new TH1F("invMassSpectrum", "invMassSpectrum", 75, rL, rR);
70
71 vector<TString> cutStrVec;
72 // cutStrVec.push_back(Form("%.1f < Path < %.1f", Path[0], Path[1]));
73 // cutStrVec.push_back(Form("%.1f < Dca12 < %.1f", Dca12[0], Dca12[1]));
74 tree->Draw(
75 Form("l0.massh>>%s", invMassSpectrum->GetName()),
76 useCuts
77 ? "l0.chi2s[][0]>12.5&&l0.chi2s[][1]>10.5&&l0.c2pv<9&&l0.path>2&&l0.tmvas[][0]>-0.03&&l0.tmvas[][1]>-0.03"
78 : "");
79 if (useCuts)
80 printf("Cuts applied: %3.1f/%lld\n", invMassSpectrum->GetEntries(), tree->GetEntries());
81
82 Double_t par[8] = {};
83 TF1* bg = new TF1("BG", "pol4", rL, rR);
84 // TF1* bg = new TF1("BG", background_new, rL, rR, 5);
85 Double_t aver = invMassSpectrum->Integral() / invMassSpectrum->GetNbinsX(); //(rR - rL);
86 printf("average %f\n", aver);
87 // par[0] = aver;
88 bg->SetParameters(&par[0]);
89 invMassSpectrum->Fit(bg, "RS", "", rL, rR);
90 bg->GetParameters(&par[0]);
91
92 TF1* sig =
93 new TF1("SIG", sig_gaus,
94 // [](Double_t *x, Double_t * p) {
95 // return p[0] * Exp(-0.5 * pow((x[0] - p[1]) / p[2], 2))/*/(p[2] * sqrt(2 * M_PI))*/ ;
96 // },
97 rL_Resonance, rR_Resonance, 3);
98
99 Double_t peak_val = invMassSpectrum->GetBinContent(invMassSpectrum->FindBin((rR_Resonance + rL_Resonance) / 2.0));
100 printf("peak_val %f\n", peak_val);
101
102 Double_t temp[3] = {peak_val, mass, width};
103 sig->SetParameters(temp);
104 invMassSpectrum->Fit(sig, "R", "", rL_Resonance, rR_Resonance);
105 sig->GetParameters(&par[5]);
106
107 // TF1 *f = new TF1("f", "pol4(0)+gaus(5)", rL, rR);
108 TF1* f = new TF1(
109 "f",
110 [&](Double_t* x, Double_t* p) {
111 // return bg->EvalPar(x, p) + sig->EvalPar(x, p+5);
112 return bg->EvalPar(x, p) + sig_gaus(x, &p[5]);
113 // return background_new(x, p) + sig_gaus(x, &p[5]);
114 },
115 rL, rR, 8);
116 f->SetNpx(500);
117
118 // par[0] = aver;
119 // par[5] = peak_val - aver;
120 for (int i = 0; i < 8; i++)
121 printf("p[%d] = %f\n", i, par[i]);
122
123 f->SetParameters(par);
124 // f->SetParLimits(0, 0.0, 1e12);
125 // f->SetParLimits(5, 0.0, 1e12);
126 f->SetParLimits(7, 0.0, 1);
127 f->SetLineColor(kMagenta + 1);
128 f->SetLineWidth(3);
129 TString fitOpt = "RS";
130 TFitResultPtr fitRes =
131 invMassSpectrum->Fit(f, (drawFit) ? fitOpt.Data() : TString(fitOpt + "0").Data(), "", rL, rR);
132 Double_t mean = fitRes->Parameter(6);
133 Double_t sigma = fitRes->Parameter(7);
134 Double_t T = invMassSpectrum->Integral(invMassSpectrum->FindBin(mean - 3 * sigma),
135 invMassSpectrum->FindBin(mean + 3 * sigma));
136 Double_t B = bg->Integral(mean - 3 * sigma, mean + 3 * sigma) / invMassSpectrum->GetBinWidth(1);
137 Double_t S = sig->Integral(mean - 3 * sigma, mean + 3 * sigma) / invMassSpectrum->GetBinWidth(1);
138 Double_t S_to_B = T / B - 1;
139 Double_t Signif = (T - B) / T;
140 printf("Tot %f Bg %f sig %f\n", T, B, S);
141 f->GetParameters(par);
142 // delete sig;
143 // sig = new TF1("SIG", sig_gaus, rL_Resonance, rR_Resonance, 3);
144 sig->SetParameters(&par[5]);
145 bg->SetParameters(&par[0]);
146 T = invMassSpectrum->Integral(invMassSpectrum->FindBin(mean - 3 * sigma),
147 invMassSpectrum->FindBin(mean + 3 * sigma));
148 B = bg->Integral(mean - 3 * sigma, mean + 3 * sigma) / invMassSpectrum->GetBinWidth(1);
149 S = sig->Integral(mean - 3 * sigma, mean + 3 * sigma) / invMassSpectrum->GetBinWidth(1);
150 S_to_B = T / B - 1;
151 Signif = (T - B) / T;
152 printf("Tot %f Bg %f sig %f after refit\n", T, B, S);
153 invMassSpectrum->SetMarkerStyle(20);
154 invMassSpectrum->SetMarkerColor(kSpring - 6);
155 invMassSpectrum->SetLineColor(kSpring - 6);
156 invMassSpectrum->SetLineWidth(1);
157
158 TFile out(outNameFitRes, "RECREATE");
159
160 unique_ptr<TCanvas> canvLambda = make_unique<TCanvas>(Form("im_thr%1.1f", thr), "Inv mass", 1600, 900);
161 canvLambda->Divide(1, 1);
162 TVirtualPad* pad = canvLambda->cd();
163 pad->SetLeftMargin(0.2);
164 canvLambda->cd(1);
165
166 invMassSpectrum->Draw("PE1X0");
167 // invMassSpectrum->GetYaxis()->SetRangeUser(0., 40.);
168 invMassSpectrum->GetXaxis()->SetTitle("M_{(p + #pi^{-})}, GeV/c^{2}");
169 invMassSpectrum->GetYaxis()->SetTitle("Entries / 2 MeV/c^{2}");
170 invMassSpectrum->GetXaxis()->SetLabelSize(0.035);
171 invMassSpectrum->GetYaxis()->SetLabelSize(0.035);
172 invMassSpectrum->GetXaxis()->SetTitleSize(0.05);
173 invMassSpectrum->GetYaxis()->SetTitleSize(0.05);
174 invMassSpectrum->GetXaxis()->SetTitleOffset(0.85);
175 invMassSpectrum->GetYaxis()->SetTitleOffset(1.5);
176 invMassSpectrum->GetYaxis()->CenterTitle();
177 invMassSpectrum->SetMinimum(0);
178
179 // Draw the legend
180 Double_t legendX = 0.55;
181 Double_t legendY = 0.85;
182 TLegend* legend = new TLegend(legendX, legendY - (4 + cutStrVec.size()) * 0.05, legendX + 0.05, legendY);
183 legend->SetTextFont(72);
184 legend->SetTextSize(0.03);
185 legend->AddEntry("", Form("Mass = %.4f", mean), 0);
186 legend->AddEntry("", Form(" #sigma = %.4f", sigma), 0);
187 legend->AddEntry("", Form("S/B = %.4f", S_to_B), 0);
188 legend->AddEntry("", Form("S/(S + B) = %.4f", Signif), 0);
189 legend->AddEntry("", Form("Sig integral = %.4f", S), 0);
190 if (cutStrVec.size() > 0)
191 legend->AddEntry("", "", 0);
192 for (TString& cutS : cutStrVec) {
193 legend->AddEntry("", cutS.Data(), 0);
194 }
195 legend->SetLineColor(0);
196 // if (useCuts){
197 legend->Draw();
198 sig->SetLineColor(kBlue);
199 sig->Draw("SAME");
200 // delete sig;
201 // delete bg;
202 // }
203 // ----- Finish --------------------------------------------------------
204 canvLambda->SaveAs(outNameInvMass.Data());
205 canvLambda->Write();
206
207 TTree* tree_res = new TTree("FitRes", "FitRes");
208 tree_res->Branch("Mean", &mean);
209 tree_res->Branch("S_to_B", &S_to_B);
210 tree_res->Branch("Signif", &Signif);
211 tree_res->Branch("Signal", &S);
212 tree_res->Branch("Thr", &thr);
213 tree_res->Branch("Tot", &T);
214 tree_res->Branch("Bg", &B);
215 tree_res->Fill();
216 out.Write();
217 out.Close();
218 printf("Results written to %s\n", outNameFitRes.Data());
219
220 timer.Stop();
221 Double_t rtime = timer.RealTime();
222 Double_t ctime = timer.CpuTime();
223 cout << endl << endl;
224 cout << "Macro finished successfully." << endl;
225 cout << "Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
226 cout << endl;
227}
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
double Double_t
#define R__ADD_INCLUDE_PATH(PATH)
kMagenta
kBlue
kSpring
char * Form(const char *fmt,...)
R__EXTERN TStyle * gStyle
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 SetLineWidth(Width_t lwidth)
virtual void SetLineColor(Color_t lcolor)
virtual void SetMarkerColor(Color_t mcolor=1)
virtual void SetMarkerStyle(Style_t mstyle=1)
virtual void SetLeftMargin(Float_t leftmargin)
virtual void SetTextFont(Font_t tfont=62)
virtual void SetTextSize(Float_t tsize=1)
void CenterTitle(Bool_t center=kTRUE)
static TDatabasePDG * Instance()
TParticlePDG * GetParticle(const char *name) const
virtual Double_t Integral(Double_t a, Double_t b, Double_t epsrel=1.e-12)
virtual Double_t * GetParameters() const
void Draw(Option_t *option="") override
virtual Double_t EvalPar(const Double_t *x, const Double_t *params=nullptr)
virtual void SetParameters(const Double_t *params)
Int_t Write(const char *name=nullptr, Int_t opt=0, Int_t bufsize=0) const override
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
void Close(Option_t *option="") override
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
TAxis * GetYaxis()
void Draw(Option_t *option="") override
virtual void SetMinimum(Double_t minimum=-1111)
virtual Double_t GetEntries() const
virtual Double_t Integral(Int_t binx1, Int_t binx2, Option_t *option="") const
virtual Double_t GetBinContent(Int_t bin) const
virtual Double_t GetBinWidth(Int_t bin) const
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
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 * GetName() const override
Double_t Mass() const
Double_t RealTime()
void Start(Bool_t reset=kTRUE)
Double_t CpuTime()
void Stop()
const char * Data() const
virtual Int_t Fill()
virtual Long64_t GetEntries() const
virtual Long64_t Draw(const char *varexp, const char *selection, Option_t *option="", Long64_t nentries=kMaxEntries, Long64_t firstentry=0)
virtual Int_t Branch(const char *folder, Int_t bufsize=32000, Int_t splitlevel=99)
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
const UInt_t dim
RVec< PromoteTypes< T0, T1 > > pow(const RVec< T0 > &v, const T1 &y)
Double_t sig_gaus(Double_t *x, Double_t *par)
Definition EvalQA.C:28
Double_t background_new(Double_t *x, Double_t *par)
Definition EvalQA.C:23
void EvalQA(TString fileName="tmp.root", Bool_t useCuts=true, Bool_t drawFit=true, TString outNameInvMass="im.pdf", TString outNameFitRes="fr.root", Double_t thr=150.0, int32_t pdg=3122)
Definition EvalQA.C:34
Double_t Exp(Double_t x)
Double_t Sqrt(Double_t x)
Definition json.hpp:4446