48 const std::string& bgcurvefile,
49 const std::string& bgsigmafile,
const std::string& pdg,
bool ismakePlots)
52 std::vector<TH1F*> hdedx_bg, hchi_bg, hionzsigma_bg;
53 std::map<int, std::vector<TH1F*>> hchi_inj, hchicos_allbg, hchicos_1by3bg, hchicos_2by3bg, hchicos_3by3bg;
58 defineHisto(hionzsigma_bg,
"ionzsigma",
"bg", pdg.data());
59 for (
int i = 0; i < 2; ++i) {
61 defineHisto(hchi_inj[i],
"chi", Form(
"inj_%d", i), pdg.data());
63 std::string charge =
"pos";
64 if (i == 1) charge =
"neg";
66 defineHisto(hchicos_allbg[i],
"chi", Form(
"%s_allbg_cos", charge.data()), pdg.data());
67 defineHisto(hchicos_1by3bg[i],
"chi", Form(
"%s_1b3bg_cos", charge.data()), pdg.data());
68 defineHisto(hchicos_2by3bg[i],
"chi", Form(
"%s_2b3bg_cos", charge.data()), pdg.data());
69 defineHisto(hchicos_3by3bg[i],
"chi", Form(
"%s_3b3bg_cos", charge.data()), pdg.data());
102 hadron->SetBranchAddress(
"dedxnosat", &dedxnosat);
103 hadron->SetBranchAddress(
"p", &p);
104 hadron->SetBranchAddress(
"costh", &costh);
105 hadron->SetBranchAddress(
"timereso", &timereso);
106 hadron->SetBranchAddress(
"nhits", &nhit);
107 hadron->SetBranchAddress(
"injtime", &injtime);
108 hadron->SetBranchAddress(
"injring", &isher);
109 hadron->SetBranchAddress(
"charge", &charge);
112 if (mass == 0.0) B2FATAL(
"Mass of particle " << pdg.data() <<
" is zero");
125 unsigned int entries = hadron->GetEntries();
127 for (
unsigned int index = 0; index < entries; ++index) {
129 hadron->GetEntry(index);
131 int chg = (charge < 0) ? 1 : 0;
132 double bg = fabs(p) / mass;
135 if (nhit < 0 || nhit > 100)
continue;
136 if (injtime <= 0 || isher < 0)
continue;
138 if (dedxnosat <= 0)
continue;
139 if (costh != costh)
continue;
140 if (bg < m_bgMin || bg >
m_bgMax)
continue;
142 if (fabs(p) > 7.0)
continue;
144 if (pdg ==
"proton")
if ((dedxnosat - 0.45) * abs(p) * abs(p) <
m_cut)
continue;
147 bgBin = std::min(
m_bgBins - 1, std::max(0, bgBin));
150 B2WARNING(
"bgBin out of range: " << bgBin
151 <<
" (valid range: 0-" << (
m_bgBins - 1) <<
")");
154 double dedx_new = had.
D2I(costh, had.
I2D(costh, 1.0) * dedxnosat);
156 hdedx_bg[bgBin]->Fill(dedx_new);
159 double dedx_cur = mbg.
getMean(bg);
160 double dedx_res = sbg.
getSigma(dedx_new, nhit, costh, timereso);
163 B2INFO(
"RESOLUTION IS ZERO!!!");
168 double chi_new = (dedx_new - dedx_cur) / dedx_res;
170 hchi_bg[bgBin]->Fill(chi_new);
175 B2INFO(
"RESOLUTION costh * nhit * timereso IS ZERO!!!");
179 hionzsigma_bg[bgBin]->Fill((dedx_new - dedx_cur) / ionz_res);
187 int icos =
static_cast<int>((costh + 1) / cosstep);
189 B2WARNING(
"cosBin (icos) out of range: " << icos
190 <<
" (valid range: 0-" << (
m_cosBins - 1) <<
")");
194 hchicos_allbg[chg][icos]->Fill(chi_new);
196 if (bgBin <=
int(
m_bgBins / 3)) hchicos_1by3bg[chg][icos]->Fill(chi_new);
197 else if (bgBin <=
int(2 *
m_bgBins / 3)) hchicos_2by3bg[chg][icos]->Fill(chi_new);
198 else hchicos_3by3bg[chg][icos]->Fill(chi_new);
202 if (isher > 0.5) wr = 1;
203 int injBin =
static_cast<int>((injtime -
m_injMin) / tstep);
205 B2WARNING(
"injBin out of range: " << injBin
206 <<
" (valid range: 0-" << (
m_injBins - 1) <<
")");
208 injBin = std::min(
m_injBins - 1, std::max(0, injBin));
209 hchi_inj[wr][injBin]->Fill(chi_new);
222 setPars(outfile, pdg, hdedx_bg, hchi_bg, hionzsigma_bg, hchi_inj);
227 plotDist(hdedx_bg, Form(
"fits_dedx_inbg_%s_%s", suffix.data(), pdg.data()),
m_bgBins);
228 plotDist(hchi_bg, Form(
"fits_chi_inbg_%s_%s", suffix.data(), pdg.data()),
m_bgBins);
229 plotDist(hionzsigma_bg, Form(
"fits_ionzreso_inbg_%s_%s", suffix.data(), pdg.data()),
m_bgBins);
230 plotDist(hchi_inj, Form(
"fits_chi_ininj_%s_%s", suffix.data(), pdg.data()),
m_injBins);
231 printCanvasCos(hchicos_allbg, hchicos_1by3bg, hchicos_2by3bg, hchicos_3by3bg, pdg, suffix);
239 for (
int i = 0; i < 2; ++i) {
252 int nbdEdx = 200, nbchi = 200;
253 double dedxMax = 20.0;
256 nbdEdx = 400, dedxMax = 4.0;
257 }
else if (pdg ==
"kaon") {
258 nbdEdx = 500, dedxMax = 5.0;
259 }
else if (pdg ==
"proton") {
260 nbdEdx = 1500, dedxMax = 30.0;
262 }
else if (pdg ==
"muon") {
263 nbdEdx = 300, dedxMax = 3.0;
264 }
else if (pdg ==
"electron") {
265 nbdEdx = 200, dedxMax = 2.0;
276 double step = (max - min) / bins;
277 if (stype ==
"nhit") step = (max - min + 1) / bins;
279 for (
int j = 0; j < bins; ++j) {
281 double start = min + j * step;
282 double end = start + step;
283 if (stype ==
"nhit") end = int((start + step) * 0.99999);
286 std::string histname = Form(
"%s_%s_%s_%d", pdg.data(), svar.data(), stype.data(), j);
287 std::string title = Form(
"%s_%s_%s (%.02f, %.02f)", pdg.data(), svar.data(), stype.data(), start, end);
290 htemp.push_back(
new TH1F(histname.data(), title.data(), nbdEdx, 0, dedxMax));
291 else if (svar ==
"chi")
292 htemp.push_back(
new TH1F(histname.data(), title.data(), nbchi, -10.0, 10.0));
294 htemp.push_back(
new TH1F(histname.data(), title.data(), 300, -3.0, 3.0));
296 htemp[j]->GetXaxis()->SetTitle(Form(
"%s", svar.data()));
297 htemp[j]->GetYaxis()->SetTitle(
"Entries");
358void HadronBgPrep::setPars(TFile*& outfile, std::string pdg, std::vector<TH1F*>& hdedx_bg, std::vector<TH1F*>& hchi_bg,
359 std::vector<TH1F*>& hionzsigma_bg, std::map<
int, std::vector<TH1F*>>& hchi_inj)
363 TTree* satTree =
new TTree(Form(
"%s", pdg.data()),
"dE/dx m_means and m_errors");
373 double satchiwidth_err;
378 double satdedxres_avg;
380 satTree->Branch(
"bg", &satbg,
"bg/D");
381 satTree->Branch(
"costh", &satcosth,
"costh/D");
384 satTree->Branch(
"dedx", &satdedx,
"dedx/D");
385 satTree->Branch(
"dedxerr", &satdedxerr,
"dedxerr/D");
386 satTree->Branch(
"dedxwidth", &satdedxwidth,
"dedxwidth/D");
389 satTree->Branch(
"chimean", &satchi,
"chimean/D");
390 satTree->Branch(
"chimean_err", &satchierr,
"chimean_err/D");
391 satTree->Branch(
"chisigma", &satchiwidth,
"chisigma/D");
392 satTree->Branch(
"chisigma_err", &satchiwidth_err,
"chisigma_err/D");
394 satTree->Branch(
"ionzres", &sationzres,
"ionzres/D");
397 satTree->Branch(
"bg_avg", &satbg_avg,
"bg_avg/D");
398 satTree->Branch(
"costh_avg", &satcosth_avg,
"costh_avg/D");
399 satTree->Branch(
"dedxres_avg", &satdedxres_avg,
"dedxres_avg/D");
403 for (
int i = 0; i <
m_bgBins; ++i) {
406 satbg =
m_bgMin + 0.5 * bgstep + i * bgstep;
416 fit(hdedx_bg[i], pdg.data(), bgstat);
417 TF1* f = hdedx_bg[i]->GetFunction(
"gaus");
418 if (bgstat == OK && f) {
419 const auto mean = f->GetParameter(1);
422 const auto err = f->GetParError(1);
425 satdedxwidth = f->GetParameter(2);
426 }
else { satdedx = 0.0; satdedxerr = 0.0; satdedxwidth = 0.0;}
431 fit(hchi_bg[i], pdg.data(), chistat);
432 f = hchi_bg[i]->GetFunction(
"gaus");
433 if (chistat == OK && f) {
434 satchi = f->GetParameter(1);
435 satchierr = f->GetParError(1);
436 satchiwidth = f->GetParameter(2);
437 satchiwidth_err = f->GetParError(2);
438 }
else { satchi = 0.0; satchierr = 0.0; satchiwidth = 0.0; satchiwidth_err = 0.0;}
444 fit(hionzsigma_bg[i], pdg.data(), ionstat);
446 sationzres = hionzsigma_bg[i]->GetFunction(
"gaus")->GetParameter(2);
447 }
else sationzres = 0.0;
459 std::string svar =
"ler";
460 for (
int ir = 0; ir < 2; ir++) {
462 if (ir == 1) svar =
"her";
464 TTree* injTree =
new TTree(Form(
"%s_%s", pdg.data(), svar.data()),
"chi m_means and m_errors");
471 injTree->Branch(
"inj_avg", &inj_avg,
"inj_avg/D");
472 injTree->Branch(
"chimean", &mean,
"chimean/D");
473 injTree->Branch(
"chimean_err", &mean_err,
"chimean_err/D");
474 injTree->Branch(
"chisigma", &sigma,
"chisigma/D");
475 injTree->Branch(
"chisigma_err", &sigma_err,
"chisigma_err/D");
484 fit(hchi_inj[ir][i], pdg.data(), injstat);
486 mean = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParameter(1);
487 mean_err = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParError(1);
488 sigma = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParameter(2);
489 sigma_err = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParError(2);
491 mean = 0.0; mean_err = 0.0; sigma = 0.0; sigma_err = 0.0;
555 std::map<
int, std::vector<TH1F*>>& hchicos_1by3bg, std::map<
int, std::vector<TH1F*>>& hchicos_2by3bg,
556 std::map<
int, std::vector<TH1F*>>& hchicos_3by3bg,
const std::string& pdg,
const std::string& suffix)
559 std::vector<std::vector<double>> chicos(2, std::vector<double>(
m_cosBins));
560 std::vector<std::vector<double>> sigmacos(2, std::vector<double>(
m_cosBins));
561 std::vector<std::vector<double>> chicoserr(2, std::vector<double>(
m_cosBins));
562 std::vector<std::vector<double>> sigmacoserr(2, std::vector<double>(
m_cosBins));
564 std::vector<std::vector<double>> chicos_1b3bg(2, std::vector<double>(
m_cosBins));
565 std::vector<std::vector<double>> sigmacos_1b3bg(2, std::vector<double>(
m_cosBins));
566 std::vector<std::vector<double>> chicos_1b3bgerr(2, std::vector<double>(
m_cosBins));
567 std::vector<std::vector<double>> sigmacos_1b3bgerr(2, std::vector<double>(
m_cosBins));
569 std::vector<std::vector<double>> chicos_2b3bg(2, std::vector<double>(
m_cosBins));
570 std::vector<std::vector<double>> sigmacos_2b3bg(2, std::vector<double>(
m_cosBins));
571 std::vector<std::vector<double>> chicos_2b3bgerr(2, std::vector<double>(
m_cosBins));
572 std::vector<std::vector<double>> sigmacos_2b3bgerr(2, std::vector<double>(
m_cosBins));
574 std::vector<std::vector<double>> chicos2(2, std::vector<double>(
m_cosBins));
575 std::vector<std::vector<double>> sigmacos2(2, std::vector<double>(
m_cosBins));
576 std::vector<std::vector<double>> chicos2err(2, std::vector<double>(
m_cosBins));
577 std::vector<std::vector<double>> sigmacos2err(2, std::vector<double>(
m_cosBins));
579 for (
int c = 0; c < 2; ++c) {
581 if (hchicos_allbg[c][i]->Integral() > 100) {
583 fit(hchicos_allbg[c][i], pdg.data(), allbgstat);
584 if (allbgstat == OK) {
585 chicos[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParameter(1);
586 chicoserr[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParError(1);
587 sigmacos[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParameter(2);
588 sigmacoserr[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParError(2);
589 }
else { chicos[c][i] = 0.0; chicoserr[c][i] = 0.0; sigmacos[c][i] = 0.0; sigmacoserr[c][i] = 0.0;}
592 if (hchicos_1by3bg[c][i]->Integral() > 100) {
595 fit(hchicos_1by3bg[c][i], pdg.data(), all1bgstat);
596 if (all1bgstat == OK) {
597 chicos_1b3bg[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParameter(1);
598 chicos_1b3bgerr[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParError(1);
599 sigmacos_1b3bg[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParameter(2);
600 sigmacos_1b3bgerr[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParError(2);
601 }
else { chicos_1b3bg[c][i] = 0.0; chicos_1b3bgerr[c][i] = 0.0; sigmacos_1b3bg[c][i] = 0.0; sigmacos_1b3bgerr[c][i] = 0.0;}
605 if (hchicos_2by3bg[c][i]->Integral() > 100) {
607 fit(hchicos_2by3bg[c][i], pdg.data(), all2bgstat);
608 if (all2bgstat == OK) {
609 chicos_2b3bg[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParameter(1);
610 chicos_2b3bgerr[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParError(1);
611 sigmacos_2b3bg[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParameter(2);
612 sigmacos_2b3bgerr[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParError(2);
613 }
else { chicos_2b3bg[c][i] = 0.0; chicos_2b3bgerr[c][i] = 0.0; sigmacos_2b3bg[c][i] = 0.0; sigmacos_2b3bgerr[c][i] = 0.0;}
617 if (hchicos_3by3bg[c][i]->Integral() > 100) {
619 fit(hchicos_3by3bg[c][i], pdg.data(), all3bgstat);
620 if (all3bgstat == OK) {
621 chicos2[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParameter(1);
622 chicos2err[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParError(1);
623 sigmacos2[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParameter(2);
624 sigmacos2err[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParError(2);
625 }
else { chicos2[c][i] = 0.0; chicos2err[c][i] = 0.0; sigmacos2[c][i] = 0.0; sigmacos2err[c][i] = 0.0;}
631 plotDist(hchicos_allbg, Form(
"fits_chi_vscos_allbg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
632 plotDist(hchicos_1by3bg, Form(
"fits_chi_vscos_1by3bg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
633 plotDist(hchicos_2by3bg, Form(
"fits_chi_vscos_2by3bg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
634 plotDist(hchicos_3by3bg, Form(
"fits_chi_vscos_3by3bg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
639 cosArray[i] = -1.0 + (i * cosstep + cosstep / 2.0);
640 cosArrayErr[i] = 0.0;
643 TGraphErrors grchicos(
m_cosBins, cosArray.data(), chicos[0].data(), cosArrayErr.data(), chicoserr[0].data());
644 TGraphErrors grchicos_1b3bg(
m_cosBins, cosArray.data(), chicos_1b3bg[0].data(), cosArrayErr.data(), chicos_1b3bgerr[0].data());
645 TGraphErrors grchicos_2b3bg(
m_cosBins, cosArray.data(), chicos_2b3bg[0].data(), cosArrayErr.data(), chicos_2b3bgerr[0].data());
646 TGraphErrors grchicos2(
m_cosBins, cosArray.data(), chicos2[0].data(), cosArrayErr.data(), chicos2err[0].data());
648 TGraphErrors grchicosn(
m_cosBins, cosArray.data(), chicos[1].data(), cosArrayErr.data(), chicoserr[1].data());
649 TGraphErrors grchicos_1b3bgn(
m_cosBins, cosArray.data(), chicos_1b3bg[1].data(), cosArrayErr.data(), chicos_1b3bgerr[1].data());
650 TGraphErrors grchicos_2b3bgn(
m_cosBins, cosArray.data(), chicos_2b3bg[1].data(), cosArrayErr.data(), chicos_2b3bgerr[1].data());
651 TGraphErrors grchicos2n(
m_cosBins, cosArray.data(), chicos2[1].data(), cosArrayErr.data(), chicos2err[1].data());
653 TGraphErrors grsigmacos(
m_cosBins, cosArray.data(), sigmacos[0].data(), cosArrayErr.data(), sigmacoserr[0].data());
654 TGraphErrors grsigmacos_1b3bg(
m_cosBins, cosArray.data(), sigmacos_1b3bg[0].data(), cosArrayErr.data(),
655 sigmacos_1b3bgerr[0].data());
656 TGraphErrors grsigmacos_2b3bg(
m_cosBins, cosArray.data(), sigmacos_2b3bg[0].data(), cosArrayErr.data(),
657 sigmacos_2b3bgerr[0].data());
658 TGraphErrors grsigmacos2(
m_cosBins, cosArray.data(), sigmacos2[0].data(), cosArrayErr.data(), sigmacos2err[0].data());
660 TGraphErrors grsigmacosn(
m_cosBins, cosArray.data(), sigmacos[1].data(), cosArrayErr.data(), sigmacoserr[1].data());
661 TGraphErrors grsigmacos_1b3bgn(
m_cosBins, cosArray.data(), sigmacos_1b3bg[1].data(), cosArrayErr.data(),
662 sigmacos_1b3bgerr[1].data());
663 TGraphErrors grsigmacos_2b3bgn(
m_cosBins, cosArray.data(), sigmacos_2b3bg[1].data(), cosArrayErr.data(),
664 sigmacos_2b3bgerr[1].data());
665 TGraphErrors grsigmacos2n(
m_cosBins, cosArray.data(), sigmacos2[1].data(), cosArrayErr.data(), sigmacos2err[1].data());
667 TLine line0(-1, 0, 1, 0);
668 line0.SetLineStyle(kDashed);
669 line0.SetLineColor(kRed);
671 TLine line1(-1, 1, 1, 1);
672 line1.SetLineStyle(kDashed);
673 line1.SetLineColor(kRed);
677 if (pdg ==
"pion") {ptype +=
"#pi"; mass =
Const::pion.getMass();}
678 else if (pdg ==
"kaon") {ptype +=
"K"; mass =
Const::kaon.getMass();}
679 else if (pdg ==
"proton") { ptype +=
"p"; mass =
Const::proton.getMass();}
680 else if (pdg ==
"muon") {ptype +=
"#mu"; mass =
Const::muon.getMass();}
681 else if (pdg ==
"electron") {ptype +=
"e"; mass =
Const::electron.getMass();}
682 if (mass == 0.0) B2FATAL(
"Mass of particle " << pdg.data() <<
" is zero");
684 int bglow = 0, bghigh = 0;
687 TLegend lchi(0.7, 0.75, 0.8, 0.85);
688 lchi.SetBorderSize(0);
689 lchi.SetFillColor(kYellow);
690 lchi.AddEntry(&grchicos, ptype +
"^{+}",
"pc");
691 lchi.AddEntry(&grchicosn, ptype +
"^{-}",
"pc");
693 TCanvas cchi(Form(
"cchi_%s", suffix.data()),
"cchi", 700, 600);
699 grchicosn.Draw(
"P,same");
705 FormatGraph(grchicos_1b3bg, 0, Form(
"first 1/3 bg bins, p =(%0.02f, %0.02f)",
m_bgMin * mass, (
m_bgMin + bghigh * bgstep) * mass));
707 grchicos_1b3bg.Draw(
"AP");
708 grchicos_1b3bgn.Draw(
"P,same");
715 FormatGraph(grchicos_2b3bg, 0, Form(
"second 1/3 bg bins, p =(%0.02f, %0.02f)", (
m_bgMin + bglow * bgstep) * mass,
716 (
m_bgMin + bghigh * bgstep) * mass));
718 grchicos_2b3bg.Draw(
"AP");
719 grchicos_2b3bgn.Draw(
"P,same");
725 FormatGraph(grchicos2, 0, Form(
"third 1/3 bg bins, p =(%0.02f, %0.02f)", (
m_bgMin + bglow * bgstep) * mass,
m_bgMax * mass));
727 grchicos2.Draw(
"AP");
728 grchicos2n.Draw(
"P,same");
731 cchi.SaveAs(Form(
"plots/HadronCal/Monitoring/mean_chi_vscos_inbg_%s_%s.pdf", pdg.data(), suffix.data()));
736 grsigmacos.Draw(
"AP");
737 grsigmacosn.Draw(
"P,same");
743 FormatGraph(grsigmacos_1b3bg, 2, Form(
"first 1/3 bg bins, p =(%0.02f, %0.02f)",
m_bgMin * mass,
744 (
m_bgMin + bghigh * bgstep) * mass));
746 grsigmacos_1b3bg.Draw(
"AP");
747 grsigmacos_1b3bgn.Draw(
"P,same");
754 FormatGraph(grsigmacos_2b3bg, 2, Form(
"second 1/3 bg bins, p =(%0.02f, %0.02f)", (
m_bgMin + bglow * bgstep) * mass,
755 (
m_bgMin + bghigh * bgstep) * mass));
757 grsigmacos_2b3bg.Draw(
"AP");
758 grsigmacos_2b3bgn.Draw(
"P,same");
764 FormatGraph(grsigmacos2, 2, Form(
"third 1/3 bg bins, p =(%0.02f, %0.02f)", (
m_bgMin + bglow * bgstep) * mass,
m_bgMax * mass));
766 grsigmacos2.Draw(
"AP");
767 grsigmacos2n.Draw(
"P,same");
770 cchi.SaveAs(Form(
"plots/HadronCal/Monitoring/sigma_chi_vscos_inbg_%s_%s.pdf", pdg.data(), suffix.data()));