9#include <cdc/calibration/CDCdEdx/HadronCalibration.h>
18 const std::string& suffix)
22 double bgmin1 = 0.25, bgmax1 = 5.1;
23 double bgmin2 = 3.9, bgmax2 = 15.0;
24 double bgmin3 = 7.5, bgmax3 = 5000;
27 TFile* infile =
new TFile(filename.data());
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");
42 TLegend tleg(0.4, 0.50, 0.65, 0.85);
43 tleg.SetBorderSize(0);
45 TLegend tlegPart(0.60, 0.60, 0.90, 0.90);
46 tlegPart.SetBorderSize(0);
48 for (
int i = 0; i < int(particles.size()); ++i) {
50 std::string particle = particles[i];
53 if (mass == 0.0) B2FATAL(
"Mass of particle " << particle.data() <<
" is zero");
55 if (!infile->GetListOfKeys()->Contains(particle.data()))
continue;
57 TTree* hadron = (TTree*) infile->Get(particle.data());
58 B2INFO(
"HadronCalibration: reading " << particle.data() <<
" in file " << filename.data());
60 double dedx, dedxerr, bg;
62 hadron->SetBranchAddress(
"dedx", &dedx);
63 hadron->SetBranchAddress(
"dedxerr", &dedxerr);
64 hadron->SetBranchAddress(
"bg_avg", &bg);
66 for (
int j = 0; j < hadron->GetEntries(); ++j) {
70 part_dedxvsbg[i].SetPoint(j, bg, dedx);
71 part_dedxvsbg[i].SetPointError(j, 0, dedxerr);
73 part_dedxvsp[i].SetPoint(j, bg * mass, dedx);
74 part_dedxvsp[i].SetPointError(j, 0, dedxerr);
77 part_dedxvsbg[i].SetName(particle.data());
80 gr_dedxvsbg->Add(&part_dedxvsbg[i]);
84 gr_dedxvsp->Add(&part_dedxvsp[i]);
86 tleg.AddEntry(&part_dedxvsbg[i], particles[i].data(),
"p");
87 tlegPart.AddEntry(&part_dedxvsbg[i], particles[i].data(),
"p");
91 TMultiGraph* grcopy1 = (TMultiGraph*)gr_dedxvsbg->Clone(Form(
"datapoints_%s", suffix.data()));
94 TF1* fdedx1 =
new TF1(
"fdedx1", [gc](
double * x,
double * par) {
95 std::vector<double> parVec(par, par + 8);
97 }, bgmin1, bgmax1, 8,
"WidgetCurve");
99 TF1* fdedx1Copy =
new TF1(
"fdedx1Copy", [gc](
double * x,
double * par) {
100 std::vector<double> parVec(par, par + 8);
102 }, bgmin1, bgmax1, 8,
"WidgetCurve");
104 fdedx1->SetParameter(0, 1);
105 fdedx1Copy->SetParameter(0, 1);
106 for (
int i = 1; i < 8; ++i) {
112 TF1* fdedx2 =
new TF1(
"fdedx2", [gc](
double * x,
double * par) {
113 std::vector<double> parVec(par, par + 5);
115 }, bgmin2, bgmax2, 5,
"WidgetCurve");
117 TF1* fdedx2Copy =
new TF1(
"fdedx2Copy", [gc](
double * x,
double * par) {
118 std::vector<double> parVec(par, par + 5);
120 }, bgmin2, bgmax2, 5,
"WidgetCurve");
122 fdedx2->SetParameter(0, 2);
123 fdedx2Copy->SetParameter(0, 2);
124 for (
int i = 1; i < 5; ++i) {
130 TF1* fdedx3 =
new TF1(
"fdedx3", [gc](
double * x,
double * par) {
131 std::vector<double> parVec(par, par + 5);
133 }, bgmin3, bgmax3, 5,
"WidgetCurve");
135 TF1* fdedx3Copy =
new TF1(
"fdedx3Copy", [gc](
double * x,
double * par) {
136 std::vector<double> parVec(par, par + 5);
138 }, bgmin3, bgmax3, 5,
"WidgetCurve");
140 fdedx3->SetParameter(0, 3);
141 fdedx3Copy->SetParameter(0, 3);
142 for (
int i = 1; i < 5; ++i) {
154 int stat1 = gr_dedxvsbg->Fit(
"fdedx1",
"",
"", bgmin1, bgmax1);
155 for (
int i = 0; i < 50; ++i) {
157 B2INFO(
"\n\tPART-1 FIT STATUS is OK: irr # " << i);
160 stat1 = gr_dedxvsbg->Fit(
"fdedx1",
"",
"", bgmin1, bgmax1);
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));
170 }
else B2INFO(
"\t--> HadronCalibration: WARNING: PART-1 FIT FAILED...");
175 int stat2 = gr_dedxvsbg->Fit(
"fdedx2",
"FQR",
"", bgmin2, bgmax2);
176 for (
int i = 0; i < 50; ++i) {
178 B2INFO(
"\n\tPART-2 FIT STATUS is OK: irr # " << i);
181 stat2 = gr_dedxvsbg->Fit(
"fdedx2",
"FQR",
"", bgmin2, bgmax2);
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));
189 }
else B2INFO(
"\t--> HadronCalibration: WARNING: PART-2 FIT FAILED...");
194 int stat3 = gr_dedxvsbg->Fit(
"fdedx3",
"FQR",
"", bgmin3, bgmax3);
195 for (
int i = 0; i < 50; ++i) {
197 B2INFO(
"\n\tPART-3 FIT STATUS is OK: irr # " << i);
200 stat3 = gr_dedxvsbg->Fit(
"fdedx3",
"FQR",
"", bgmin3, bgmax3);
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));
209 }
else B2INFO(
"\t--> HadronCalibration: WARNING: PART-3 FIT FAILED...");
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);
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));
236 bgcurvecan.cd(i + 1);
238 if (i == 0 || i == 3) gPad->SetLogy();
240 grcopy->GetListOfGraphs()->SetDrawOption(
"AXIS");
242 gPad->Modified(); gPad->Update();
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);
257 gPad->Modified(); gPad->Update();
258 TPaveText* ptold =
new TPaveText(.35, .40, .75, .50,
"blNDC");
259 ptold->SetBorderSize(0);
260 ptold->SetFillStyle(0);
262 fdedx1Copy->Draw(
"same");
263 fdedx2Copy->Draw(
"same");
264 fdedx3Copy->Draw(
"same");
265 ptold->AddText(
"Old parameters");
267 fdedx1->Draw(
"same");
268 fdedx2->Draw(
"same");
269 fdedx3->Draw(
"same");
270 ptold->AddText(
"New parameters");
274 bgline1.Draw(
"same");
275 bgline2.Draw(
"same");
276 dedxline1.Draw(
"same");
279 tleg.AddEntry(fdedx1Copy,
"Pub-Fit: 1",
"f1");
280 tleg.AddEntry(fdedx2Copy,
"Pub-Fit: 2",
"f1");
281 tleg.AddEntry(fdedx3Copy,
"Pub-Fit: 3",
"f1");
284 if (i == 0 || i == 3) ptold->Draw(
"same");
287 bgcurvecan.SaveAs(Form(
"plots/HadronCal/BGfits/bgcurve_vsfits_%s.pdf", suffix.data()));
289 TCanvas bgcurveraw(Form(
"bgcurveraw_%s", suffix.data()),
"bg curvs", 600, 600);
292 grcopy1->GetListOfGraphs()->SetDrawOption(
"AXIS");
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()));
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()));
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);
327 TMultiGraph* fit_bgratio =
new TMultiGraph(Form(
"fit_bgratio_%s", suffix.data()),
";#beta#gamma;ratio");
328 TGraph part_bgfit_ratio[npart];
330 TMultiGraph* fit_residual =
new TMultiGraph(Form(
"fit_residual_%s", suffix.data()),
";#beta#gamma;residual");
331 TGraph part_bgfit_residual[npart];
333 double A = 4.5, B = 10;
335 double rmin = 1.0, rmax = 1.0;
337 for (
int i = 0; i < npart; ++i) {
339 for (
int j = 0; j < part_dedxvsbg[i].GetN(); ++j) {
342 part_dedxvsbg[i].GetPoint(j, x, y);
344 if (y == 0)
continue;
347 fit = fdedx1->Eval(x);
349 fit = fdedx2->Eval(x);
351 fit = fdedx3->Eval(x);
354 if (npart == 4) fit = 1.0;
356 part_bgfit_ratio[i].SetPoint(respoint++, x, fit / y);
357 part_bgfit_residual[i].SetPoint(respoint++, x, fit - y);
360 if (fit / y < rmin) rmin = fit / y;
361 else if (fit / y > rmax) rmax = fit / y;
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]);
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]);
378 fit_bgratio->SetMinimum(rmin * 0.97);
379 fit_bgratio->SetMaximum(rmax * 1.03);
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;
389 fit_residual->SetMinimum(-0.12);
390 fit_residual->SetMaximum(+0.12);
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()));
417 const std::string& suffix)
420 std::string title =
"chi-fit-means of different particles;#beta#gamma;#chi(#mu)";
421 std::string sname = Form(
"gr_chimean_vs_bg_%s", suffix.data());
425 title =
"chi-fit-width of different particles;#beta#gamma;#chi(#sigma)";
426 sname = Form(
"gr_chiwidth_vs_bg_%s", suffix.data());
430 title =
"chi-fit-means of different particles: latest curve+sigma pars;p(GeV/c);#chi(#mu)";
431 sname = Form(
"gr_chimean_vs_mom_%s", suffix.data());
435 title =
"chi-fit-width of different particles: w/ latest curve+sigma pars;p(GeV/c);#chi(#sigma)";
436 sname = Form(
"gr_chiwidth_vs_mom_%s", suffix.data());
437 plotMonitoring(particles, filename, sname, title,
"mom",
"sigma");
439 std::string svar =
"ler";
440 for (
int ir = 0; ir < 2; ir++) {
441 if (ir == 1) svar =
"her";
444 title = Form(
"#chi mean vs injection time, %s;injection time;#chi_{#mu}", svar.data());
445 sname = Form(
"gr_chimean_vs_inj_%s_%s", suffix.data(), svar.data());
449 title = Form(
"#chi sigma vs injection time, %s;injection time;#chi_{#sigma}", svar.data());
450 sname = Form(
"gr_chiwidth_vs_inj_%s_%s", suffix.data(), svar.data());
456 const std::string& title,
457 const std::string& sxvar,
const std::string& syvar)
460 const int npart = int(particles.size());
463 TFile* infile =
new TFile(filename.data());
467 std::vector<TGraphErrors> grchim(npart);
469 TMultiGraph* gr_var =
new TMultiGraph(Form(
"%s", sname.data()),
"");
471 TLegend tlegPart(0.75, 0.65, 0.90, 0.90);
472 tlegPart.SetBorderSize(0);
474 for (
int i = 0; i < npart; ++i) {
475 std::string particle = particles[i];
477 if (mass == 0.0) B2FATAL(
"Mass of particle " << particle.data() <<
" is zero");
479 if (!infile->GetListOfKeys()->Contains(particle.data()))
continue;
481 if (sxvar ==
"bg" || sxvar ==
"mom") hadron = (TTree*)infile->Get(particle.data());
482 else hadron = (TTree*)infile->Get(Form(
"%s_%s", particle.data(), sxvar.data()));
484 B2INFO(
"HadronCalibration: reading " << particle.data() <<
" in file " << filename.data());
486 double chimean, chisigma, avg, chimean_err, chisigmaerr;
488 hadron->SetBranchAddress(
"chimean", &chimean);
489 hadron->SetBranchAddress(
"chimean_err", &chimean_err);
490 hadron->SetBranchAddress(
"chisigma", &chisigma);
491 hadron->SetBranchAddress(
"chisigma_err", &chisigmaerr);
492 if (sxvar ==
"bg" || sxvar ==
"mom") hadron->SetBranchAddress(
"bg_avg", &avg);
493 else hadron->SetBranchAddress(
"inj_avg", &avg);
495 for (
int j = 0; j < hadron->GetEntries(); ++j) {
499 if (syvar ==
"chi") {var = chimean;}
500 else {var = chisigma;}
501 if (sxvar ==
"mom") xvar = avg * mass;
504 grchim[i].SetPoint(j, xvar, var);
508 tlegPart.AddEntry(&grchim[i], particles[i].data(),
"p");
511 if (i == 4) grchim[i].SetMarkerColor(i + 2);
512 gr_var->Add(&grchim[i]);
516 TCanvas ctemp(Form(
"%s", sname.data()), Form(
"%s", sname.data()), 450, 350);
518 if (sxvar ==
"bg" || sxvar ==
"mom") gPad->SetLogx();
520 if (syvar ==
"chi") { gr_var->SetMinimum(-1.0); gr_var->SetMaximum(+1.0);}
521 else { gr_var->SetMinimum(0.6); gr_var->SetMaximum(1.4); }
523 gr_var->SetTitle(Form(
"%s", title.data()));
525 tlegPart.Draw(
"same");
526 ctemp.SaveAs(Form(
"plots/HadronCal/Monitoring/%s.pdf", sname.data()));
527 if (sxvar ==
"bg" || sxvar ==
"mom") {
529 if (sxvar ==
"bg") gr_var->GetXaxis()->SetLimits(0.1, 20);
530 else gr_var->GetXaxis()->SetLimits(0.1, 1.0);
532 tlegPart.Draw(
"same");
533 ctemp.SaveAs(Form(
"plots/HadronCal/Monitoring/%s_zoomed.pdf", sname.data()));
539 const std::string& paramfile,
540 const std::string& suffix)
544 const int npart = int(particles.size());
549 TFile* infile =
new TFile(filename.data());
550 std::vector<TGraphErrors> part_resovsdedx(npart);
552 TMultiGraph* gr_resovsdedx =
new TMultiGraph(
"gr_resovsdedx",
";dedx;#sigma(ionz)");
554 TLegend tlegPart(0.72, 0.15, 0.88, 0.40);
556 for (
int i = 0; i < int(particles.size()); ++i) {
558 std::string particle = particles[i];
561 if (mass == 0.0) B2FATAL(
"Mass of particle " << particle.data() <<
" is zero");
563 if (particle ==
"electron")
continue;
565 if (!infile->GetListOfKeys()->Contains(particle.data()))
continue;
566 TTree* hadron = (TTree*)infile->Get(particle.data());
567 B2INFO(
"\tHadronCalibration: reading " << particle <<
" in file " << filename.data());
569 double dedx, ionzres;
571 hadron->SetBranchAddress(
"dedx", &dedx);
572 hadron->SetBranchAddress(
"ionzres", &ionzres);
574 part_resovsdedx[i].SetName(particle.data());
576 for (
int j = 0; j < hadron->GetEntries(); ++j) {
578 part_resovsdedx[i].SetPoint(j, dedx, ionzres);
583 gr_resovsdedx->Add(&part_resovsdedx[i]);
584 tlegPart.AddEntry(&part_resovsdedx[i], particles[i].data(),
"p");
587 gStyle->SetOptStat(0);
588 gStyle->SetStatY(0.9);
589 gStyle->SetStatX(0.4);
590 gStyle->SetStatW(0.15);
591 gStyle->SetStatH(0.15);
593 TF1* sigvsdedx =
new TF1(
"sigvsdedx",
"[0]+[1]*x", 0.50, 15.0);
597 TF1* sigvsdedxCopy = (TF1*)sigvsdedx->Clone(
"sigvsdedxcopy");
600 TCanvas sigcan(
"sigcan",
" Reso(ionz) vs dE/dx", 820, 750);
602 gr_resovsdedx->Draw(
"APE");
603 sigvsdedxCopy->Draw(
"same");
604 tlegPart.Draw(
"same");
606 int status = gr_resovsdedx->Fit(
"sigvsdedx",
"MF",
"", 0.50, 7.0);
607 for (
int i = 0; i < 10; ++i) {
608 if (status == 0)
break;
609 status = gr_resovsdedx->Fit(
"sigvsdedx",
"",
"", 0.50, 7.0);
611 gr_resovsdedx->SetTitle(Form(
"%s (slope = %0.03f, const = %0.03f)", gr_resovsdedx->GetTitle(), sigvsdedx->GetParameter(1),
612 sigvsdedx->GetParameter(0)));
613 gPad->Modified(); gPad->Update();
614 sigcan.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vsionz_%s.pdf", suffix.data()));
616 gr_resovsdedx->GetXaxis()->SetLimits(0.2, 2.00);
617 gr_resovsdedx->GetHistogram()->SetMaximum(0.50);
618 gr_resovsdedx->GetHistogram()->SetMinimum(0.00);
619 gr_resovsdedx->Draw(
"APE");
620 sigvsdedxCopy->Draw(
"same");
621 tlegPart.Draw(
"same");
622 sigcan.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vsionz_zoomed_%s.pdf", suffix.data()));
623 gStyle->SetOptStat(11);
627 B2INFO(
"\tHadronCalibration: SigmavsdEdx FITs Ok. updating parameters");
628 for (
int i = 0; i < 2; ++i) {
629 B2INFO(
"\t" << i <<
") Old = " << gpar.
getDedxPars(i) <<
" --> New = " << sigvsdedx->GetParameter(i));
632 }
else B2INFO(
"\tHadronCalibration: WARNING: SigmavsdEdx FIT FAILED... \n \tHadronCalibration: Skipping parameters");
638 delete gr_resovsdedx;
643 const std::string& paramsigma,
644 const std::string& suffix)
647 const double lowernhit = 7, uppernhit = 39;
654 TF1* fsigma =
new TF1(
"fsigma", [gs](
double * x,
double * par) {
655 std::vector<double> parVec(par, par + 6);
657 }, lowernhit, uppernhit, 6,
"CDCDedxWidgetSigma");
659 fsigma->SetParameter(0, 2);
660 for (
int i = 1; i < 6; ++i) fsigma->SetParameter(i, sgpar.
getNHitPars(i - 1));
662 TF1* fsigmacopy = (TF1*)fsigma->Clone(
"fsigmacopy");
665 TFile* infile =
new TFile(filename.data());
667 for (
int ip = 0; ip < int(particles.size()); ++ip) {
669 std::string particle = particles[ip];
670 TGraphErrors gr_dedxvsbg;
672 if (!infile->GetListOfKeys()->Contains(Form(
"%s_nhit", particle.data())))
continue;
673 TTree* hadron = (TTree*)infile->Get(Form(
"%s_nhit", particle.data()));
674 B2INFO(
"\tHadronCalibration: reading " << particle <<
" in file " << filename.data());
676 double avg, sigma, sigmaerr;
678 hadron->SetBranchAddress(
"avg", &avg);
679 hadron->SetBranchAddress(
"chisigma", &sigma);
680 hadron->SetBranchAddress(
"chisigma_err", &sigmaerr);
682 for (
int j = 0; j < hadron->GetEntries(); ++j) {
684 gr_dedxvsbg.SetPoint(j, avg, sigma);
685 gr_dedxvsbg.SetPointError(j, 0, sigmaerr);
691 gStyle->SetOptFit(0);
692 TCanvas sigvsnhitcan(Form(
"sigvsnhitcan_%s", suffix.data()),
"#sigma vs. nHit", 600, 600);
694 gr_dedxvsbg.SetMarkerStyle(8);
695 gr_dedxvsbg.SetMarkerSize(0.5);
696 gr_dedxvsbg.SetMaximum(2.2);
697 gr_dedxvsbg.SetMinimum(0.0);
698 gr_dedxvsbg.SetTitle(Form(
"width of (dedx-pred)/(#sigma_{Cos * Ion * InjReso}) vs lNHitsUsed, %s ;lNHitsUsed; #sigma",
700 gr_dedxvsbg.Draw(
"AP");
701 fsigmacopy->Draw(
"same");
703 TLegend tleg(0.4, 0.70, 0.65, 0.85);
704 tleg.SetBorderSize(0);
705 tleg.AddEntry(&gr_dedxvsbg,
"Data points",
"P");
706 tleg.AddEntry(fsigmacopy,
"Public Fit",
"f1");
708 if (particle ==
"muon") {
711 int status = gr_dedxvsbg.Fit(
"fsigma",
"FR",
"", lowernhit, uppernhit);
713 for (
int i = 0; i < 20; ++i) {
714 if (status == 0)
break;
715 status = gr_dedxvsbg.Fit(
"fsigma",
"FR",
"", lowernhit, uppernhit);
719 B2INFO(
"\tHadronCalibration::fitSigmaVsNHit --> FIT OK..updating parameters");
720 for (
int j = 1; j < 6; ++j) {
721 B2INFO(
"\t" << j <<
") Old = " << sgpar.
getNHitPars(j - 1) <<
" --> New = " << fsigma->GetParameter(j));
724 }
else B2INFO(
"\tHadronCalibration::fitSigmaVsNHit --> WARNING: FIT FAILED..: status = " << status);
729 tleg.AddEntry(fsigma,
"New Fit",
"f1");
734 for (
int i = 1; i < 6; ++i) fsigma->SetParameter(i, sgpar.
getNHitPars(i - 1));
735 fsigma->SetRange(7, 39);
736 fsigma->Draw(
"same");
737 tleg.AddEntry(fsigma,
"New (param. from muon fit)",
"f1");
742 sigvsnhitcan.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vsnhits_%s_%s.pdf", suffix.data(), particle.data()));
747 const std::string& paramsigma,
748 const std::string& suffix)
750 double lowercos = -0.84, uppercos = 0.96;
757 TF1* total =
new TF1(
"total", [gs](
double * x,
double * par) {
758 std::vector<double> parVec(par, par + 11);
760 }, lowercos, uppercos, 11,
"CDCDedxWidgetSigma");
762 for (
int i = 0; i < 10; ++i) total->SetParameter(i + 1, gpar.
getCosPars(i));
763 total->FixParameter(0, 3);
764 total->FixParameter(2, 0.0);
766 TF1* fsigmacopy = (TF1*)total->Clone(
"fsigmacopy");
769 TFile* infile =
new TFile(filename.data());
771 for (
int ip = 0; ip < int(particles.size()); ++ip) {
773 std::string particle = particles[ip];
774 TGraphErrors gr_dedx;
776 if (!infile->GetListOfKeys()->Contains(Form(
"%s_costh", particle.data())))
continue;
777 TTree* hadron = (TTree*)infile->Get(Form(
"%s_costh", particle.data()));
778 B2INFO(
"\tHadronCalibration: reading " << particle <<
" in file " << filename.data());
780 double avg, sigma, sigmaerr;
782 hadron->SetBranchAddress(
"avg", &avg);
783 hadron->SetBranchAddress(
"chisigma", &sigma);
784 hadron->SetBranchAddress(
"chisigma_err", &sigmaerr);
786 for (
int j = 0; j < hadron->GetEntries(); ++j) {
788 gr_dedx.SetPoint(j, avg, sigma);
789 gr_dedx.SetPointError(j, 0, sigmaerr);
795 gStyle->SetOptFit(0);
797 TCanvas sigvscos(
"sigvscos",
"#sigma vs. cos(#theta)", 400, 400);
799 gr_dedx.SetMaximum(1.8);
800 gr_dedx.SetMinimum(0.4);
801 gr_dedx.SetTitle(Form(
"(dedx-pred)/(#sigma_{Nhit * Ion * InjReso}) vs cos(#theta), %s;cos(#theta);#sigma", particle.data()));
804 fsigmacopy->Draw(
"same");
806 TLegend tleg(0.75, 0.75, 0.89, 0.89);
807 tleg.SetBorderSize(0);
808 tleg.AddEntry(&gr_dedx,
"Data points",
"P");
809 tleg.AddEntry(fsigmacopy,
"Public Fit",
"f1");
811 if (particle ==
"muon") {
813 int status = gr_dedx.Fit(
"total",
"FR",
"", lowercos, uppercos);
815 for (
int i = 0; i < 20; ++i) {
816 if (status == 0)
break;
817 status = gr_dedx.Fit(
"total",
"FR",
"", lowercos, uppercos);
820 B2INFO(
"\tHadronCalibration::fitSigmaVsCos --> FIT OK..updating parameters");
821 for (
int j = 1; j < 11; ++j) {
822 B2INFO(
"\t" << j - 1 <<
") Old = " << gpar.
getCosPars(j - 1) <<
" --> New = " << total->GetParameter(j));
823 gpar.
setCosPars(j - 1, total->GetParameter(j));
825 }
else B2INFO(
"\tHadronCalibration::fitSigmaVsCos --> WARNING: FIT FAILED..: status = " << status);
828 tleg.AddEntry(total,
"New Fit",
"f1");
832 for (
int i = 1; i < 11; ++i) total->SetParameter(i, gpar.
getCosPars(i - 1));
834 tleg.AddEntry(total,
"New (param. from muon fit)",
"f1");
839 sigvscos.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vscos_%s_%s.pdf", suffix.data(), particle.data()));
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
Class to hold the prediction of resolution depending dE/dx, nhit, and cos(theta)
void setNHitPars(int i, double val)
set the nhit parameters
double getCosPars(int i)
get the cos(theta) parameters
double getDedxPars(int i)
get the dedx parameters
void setDedxPars(int i, double val)
set the dedx parameters
void setCosPars(int i, double val)
set the cos(theta) parameters
void printParameters(std::string infile)
write the parameters in file
void setParameters(std::string infile)
set the parameters from file
double getNHitPars(int i)
get the nhit parameters
double getParticleMass(const std::string &particle)
function to get the particle mass
void plotMonitoring(std::vector< std::string > particles, const std::string &filename, const std::string &sname, const std::string &title, const std::string &sx, const std::string &sy)
plots chi and width after fitting - main function
void fitSigmaVsCos(std::vector< std::string > particles, const std::string &filename, const std::string ¶mfile, const std::string &suffx)
fit sigma vs.
void setFitterStyle(TF1 *&fitt, const int ic, const int il)
function to set fitter cosmetics
void fitSigmaVsNHit(std::vector< std::string > particles, const std::string &filename, const std::string ¶msigma, const std::string &suffx)
fit sigma vs.
void fitBGCurve(std::vector< std::string > particles, const std::string &filename, const std::string ¶mfile, const std::string &suffx)
fit the beta-gamma curve
void plotBGMonitoring(std::vector< std::string > particles, const std::string &filename, const std::string &suffix)
plots mean and width after fitting
void setGraphStyle(TGraphErrors &gr, const int ic)
function to set graph cosmetics
HadronBgPrep m_prep
object for dE/dx to prepare sample
void fitSigmavsIonz(std::vector< std::string > particles, const std::string &filename, const std::string ¶mfile, const std::string &suffix)
fit sigma vs.
HadronCalibration()
Constructor: Sets the description, the properties and the parameters of the algorithm.
Abstract base class for different kinds of events.