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