9#include <reconstruction/calibration/CDCdEdx/CDCDedx1DCellAlgorithm.h>
17 m_eaMin(-TMath::Pi() / 2),
18 m_eaMax(+TMath::Pi() / 2),
39 setDescription(
"A calibration algorithm for the CDC dE/dx entrance angle cleanup correction");
51 B2FATAL(
"There is no valid previous payload for CDCDedx1DCell");
54 auto ttree = getObjectPtr<TTree>(
"tree");
57 std::vector<double>* dedxhit = 0, *enta = 0;
58 std::vector<int>* layer = 0;
59 double pt = 0, costh = 0;
61 ttree->SetBranchAddress(
"dedxhit", &dedxhit);
62 ttree->SetBranchAddress(
"entaRS", &enta);
63 ttree->SetBranchAddress(
"layer", &layer);
64 ttree->SetBranchAddress(
"pt", &pt);
65 ttree->SetBranchAddress(
"costh", &costh);
80 std::vector<TH1D*> hdedxhit[2];
84 TH2D* hptcosth =
new TH2D(
"hptcosth",
"pt vs costh dist;pt;costh", 1000, -8.0, 8.0, 1000, -1.0, 1.0);
89 for (
int i = 0; i < ttree->GetEntries(); ++i) {
99 if (abs(pt) >
m_ptMax)
continue;
102 int rand = gRandom->Integer(100);
103 if (rand < 10) hptcosth->Fill(pt, costh);
105 for (
unsigned int j = 0; j < dedxhit->size(); ++j) {
107 if (dedxhit->at(j) == 0)
continue;
109 double entaval = enta->at(j);
112 if (ibin < 0 || ibin >
m_eaBin)
continue;
115 if (layer->at(j) < 8)mL = 0;
118 hdedxlay[mL]->Fill(dedxhit->at(j));
119 if (rand < 10) hentalay[mL]->Fill(entaval);
123 hdedxhit[mL][jbinea]->Fill(dedxhit->at(j));
127 for (
int il = 0; il < 2; il++) {
129 int minlay = 0, maxlay = 0;
133 hdedxlay[il]->SetTitle(Form(
"%s;%d;%d", hdedxlay[il]->GetTitle(), minlay, maxlay));
136 std::vector<double>tempconst;
146 TH1D* htemp = (TH1D*)hdedxhit[il][jea]->Clone(Form(
"h_%s_b%d_c",
m_label[il].data(), jea));
148 int minbin = 1, maxbin = 1;
159 tempconst.push_back(dedxmean);
161 hdedxhit[il][iea]->SetTitle(Form(
"%s, #mu_{truc} = %0.5f;%d;%d", hdedxhit[il][iea]->GetTitle(), dedxmean, minbin, maxbin));
165 std::vector<double>layerconst;
168 for (
int iea = 0; iea <
m_eaBin; iea++) {
171 layerconst.push_back(tempconst.at(jea));
203 for (
int il = 0; il < 2; il++) {
207 delete hdedxhit[il][iea];
220 if (cruns == 0) B2INFO(
"CDCDedxBadWires: start exp " << expRun.first <<
" and run " << expRun.second <<
"");
225 int estart = erStart.first;
226 int rstart = erStart.second;
229 int eend = erEnd.first;
230 int rend = erEnd.second;
234 m_runExp = Form(
"Range (%d:%d,%d:%d)", estart, rstart, eend, rend);
236 else m_suffix = Form(
"e%d_r%dr%d", estart, rstart, rend);
243 std::map<int, std::vector<double>> bounds;
244 std::map<int, std::vector<int>> steps;
246 const std::array<int, 2> nDev{8, 4};
247 bounds[0] = {0, 108, 123, 133, 158, 183, 193, 208, 316};
248 steps[0] = {9, 3, 2, 1, 1, 2, 3, 9};
249 bounds[1] = {0, 38, 158, 278, 316};
250 steps[1] = {2, 1, 1, 2};
252 for (
int il = 0; il < 2; il++) {
254 for (
int ibin = 0; ibin <= nDev[il]; ibin++) bounds[il][ibin] = bounds[il][ibin] *
m_binSplit;
256 int ieaprime = -1, temp = -99, ibin = 0;
261 for (
int iea = 0; iea <
m_eaBin; iea++) {
264 if (iea %
int(bounds[il][ibin + 1]) == 0 && iea > 0) ibin++;
265 int diff = iea - int(bounds[il][ibin]);
266 if (diff % steps[il][ibin] == 0) ieaprime++;
267 }
else ieaprime = iea;
271 if (ieaprime != temp) {
274 double binvalue = pastbin + binwidth;
276 if (abs(binvalue) < 1e-5)binvalue = 0;
289 for (
int il = 0; il < 2; il++) {
291 std::string title = Form(
"dedxhit dist (%s): %s ; dedxhit;entries",
m_label[il].data(),
m_runExp.data());
293 hdedxlay[il]->SetTitle(Form(
"%s", title.data()));
298 if (
isVarBins) title = Form(
"entaRS dist (variable bins): %s: (%s); entaRS (#alpha);entries",
m_label[il].data(),
m_runExp.data());
299 else title = Form(
"entaRS dist (sym. bins): %s: (%s); entaRS (#alpha);entries",
m_label[il].data(),
m_runExp.data());
301 hentalay[il] =
new TH1D(Form(
"hentalay%s",
m_label[il].data()),
"",
m_eaBinLocal[il], nvarBins);
302 hentalay[il]->SetTitle(Form(
"%s", title.data()));
308 double width = max - min;
310 if (
isPrintLog) B2INFO(
"bin: " << iea <<
" ], min:" << min <<
" , max: " << max <<
" , width: " << width);
312 title = Form(
"%s: entaRS = (%0.03f to %0.03f)",
m_label[il].data(), min, max);
314 hdedxhit[il][iea]->SetTitle(Form(
"%s", title.data()));
324 double sum = hist->Integral();
325 if (sum <= 0 || hist->GetNbinsX() <= 0) {
326 binlow = 1; binhigh = 1;
330 binlow = 1.0; binhigh = 1.0;
331 double sumPer5 = 0.0, sumPer75 = 0.0;
332 for (
int ibin = 1; ibin <= hist->GetNbinsX(); ibin++) {
333 double bcdedx = hist->GetBinContent(ibin);
351 if (hist->Integral() < 100)
return 1.0;
353 if (binlow <= 0 || binhigh > hist->GetNbinsX())
return 1.0;
355 double binweights = 0., sumofbc = 0.;
356 for (
int ibin = binlow; ibin <= binhigh; ibin++) {
357 double bcdedx = hist->GetBinContent(ibin);
359 binweights += (bcdedx * hist->GetBinCenter(ibin));
363 if (sumofbc > 0)
return binweights / sumofbc;
371 B2INFO(
"dE/dx one cell calibration: Generating payloads");
373 for (
unsigned int il = 0; il < 2; il++) {
378 B2ERROR(
"merging failed because of unmatch bins (old " <<
m_eaBin <<
" new " << nbins <<
")");
380 for (
unsigned int iea = 0; iea < nbins; iea++) {
394 B2INFO(
"dE/dx Calibration done for CDCDedx1DCell");
401 std::map<
int, std::vector<int>> steps)
404 TCanvas cmfactor(
"cmfactor",
"Merging factors", 800, 400);
405 cmfactor.Divide(2, 1);
407 for (
int il = 0; il < 2; il++) {
409 nvarBins = &bounds[il][0];
411 TH1I* hist =
new TH1I(Form(
"hist_%s",
m_label[il].data()),
"", nDev[il], nvarBins);
412 hist->SetTitle(Form(
"Merging factor for %s bins;binindex;merge-factors",
m_label[il].data()));
414 for (
int ibin = 0; ibin < nDev[il]; ibin++) hist->SetBinContent(ibin + 1, steps[il][ibin]);
417 hist->SetFillColor(kYellow);
422 cmfactor.SaveAs(Form(
"cdcdedx_1dcell_mergefactor%s.pdf",
m_suffix.data()));
423 cmfactor.SaveAs(Form(
"cdcdedx_1dcell_mergefactor%s.root",
m_suffix.data()));
430 TCanvas ctmp(
"tmp",
"tmp", 1200, 1200);
432 std::stringstream psname;
434 psname << Form(
"cdcdedx_1dcell_dedxhit%s.pdf[",
m_suffix.data());
435 ctmp.Print(psname.str().c_str());
437 psname << Form(
"cdcdedx_1dcell_dedxhit%s.pdf",
m_suffix.data());
439 for (
int il = 0; il < 2; il++) {
443 int minbin = std::stoi(hdedxhit[il][jea]->GetXaxis()->GetTitle());
444 int maxbin = std::stoi(hdedxhit[il][jea]->GetYaxis()->GetTitle());
446 ctmp.cd(jea % 16 + 1);
447 hdedxhit[il][jea]->SetFillColor(4 + il);
449 hdedxhit[il][jea]->SetTitle(Form(
"%s;dedxhit;entries", hdedxhit[il][jea]->GetTitle()));
450 hdedxhit[il][jea]->DrawClone(
"hist");
451 TH1D* htempC = (TH1D*)hdedxhit[il][jea]->Clone(Form(
"%sc2", hdedxhit[il][jea]->GetName()));
452 htempC->GetXaxis()->SetRange(minbin, maxbin);
453 htempC->SetFillColor(kGray);
454 htempC->DrawClone(
"same hist");
457 ctmp.Print(psname.str().c_str());
465 psname << Form(
"cdcdedx_1dcell_dedxhit%s.pdf]",
m_suffix.data());
466 ctmp.Print(psname.str().c_str());
473 TCanvas cdedxlayer(
"layerdedxhit",
"Inner and Outer Layer dedxhit dist", 900, 400);
474 cdedxlayer.Divide(2, 1);
476 for (
int il = 0; il < 2; il++) {
477 int minlay = 0, maxlay = 0;
479 minlay = std::stoi(hdedxlay[il]->GetXaxis()->GetTitle());
480 maxlay = std::stoi(hdedxlay[il]->GetYaxis()->GetTitle());
481 double lowedge = hdedxlay[il]->GetXaxis()->GetBinLowEdge(minlay);
482 double upedge = hdedxlay[il]->GetXaxis()->GetBinUpEdge(maxlay);
483 hdedxlay[il]->SetTitle(Form(
"%s, trunc #rightarrow: %0.02f - %0.02f;dedxhit;entries", hdedxlay[il]->GetTitle(), lowedge, upedge));
486 cdedxlayer.cd(il + 1);
487 hdedxlay[il]->SetFillColor(kYellow);
488 hdedxlay[il]->Draw(
"histo");
491 TH1D* hdedxlayC = (TH1D*)hdedxlay[il]->Clone(Form(
"hdedxlayC%d", il));
492 hdedxlayC->GetXaxis()->SetRange(minlay, maxlay);
493 hdedxlayC->SetFillColor(kAzure + 1);
494 hdedxlayC->Draw(
"same histo");
498 cdedxlayer.SaveAs(Form(
"cdcdedx_1dcell_dedxlay%s.pdf",
m_suffix.data()));
499 cdedxlayer.SaveAs(Form(
"cdcdedx_1dcell_dedxlay%s.root",
m_suffix.data()));
506 TCanvas ceadist(
"ceadist",
"Enta distributions", 800, 400);
507 ceadist.Divide(2, 1);
509 for (
int il = 0; il < 2; il++) {
513 hentalay[il]->SetFillColor(kYellow);
514 hentalay[il]->Draw(
"hist");
517 TCanvas cptcos(
"cptcos",
"pt vs costh dist.", 400, 400);
519 hptcosth->Draw(
"colz");
521 cptcos.SaveAs(Form(
"cdcdedx_ptcosth_%s.pdf",
m_suffix.data()));
522 ceadist.SaveAs(Form(
"cdcdedx_1dcell_enta%s.pdf",
m_suffix.data()));
523 ceadist.SaveAs(Form(
"cdcdedx_1dcell_enta%s.root",
m_suffix.data()));
530 TH1D* hconst, *hconstvar;
536 std::string title = Form(
"calibration const dist: %s: (%s); entaRS (#alpha); entries",
m_label[il].data(),
m_runExp.data());
537 hconst->SetTitle(Form(
"%s", title.data()));
539 hconstvar =
new TH1D(Form(
"hconstvar%s",
m_label[il].data()),
"",
m_eaBinLocal[il], nvarBins);
540 title = Form(
"calibration const dist (var bins): %s: (%s); entaRS (#alpha);entries",
m_label[il].data(),
m_runExp.data());
541 hconstvar->SetTitle(Form(
"%s", title.data()));
545 hconstvar->SetBinContent(iea + 1, tempconst.at(iea));
548 for (
int jea = 0; jea <
m_eaBin; jea++) hconst->SetBinContent(jea + 1, layerconst.at(jea));
550 gStyle->SetOptStat(
"ne");
551 TCanvas cconst(
"cconst",
"Calirbation Constants", 800, 400);
554 cconst.SetWindowSize(1000, 800);
558 hconst->SetFillColor(kYellow);
559 hconst->Draw(
"histo");
562 hconstvar->SetFillColor(kBlue);
563 hconstvar->Draw(
"hist");
565 cconst.SaveAs(Form(
"cdcdedx_1dcell_relconst%s_%s.pdf",
m_label[il].data(),
m_suffix.data()));
566 cconst.SaveAs(Form(
"cdcdedx_1dcell_relconst%s_%s.root",
m_label[il].data(),
m_suffix.data()));
577 TH1D* hnewconst[2], *holdconst[2];
578 double min[2], max[2];
580 for (
unsigned int il = 0; il < 2; il++) {
583 std::string title = Form(
"final calibration const dist (%s): %s; entaRS (#alpha); entries",
m_label[il].data(),
m_runExp.data());
585 hnewconst[il]->SetTitle(Form(
"%s", title.data()));
587 title = Form(
"old calibration const dist (%s): %s; entaRS (#alpha); entries",
m_label[il].data(),
m_runExp.data());
589 holdconst[il]->SetTitle(Form(
"%s", title.data()));
591 for (
unsigned int iea = 0; iea < nbins; iea++) {
593 holdconst[il]->SetBinContent(iea + 1, prev);
594 hnewconst[il]->SetBinContent(iea + 1,
m_onedcors[il][iea]);
596 min[il] = hnewconst[il]->GetMinimum();
597 max[il] = hnewconst[il]->GetMaximum();
601 if (max[1] < max[0])max[1] = max[0];
602 if (min[1] > min[0])min[1] = min[0];
604 gStyle->SetOptStat(
"ne");
605 TCanvas cfconst(
"cfconst",
"Final calirbation constants", 800, 400);
606 cfconst.Divide(2, 1);
608 for (
int il = 0; il < 2; il++) {
610 hnewconst[il]->GetYaxis()->SetRangeUser(min[1] * 0.95, max[1] * 1.05);
611 hnewconst[il]->SetLineColor(kBlack);
612 hnewconst[il]->Draw(
"histo");
613 holdconst[il]->SetLineColor(kRed);
614 holdconst[il]->Draw(
"histo same");
616 auto legend =
new TLegend(0.4, 0.75, 0.56, 0.85);
617 legend->AddEntry(holdconst[il],
"Old",
"lep");
618 legend->AddEntry(hnewconst[il],
"New",
"lep");
622 cfconst.SaveAs(Form(
"cdcdedx_1dcell_fconsts%s.pdf",
m_suffix.data()));
623 cfconst.SaveAs(Form(
"cdcdedx_1dcell_fconsts%s.root",
m_suffix.data()));
625 for (
int il = 0; il < 2; il++) {
626 delete hnewconst[il];
627 delete holdconst[il];
635 TCanvas cstats(
"cstats",
"cstats", 1000, 500);
636 cstats.SetBatch(kTRUE);
640 auto hestats = getObjectPtr<TH1I>(
"hestats");
642 hestats->SetName(Form(
"hestats_%s",
m_suffix.data()));
643 hestats->SetStats(0);
644 hestats->DrawCopy(
"");
648 auto htstats = getObjectPtr<TH1I>(
"htstats");
650 hestats->SetName(Form(
"htstats_%s",
m_suffix.data()));
651 htstats->DrawCopy(
"");
652 hestats->SetStats(0);
654 cstats.Print(Form(
"cdcdedx_1dcell_stats_%s.pdf",
m_suffix.data()));
CDCDedx1DCellAlgorithm()
Constructor: Sets the description, the properties and the parameters of the algorithm.
std::string m_label[2]
add inner/outer layer label
double m_eaMax
upper edge of enta angle
void plotMergeFactor(std::map< int, std::vector< double > > bounds, const std::array< int, 2 > nDev, std::map< int, std::vector< int > > steps)
funtion to plot merging factor
double m_truncMax
uppr thershold on truncation
int m_binSplit
multiply nbins by this factor in full range
std::array< std::vector< int >, 2 > m_binIndex
symm/Var bin numebrs
double m_truncMin
lower thershold on truncation
double m_adjustFac
faactor with that one what to adjust baseline
void getTruncatedBins(TH1D *hist, int &binlow, int &binhigh)
function to get bins of trunction from histogram
void CreateBinMapping()
class function to create vectors for bin mappping (Var->symm)
double m_chargeType
charge type for baseline adj
void getExpRunInfo()
function to get extract calibration run/exp
DBObjPtr< CDCDedx1DCell > m_DBOneDCell
One cell correction DB object.
double m_cosMax
a limit on cos theta
bool isPrintLog
print more debug information
std::array< std::vector< double >, 2 > m_binValue
etna Var bin values
std::string m_suffix
add suffix to all plot name
double getTruncationMean(TH1D *hist, int binlow, int binhigh)
function to get truncated mean
double m_ptMax
a limit on transverse momentum
void plotConstants()
function to draw the old/new final constants
std::vector< int > m_eaBinLocal
bool isFixTrunc
true = fix window for all out/inner layers
bool isVarBins
true: if variable bin size is requested
void plotdedxHist(std::vector< TH1D * > hdedxhit[2])
function to draw the dE/dx histrogram in enta bins
void defineHisto(std::vector< TH1D * > hdedxhit[2], TH1D *hdedxlay[2], TH1D *hentalay[2])
function to define histograms
double m_eaBW
binwdith of enta angle bin
bool isRotSymm
if rotation symmtery requested
std::string m_runExp
add suffix to all plot name
void plotEventStats()
function to draw the stats plots
int rotationalBin(int nbin, int ibin)
class funtion to set rotation symmetry
virtual EResult calibrate() override
1D cell algorithm
void plotQaPars(TH1D *hentalay[2], TH2D *hptcosth)
funtion to draw pt vs costh and entrance angle distribution for Inner/Outer layer
double m_dedxMax
upper edge of dedxhit
void createPayload()
funtion to generate final constants
bool isMakePlots
produce plots for status
void plotRelConst(std::vector< double >tempconst, std::vector< double >layerconst, int il)
function to draw symm/Var layer constant
std::vector< std::vector< double > > m_onedcors
final vectors of calibration
bool isMerge
print more debug information
double m_dedxMin
lower edge of dedxhit
void plotLayerDist(TH1D *hdedxL[2])
funtion to draw dedx dist.
double m_eaMin
lower edge of enta angle
dE/dx wire gain calibration constants
Base class for calibration algorithms.
void saveCalibration(TClonesArray *data, const std::string &name)
Store DBArray payload with given name with default IOV.
void updateDBObjPtrs(const unsigned int event, const int run, const int experiment)
Updates any DBObjPtrs by calling update(event) for DBStore.
void setDescription(const std::string &description)
Set algorithm description (in constructor)
const std::vector< Calibration::ExpRun > & getRunList() const
Get the list of runs for which calibration is called.
EResult
The result of calibration.
@ c_OK
Finished successfully =0 in Python.
@ c_NotEnoughData
Needs more data =2 in Python.
Abstract base class for different kinds of events.