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];
52 double mass =
m_prep.getParticleMass(particle);
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()));
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];
476 double mass =
m_prep.getParticleMass(particle);
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];
560 double mass =
m_prep.getParticleMass(particle);
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()));