47 const std::string& bgcurvefile,
48 const std::string& bgsigmafile,
const std::string& pdg,
bool ismakePlots)
51 std::vector<TH1F*> hdedx_bg, hchi_bg, hionzsigma_bg;
52 std::map<int, std::vector<TH1F*>> hchi_inj, hchicos_allbg, hchicos_1by3bg, hchicos_2by3bg, hchicos_3by3bg;
57 defineHisto(hionzsigma_bg,
"ionzsigma",
"bg", pdg.data());
58 for (
int i = 0; i < 2; ++i) {
60 defineHisto(hchi_inj[i],
"chi", Form(
"inj_%d", i), pdg.data());
62 std::string charge =
"pos";
63 if (i == 1) charge =
"neg";
65 defineHisto(hchicos_allbg[i],
"chi", Form(
"%s_allbg_cos", charge.data()), pdg.data());
66 defineHisto(hchicos_1by3bg[i],
"chi", Form(
"%s_1b3bg_cos", charge.data()), pdg.data());
67 defineHisto(hchicos_2by3bg[i],
"chi", Form(
"%s_2b3bg_cos", charge.data()), pdg.data());
68 defineHisto(hchicos_3by3bg[i],
"chi", Form(
"%s_3b3bg_cos", charge.data()), pdg.data());
101 hadron->SetBranchAddress(
"dedxnosat", &dedxnosat);
102 hadron->SetBranchAddress(
"p", &p);
103 hadron->SetBranchAddress(
"costh", &costh);
104 hadron->SetBranchAddress(
"timereso", &timereso);
105 hadron->SetBranchAddress(
"nhits", &nhit);
106 hadron->SetBranchAddress(
"injtime", &injtime);
107 hadron->SetBranchAddress(
"injring", &isher);
108 hadron->SetBranchAddress(
"charge", &charge);
111 if (mass == 0.0) B2FATAL(
"Mass of particle " << pdg.data() <<
" is zero");
124 unsigned int entries = hadron->GetEntries();
126 for (
unsigned int index = 0; index < entries; ++index) {
128 hadron->GetEntry(index);
130 int chg = (charge < 0) ? 1 : 0;
131 double bg = fabs(p) / mass;
134 if (nhit < 0 || nhit > 100)
continue;
135 if (injtime <= 0 || isher < 0)
continue;
137 if (dedxnosat <= 0)
continue;
138 if (costh != costh)
continue;
139 if (bg < m_bgMin || bg >
m_bgMax)
continue;
141 if (fabs(p) > 7.0)
continue;
143 if (pdg ==
"proton")
if ((dedxnosat - 0.45) * abs(p) * abs(p) <
m_cut)
continue;
146 bgBin = std::min(
m_bgBins - 1, std::max(0, bgBin));
149 B2WARNING(
"bgBin out of range: " << bgBin
150 <<
" (valid range: 0-" << (
m_bgBins - 1) <<
")");
153 double dedx_new = had.
D2I(costh, had.
I2D(costh, 1.0) * dedxnosat);
155 hdedx_bg[bgBin]->Fill(dedx_new);
158 double dedx_cur = mbg.
getMean(bg);
159 double dedx_res = sbg.
getSigma(dedx_new, nhit, costh, timereso);
162 B2INFO(
"RESOLUTION IS ZERO!!!");
167 double chi_new = (dedx_new - dedx_cur) / dedx_res;
169 hchi_bg[bgBin]->Fill(chi_new);
174 B2INFO(
"RESOLUTION costh * nhit * timereso IS ZERO!!!");
178 hionzsigma_bg[bgBin]->Fill((dedx_new - dedx_cur) / ionz_res);
186 int icos =
static_cast<int>((costh + 1) / cosstep);
188 B2WARNING(
"cosBin (icos) out of range: " << icos
189 <<
" (valid range: 0-" << (
m_cosBins - 1) <<
")");
193 hchicos_allbg[chg][icos]->Fill(chi_new);
195 if (bgBin <=
int(
m_bgBins / 3)) hchicos_1by3bg[chg][icos]->Fill(chi_new);
196 else if (bgBin <=
int(2 *
m_bgBins / 3)) hchicos_2by3bg[chg][icos]->Fill(chi_new);
197 else hchicos_3by3bg[chg][icos]->Fill(chi_new);
201 if (isher > 0.5) wr = 1;
202 int injBin =
static_cast<int>((injtime -
m_injMin) / tstep);
204 B2WARNING(
"injBin out of range: " << injBin
205 <<
" (valid range: 0-" << (
m_injBins - 1) <<
")");
207 injBin = std::min(
m_injBins - 1, std::max(0, injBin));
208 hchi_inj[wr][injBin]->Fill(chi_new);
221 setPars(outfile, pdg, hdedx_bg, hchi_bg, hionzsigma_bg, hchi_inj);
226 plotDist(hdedx_bg, Form(
"fits_dedx_inbg_%s_%s", suffix.data(), pdg.data()),
m_bgBins);
227 plotDist(hchi_bg, Form(
"fits_chi_inbg_%s_%s", suffix.data(), pdg.data()),
m_bgBins);
228 plotDist(hionzsigma_bg, Form(
"fits_ionzreso_inbg_%s_%s", suffix.data(), pdg.data()),
m_bgBins);
229 plotDist(hchi_inj, Form(
"fits_chi_ininj_%s_%s", suffix.data(), pdg.data()),
m_injBins);
230 printCanvasCos(hchicos_allbg, hchicos_1by3bg, hchicos_2by3bg, hchicos_3by3bg, pdg, suffix);
238 for (
int i = 0; i < 2; ++i) {
251 int nbdEdx = 200, nbchi = 200;
252 double dedxMax = 20.0;
255 nbdEdx = 400, dedxMax = 4.0;
256 }
else if (pdg ==
"kaon") {
257 nbdEdx = 500, dedxMax = 5.0;
258 }
else if (pdg ==
"proton") {
259 nbdEdx = 1500, dedxMax = 30.0;
261 }
else if (pdg ==
"muon") {
262 nbdEdx = 300, dedxMax = 3.0;
263 }
else if (pdg ==
"electron") {
264 nbdEdx = 200, dedxMax = 2.0;
275 double step = (max - min) / bins;
276 if (stype ==
"nhit") step = (max - min + 1) / bins;
278 for (
int j = 0; j < bins; ++j) {
280 double start = min + j * step;
281 double end = start + step;
282 if (stype ==
"nhit") end = int((start + step) * 0.99999);
285 std::string histname = Form(
"%s_%s_%s_%d", pdg.data(), svar.data(), stype.data(), j);
286 std::string title = Form(
"%s_%s_%s (%.02f, %.02f)", pdg.data(), svar.data(), stype.data(), start, end);
289 htemp.push_back(
new TH1F(histname.data(), title.data(), nbdEdx, 0, dedxMax));
290 else if (svar ==
"chi")
291 htemp.push_back(
new TH1F(histname.data(), title.data(), nbchi, -10.0, 10.0));
293 htemp.push_back(
new TH1F(histname.data(), title.data(), 300, -3.0, 3.0));
295 htemp[j]->GetXaxis()->SetTitle(Form(
"%s", svar.data()));
296 htemp[j]->GetYaxis()->SetTitle(
"Entries");
357void HadronBgPrep::setPars(TFile*& outfile, std::string pdg, std::vector<TH1F*>& hdedx_bg, std::vector<TH1F*>& hchi_bg,
358 std::vector<TH1F*>& hionzsigma_bg, std::map<
int, std::vector<TH1F*>>& hchi_inj)
362 TTree* satTree =
new TTree(Form(
"%s", pdg.data()),
"dE/dx m_means and m_errors");
372 double satchiwidth_err;
377 double satdedxres_avg;
379 satTree->Branch(
"bg", &satbg,
"bg/D");
380 satTree->Branch(
"costh", &satcosth,
"costh/D");
383 satTree->Branch(
"dedx", &satdedx,
"dedx/D");
384 satTree->Branch(
"dedxerr", &satdedxerr,
"dedxerr/D");
385 satTree->Branch(
"dedxwidth", &satdedxwidth,
"dedxwidth/D");
388 satTree->Branch(
"chimean", &satchi,
"chimean/D");
389 satTree->Branch(
"chimean_err", &satchierr,
"chimean_err/D");
390 satTree->Branch(
"chisigma", &satchiwidth,
"chisigma/D");
391 satTree->Branch(
"chisigma_err", &satchiwidth_err,
"chisigma_err/D");
393 satTree->Branch(
"ionzres", &sationzres,
"ionzres/D");
396 satTree->Branch(
"bg_avg", &satbg_avg,
"bg_avg/D");
397 satTree->Branch(
"costh_avg", &satcosth_avg,
"costh_avg/D");
398 satTree->Branch(
"dedxres_avg", &satdedxres_avg,
"dedxres_avg/D");
402 for (
int i = 0; i <
m_bgBins; ++i) {
405 satbg =
m_bgMin + 0.5 * bgstep + i * bgstep;
415 fit(hdedx_bg[i], pdg.data(), bgstat);
417 satdedx =
m_means[i] = hdedx_bg[i]->GetFunction(
"gaus")->GetParameter(1);
418 satdedxerr =
m_errors[i] = hdedx_bg[i]->GetFunction(
"gaus")->GetParError(1);
419 satdedxwidth = hdedx_bg[i]->GetFunction(
"gaus")->GetParameter(2);
420 }
else { satdedx = 0.0; satdedxerr = 0.0; satdedxwidth = 0.0;}
425 fit(hchi_bg[i], pdg.data(), chistat);
427 satchi = hchi_bg[i]->GetFunction(
"gaus")->GetParameter(1);
428 satchierr = hchi_bg[i]->GetFunction(
"gaus")->GetParError(1);
429 satchiwidth = hchi_bg[i]->GetFunction(
"gaus")->GetParameter(2);
430 satchiwidth_err = hchi_bg[i]->GetFunction(
"gaus")->GetParError(2);
431 }
else { satchi = 0.0; satchierr = 0.0; satchiwidth = 0.0; satchiwidth_err = 0.0;}
437 fit(hionzsigma_bg[i], pdg.data(), ionstat);
439 sationzres = hionzsigma_bg[i]->GetFunction(
"gaus")->GetParameter(2);
440 }
else sationzres = 0.0;
452 std::string svar =
"ler";
453 for (
int ir = 0; ir < 2; ir++) {
455 if (ir == 1) svar =
"her";
457 TTree* injTree =
new TTree(Form(
"%s_%s", pdg.data(), svar.data()),
"chi m_means and m_errors");
464 injTree->Branch(
"inj_avg", &inj_avg,
"inj_avg/D");
465 injTree->Branch(
"chimean", &mean,
"chimean/D");
466 injTree->Branch(
"chimean_err", &mean_err,
"chimean_err/D");
467 injTree->Branch(
"chisigma", &sigma,
"chisigma/D");
468 injTree->Branch(
"chisigma_err", &sigma_err,
"chisigma_err/D");
477 fit(hchi_inj[ir][i], pdg.data(), injstat);
479 mean = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParameter(1);
480 mean_err = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParError(1);
481 sigma = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParameter(2);
482 sigma_err = hchi_inj[ir][i]->GetFunction(
"gaus")->GetParError(2);
484 mean = 0.0; mean_err = 0.0; sigma = 0.0; sigma_err = 0.0;
548 std::map<
int, std::vector<TH1F*>>& hchicos_1by3bg, std::map<
int, std::vector<TH1F*>>& hchicos_2by3bg,
549 std::map<
int, std::vector<TH1F*>>& hchicos_3by3bg,
const std::string& pdg,
const std::string& suffix)
552 std::vector<std::vector<double>> chicos(2, std::vector<double>(
m_cosBins));
553 std::vector<std::vector<double>> sigmacos(2, std::vector<double>(
m_cosBins));
554 std::vector<std::vector<double>> chicoserr(2, std::vector<double>(
m_cosBins));
555 std::vector<std::vector<double>> sigmacoserr(2, std::vector<double>(
m_cosBins));
557 std::vector<std::vector<double>> chicos_1b3bg(2, std::vector<double>(
m_cosBins));
558 std::vector<std::vector<double>> sigmacos_1b3bg(2, std::vector<double>(
m_cosBins));
559 std::vector<std::vector<double>> chicos_1b3bgerr(2, std::vector<double>(
m_cosBins));
560 std::vector<std::vector<double>> sigmacos_1b3bgerr(2, std::vector<double>(
m_cosBins));
562 std::vector<std::vector<double>> chicos_2b3bg(2, std::vector<double>(
m_cosBins));
563 std::vector<std::vector<double>> sigmacos_2b3bg(2, std::vector<double>(
m_cosBins));
564 std::vector<std::vector<double>> chicos_2b3bgerr(2, std::vector<double>(
m_cosBins));
565 std::vector<std::vector<double>> sigmacos_2b3bgerr(2, std::vector<double>(
m_cosBins));
567 std::vector<std::vector<double>> chicos2(2, std::vector<double>(
m_cosBins));
568 std::vector<std::vector<double>> sigmacos2(2, std::vector<double>(
m_cosBins));
569 std::vector<std::vector<double>> chicos2err(2, std::vector<double>(
m_cosBins));
570 std::vector<std::vector<double>> sigmacos2err(2, std::vector<double>(
m_cosBins));
572 for (
int c = 0; c < 2; ++c) {
574 if (hchicos_allbg[c][i]->Integral() > 100) {
576 fit(hchicos_allbg[c][i], pdg.data(), allbgstat);
577 if (allbgstat == OK) {
578 chicos[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParameter(1);
579 chicoserr[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParError(1);
580 sigmacos[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParameter(2);
581 sigmacoserr[c][i] = hchicos_allbg[c][i]->GetFunction(
"gaus")->GetParError(2);
582 }
else { chicos[c][i] = 0.0; chicoserr[c][i] = 0.0; sigmacos[c][i] = 0.0; sigmacoserr[c][i] = 0.0;}
585 if (hchicos_1by3bg[c][i]->Integral() > 100) {
588 fit(hchicos_1by3bg[c][i], pdg.data(), all1bgstat);
589 if (all1bgstat == OK) {
590 chicos_1b3bg[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParameter(1);
591 chicos_1b3bgerr[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParError(1);
592 sigmacos_1b3bg[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParameter(2);
593 sigmacos_1b3bgerr[c][i] = hchicos_1by3bg[c][i]->GetFunction(
"gaus")->GetParError(2);
594 }
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;}
598 if (hchicos_2by3bg[c][i]->Integral() > 100) {
600 fit(hchicos_2by3bg[c][i], pdg.data(), all2bgstat);
601 if (all2bgstat == OK) {
602 chicos_2b3bg[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParameter(1);
603 chicos_2b3bgerr[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParError(1);
604 sigmacos_2b3bg[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParameter(2);
605 sigmacos_2b3bgerr[c][i] = hchicos_2by3bg[c][i]->GetFunction(
"gaus")->GetParError(2);
606 }
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;}
610 if (hchicos_3by3bg[c][i]->Integral() > 100) {
612 fit(hchicos_3by3bg[c][i], pdg.data(), all3bgstat);
613 if (all3bgstat == OK) {
614 chicos2[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParameter(1);
615 chicos2err[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParError(1);
616 sigmacos2[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParameter(2);
617 sigmacos2err[c][i] = hchicos_3by3bg[c][i]->GetFunction(
"gaus")->GetParError(2);
618 }
else { chicos2[c][i] = 0.0; chicos2err[c][i] = 0.0; sigmacos2[c][i] = 0.0; sigmacos2err[c][i] = 0.0;}
624 plotDist(hchicos_allbg, Form(
"fits_chi_vscos_allbg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
625 plotDist(hchicos_1by3bg, Form(
"fits_chi_vscos_1by3bg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
626 plotDist(hchicos_2by3bg, Form(
"fits_chi_vscos_2by3bg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
627 plotDist(hchicos_3by3bg, Form(
"fits_chi_vscos_3by3bg_%s_%s", pdg.data(), suffix.data()),
m_cosBins);
632 cosArray[i] = -1.0 + (i * cosstep + cosstep / 2.0);
633 cosArrayErr[i] = 0.0;
636 TGraphErrors grchicos(
m_cosBins, cosArray.data(), chicos[0].data(), cosArrayErr.data(), chicoserr[0].data());
637 TGraphErrors grchicos_1b3bg(
m_cosBins, cosArray.data(), chicos_1b3bg[0].data(), cosArrayErr.data(), chicos_1b3bgerr[0].data());
638 TGraphErrors grchicos_2b3bg(
m_cosBins, cosArray.data(), chicos_2b3bg[0].data(), cosArrayErr.data(), chicos_2b3bgerr[0].data());
639 TGraphErrors grchicos2(
m_cosBins, cosArray.data(), chicos2[0].data(), cosArrayErr.data(), chicos2err[0].data());
641 TGraphErrors grchicosn(
m_cosBins, cosArray.data(), chicos[1].data(), cosArrayErr.data(), chicoserr[1].data());
642 TGraphErrors grchicos_1b3bgn(
m_cosBins, cosArray.data(), chicos_1b3bg[1].data(), cosArrayErr.data(), chicos_1b3bgerr[1].data());
643 TGraphErrors grchicos_2b3bgn(
m_cosBins, cosArray.data(), chicos_2b3bg[1].data(), cosArrayErr.data(), chicos_2b3bgerr[1].data());
644 TGraphErrors grchicos2n(
m_cosBins, cosArray.data(), chicos2[1].data(), cosArrayErr.data(), chicos2err[1].data());
646 TGraphErrors grsigmacos(
m_cosBins, cosArray.data(), sigmacos[0].data(), cosArrayErr.data(), sigmacoserr[0].data());
647 TGraphErrors grsigmacos_1b3bg(
m_cosBins, cosArray.data(), sigmacos_1b3bg[0].data(), cosArrayErr.data(),
648 sigmacos_1b3bgerr[0].data());
649 TGraphErrors grsigmacos_2b3bg(
m_cosBins, cosArray.data(), sigmacos_2b3bg[0].data(), cosArrayErr.data(),
650 sigmacos_2b3bgerr[0].data());
651 TGraphErrors grsigmacos2(
m_cosBins, cosArray.data(), sigmacos2[0].data(), cosArrayErr.data(), sigmacos2err[0].data());
653 TGraphErrors grsigmacosn(
m_cosBins, cosArray.data(), sigmacos[1].data(), cosArrayErr.data(), sigmacoserr[1].data());
654 TGraphErrors grsigmacos_1b3bgn(
m_cosBins, cosArray.data(), sigmacos_1b3bg[1].data(), cosArrayErr.data(),
655 sigmacos_1b3bgerr[1].data());
656 TGraphErrors grsigmacos_2b3bgn(
m_cosBins, cosArray.data(), sigmacos_2b3bg[1].data(), cosArrayErr.data(),
657 sigmacos_2b3bgerr[1].data());
658 TGraphErrors grsigmacos2n(
m_cosBins, cosArray.data(), sigmacos2[1].data(), cosArrayErr.data(), sigmacos2err[1].data());
660 TLine line0(-1, 0, 1, 0);
661 line0.SetLineStyle(kDashed);
662 line0.SetLineColor(kRed);
664 TLine line1(-1, 1, 1, 1);
665 line1.SetLineStyle(kDashed);
666 line1.SetLineColor(kRed);
670 if (pdg ==
"pion") {ptype +=
"#pi"; mass =
Const::pion.getMass();}
671 else if (pdg ==
"kaon") {ptype +=
"K"; mass =
Const::kaon.getMass();}
672 else if (pdg ==
"proton") { ptype +=
"p"; mass =
Const::proton.getMass();}
673 else if (pdg ==
"muon") {ptype +=
"#mu"; mass =
Const::muon.getMass();}
674 else if (pdg ==
"electron") {ptype +=
"e"; mass =
Const::electron.getMass();}
675 if (mass == 0.0) B2FATAL(
"Mass of particle " << pdg.data() <<
" is zero");
677 int bglow = 0, bghigh = 0;
680 TLegend lchi(0.7, 0.75, 0.8, 0.85);
681 lchi.SetBorderSize(0);
682 lchi.SetFillColor(kYellow);
683 lchi.AddEntry(&grchicos, ptype +
"^{+}",
"pc");
684 lchi.AddEntry(&grchicosn, ptype +
"^{-}",
"pc");
686 TCanvas cchi(Form(
"cchi_%s", suffix.data()),
"cchi", 700, 600);
692 grchicosn.Draw(
"P,same");
698 FormatGraph(grchicos_1b3bg, 0, Form(
"first 1/3 bg bins, p =(%0.02f, %0.02f)",
m_bgMin * mass, bghigh * bgstep * mass));
700 grchicos_1b3bg.Draw(
"AP");
701 grchicos_1b3bgn.Draw(
"P,same");
708 FormatGraph(grchicos_2b3bg, 0, Form(
"second 1/3 bg bins, p =(%0.02f, %0.02f)", bglow * bgstep * mass, bghigh * bgstep * mass));
710 grchicos_2b3bg.Draw(
"AP");
711 grchicos_2b3bgn.Draw(
"P,same");
717 FormatGraph(grchicos2, 0, Form(
"third 1/3 bg bins, p =(%0.02f, %0.02f)", bglow * bgstep * mass,
m_bgMax * mass));
719 grchicos2.Draw(
"AP");
720 grchicos2n.Draw(
"P,same");
723 cchi.SaveAs(Form(
"plots/HadronCal/Monitoring/mean_chi_vscos_inbg_%s_%s.pdf", pdg.data(), suffix.data()));
728 grsigmacos.Draw(
"AP");
729 grsigmacosn.Draw(
"P,same");
735 FormatGraph(grsigmacos_1b3bg, 2, Form(
"first 1/3 bg bins, p =(%0.02f, %0.02f)",
m_bgMin * mass, bghigh * bgstep * mass));
737 grsigmacos_1b3bg.Draw(
"AP");
738 grsigmacos_1b3bgn.Draw(
"P,same");
745 FormatGraph(grsigmacos_2b3bg, 2, Form(
"second 1/3 bg bins, p =(%0.02f, %0.02f)", bglow * bgstep * mass, bghigh * bgstep * mass));
747 grsigmacos_2b3bg.Draw(
"AP");
748 grsigmacos_2b3bgn.Draw(
"P,same");
754 FormatGraph(grsigmacos2, 2, Form(
"third 1/3 bg bins, p =(%0.02f, %0.02f)", bglow * bgstep * mass,
m_bgMax * mass));
756 grsigmacos2.Draw(
"AP");
757 grsigmacos2n.Draw(
"P,same");
760 cchi.SaveAs(Form(
"plots/HadronCal/Monitoring/sigma_chi_vscos_inbg_%s_%s.pdf", pdg.data(), suffix.data()));