19{
20
21
22 double bgmin1 = 0.25, bgmax1 = 5.1;
23 double bgmin2 = 3.9, bgmax2 = 15.0;
24 double bgmin3 = 7.5, bgmax3 = 5000;
25
26 const int npart = 5;
27 TFile* infile = new TFile(filename.data());
28
32
33
34 TGraphErrors part_dedxvsbg[npart];
35 TMultiGraph* gr_dedxvsbg = new TMultiGraph(Form("gr_dedxvsbg_%s", suffix.data()), ";#beta#gamma;dE/dx");
36 TGraphErrors part_dedxvsp[npart];
37 TMultiGraph* gr_dedxvsp = new TMultiGraph(Form("gr_dedxvsp_%s", suffix.data()), ";momentum(GeV/c);dE/dx");
38
39
40
41
42 TLegend tleg(0.4, 0.50, 0.65, 0.85);
43 tleg.SetBorderSize(0);
44
45 TLegend tlegPart(0.60, 0.60, 0.90, 0.90);
46 tlegPart.SetBorderSize(0);
47
48 for (int i = 0; i < int(particles.size()); ++i) {
49
50 std::string particle = particles[i];
51
53 if (mass == 0.0) B2FATAL("Mass of particle " << particle.data() << " is zero");
54
55 if (!infile->GetListOfKeys()->Contains(particle.data())) continue;
56
57 TTree* hadron = (TTree*) infile->Get(particle.data());
58 B2INFO("HadronCalibration: reading " << particle.data() << " in file " << filename.data());
59
60 double dedx, dedxerr, bg;
61
62 hadron->SetBranchAddress("dedx", &dedx);
63 hadron->SetBranchAddress("dedxerr", &dedxerr);
64 hadron->SetBranchAddress("bg_avg", &bg);
65
66 for (int j = 0; j < hadron->GetEntries(); ++j) {
67
68 hadron->GetEvent(j);
69
70 part_dedxvsbg[i].SetPoint(j, bg, dedx);
71 part_dedxvsbg[i].SetPointError(j, 0, dedxerr);
72
73 part_dedxvsp[i].SetPoint(j, bg * mass, dedx);
74 part_dedxvsp[i].SetPointError(j, 0, dedxerr);
75 }
76
77 part_dedxvsbg[i].SetName(particle.data());
80 gr_dedxvsbg->Add(&part_dedxvsbg[i]);
81
84 gr_dedxvsp->Add(&part_dedxvsp[i]);
85
86 tleg.AddEntry(&part_dedxvsbg[i], particles[i].data(), "p");
87 tlegPart.AddEntry(&part_dedxvsbg[i], particles[i].data(), "p");
88
89 }
90
91 TMultiGraph* grcopy1 = (TMultiGraph*)gr_dedxvsbg->Clone(Form("datapoints_%s", suffix.data()));
92
93
94 TF1* fdedx1 = new TF1("fdedx1", [gc](double * x, double * par) {
95 std::vector<double> parVec(par, par + 8);
97 }, bgmin1, bgmax1, 8, "WidgetCurve");
98
99 TF1* fdedx1Copy = new TF1("fdedx1Copy", [gc](double * x, double * par) {
100 std::vector<double> parVec(par, par + 8);
102 }, bgmin1, bgmax1, 8, "WidgetCurve");
103
104 fdedx1->SetParameter(0, 1);
105 fdedx1Copy->SetParameter(0, 1);
106 for (int i = 1; i < 8; ++i) {
109 }
110
111
112 TF1* fdedx2 = new TF1("fdedx2", [gc](double * x, double * par) {
113 std::vector<double> parVec(par, par + 5);
115 }, bgmin2, bgmax2, 5, "WidgetCurve");
116
117 TF1* fdedx2Copy = new TF1("fdedx2Copy", [gc](double * x, double * par) {
118 std::vector<double> parVec(par, par + 5);
120 }, bgmin2, bgmax2, 5, "WidgetCurve");
121
122 fdedx2->SetParameter(0, 2);
123 fdedx2Copy->SetParameter(0, 2);
124 for (int i = 1; i < 5; ++i) {
127 }
128
129
130 TF1* fdedx3 = new TF1("fdedx3", [gc](double * x, double * par) {
131 std::vector<double> parVec(par, par + 5);
133 }, bgmin3, bgmax3, 5, "WidgetCurve");
134
135 TF1* fdedx3Copy = new TF1("fdedx3Copy", [gc](double * x, double * par) {
136 std::vector<double> parVec(par, par + 5);
138 }, bgmin3, bgmax3, 5, "WidgetCurve");
139
140 fdedx3->SetParameter(0, 3);
141 fdedx3Copy->SetParameter(0, 3);
142 for (int i = 1; i < 5; ++i) {
145 }
146
147
148
149
150
151
152
153
154 int stat1 = gr_dedxvsbg->Fit("fdedx1", "", "", bgmin1, bgmax1);
155 for (int i = 0; i < 50; ++i) {
156 if (stat1 == 0) {
157 B2INFO("\n\tPART-1 FIT STATUS is OK: irr # " << i);
158 break;
159 }
160 stat1 = gr_dedxvsbg->Fit("fdedx1", "", "", bgmin1, bgmax1);
161 }
162
163
164 if (stat1 == 0) {
165 B2INFO("\t--> HadronCalibration: ATTENTIONS: PART-1 FIT OK..updating parameters");
166 for (int i = 1; i < 8; ++i) {
167 B2INFO(
"\t" << i <<
") Old = " << gpar.
getCurvePars(i - 1) <<
" --> New = " << fdedx1->GetParameter(i));
169 }
170 } else B2INFO("\t--> HadronCalibration: WARNING: PART-1 FIT FAILED...");
171
172
173
174
175 int stat2 = gr_dedxvsbg->Fit("fdedx2", "FQR", "", bgmin2, bgmax2);
176 for (int i = 0; i < 50; ++i) {
177 if (stat2 == 0) {
178 B2INFO("\n\tPART-2 FIT STATUS is OK: irr # " << i);
179 break;
180 }
181 stat2 = gr_dedxvsbg->Fit("fdedx2", "FQR", "", bgmin2, bgmax2);
182 }
183 if (stat2 == 0) {
184 B2INFO("\t--> HadronCalibration: ATTENTIONS: PART-2 FIT OK..updating parameters");
185 for (int i = 1; i < 5; ++i) {
186 B2INFO(
"\t" << i <<
") Old = " << gpar.
getCurvePars(6 + i) <<
" --> New = " << fdedx2->GetParameter(i));
188 }
189 } else B2INFO("\t--> HadronCalibration: WARNING: PART-2 FIT FAILED...");
190
191
192
193
194 int stat3 = gr_dedxvsbg->Fit("fdedx3", "FQR", "", bgmin3, bgmax3);
195 for (int i = 0; i < 50; ++i) {
196 if (stat3 == 0) {
197 B2INFO("\n\tPART-3 FIT STATUS is OK: irr # " << i);
198 break;
199 }
200 stat3 = gr_dedxvsbg->Fit("fdedx3", "FQR", "", bgmin3, bgmax3);
201 }
202
203 if (stat3 == 0) {
204 B2INFO("\t--> HadronCalibration: ATTENTIONS: PART-3 FIT OK..updating parameters");
205 for (int i = 1; i < 5; ++i) {
206 B2INFO(
"\t" << i <<
") Old = " << gpar.
getCurvePars(10 + i) <<
" --> New = " << fdedx3->GetParameter(i));
208 }
209 } else B2INFO("\t--> HadronCalibration: WARNING: PART-3 FIT FAILED...");
210
211
212
213 TLine bgline1(4.5, 0.50, 4.5, 1.20);
214 bgline1.SetLineStyle(kDashed);
215 bgline1.SetLineColor(kGray);
216 TLine bgline2(10.0, 0.50, 10.0, 1.20);
217 bgline2.SetLineStyle(kDashed);
218 bgline2.SetLineColor(kGray);
219 TLine dedxline1(0.75, 1.0, 1000, 1.0);
220 dedxline1.SetLineStyle(kDashed);
221 dedxline1.SetLineColor(kGray);
222
226
230
231 TCanvas bgcurvecan(Form("bgcurvecan_%s", suffix.data()), "bg curve and fitting", 1400, 800);
232 bgcurvecan.Divide(3, 2);
233 for (int i = 0; i < 6; i++) {
234 TMultiGraph* grcopy = (TMultiGraph*)grcopy1->Clone(Form("datapoints_%s_%d", suffix.data(), i));
235
236 bgcurvecan.cd(i + 1);
237 gPad->cd();
238 if (i == 0 || i == 3) gPad->SetLogy();
239 gPad->SetLogx();
240 grcopy->GetListOfGraphs()->SetDrawOption("AXIS");
241 grcopy->Draw("A*");
242 gPad->Modified(); gPad->Update();
243
244 if (i == 0 || i == 3) {
245 grcopy->GetXaxis()->SetLimits(0.10, 14500);
246 grcopy->SetMinimum(0.50);
247 grcopy->SetMaximum(50.0);
248 } else if (i == 1 || i == 4) {
249 grcopy->GetXaxis()->SetLimits(0.75, 100);
250 grcopy->SetMinimum(0.020);
251 grcopy->SetMaximum(3.0);
252 } else if (i == 2 || i == 5) {
253 grcopy->GetXaxis()->SetLimits(0.75, 50);
254 grcopy->SetMinimum(0.50);
255 grcopy->SetMaximum(1.20);
256 }
257 gPad->Modified(); gPad->Update();
258 TPaveText* ptold = new TPaveText(.35, .40, .75, .50, "blNDC");
259 ptold->SetBorderSize(0);
260 ptold->SetFillStyle(0);
261 if (i < 3) {
262 fdedx1Copy->Draw("same");
263 fdedx2Copy->Draw("same");
264 fdedx3Copy->Draw("same");
265 ptold->AddText("Old parameters");
266 } else {
267 fdedx1->Draw("same");
268 fdedx2->Draw("same");
269 fdedx3->Draw("same");
270 ptold->AddText("New parameters");
271
272 }
273
274 bgline1.Draw("same");
275 bgline2.Draw("same");
276 dedxline1.Draw("same");
277
278 if (i == 0) {
279 tleg.AddEntry(fdedx1Copy, "Pub-Fit: 1", "f1");
280 tleg.AddEntry(fdedx2Copy, "Pub-Fit: 2", "f1");
281 tleg.AddEntry(fdedx3Copy, "Pub-Fit: 3", "f1");
282 tleg.Draw("same");
283 }
284 if (i == 0 || i == 3) ptold->Draw("same");
285 }
286
287 bgcurvecan.SaveAs(Form("plots/HadronCal/BGfits/bgcurve_vsfits_%s.pdf", suffix.data()));
288
289 TCanvas bgcurveraw(Form("bgcurveraw_%s", suffix.data()), "bg curvs", 600, 600);
290 gPad->SetLogy();
291 gPad->SetLogx();
292 grcopy1->GetListOfGraphs()->SetDrawOption("AXIS");
293 grcopy1->Draw("A*");
294 gPad->Modified(); gPad->Update();
295 tlegPart.Draw("same");
296 fdedx1->Draw("same");
297 fdedx2->Draw("same");
298 fdedx3->Draw("same");
299 bgcurveraw.SaveAs(Form("plots/HadronCal/BGfits/bgcurve_raw_%s.root", suffix.data()));
300 bgcurveraw.SaveAs(Form("plots/HadronCal/BGfits/bgcurve_raw_%s.pdf", suffix.data()));
301
302 bgcurveraw.cd();
303 gPad->SetLogy();
304 gPad->SetLogx();
305 gr_dedxvsp->GetListOfGraphs()->SetDrawOption("AXIS");
306 gr_dedxvsp->Draw("A*");
307 gPad->Modified(); gPad->Update();
308 tlegPart.Draw("same");
309 bgcurveraw.SaveAs(Form("plots/HadronCal/BGfits/dedx_vs_mom_raw_%s.pdf", suffix.data()));
310
311
312 double func1a = fdedx1->Eval(4.5);
313 double func2a = fdedx2->Eval(4.5);
314 double func2b = fdedx2->Eval(10);
315 double func3a = fdedx3->Eval(10);
316 double diffval1 = 100 * abs(func1a - func2a) / func2a;
317 double diffval2 = 100 * abs(func2b - func3a) / func3a;
318 B2INFO("\t\n FIT Constraint for 1/beta^2 region (bg = 4.5): func1 --> " << func1a << ", func2 --> " << func2a <<
319 ", diff in % = " << diffval1);
320 B2INFO("\t\n FIT Constraint for 1/beta^2 region (bg = 10.): func1 --> " << func2b << ", func2 --> " << func3a <<
321 ", diff in % = " << diffval2);
322
323
324
325
326
327 TMultiGraph* fit_bgratio = new TMultiGraph(Form("fit_bgratio_%s", suffix.data()), ";#beta#gamma;ratio");
328 TGraph part_bgfit_ratio[npart];
329
330 TMultiGraph* fit_residual = new TMultiGraph(Form("fit_residual_%s", suffix.data()), ";#beta#gamma;residual");
331 TGraph part_bgfit_residual[npart];
332
333 double A = 4.5, B = 10;
334 int respoint = 1;
335 double rmin = 1.0, rmax = 1.0;
336
337 for (int i = 0; i < npart; ++i) {
338
339 for (int j = 0; j < part_dedxvsbg[i].GetN(); ++j) {
340
341 double x, y, fit;
342 part_dedxvsbg[i].GetPoint(j, x, y);
343
344 if (y == 0) continue;
345
346 if (x < A)
347 fit = fdedx1->Eval(x);
348 else if (x < B)
349 fit = fdedx2->Eval(x);
350 else
351 fit = fdedx3->Eval(x);
352
353
354 if (npart == 4) fit = 1.0;
355 if (x < 2000) {
356 part_bgfit_ratio[i].SetPoint(respoint++, x, fit / y);
357 part_bgfit_residual[i].SetPoint(respoint++, x, fit - y);
358 }
359
360 if (fit / y < rmin) rmin = fit / y;
361 else if (fit / y > rmax) rmax = fit / y;
362
363 }
364
365 part_bgfit_ratio[i].SetMarkerSize(0.50);
366 part_bgfit_ratio[i].SetMarkerStyle(4);
367 part_bgfit_ratio[i].SetMarkerColor(i + 1);
368 if (i == 4) part_bgfit_ratio[i].SetMarkerColor(i + 2);
369 if (i <= 3)fit_bgratio->Add(&part_bgfit_ratio[i]);
370
371 part_bgfit_residual[i].SetMarkerSize(0.50);
372 part_bgfit_residual[i].SetMarkerStyle(4);
373 part_bgfit_residual[i].SetMarkerColor(i + 1);
374 if (i == 4)part_bgfit_residual[i].SetMarkerColor(i + 2);
375 if (i <= 3)fit_residual->Add(&part_bgfit_residual[i]);
376 }
377
378 fit_bgratio->SetMinimum(rmin * 0.97);
379 fit_bgratio->SetMaximum(rmax * 1.03);
380
381 TCanvas* bgfitratiocan = new TCanvas(Form("bgfitratiocan_%s", suffix.data()), "dE/dx fit residual", 450, 350);
382 bgfitratiocan->cd()->SetLogx();
383 bgfitratiocan->cd()->SetGridy();
384 fit_bgratio->Draw("AP");
385 tlegPart.Draw("same");
386 bgfitratiocan->SaveAs(Form("plots/HadronCal/BGfits/bgfit_ratios_%s.pdf", suffix.data()));
387 delete bgfitratiocan;
388
389 fit_residual->SetMinimum(-0.12);
390 fit_residual->SetMaximum(+0.12);
391
392 TCanvas* bgrescan = new TCanvas(Form("bgrescan_%s", suffix.data()), "dE/dx fit residual", 450, 350);
393 bgrescan->cd()->SetLogx();
394 bgrescan->cd()->SetGridy();
395 fit_residual->Draw("AP");
396 tlegPart.Draw("same");
397 bgrescan->SaveAs(Form("plots/HadronCal/BGfits/bgfit_residual_%s.pdf", suffix.data()));
398 delete bgrescan;
399
400
402
403 delete gr_dedxvsbg;
404 delete gr_dedxvsp;
405
406 delete fdedx1;
407 delete fdedx2;
408 delete fdedx3;
409 delete fdedx1Copy;
410 delete fdedx2Copy;
411 delete fdedx3Copy;
412
413 infile->Close();
414}
Class to hold the prediction of mean as a function of beta-gamma (bg)
void setCurvePars(int i, double val)
set the curve parameters
void printParameters(std::string infile)
write the parameters in file
double getCurvePars(int i)
get the curve parameters
void setParameters(std::string infile)
set the parameters from file
double getParticleMass(const std::string &particle)
function to get the particle mass
void setFitterStyle(TF1 *&fitt, const int ic, const int il)
function to set fitter cosmetics
void setGraphStyle(TGraphErrors &gr, const int ic)
function to set graph cosmetics
HadronBgPrep m_prep
object for dE/dx to prepare sample