18 const std::string& paramfile,
19 const std::string& suffix,
const bool makeIterationSummary)
21 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(
"Minuit");
23 double bgmin1 = 0.25, bgmax1 = 5.1;
24 double bgmin2 = 3.9, bgmax2 = 15.0;
25 double bgmin3 = 7.5, bgmax3 = 5000;
28 TFile* infile =
new TFile(filename.data());
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");
43 TLegend tleg(0.4, 0.50, 0.65, 0.85);
44 tleg.SetBorderSize(0);
46 TLegend tlegPart(0.60, 0.60, 0.90, 0.90);
47 tlegPart.SetBorderSize(0);
49 for (
int i = 0; i < int(particles.size()); ++i) {
51 std::string particle = particles[i];
53 double mass =
m_prep.getParticleMass(particle);
54 if (mass == 0.0) B2FATAL(
"Mass of particle " << particle.data() <<
" is zero");
56 if (!infile->GetListOfKeys()->Contains(particle.data()))
continue;
58 TTree* hadron =
static_cast<TTree*
>(infile->Get(particle.data()));
59 B2INFO(
"HadronCalibration: reading " << particle.data() <<
" in file " << filename.data());
61 double dedx, dedxerr, bg;
63 hadron->SetBranchAddress(
"dedx", &dedx);
64 hadron->SetBranchAddress(
"dedxerr", &dedxerr);
65 hadron->SetBranchAddress(
"bg_avg", &bg);
67 for (
int j = 0; j < hadron->GetEntries(); ++j) {
71 part_dedxvsbg[i].SetPoint(j, bg, dedx);
72 part_dedxvsbg[i].SetPointError(j, 0, dedxerr);
74 part_dedxvsp[i].SetPoint(j, bg * mass, dedx);
75 part_dedxvsp[i].SetPointError(j, 0, dedxerr);
78 part_dedxvsbg[i].SetName(particle.data());
81 gr_dedxvsbg->Add(&part_dedxvsbg[i]);
85 gr_dedxvsp->Add(&part_dedxvsp[i]);
87 tleg.AddEntry(&part_dedxvsbg[i], particles[i].data(),
"p");
88 tlegPart.AddEntry(&part_dedxvsbg[i], particles[i].data(),
"p");
92 TMultiGraph* grcopy1 =
static_cast<TMultiGraph*
>(gr_dedxvsbg->Clone(Form(
"datapoints_%s", suffix.data())));
96 TF1* fdedx1 =
new TF1(
"fdedx1", [gc](
double * x,
double * par) {
97 std::vector<double> parVec(par, par + 8);
99 }, bgmin1, bgmax1, 8,
"WidgetCurve");
102 TF1* fdedx1Copy =
new TF1(
"fdedx1Copy", [gc](
double * x,
double * par) {
103 std::vector<double> parVec(par, par + 8);
105 }, bgmin1, bgmax1, 8,
"WidgetCurve");
107 fdedx1->FixParameter(0, 1);
108 fdedx1Copy->FixParameter(0, 1);
109 for (
int i = 1; i < 8; ++i) {
116 TF1* fdedx2 =
new TF1(
"fdedx2", [gc](
double * x,
double * par) {
117 std::vector<double> parVec(par, par + 5);
119 }, bgmin2, bgmax2, 5,
"WidgetCurve");
122 TF1* fdedx2Copy =
new TF1(
"fdedx2Copy", [gc](
double * x,
double * par) {
123 std::vector<double> parVec(par, par + 5);
125 }, bgmin2, bgmax2, 5,
"WidgetCurve");
127 fdedx2->FixParameter(0, 2);
128 fdedx2Copy->FixParameter(0, 2);
129 for (
int i = 1; i < 5; ++i) {
136 TF1* fdedx3 =
new TF1(
"fdedx3", [gc](
double * x,
double * par) {
137 std::vector<double> parVec(par, par + 5);
139 }, bgmin3, bgmax3, 5,
"WidgetCurve");
142 TF1* fdedx3Copy =
new TF1(
"fdedx3Copy", [gc](
double * x,
double * par) {
143 std::vector<double> parVec(par, par + 5);
145 }, bgmin3, bgmax3, 5,
"WidgetCurve");
147 fdedx3->FixParameter(0, 3);
148 fdedx3Copy->FixParameter(0, 3);
150 for (
int i = 1; i < 5; ++i) {
162 int stat1 = gr_dedxvsbg->Fit(
"fdedx1",
"",
"", bgmin1, bgmax1);
163 for (
int i = 0; i < 50; ++i) {
165 B2INFO(
"\n\tPART-1 FIT STATUS is OK: irr # " << i);
168 stat1 = gr_dedxvsbg->Fit(
"fdedx1",
"",
"", bgmin1, bgmax1);
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));
178 }
else B2INFO(
"\t--> HadronCalibration: WARNING: PART-1 FIT FAILED...");
183 int stat2 = gr_dedxvsbg->Fit(
"fdedx2",
"FQR",
"", bgmin2, bgmax2);
184 for (
int i = 0; i < 50; ++i) {
186 B2INFO(
"\n\tPART-2 FIT STATUS is OK: irr # " << i);
189 stat2 = gr_dedxvsbg->Fit(
"fdedx2",
"FQR",
"", bgmin2, bgmax2);
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));
197 }
else B2INFO(
"\t--> HadronCalibration: WARNING: PART-2 FIT FAILED...");
202 int stat3 = gr_dedxvsbg->Fit(
"fdedx3",
"FQR",
"", bgmin3, bgmax3);
203 for (
int i = 0; i < 50; ++i) {
205 B2INFO(
"\n\tPART-3 FIT STATUS is OK: irr # " << i);
208 stat3 = gr_dedxvsbg->Fit(
"fdedx3",
"FQR",
"", bgmin3, bgmax3);
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));
217 }
else B2INFO(
"\t--> HadronCalibration: WARNING: PART-3 FIT FAILED...");
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);
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)));
244 bgcurvecan.cd(i + 1);
246 if (i == 0 || i == 3) gPad->SetLogy();
248 grcopy->GetListOfGraphs()->SetDrawOption(
"AXIS");
250 gPad->Modified(); gPad->Update();
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);
265 gPad->Modified(); gPad->Update();
266 TPaveText* ptold =
new TPaveText(.35, .40, .75, .50,
"blNDC");
267 ptold->SetBorderSize(0);
268 ptold->SetFillStyle(0);
270 fdedx1Copy->Draw(
"same");
271 fdedx2Copy->Draw(
"same");
272 fdedx3Copy->Draw(
"same");
273 ptold->AddText(
"Old parameters");
275 fdedx1->Draw(
"same");
276 fdedx2->Draw(
"same");
277 fdedx3->Draw(
"same");
278 ptold->AddText(
"New parameters");
282 bgline1.Draw(
"same");
283 bgline2.Draw(
"same");
284 dedxline1.Draw(
"same");
287 tleg.AddEntry(fdedx1Copy,
"Pub-Fit: 1",
"f1");
288 tleg.AddEntry(fdedx2Copy,
"Pub-Fit: 2",
"f1");
289 tleg.AddEntry(fdedx3Copy,
"Pub-Fit: 3",
"f1");
292 if (i == 0 || i == 3) ptold->Draw(
"same");
295 bgcurvecan.SaveAs(Form(
"plots/HadronCal/BGfits/bgcurve_vsfits_%s.pdf", suffix.data()));
297 TCanvas bgcurveraw(Form(
"bgcurveraw_%s", suffix.data()),
"bg curvs", 600, 600);
300 grcopy1->GetListOfGraphs()->SetDrawOption(
"AXIS");
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()));
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()));
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);
335 if (makeIterationSummary) {
336 TMultiGraph* fit_bgratio =
new TMultiGraph(Form(
"fit_bgratio_%s", suffix.data()),
";#beta#gamma;ratio");
337 TGraph part_bgfit_ratio[npart];
339 TMultiGraph* fit_residual =
new TMultiGraph(Form(
"fit_residual_%s", suffix.data()),
";#beta#gamma;residual");
340 TGraph part_bgfit_residual[npart];
342 double A = 4.5, B = 10;
344 double rmin = 1.0, rmax = 1.0;
346 for (
int i = 0; i < npart; ++i) {
348 for (
int j = 0; j < part_dedxvsbg[i].GetN(); ++j) {
351 part_dedxvsbg[i].GetPoint(j, x, y);
353 if (y == 0)
continue;
356 fit = fdedx1->Eval(x);
358 fit = fdedx2->Eval(x);
360 fit = fdedx3->Eval(x);
363 if (npart == 4) fit = 1.0;
365 part_bgfit_ratio[i].SetPoint(respoint++, x, fit / y);
366 part_bgfit_residual[i].SetPoint(respoint++, x, fit - y);
369 if (fit / y < rmin) rmin = fit / y;
370 else if (fit / y > rmax) rmax = fit / y;
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]);
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]);
387 fit_bgratio->SetMinimum(rmin * 0.97);
388 fit_bgratio->SetMaximum(rmax * 1.03);
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;
398 fit_residual->SetMinimum(-0.12);
399 fit_residual->SetMaximum(+0.12);
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()));
465 const std::string& sname,
466 const std::string& title,
467 const std::string& sxvar,
const std::string& syvar)
470 const int npart = int(particles.size());
473 TFile* infile =
new TFile(filename.data());
477 std::vector<TGraphErrors> grchim(npart);
479 TMultiGraph* gr_var =
new TMultiGraph(Form(
"%s", sname.data()),
"");
481 TLegend tlegPart(0.75, 0.65, 0.90, 0.90);
482 tlegPart.SetBorderSize(0);
484 for (
int i = 0; i < npart; ++i) {
485 std::string particle = particles[i];
486 double mass =
m_prep.getParticleMass(particle);
487 if (mass == 0.0) B2FATAL(
"Mass of particle " << particle.data() <<
" is zero");
489 if (!infile->GetListOfKeys()->Contains(particle.data()))
continue;
491 if (sxvar ==
"bg" || sxvar ==
"mom") hadron =
static_cast<TTree*
>(infile->Get(particle.data()));
492 else hadron =
static_cast<TTree*
>(infile->Get(Form(
"%s_%s", particle.data(), sxvar.data())));
494 B2INFO(
"HadronCalibration: reading " << particle.data() <<
" in file " << filename.data());
496 double chimean, chisigma, avg, chimean_err, chisigmaerr;
498 hadron->SetBranchAddress(
"chimean", &chimean);
499 hadron->SetBranchAddress(
"chimean_err", &chimean_err);
500 hadron->SetBranchAddress(
"chisigma", &chisigma);
501 hadron->SetBranchAddress(
"chisigma_err", &chisigmaerr);
502 if (sxvar ==
"bg" || sxvar ==
"mom") hadron->SetBranchAddress(
"bg_avg", &avg);
503 else hadron->SetBranchAddress(
"inj_avg", &avg);
505 for (
int j = 0; j < hadron->GetEntries(); ++j) {
509 if (syvar ==
"chi") {var = chimean;}
510 else {var = chisigma;}
511 if (sxvar ==
"mom") xvar = avg * mass;
514 grchim[i].SetPoint(j, xvar, var);
518 tlegPart.AddEntry(&grchim[i], particles[i].data(),
"p");
521 if (i == 4) grchim[i].SetMarkerColor(i + 2);
522 gr_var->Add(&grchim[i]);
526 TCanvas ctemp(Form(
"%s", sname.data()), Form(
"%s", sname.data()), 450, 350);
528 if (sxvar ==
"bg" || sxvar ==
"mom") gPad->SetLogx();
530 if (syvar ==
"chi") { gr_var->SetMinimum(-1.0); gr_var->SetMaximum(+1.0);}
531 else { gr_var->SetMinimum(0.6); gr_var->SetMaximum(1.4); }
533 gr_var->SetTitle(Form(
"%s", title.data()));
535 tlegPart.Draw(
"same");
536 ctemp.SaveAs(Form(
"plots/HadronCal/Monitoring/%s.pdf", sname.data()));
537 if (sxvar ==
"bg" || sxvar ==
"mom") {
539 if (sxvar ==
"bg") gr_var->GetXaxis()->SetLimits(0.1, 20);
540 else gr_var->GetXaxis()->SetLimits(0.1, 1.0);
542 tlegPart.Draw(
"same");
543 ctemp.SaveAs(Form(
"plots/HadronCal/Monitoring/%s_zoomed.pdf", sname.data()));
549 const std::string& paramfile,
550 const std::string& suffix,
const bool makeIterationSummary)
554 const int npart = int(particles.size());
559 TFile* infile =
new TFile(filename.data());
560 std::vector<TGraphErrors> part_resovsdedx(npart);
562 TMultiGraph* gr_resovsdedx =
new TMultiGraph(
"gr_resovsdedx",
";dedx;#sigma(ionz)");
564 TLegend tlegPart(0.72, 0.15, 0.88, 0.40);
566 for (
int i = 0; i < int(particles.size()); ++i) {
568 std::string particle = particles[i];
570 double mass =
m_prep.getParticleMass(particle);
571 if (mass == 0.0) B2FATAL(
"Mass of particle " << particle.data() <<
" is zero");
573 if (particle ==
"electron")
continue;
575 if (!infile->GetListOfKeys()->Contains(particle.data()))
continue;
576 TTree* hadron =
static_cast<TTree*
>(infile->Get(particle.data()));
577 B2INFO(
"\tHadronCalibration: reading " << particle <<
" in file " << filename.data());
579 double dedx, ionzres;
581 hadron->SetBranchAddress(
"dedx", &dedx);
582 hadron->SetBranchAddress(
"ionzres", &ionzres);
584 part_resovsdedx[i].SetName(particle.data());
586 for (
int j = 0; j < hadron->GetEntries(); ++j) {
588 part_resovsdedx[i].SetPoint(j, dedx, ionzres);
593 gr_resovsdedx->Add(&part_resovsdedx[i]);
594 tlegPart.AddEntry(&part_resovsdedx[i], particles[i].data(),
"p");
597 gStyle->SetOptStat(0);
598 gStyle->SetStatY(0.9);
599 gStyle->SetStatX(0.4);
600 gStyle->SetStatW(0.15);
601 gStyle->SetStatH(0.15);
603 TF1* sigvsdedx =
new TF1(
"sigvsdedx",
"[0]+[1]*x", 0.50, 15.0);
607 TF1* sigvsdedxCopy =
static_cast<TF1*
>(sigvsdedx->Clone(
"sigvsdedxcopy"));
610 TCanvas sigcan(
"sigcan",
" Reso(ionz) vs dE/dx", 820, 750);
612 gr_resovsdedx->Draw(
"APE");
613 sigvsdedxCopy->Draw(
"same");
614 tlegPart.Draw(
"same");
616 int status = gr_resovsdedx->Fit(
"sigvsdedx",
"MF",
"", 0.50, 7.0);
617 for (
int i = 0; i < 10; ++i) {
618 if (status == 0)
break;
619 status = gr_resovsdedx->Fit(
"sigvsdedx",
"",
"", 0.50, 7.0);
621 if (makeIterationSummary) {
622 gr_resovsdedx->SetTitle(Form(
"%s (slope = %0.03f, const = %0.03f)", gr_resovsdedx->GetTitle(), sigvsdedx->GetParameter(1),
623 sigvsdedx->GetParameter(0)));
624 gPad->Modified(); gPad->Update();
625 sigcan.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vsionz_%s.pdf", suffix.data()));
627 gr_resovsdedx->GetXaxis()->SetLimits(0.2, 2.00);
628 gr_resovsdedx->GetHistogram()->SetMaximum(0.50);
629 gr_resovsdedx->GetHistogram()->SetMinimum(0.00);
630 gr_resovsdedx->Draw(
"APE");
631 sigvsdedxCopy->Draw(
"same");
632 tlegPart.Draw(
"same");
633 sigcan.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vsionz_zoomed_%s.pdf", suffix.data()));
634 gStyle->SetOptStat(11);
638 B2INFO(
"\tHadronCalibration: SigmavsdEdx FITs Ok. updating parameters");
639 for (
int i = 0; i < 2; ++i) {
640 B2INFO(
"\t" << i <<
") Old = " << gpar.
getDedxPars(i) <<
" --> New = " << sigvsdedx->GetParameter(i));
643 }
else B2INFO(
"\tHadronCalibration: WARNING: SigmavsdEdx FIT FAILED... \n \tHadronCalibration: Skipping parameters");
649 delete gr_resovsdedx;
654 const std::string& paramsigma,
655 const std::string& suffix,
const bool makeIterationSummary)
658 const double lowernhit = 7, uppernhit = 39;
666 TF1* fsigma =
new TF1(
"fsigma", [gs](
double * x,
double * par) {
667 std::vector<double> parVec(par, par + 6);
669 }, lowernhit, uppernhit, 6,
"CDCDedxWidgetSigma");
671 fsigma->FixParameter(0, 2);
672 for (
int i = 1; i < 6; ++i) fsigma->SetParameter(i, sgpar.
getNHitPars(i - 1));
674 TF1* fsigmacopy =
static_cast<TF1*
>(fsigma->Clone(
"fsigmacopy"));
677 TFile* infile =
new TFile(filename.data());
679 for (
int ip = 0; ip < int(particles.size()); ++ip) {
681 std::string particle = particles[ip];
682 TGraphErrors gr_dedxvsbg;
684 if (!infile->GetListOfKeys()->Contains(Form(
"%s_nhit", particle.data())))
continue;
685 TTree* hadron =
static_cast<TTree*
>(infile->Get(Form(
"%s_nhit", particle.data())));
686 B2INFO(
"\tHadronCalibration: reading " << particle <<
" in file " << filename.data());
688 double avg, sigma, sigmaerr;
690 hadron->SetBranchAddress(
"avg", &avg);
691 hadron->SetBranchAddress(
"chisigma", &sigma);
692 hadron->SetBranchAddress(
"chisigma_err", &sigmaerr);
694 for (
int j = 0; j < hadron->GetEntries(); ++j) {
696 gr_dedxvsbg.SetPoint(j, avg, sigma);
697 gr_dedxvsbg.SetPointError(j, 0, sigmaerr);
703 gStyle->SetOptFit(0);
704 TCanvas sigvsnhitcan(Form(
"sigvsnhitcan_%s", suffix.data()),
"#sigma vs. nHit", 600, 600);
706 gr_dedxvsbg.SetMarkerStyle(8);
707 gr_dedxvsbg.SetMarkerSize(0.5);
708 gr_dedxvsbg.SetMaximum(2.2);
709 gr_dedxvsbg.SetMinimum(0.0);
710 gr_dedxvsbg.SetTitle(Form(
"width of (dedx-pred)/(#sigma_{Cos * Ion * InjReso}) vs lNHitsUsed, %s ;lNHitsUsed; #sigma",
712 gr_dedxvsbg.Draw(
"AP");
713 fsigmacopy->Draw(
"same");
715 TLegend tleg(0.4, 0.70, 0.65, 0.85);
716 tleg.SetBorderSize(0);
717 tleg.AddEntry(&gr_dedxvsbg,
"Data points",
"P");
718 tleg.AddEntry(fsigmacopy,
"Public Fit",
"f1");
720 if (particle ==
"muon") {
723 int status = gr_dedxvsbg.Fit(
"fsigma",
"FR",
"", lowernhit, uppernhit);
725 for (
int i = 0; i < 20; ++i) {
726 if (status == 0)
break;
727 status = gr_dedxvsbg.Fit(
"fsigma",
"FR",
"", lowernhit, uppernhit);
731 B2INFO(
"\tHadronCalibration::fitSigmaVsNHit --> FIT OK..updating parameters");
732 for (
int j = 1; j < 6; ++j) {
733 B2INFO(
"\t" << j <<
") Old = " << sgpar.
getNHitPars(j - 1) <<
" --> New = " << fsigma->GetParameter(j));
736 }
else B2INFO(
"\tHadronCalibration::fitSigmaVsNHit --> WARNING: FIT FAILED..: status = " << status);
741 tleg.AddEntry(fsigma,
"New Fit",
"f1");
746 for (
int i = 1; i < 6; ++i) fsigma->SetParameter(i, sgpar.
getNHitPars(i - 1));
747 fsigma->SetRange(7, 39);
748 fsigma->Draw(
"same");
749 tleg.AddEntry(fsigma,
"New (param. from muon fit)",
"f1");
754 if (makeIterationSummary) sigvsnhitcan.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vsnhits_%s_%s.pdf", suffix.data(),
760 const std::string& paramsigma,
761 const std::string& suffix,
const bool makeIterationSummary)
763 double lowercos = -0.84, uppercos = 0.96;
771 TF1* total =
new TF1(
"total", [gs](
double * x,
double * par) {
772 std::vector<double> parVec(par, par + 11);
774 }, lowercos, uppercos, 11,
"CDCDedxWidgetSigma");
776 for (
int i = 0; i < 10; ++i) total->SetParameter(i + 1, gpar.
getCosPars(i));
777 total->FixParameter(0, 3);
778 total->FixParameter(2, 0.0);
780 TF1* fsigmacopy =
static_cast<TF1*
>(total->Clone(
"fsigmacopy"));
783 TFile* infile =
new TFile(filename.data());
785 for (
int ip = 0; ip < int(particles.size()); ++ip) {
787 std::string particle = particles[ip];
788 TGraphErrors gr_dedx;
790 if (!infile->GetListOfKeys()->Contains(Form(
"%s_costh", particle.data())))
continue;
791 TTree* hadron =
static_cast<TTree*
>(infile->Get(Form(
"%s_costh", particle.data())));
792 B2INFO(
"\tHadronCalibration: reading " << particle <<
" in file " << filename.data());
794 double avg, sigma, sigmaerr;
796 hadron->SetBranchAddress(
"avg", &avg);
797 hadron->SetBranchAddress(
"chisigma", &sigma);
798 hadron->SetBranchAddress(
"chisigma_err", &sigmaerr);
800 for (
int j = 0; j < hadron->GetEntries(); ++j) {
802 gr_dedx.SetPoint(j, avg, sigma);
803 gr_dedx.SetPointError(j, 0, sigmaerr);
809 gStyle->SetOptFit(0);
811 TCanvas sigvscos(
"sigvscos",
"#sigma vs. cos(#theta)", 400, 400);
813 gr_dedx.SetMaximum(1.8);
814 gr_dedx.SetMinimum(0.4);
815 gr_dedx.SetTitle(Form(
"(dedx-pred)/(#sigma_{Nhit * Ion * InjReso}) vs cos(#theta), %s;cos(#theta);#sigma", particle.data()));
818 fsigmacopy->Draw(
"same");
820 TLegend tleg(0.75, 0.75, 0.89, 0.89);
821 tleg.SetBorderSize(0);
822 tleg.AddEntry(&gr_dedx,
"Data points",
"P");
823 tleg.AddEntry(fsigmacopy,
"Public Fit",
"f1");
825 if (particle ==
"muon") {
827 int status = gr_dedx.Fit(
"total",
"FR",
"", lowercos, uppercos);
829 for (
int i = 0; i < 20; ++i) {
830 if (status == 0)
break;
831 status = gr_dedx.Fit(
"total",
"FR",
"", lowercos, uppercos);
834 B2INFO(
"\tHadronCalibration::fitSigmaVsCos --> FIT OK..updating parameters");
835 for (
int j = 1; j < 11; ++j) {
836 B2INFO(
"\t" << j - 1 <<
") Old = " << gpar.
getCosPars(j - 1) <<
" --> New = " << total->GetParameter(j));
837 gpar.
setCosPars(j - 1, total->GetParameter(j));
839 }
else B2INFO(
"\tHadronCalibration::fitSigmaVsCos --> WARNING: FIT FAILED..: status = " << status);
842 tleg.AddEntry(total,
"New Fit",
"f1");
846 for (
int i = 1; i < 11; ++i) total->SetParameter(i, gpar.
getCosPars(i - 1));
848 tleg.AddEntry(total,
"New (param. from muon fit)",
"f1");
853 if (makeIterationSummary) sigvscos.SaveAs(Form(
"plots/HadronCal/Resofits/sigma_vscos_%s_%s.pdf", suffix.data(), particle.data()));