9#include <cdc/calibration/CDCdEdx/CDCDedx1DCellAlgorithm.h>
19 m_eaMin(-TMath::Pi() / 2),
20 m_eaMax(+TMath::Pi() / 2),
41 setDescription(
"A calibration algorithm for the CDC dE/dx entrance angle cleanup correction");
53 B2FATAL(
"There is no valid previous payload for CDCDedx1DCell");
56 auto ttree = getObjectPtr<TTree>(
"tree");
59 std::vector<double>* dedxhit = 0, *enta = 0;
60 std::vector<int>* layer = 0;
61 double pt = 0, costh = 0;
63 ttree->SetBranchAddress(
"dedxhit", &dedxhit);
64 ttree->SetBranchAddress(
"entaRS", &enta);
65 ttree->SetBranchAddress(
"layer", &layer);
66 ttree->SetBranchAddress(
"pt", &pt);
67 ttree->SetBranchAddress(
"costh", &costh);
82 std::vector<TH1D*> hdedxhit[2];
86 TH2D* hptcosth =
new TH2D(
"hptcosth",
"pt vs costh dist;pt;costh", 1000, -8.0, 8.0, 1000, -1.0, 1.0);
91 for (
int i = 0; i < ttree->GetEntries(); ++i) {
95 if (std::abs(costh) >
m_cosMax)
continue;
101 if (std::abs(pt) >
m_ptMax)
continue;
104 int rand = gRandom->Integer(100);
105 if (rand < 10) hptcosth->Fill(pt, costh);
107 for (
unsigned int j = 0; j < dedxhit->size(); ++j) {
109 if (dedxhit->at(j) == 0)
continue;
111 double entaval = enta->at(j);
114 if (ibin < 0 || ibin >
m_eaBin)
continue;
117 if (layer->at(j) < 8)mL = 0;
120 hdedxlay[mL]->Fill(dedxhit->at(j));
121 if (rand < 10) hentalay[mL]->Fill(entaval);
125 hdedxhit[mL][jbinea]->Fill(dedxhit->at(j));
129 for (
int il = 0; il < 2; il++) {
131 int minlay = 0, maxlay = 0;
135 hdedxlay[il]->SetTitle(Form(
"%s;%d;%d", hdedxlay[il]->GetTitle(), minlay, maxlay));
138 std::vector<double>tempconst;
148 TH1D* htemp = (TH1D*)hdedxhit[il][jea]->Clone(Form(
"h_%s_b%d_c",
m_label[il].data(), jea));
150 int minbin = 1, maxbin = 1;
161 tempconst.push_back(dedxmean);
163 hdedxhit[il][iea]->SetTitle(Form(
"%s, #mu_{truc} = %0.5f;%d;%d", hdedxhit[il][iea]->GetTitle(), dedxmean, minbin, maxbin));
167 std::vector<double>layerconst;
170 for (
int iea = 0; iea <
m_eaBin; iea++) {
173 layerconst.push_back(tempconst.at(jea));
205 for (
int il = 0; il < 2; il++) {
209 delete hdedxhit[il][iea];
222 if (cruns == 0) B2INFO(
"CDCDedxBadWires: start exp " << expRun.first <<
" and run " << expRun.second <<
"");
227 int estart = erStart.first;
228 int rstart = erStart.second;
231 int eend = erEnd.first;
232 int rend = erEnd.second;
236 m_runExp = Form(
"Range (%d:%d,%d:%d)", estart, rstart, eend, rend);
238 else m_suffix = Form(
"e%d_r%dr%d", estart, rstart, rend);
245 std::map<int, std::vector<double>> bounds;
246 std::map<int, std::vector<int>> steps;
248 const std::array<int, 2> nDev{8, 4};
249 bounds[0] = {0, 108, 123, 133, 158, 183, 193, 208, 316};
250 steps[0] = {9, 3, 2, 1, 1, 2, 3, 9};
251 bounds[1] = {0, 38, 158, 278, 316};
252 steps[1] = {2, 1, 1, 2};
254 for (
int il = 0; il < 2; il++) {
256 for (
int ibin = 0; ibin <= nDev[il]; ibin++) bounds[il][ibin] = bounds[il][ibin] *
m_binSplit;
258 int ieaprime = -1, temp = -99, ibin = 0;
263 for (
int iea = 0; iea <
m_eaBin; iea++) {
266 if (iea %
int(bounds[il][ibin + 1]) == 0 && iea > 0) ibin++;
267 int diff = iea - int(bounds[il][ibin]);
268 if (diff % steps[il][ibin] == 0) ieaprime++;
269 }
else ieaprime = iea;
273 if (ieaprime != temp) {
276 double binvalue = pastbin + binwidth;
278 if (std::abs(binvalue) < 1e-5)binvalue = 0;
291 for (
int il = 0; il < 2; il++) {
293 std::string title = Form(
"dedxhit dist (%s): %s ; dedxhit;entries",
m_label[il].data(),
m_runExp.data());
295 hdedxlay[il]->SetTitle(Form(
"%s", title.data()));
300 if (
isVarBins) title = Form(
"entaRS dist (variable bins): %s: (%s); entaRS (#alpha);entries",
m_label[il].data(),
m_runExp.data());
301 else title = Form(
"entaRS dist (sym. bins): %s: (%s); entaRS (#alpha);entries",
m_label[il].data(),
m_runExp.data());
303 hentalay[il] =
new TH1D(Form(
"hentalay%s",
m_label[il].data()),
"",
m_eaBinLocal[il], nvarBins);
304 hentalay[il]->SetTitle(Form(
"%s", title.data()));
310 double width = max - min;
312 if (
isPrintLog) B2INFO(
"bin: " << iea <<
" ], min:" << min <<
" , max: " << max <<
" , width: " << width);
314 title = Form(
"%s: entaRS = (%0.03f to %0.03f)",
m_label[il].data(), min, max);
316 hdedxhit[il][iea]->SetTitle(Form(
"%s", title.data()));
326 double sum = hist->Integral();
327 if (sum <= 0 || hist->GetNbinsX() <= 0) {
328 binlow = 1; binhigh = 1;
332 binlow = 1.0; binhigh = 1.0;
333 double sumPer5 = 0.0, sumPer75 = 0.0;
334 for (
int ibin = 1; ibin <= hist->GetNbinsX(); ibin++) {
335 double bcdedx = hist->GetBinContent(ibin);
353 if (hist->Integral() < 100)
return 1.0;
355 if (binlow <= 0 || binhigh > hist->GetNbinsX())
return 1.0;
357 double binweights = 0., sumofbc = 0.;
358 for (
int ibin = binlow; ibin <= binhigh; ibin++) {
359 double bcdedx = hist->GetBinContent(ibin);
361 binweights += (bcdedx * hist->GetBinCenter(ibin));
365 if (sumofbc > 0)
return binweights / sumofbc;
373 B2INFO(
"dE/dx one cell calibration: Generating payloads");
375 for (
unsigned int il = 0; il < 2; il++) {
380 B2ERROR(
"merging failed because of unmatch bins (old " <<
m_eaBin <<
" new " << nbins <<
")");
382 for (
unsigned int iea = 0; iea < nbins; iea++) {
396 B2INFO(
"dE/dx Calibration done for CDCDedx1DCell");
403 std::map<
int, std::vector<int>> steps)
406 TCanvas cmfactor(
"cmfactor",
"Merging factors", 800, 400);
407 cmfactor.Divide(2, 1);
409 for (
int il = 0; il < 2; il++) {
411 nvarBins = &bounds[il][0];
413 TH1I* hist =
new TH1I(Form(
"hist_%s",
m_label[il].data()),
"", nDev[il], nvarBins);
414 hist->SetTitle(Form(
"Merging factor for %s bins;binindex;merge-factors",
m_label[il].data()));
416 for (
int ibin = 0; ibin < nDev[il]; ibin++) hist->SetBinContent(ibin + 1, steps[il][ibin]);
419 hist->SetFillColor(kYellow);
424 cmfactor.SaveAs(Form(
"cdcdedx_1dcell_mergefactor%s.pdf",
m_suffix.data()));
425 cmfactor.SaveAs(Form(
"cdcdedx_1dcell_mergefactor%s.root",
m_suffix.data()));
432 TCanvas ctmp(
"tmp",
"tmp", 1200, 1200);
434 std::stringstream psname;
436 psname << Form(
"cdcdedx_1dcell_dedxhit%s.pdf[",
m_suffix.data());
437 ctmp.Print(psname.str().c_str());
439 psname << Form(
"cdcdedx_1dcell_dedxhit%s.pdf",
m_suffix.data());
441 for (
int il = 0; il < 2; il++) {
445 int minbin = std::stoi(hdedxhit[il][jea]->GetXaxis()->GetTitle());
446 int maxbin = std::stoi(hdedxhit[il][jea]->GetYaxis()->GetTitle());
448 ctmp.cd(jea % 16 + 1);
449 hdedxhit[il][jea]->SetFillColor(4 + il);
451 hdedxhit[il][jea]->SetTitle(Form(
"%s;dedxhit;entries", hdedxhit[il][jea]->GetTitle()));
452 hdedxhit[il][jea]->DrawClone(
"hist");
453 TH1D* htempC = (TH1D*)hdedxhit[il][jea]->Clone(Form(
"%sc2", hdedxhit[il][jea]->GetName()));
454 htempC->GetXaxis()->SetRange(minbin, maxbin);
455 htempC->SetFillColor(kGray);
456 htempC->DrawClone(
"same hist");
459 ctmp.Print(psname.str().c_str());
467 psname << Form(
"cdcdedx_1dcell_dedxhit%s.pdf]",
m_suffix.data());
468 ctmp.Print(psname.str().c_str());
475 TCanvas cdedxlayer(
"layerdedxhit",
"Inner and Outer Layer dedxhit dist", 900, 400);
476 cdedxlayer.Divide(2, 1);
478 for (
int il = 0; il < 2; il++) {
479 int minlay = 0, maxlay = 0;
481 minlay = std::stoi(hdedxlay[il]->GetXaxis()->GetTitle());
482 maxlay = std::stoi(hdedxlay[il]->GetYaxis()->GetTitle());
483 double lowedge = hdedxlay[il]->GetXaxis()->GetBinLowEdge(minlay);
484 double upedge = hdedxlay[il]->GetXaxis()->GetBinUpEdge(maxlay);
485 hdedxlay[il]->SetTitle(Form(
"%s, trunc #rightarrow: %0.02f - %0.02f;dedxhit;entries", hdedxlay[il]->GetTitle(), lowedge, upedge));
488 cdedxlayer.cd(il + 1);
489 hdedxlay[il]->SetFillColor(kYellow);
490 hdedxlay[il]->Draw(
"histo");
493 TH1D* hdedxlayC = (TH1D*)hdedxlay[il]->Clone(Form(
"hdedxlayC%d", il));
494 hdedxlayC->GetXaxis()->SetRange(minlay, maxlay);
495 hdedxlayC->SetFillColor(kAzure + 1);
496 hdedxlayC->Draw(
"same histo");
500 cdedxlayer.SaveAs(Form(
"cdcdedx_1dcell_dedxlay%s.pdf",
m_suffix.data()));
501 cdedxlayer.SaveAs(Form(
"cdcdedx_1dcell_dedxlay%s.root",
m_suffix.data()));
508 TCanvas ceadist(
"ceadist",
"Enta distributions", 800, 400);
509 ceadist.Divide(2, 1);
511 for (
int il = 0; il < 2; il++) {
515 hentalay[il]->SetFillColor(kYellow);
516 hentalay[il]->Draw(
"hist");
519 TCanvas cptcos(
"cptcos",
"pt vs costh dist.", 400, 400);
521 hptcosth->Draw(
"colz");
523 cptcos.SaveAs(Form(
"cdcdedx_ptcosth_%s.pdf",
m_suffix.data()));
524 ceadist.SaveAs(Form(
"cdcdedx_1dcell_enta%s.pdf",
m_suffix.data()));
525 ceadist.SaveAs(Form(
"cdcdedx_1dcell_enta%s.root",
m_suffix.data()));
532 TH1D* hconst, *hconstvar;
538 std::string title = Form(
"calibration const dist: %s: (%s); entaRS (#alpha); entries",
m_label[il].data(),
m_runExp.data());
539 hconst->SetTitle(Form(
"%s", title.data()));
541 hconstvar =
new TH1D(Form(
"hconstvar%s",
m_label[il].data()),
"",
m_eaBinLocal[il], nvarBins);
542 title = Form(
"calibration const dist (var bins): %s: (%s); entaRS (#alpha);entries",
m_label[il].data(),
m_runExp.data());
543 hconstvar->SetTitle(Form(
"%s", title.data()));
547 hconstvar->SetBinContent(iea + 1, tempconst.at(iea));
550 for (
int jea = 0; jea <
m_eaBin; jea++) hconst->SetBinContent(jea + 1, layerconst.at(jea));
552 gStyle->SetOptStat(
"ne");
553 TCanvas cconst(
"cconst",
"Calirbation Constants", 800, 400);
556 cconst.SetWindowSize(1000, 800);
560 hconst->SetFillColor(kYellow);
561 hconst->Draw(
"histo");
564 hconstvar->SetFillColor(kBlue);
565 hconstvar->Draw(
"hist");
567 cconst.SaveAs(Form(
"cdcdedx_1dcell_relconst%s_%s.pdf",
m_label[il].data(),
m_suffix.data()));
568 cconst.SaveAs(Form(
"cdcdedx_1dcell_relconst%s_%s.root",
m_label[il].data(),
m_suffix.data()));
579 TH1D* hnewconst[2], *holdconst[2];
580 double min[2], max[2];
582 for (
unsigned int il = 0; il < 2; il++) {
585 std::string title = Form(
"final calibration const dist (%s): %s; entaRS (#alpha); entries",
m_label[il].data(),
m_runExp.data());
587 hnewconst[il]->SetTitle(Form(
"%s", title.data()));
589 title = Form(
"old calibration const dist (%s): %s; entaRS (#alpha); entries",
m_label[il].data(),
m_runExp.data());
591 holdconst[il]->SetTitle(Form(
"%s", title.data()));
593 for (
unsigned int iea = 0; iea < nbins; iea++) {
595 holdconst[il]->SetBinContent(iea + 1, prev);
596 hnewconst[il]->SetBinContent(iea + 1,
m_onedcors[il][iea]);
598 min[il] = hnewconst[il]->GetMinimum();
599 max[il] = hnewconst[il]->GetMaximum();
603 if (max[1] < max[0])max[1] = max[0];
604 if (min[1] > min[0])min[1] = min[0];
606 gStyle->SetOptStat(
"ne");
607 TCanvas cfconst(
"cfconst",
"Final calirbation constants", 800, 400);
608 cfconst.Divide(2, 1);
610 for (
int il = 0; il < 2; il++) {
612 hnewconst[il]->GetYaxis()->SetRangeUser(min[1] * 0.95, max[1] * 1.05);
613 hnewconst[il]->SetLineColor(kBlack);
614 hnewconst[il]->Draw(
"histo");
615 holdconst[il]->SetLineColor(kRed);
616 holdconst[il]->Draw(
"histo same");
618 auto legend =
new TLegend(0.4, 0.75, 0.56, 0.85);
619 legend->AddEntry(holdconst[il],
"Old",
"lep");
620 legend->AddEntry(hnewconst[il],
"New",
"lep");
624 cfconst.SaveAs(Form(
"cdcdedx_1dcell_fconsts%s.pdf",
m_suffix.data()));
625 cfconst.SaveAs(Form(
"cdcdedx_1dcell_fconsts%s.root",
m_suffix.data()));
627 for (
int il = 0; il < 2; il++) {
628 delete hnewconst[il];
629 delete holdconst[il];
637 TCanvas cstats(
"cstats",
"cstats", 1000, 500);
638 cstats.SetBatch(kTRUE);
642 auto hestats = getObjectPtr<TH1I>(
"hestats");
644 hestats->SetName(Form(
"hestats_%s",
m_suffix.data()));
645 hestats->SetStats(0);
646 hestats->DrawCopy(
"");
650 auto htstats = getObjectPtr<TH1I>(
"htstats");
652 hestats->SetName(Form(
"htstats_%s",
m_suffix.data()));
653 htstats->DrawCopy(
"");
654 hestats->SetStats(0);
656 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)
function to plot merging factor
double m_truncMax
upper threshold on truncation
int m_binSplit
multiply nbins by this factor in full range
std::array< std::vector< int >, 2 > m_binIndex
symm/Var bin numbers
double m_truncMin
lower threshold on truncation
double m_adjustFac
factor with that one what to adjust baseline
void getTruncatedBins(TH1D *hist, int &binlow, int &binhigh)
function to get bins of truncation from histogram
void CreateBinMapping()
class function to create vectors for bin mapping (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
enta 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 histogram 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 symmetry 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 function to set rotation symmetry
virtual EResult calibrate() override
1D cell algorithm
void plotQaPars(TH1D *hentalay[2], TH2D *hptcosth)
function to draw pt vs costh and entrance angle distribution for Inner/Outer layer
double m_dedxMax
upper edge of dedxhit
void createPayload()
function 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])
function 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.