Belle II Software  release-08-01-10
CDCDedxWireGainAlgorithm.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <reconstruction/calibration/CDCDedxWireGainAlgorithm.h>
10 
11 using namespace Belle2;
12 using namespace CDC;
13 using namespace std;
14 
15 //-----------------------------------------------------------------
16 // Implementation
17 //-----------------------------------------------------------------
19  CalibrationAlgorithm("CDCDedxElectronCollector"),
20  m_isMakePlots(true),
21  m_isMerge(true),
22  m_isWireTruc(false),
23  m_dedxBins(250),
24  m_dedxMin(0.0),
25  m_dedxMax(5.0),
26  m_truncMin(0.05),
27  m_truncMax(0.75),
28  m_suffix("")
29 {
30  // Set module properties
31  setDescription("A calibration algorithm for CDC dE/dx wire gains");
32 }
33 
34 //-----------------------------------------------------------------
35 // Run the calibration
36 //-----------------------------------------------------------------
38 {
39 
40  //if not checking then copy function here;
41  getExpRunInfo();
42 
43  if (!m_DBBadWires.isValid() || !m_DBWireGains.isValid())
44  B2FATAL("There is no valid payload for BadWires and/or Wirgain");
45 
46  // Get data objects
47  auto ttree = getObjectPtr<TTree>("tree");
48  if (ttree->GetEntries() < 100)return c_NotEnoughData;
49 
50  vector<int>* wire = 0;
51  ttree->SetBranchAddress("wire", &wire);
52 
53  vector<double>* dedxhit = 0;
54  ttree->SetBranchAddress("dedxhit", &dedxhit);
55 
56  // dedxhit vector to store dE/dx values for each wire
57  map<int, vector<double>> wirededx;
58 
59  //IL = Inner Layer and OL = Outer Layer
60  array<TH1D*, 2> hdedxL;
61  string label[2] = {"IL", "OL"};
62  for (int il = 0; il < 2; il++)
63  hdedxL[il] = new TH1D(Form("hdedx%s_%s", label[il].data(), m_suffix.data()), "", m_dedxBins, m_dedxMin, m_dedxMax);
64 
65  for (int i = 0; i < ttree->GetEntries(); ++i) {
66  ttree->GetEvent(i);
67  for (unsigned int j = 0; j < wire->size(); ++j) {
68  int jwire = wire->at(j);
69  double jhitdedx = dedxhit->at(j);
70  wirededx[jwire].push_back(jhitdedx);
71  //wire # 1279 end of inner layers
72  if (jwire < 1280) hdedxL[0]->Fill(jhitdedx);
73  else hdedxL[1]->Fill(jhitdedx);
74  }
75  }
76 
77  //return if ~10% low stats or dead wires
78  int minstat = 0;
79  for (unsigned int jw = 0; jw < c_nwireCDC; ++jw)
80  if (wirededx[jw].size() <= 100) minstat++;
81 
82  if (minstat > 0.10 * c_nwireCDC) return c_NotEnoughData;
83 
84  //25-75 is average bin # for trunction
85  array<unsigned int, 2> minbinL, maxbinL;
86  for (int il = 0; il < 2; il++) {
87  getTruncatedBins(hdedxL[il], minbinL[il], maxbinL[il]);
88  hdedxL[il]->SetTitle(Form("%s(%s);%d;%d", label[il].data(), m_suffix.data(), minbinL[il], maxbinL[il]));
89  }
90 
91  vector<double> vrel_mean;
92  vector<double> vdedx_means;
93 
94  vector<TH1D*> hdedxhit(c_nwireCDC);
95 
96  B2INFO("Creating CDCGeometryPar object");
98 
99  vector<double> layermean(c_maxNSenseLayers);
100 
101  int activelayers = 0;
102  double layeravg = 0.0;
103 
104  int jwire = -1;
105  for (unsigned int il = 0; il < c_maxNSenseLayers; ++il) {
106 
107  int activewires = 0;
108  layermean[il] = 0.0;
109 
110  for (unsigned int iw = 0; iw < cdcgeo.nWiresInLayer(il); ++iw) {
111 
112  jwire++;
113  hdedxhit[jwire] = new TH1D(Form("h%s_w%d", m_suffix.data(), jwire), "", m_dedxBins, m_dedxMin, m_dedxMax);
114 
115  for (unsigned int ih = 0; ih < wirededx[jwire].size(); ++ih) {
116  hdedxhit[jwire]->Fill(wirededx[jwire][ih]);
117  }
118 
119  unsigned int minbin, maxbin;
120  if (!m_isWireTruc) {
121  getTruncatedBins(hdedxhit[jwire], minbin, maxbin);
122  } else {
123  if (jwire < 1280) {
124  minbin = minbinL[0];
125  maxbin = maxbinL[0];
126  } else {
127  minbin = minbinL[1];
128  maxbin = maxbinL[1];
129  }
130  }
131  hdedxhit[jwire]->SetTitle(Form("dedxhit-dist, wire: %d (%s);%d;%d", jwire, m_suffix.data(), minbin, maxbin));
132 
133  double dedxmean;
134  if (m_DBBadWires->getBadWireStatus(jwire) == kTRUE) dedxmean = 0.0;
135 
136  else dedxmean = getTruncationMean(hdedxhit[jwire], minbin, maxbin);
137  vrel_mean.push_back(dedxmean);
138 
139  double prewg = m_DBWireGains->getWireGain(jwire);
140  if (prewg > 0.0 && m_isMerge) {
141  vdedx_means.push_back(dedxmean * prewg);
142  B2INFO("merged-wireGain: [" << jwire << "], prewgvious = " << prewg << ", rel = " << dedxmean << ", merged = " << vdedx_means.at(
143  jwire));
144  } else vdedx_means.push_back(dedxmean);
145 
146  //calculate layer average for active wires
147  if (vdedx_means.at(jwire) > 0) {
148  layermean[il] += vdedx_means.at(jwire);
149  activewires++;
150  }
151  }
152 
153  if (activewires > 0) layermean[il] /= activewires;
154  else layermean[il] = 1.0;
155 
156  //calculate outer layer average for active layer
157  if (il >= 8 && layermean[il] > 0) {
158  layeravg += layermean[il];
159  activelayers++;
160  }
161 
162  }
163 
164  //normalisation of wiregains to get outergain ~1.0
165  if (activelayers > 0) layeravg /= activelayers;
166 
167  for (unsigned int iw = 0; iw < c_nwireCDC; ++iw) {
168  vrel_mean.at(iw) /= layeravg;
169  vdedx_means.at(iw) /= layeravg;
170  }
171 
172  if (m_isMakePlots) {
173 
174  //1. Inner and Outer layer dE/dx distributions
175  plotLayerDist(hdedxL);
176 
177  //2. wiredist -> 14336 (good, bad)
178  plotWireDist(hdedxhit, vrel_mean);
179 
180  //3. wiregains draw (1D, dist)
181  plotWireGain(vdedx_means, vrel_mean, layeravg);
182 
183  //4. layer gain plot
184  plotLayerGain(layermean, layeravg);
185 
186  //5. wiregains per layer
187  plotWGPerLayer(vdedx_means, layermean, layeravg);
188 
189  //6. Statstics plot
190  plotEventStats();
191  }
192 
193  createPayload(vdedx_means);
194  m_suffix.clear();
195  return c_OK;
196 }
197 
198 //------------------------------------
200 {
201 
202  int cruns = 0;
203  for (auto expRun : getRunList()) {
204  if (cruns == 0) B2INFO("CDCDedxWireGain: start exp " << expRun.first << " and run " << expRun.second << "");
205  cruns++;
206  }
207 
208  const auto erStart = getRunList()[0];
209  int estart = erStart.first;
210  int rstart = erStart.second;
211 
212  const auto erEnd = getRunList()[cruns - 1];
213  int rend = erEnd.second;
214 
215  updateDBObjPtrs(1, rstart, estart);
216 
217  if (m_suffix.length() > 0) m_suffix = Form("%s_e%d_r%dr%d", m_suffix.data(), estart, rstart, rend);
218  else m_suffix = Form("e%d_r%dr%d", estart, rstart, rend);
219 }
220 
221 //--------------------------
222 void CDCDedxWireGainAlgorithm::createPayload(const vector<double>& vdedx_means)
223 {
224 
225  B2INFO("dE/dx Calibration done for " << vdedx_means.size() << " CDC wires");
226  CDCDedxWireGain* gains = new CDCDedxWireGain(vdedx_means);
227  saveCalibration(gains, "CDCDedxWireGain");
228 }
229 
230 //--------------------------
231 double CDCDedxWireGainAlgorithm::getTruncationMean(TH1D* hdedxhit, int binlow, int binhigh)
232 {
233 
234  //calculating truncation average
235  if (hdedxhit->Integral() < 100) return 1.0;
236 
237  if (binlow <= 0 || binhigh > hdedxhit->GetNbinsX()) return 1.0;
238 
239  double binweights = 0., sumofbc = 0.;
240  for (int ibin = binlow; ibin <= binhigh; ibin++) {
241  double bcdedx = hdedxhit->GetBinContent(ibin);
242  if (bcdedx > 0) {
243  binweights += (bcdedx * hdedxhit->GetBinCenter(ibin));
244  sumofbc += bcdedx;
245  }
246  }
247  if (sumofbc > 0) return binweights / sumofbc;
248  else return 1.0;
249 }
250 
251 //--------------------------
252 void CDCDedxWireGainAlgorithm::getTruncatedBins(TH1D* hdedxhit, unsigned int& binlow, unsigned int& binhigh)
253 {
254 
255  //calculating truncation average
256  double sum = hdedxhit->Integral();
257  if (sum <= 0 || hdedxhit->GetNbinsX() <= 0) {
258  binlow = 1; binhigh = 1;
259  return ;
260  }
261 
262  binlow = 1.0; binhigh = 1.0;
263  double sumPer5 = 0.0, sumPer75 = 0.0;
264  for (int ibin = 1; ibin <= hdedxhit->GetNbinsX(); ibin++) {
265  double bcdedx = hdedxhit->GetBinContent(ibin);
266  if (sumPer5 <= m_truncMin * sum) {
267  sumPer5 += bcdedx;
268  binlow = ibin;
269  }
270  if (sumPer75 <= m_truncMax * sum) {
271  sumPer75 += bcdedx;
272  binhigh = ibin;
273  }
274  }
275  return;
276 }
277 
278 //--------------------------
279 void CDCDedxWireGainAlgorithm::plotLayerDist(array<TH1D*, 2> hdedxL)
280 {
281 
282  TCanvas cldedx("cldedx", "IL/OL dedxhit dist", 900, 400);
283  cldedx.Divide(2, 1);
284 
285  for (int il = 0; il < 2; il++) {
286  cldedx.cd(il + 1);
287 
288  int minbin = stoi(hdedxL[il]->GetXaxis()->GetTitle());
289  int maxbin = stoi(hdedxL[il]->GetYaxis()->GetTitle());
290  double lowedge = hdedxL[il]->GetXaxis()->GetBinLowEdge(minbin);
291  double upedge = hdedxL[il]->GetXaxis()->GetBinUpEdge(maxbin);
292 
293  hdedxL[il]->SetFillColor(kYellow);
294  hdedxL[il]->SetTitle(Form("%s, trunc(%0.02f - %0.02f);dedxhit;entries", hdedxL[il]->GetTitle(), lowedge, upedge));
295  hdedxL[il]->Draw("histo");
296 
297  TH1D* hdedxLC = (TH1D*)hdedxL[il]->Clone(Form("%s_c", hdedxL[il]->GetName()));
298  hdedxLC->GetXaxis()->SetRange(minbin, maxbin);
299  hdedxLC->SetFillColor(kAzure + 1);
300  hdedxLC->Draw("same histo");
301  }
302 
303  cldedx.SaveAs(Form("cdcdedx_wgcal_layerdedx_%s.pdf", m_suffix.data()));
304 }
305 
306 //------------------------------------
307 void CDCDedxWireGainAlgorithm::plotWireDist(const vector<TH1D*>& hist, const vector<double>& vrel_mean)
308 {
309 
310  TCanvas ctmp(Form("cdcdedx_%s", m_suffix.data()), "", 1200, 1200);
311  ctmp.Divide(4, 4);
312  ctmp.SetBatch(kTRUE);
313 
314  stringstream psname;
315  psname << Form("cdcdedx_wgcal_%s.pdf[", m_suffix.data());
316  ctmp.Print(psname.str().c_str());
317  psname.str("");
318  psname << Form("cdcdedx_wgcal_%s.pdf", m_suffix.data());
319 
320  for (unsigned int iw = 0; iw < hist.size(); iw++) {
321 
322  int minbin = stoi(hist[iw]->GetXaxis()->GetTitle());
323  int maxbin = stoi(hist[iw]->GetYaxis()->GetTitle());
324 
325  hist[iw]->SetFillColor(kYellow - 9);
326  hist[iw]->SetTitle(Form("%s, rel. #mu_{trunc} %0.03f;dedxhit;entries", hist[iw]->GetTitle(), vrel_mean.at(iw)));
327 
328  if (m_DBBadWires->getBadWireStatus(iw) == kTRUE) {
329  hist[iw]->SetLineColor(kRed);
330  hist[iw]->SetLineWidth(2);
331  }
332  ctmp.cd(iw % 16 + 1);
333  hist[iw]->DrawCopy();
334 
335  TH1D* hdedxhitC = (TH1D*)hist[iw]->Clone(Form("%sC", hist[iw]->GetName()));
336  hdedxhitC->GetXaxis()->SetRange(minbin, maxbin);
337  hdedxhitC->SetFillColor(kAzure + 1);
338  hdedxhitC->DrawCopy("same histo");
339 
340  if (((iw + 1) % 16 == 0) || iw == (hist.size() - 1)) {
341  ctmp.Print(psname.str().c_str());
342  ctmp.Clear("D");
343  }
344  delete hist[iw];
345  delete hdedxhitC;
346  }
347 
348  psname.str("");
349  psname << Form("cdcdedx_wgcal_%s.pdf]", m_suffix.data());
350  ctmp.Print(psname.str().c_str());
351 }
352 
353 //------------------------------------
354 void CDCDedxWireGainAlgorithm::plotWireGain(const vector<double>& vdedx_means, const vector<double>& vrel_mean, double layeravg)
355 {
356 
357  //saving final constants in a histograms for validation
358  TCanvas cwconst("cwconst", "", 900, 500);
359  TCanvas cwconstvar("cwconstvar", "", 500, 400);
360 
361  array<TH1D*, 2> hconstpw, hconstpwvar;
362 
363  for (int i = 0; i < 2; i++) {
364 
365  hconstpw[i] = new TH1D(Form("hconstpw_%d_%s", i, m_suffix.data()), "", c_nwireCDC, -0.5, 14335.5);
366  hconstpw[i]->SetTitle(Form("wiregain const (%s); wire numbers;<dedxhit>", m_suffix.data()));
367  if (m_isMerge
368  && i == 0) hconstpw[i]->SetTitle(Form("merged wiregain rel-const (%s), avg = %0.03f; wire numbers;<dedxhit>", m_suffix.data(),
369  layeravg));
370 
371  hconstpwvar[i] = new TH1D(Form("hconstpwvar_%s", m_suffix.data()), "", 400, -0.5, 2.5);
372  hconstpwvar[i]->SetTitle(Form("wiregain const (%s); wire gains; nentries", m_suffix.data()));
373  if (m_isMerge
374  && i == 0) hconstpwvar[i]->SetTitle(Form("merged wiregain rel-const (%s), avg = %0.03f; wire gains; nentries", m_suffix.data(),
375  layeravg));
376 
377  for (unsigned int iw = 0; iw < c_nwireCDC; iw++) {
378 
379  double gain = vdedx_means.at(iw);
380  if (m_isMerge && i == 1) gain = vrel_mean.at(iw);
381  hconstpw[i]->SetBinContent(iw + 1, gain);
382  hconstpwvar[i]->Fill(gain);
383 
384  if (iw % 500 == 0) hconstpw[i]->GetXaxis()->SetBinLabel(iw + 1, Form("w%d", iw + 1));
385  }
386 
387  hconstpw[i]->SetLineColor(i * 2 + 2);
388  hconstpw[i]->LabelsOption("u", "X");
389  hconstpw[i]->GetYaxis()->SetRangeUser(-0.1, 3.5);
390  hconstpw[i]->LabelsDeflate();
391 
392  hconstpwvar[i]->SetFillColor(i * 2 + 2);
393  hconstpwvar[i]->Scale(1 / hconstpwvar[i]->GetMaximum());
394 
395  }
396  cwconst.cd();
397  cwconst.SetGridy(1);
398  hconstpw[0]->Draw("");
399  if (m_isMerge) hconstpw[1]->Draw("same");
400 
401  cwconstvar.cd();
402  hconstpwvar[0]->Draw("hist");
403  if (m_isMerge) hconstpwvar[1]->Draw("hist same");
404 
405  cwconst.SaveAs(Form("cdcdedx_wgcal_wireconst_%s.pdf", m_suffix.data()));
406  cwconstvar.SaveAs(Form("cdcdedx_wgcal_wireconstvar_%s.pdf", m_suffix.data()));
407 }
408 
409 //------------------------------------
410 void CDCDedxWireGainAlgorithm::plotLayerGain(const vector<double>& layermean, double layeravg)
411 {
412 
413  TH1D hlayeravg(Form("hlayeravg_%s", m_suffix.data()), "", layermean.size(), -0.5, 55.5);
414  hlayeravg.SetTitle(Form("layer gain avg (%s); layer numbers;<dedxhit>", m_suffix.data()));
415 
416  for (unsigned int il = 0; il < layermean.size(); il++) {
417  hlayeravg.SetBinContent(il + 1, layermean[il]);
418  if (il % 2 == 0 || il == layermean.size() - 1) hlayeravg.GetXaxis()->SetBinLabel(il + 1, Form("L%d", il));
419  }
420 
421  TCanvas clayeravg("clayeravg", "clayeravg", 800, 500);
422  clayeravg.SetGridy(1);
423  clayeravg.cd();
424  gStyle->SetOptStat("ne");
425  hlayeravg.LabelsOption("u", "X");
426  hlayeravg.SetLineColor(kBlue);
427  hlayeravg.GetYaxis()->SetRangeUser(-0.1, 3.5);
428  hlayeravg.SetTitle(Form("%s, avg = %0.03f (abs)", hlayeravg.GetTitle(), layeravg));
429  hlayeravg.LabelsDeflate();
430  hlayeravg.Draw("");
431  TLine* tl = new TLine(-0.5, layeravg, 55.5, layeravg);
432  tl->SetLineColor(kRed);
433  tl->DrawClone("same");
434  clayeravg.SaveAs(Form("cdcdedx_wgcal_layeravg_%s.pdf", m_suffix.data()));
435  delete tl;
436 }
437 
438 //------------------------------------
439 void CDCDedxWireGainAlgorithm::plotWGPerLayer(const vector<double>& vdedx_means, const vector<double>& layermean, double layeravg)
440 {
441 
443 
444  TCanvas clconst("clconst", "", 800, 500);
445  clconst.Divide(2, 2);
446  clconst.SetBatch(kTRUE);
447 
448  stringstream psnameL;
449  psnameL << Form("cdcdedx_wgcal_layerconst_%s.pdf[", m_suffix.data());
450  clconst.Print(psnameL.str().c_str());
451  psnameL.str(""); psnameL << Form("cdcdedx_wgcal_layerconst_%s.pdf", m_suffix.data());
452 
453  int jwire = 0;
454 
455  for (unsigned int il = 0; il < layermean.size(); ++il) {
456 
457  unsigned int nwires = cdcgeo.nWiresInLayer(il);
458  TH1D hconstpl(Form("hconstpwvar_l%d_%s", il, m_suffix.data()), "", nwires, jwire, jwire + nwires);
459  hconstpl.SetTitle(Form("abs-const, layer: %d (%s); wire numbers;<dedxhit>", il, m_suffix.data()));
460 
461  for (unsigned int iw = 0; iw < nwires; ++iw) {
462  hconstpl.SetBinContent(iw + 1, vdedx_means.at(jwire));
463  if (il < 32) {
464  if (iw % 10 == 0) hconstpl.GetXaxis()->SetBinLabel(iw + 1, Form("w%d", jwire));
465  } else {
466  if (iw % 15 == 0) hconstpl.GetXaxis()->SetBinLabel(iw + 1, Form("w%d", jwire));
467  }
468  jwire++;
469  }
470 
471  double lmean = layermean.at(il) / layeravg;
472 
473  clconst.cd(il % 4 + 1);
474  gStyle->SetOptStat("ne");
475 
476  hconstpl.SetTitle(Form("%s, avg = %0.03f", hconstpl.GetTitle(), lmean));
477 
478  if (il < 8) hconstpl.GetYaxis()->SetRangeUser(-0.1, 4.0);
479  else hconstpl.GetYaxis()->SetRangeUser(-0.1, 2.0);
480  hconstpl.SetFillColor(kAzure - 1);
481  hconstpl.LabelsOption("u", "X");
482  hconstpl.DrawCopy("hist");
483 
484  TLine* tlc = new TLine(jwire - nwires, lmean, jwire, lmean);
485  tlc->SetLineColor(kRed);
486  tlc->DrawClone("same");
487 
488  if ((il + 1) % 4 == 0 || (il + 1) == layermean.size()) {
489  clconst.Print(psnameL.str().c_str());
490  clconst.Clear("D");
491  }
492 
493  delete tlc;
494  }
495 
496  psnameL.str("");
497  psnameL << Form("cdcdedx_wgcal_layerconst_%s.pdf]", m_suffix.data());
498  clconst.Print(psnameL.str().c_str());
499 }
500 
501 //--------------------------
503 {
504 
505  TCanvas cstats("cstats", "cstats", 800, 400);
506  cstats.SetBatch(kTRUE);
507  cstats.Divide(2, 1);
508 
509  cstats.cd(1);
510  auto hestats = getObjectPtr<TH1I>("hestats");
511  if (hestats) {
512  hestats->SetName(Form("hestats_%s", m_suffix.data()));
513  hestats->SetStats(0);
514  hestats->DrawCopy("");
515  }
516 
517  cstats.cd(2);
518  auto htstats = getObjectPtr<TH1I>("htstats");
519  if (htstats) {
520  htstats->SetName(Form("htstats_%s", m_suffix.data()));
521  htstats->SetStats(0);
522  htstats->DrawCopy("");
523  }
524 
525  cstats.Print(Form("cdcdedx_wgcal_stats_%s.pdf", m_suffix.data()));
526 }
void plotWGPerLayer(const std::vector< double > &vdedx_means, const std::vector< double > &layermean, double layeravg)
function to draw WG per layer
void plotLayerGain(const std::vector< double > &layermean, double layeravg)
function to draw layer gains
void plotLayerDist(std::array< TH1D *, 2 > hdedxL)
function to draw dE/dx for inner/outer layer
bool m_isMerge
merge payload at the time of calibration
double m_truncMax
max trunc range for mean
double m_truncMin
min trunc range for mean
void getTruncatedBins(TH1D *hdedxhit, unsigned int &binlow, unsigned int &binhigh)
function to get bins of trunction from histogram
void plotWireGain(const std::vector< double > &vdedx_means, const std::vector< double > &vrel_mean, double layeravg)
function to draw wire gains
void getExpRunInfo()
function to get extract calibration run/exp
void createPayload(const std::vector< double > &vdedx_tmeans)
function to finally store new payload after full calibration
void plotWireDist(const std::vector< TH1D * > &hist, const std::vector< double > &vrel_mean)
function to draw dE/dx histograms for each wire
bool m_isMakePlots
Save arithmetic and truncated mean for the 'dedx' values.
DBObjPtr< CDCDedxBadWires > m_DBBadWires
Bad wire DB object.
std::string m_suffix
suffix string to seperate plots
double getTruncationMean(TH1D *hdedxhit, int binlow, int binhigh)
function to get mean of trunction from histogram
int m_dedxBins
number of bins for dedx histogram
DBObjPtr< CDCGeometry > m_cdcGeo
Geometry of CDC.
CDCDedxWireGainAlgorithm()
Constructor: Sets the description, the properties and the parameters of the algorithm.
DBObjPtr< CDCDedxWireGain > m_DBWireGains
Wire gain DB object.
void plotEventStats()
function to draw statstics
virtual EResult calibrate() override
Wire gain algorithm.
double m_dedxMax
max dedx range for wiregain cal
double m_dedxMin
min dedx range for wiregain cal
bool m_isWireTruc
method of trunc range for mean
dE/dx wire gain calibration constants
The Class for CDC Geometry Parameters.
unsigned nWiresInLayer(int layerId) const
Returns wire numbers in a layer.
static CDCGeometryPar & Instance(const CDCGeometry *=nullptr)
Static method to get a reference to the CDCGeometryPar instance.
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)
EResult
The result of calibration.
@ c_OK
Finished successfuly =0 in Python.
@ c_NotEnoughData
Needs more data =2 in Python.
const std::vector< Calibration::ExpRun > & getRunList() const
Get the list of runs for which calibration is called.
Abstract base class for different kinds of events.