Belle II Software  release-08-01-10
eclMergingCrystalTimingAlgorithm.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 /* Own header. */
10 #include <ecl/calibration/eclMergingCrystalTimingAlgorithm.h>
11 
12 /* ECL headers. */
13 #include <ecl/dbobjects/ECLCrystalCalib.h>
14 #include <ecl/dbobjects/ECLReferenceCrystalPerCrateCalib.h>
15 #include <ecl/digitization/EclConfiguration.h>
16 #include <ecl/mapper/ECLChannelMapper.h>
17 
18 /* ROOT headers. */
19 #include <TDirectory.h>
20 #include <TFile.h>
21 #include <TH1F.h>
22 #include <TString.h>
23 
24 using namespace std;
25 using namespace Belle2;
26 using namespace ECL;
27 using namespace Calibration;
28 
30 eclMergingCrystalTimingAlgorithm::eclMergingCrystalTimingAlgorithm():
31  CalibrationAlgorithm("DummyCollector"),
32  readPrevCrysPayload(false),
33  m_ECLCrystalTimeOffsetBhabha("ECLCrystalTimeOffsetBhabha"),
34  m_ECLCrystalTimeOffsetBhabhaGamma("ECLCrystalTimeOffsetBhabhaGamma"),
35  m_ECLCrystalTimeOffsetCosmic("ECLCrystalTimeOffsetCosmic"),
36  m_ECLReferenceCrystalPerCrateCalib("ECLReferenceCrystalPerCrateCalib"),
37  m_ECLCrateTimeOffset("ECLCrateTimeOffset")
38 {
40  "Perform time calibration of ecl crystals by combining previous values from the DB for different calibrations."
41  );
42 }
43 
45 {
47  B2INFO("readPrevCrysPayload = " << readPrevCrysPayload);
48 
49  //------------------------------------------------------------------------
50  // Get the input run list to use to update the DBObjectPtrs
51  auto runs = getRunList();
52  /* Take the first run. For the crystal cosmic calibrations, because of the crate
53  calibrations, there is not a known correct run to use within the range. */
54  ExpRun chosenRun = runs.front();
55  B2INFO("merging using the ExpRun (" << chosenRun.second << "," << chosenRun.first << ")");
56  // After here your DBObjPtrs are correct
57  updateDBObjPtrs(1, chosenRun.second, chosenRun.first);
58 
59 
60  //------------------------------------------------------------------------
61  /* With the database set up, load the ecl channel mapper to access the
62  crystal to crate mapping information */
63  unique_ptr<ECLChannelMapper> crystalMapper(new ECL::ECLChannelMapper());
64  crystalMapper->initFromDB();
65 
66  //------------------------------------------------------------------------
67  // Test the DBObjects we want to exist and fail if not all of them do.
68  bool allObjectsFound = true;
69 
71  // Check that the payloads we want to merge are sufficiently loaded
73  allObjectsFound = false;
74  B2ERROR("No valid DBObject found for 'ECLCrystalTimeOffsetBhabha'");
75  }
77  allObjectsFound = false;
78  B2ERROR("No valid DBObject found for 'ECLCrystalTimeOffsetBhabhaGamma'");
79  }
81  allObjectsFound = false;
82  B2ERROR("No valid DBObject found for 'ECLCrystalTimeOffsetCosmic'");
83  }
84 
85  // Check that the reference crystal payload is loaded
87  allObjectsFound = false;
88  B2ERROR("No valid DBObject found for 'ECLReferenceCrystalPerCrateCalib'");
89  }
90 
91  // Check that the crate payload is loaded (used for transforming cosmic payload)
92  if (!m_ECLCrateTimeOffset) {
93  allObjectsFound = false;
94  B2ERROR("No valid DBObject found for 'ECLCrateTimeOffset'");
95  }
96 
97 
98  if (allObjectsFound) {
99  B2INFO("Valid objects found for 'ECLCrystalTimeOffsetBhabha', 'ECLCrystalTimeOffsetBhabhaGamma' and 'ECLCrystalTimeOffsetCosmic')");
100  B2INFO("Valid object found for 'ECLReferenceCrystalPerCrateCalib'");
101  B2INFO("Valid object found for 'ECLCrateTimeOffset'");
102  } else {
103  B2INFO("Exiting with failure");
104  return c_Failure;
105  }
106 
107 
108  /* 1/(4fRF) = 0.4913 ns/clock tick, where fRF is the accelerator RF frequency.
109  Same for all crystals. */
110  const double TICKS_TO_NS = 1.0 / (4.0 * EclConfiguration::getRF()) * 1e3;
111 
112 
113 
114  // Set the rootfile name
115  bool minRunNumBool = false;
116  bool maxRunNumBool = false;
117  int minRunNum = -1;
118  int maxRunNum = -1;
119  int minExpNum = -1;
120  int maxExpNum = -1;
121  for (auto expRun : getRunList()) {
122  int expNumber = expRun.first;
123  int runNumber = expRun.second;
124  if (!minRunNumBool) {
125  minExpNum = expNumber;
126  minRunNum = runNumber;
127  minRunNumBool = true;
128  }
129  if (!maxRunNumBool) {
130  maxExpNum = expNumber;
131  maxRunNum = runNumber;
132  maxRunNumBool = true;
133  }
134  if (((minRunNum > runNumber) && (minExpNum >= expNumber)) ||
135  (minExpNum > expNumber)) {
136  minExpNum = expNumber;
137  minRunNum = runNumber;
138  }
139  if (((maxRunNum < runNumber) && (maxExpNum <= expNumber)) ||
140  (maxExpNum < expNumber))
141 
142  {
143  maxExpNum = expNumber;
144  maxRunNum = runNumber;
145  }
146  }
147 
148  string debugFilenameBase = "ECLCrystalTimeOffsetMerged";
149  B2INFO("debugFilenameBase = " << debugFilenameBase);
150  string runNumsString = string("_") + to_string(minExpNum) + "_" + to_string(minRunNum) + string("-") +
151  to_string(maxExpNum) + "_" + to_string(maxRunNum);
152  string debugFilename = debugFilenameBase + runNumsString + string(".root");
153 
154 
155 
156 
157  //------------------------------------------------------------------------
159  vector<float> bhabhaCalib = m_ECLCrystalTimeOffsetBhabha->getCalibVector();
160  vector<float> bhabhaCalibUnc = m_ECLCrystalTimeOffsetBhabha->getCalibUncVector(); // Negative uncertainties are flags of bad fits
161 
162  vector<float> bhabhaGammaCalib = m_ECLCrystalTimeOffsetBhabhaGamma->getCalibVector();
163  vector<float> bhabhaGammaCalibUnc = m_ECLCrystalTimeOffsetBhabhaGamma->getCalibUncVector(); // Negative uncertainties can be flags
164 
165  vector<float> cosmicCalib = m_ECLCrystalTimeOffsetCosmic->getCalibVector();
166  vector<float> cosmicCalibUnc = m_ECLCrystalTimeOffsetCosmic->getCalibUncVector();
167 
168  B2INFO("Loaded 'ECLCrystalTimeOffset*' calibrations");
169 
170  // Get the list of reference crystals as special case crystals
171  vector<short> refCrystalPerCrate = m_ECLReferenceCrystalPerCrateCalib->getReferenceCrystals();
172 
173  B2INFO("Loaded 'ECLReferenceCrystalPerCrateCalib' calibration");
174 
175  vector<float> crateCalib = m_ECLCrateTimeOffset->getCalibVector();
176 
177  B2INFO("Loaded 'ECLCrateTimeOffset' calibration");
178 
179 
180  // Get the previous crystal payloads
181  DBObjPtr<Belle2::ECLCrystalCalib> customPrevCrystalTimeObject("ECLCrystalTimeOffsetPreviousValues");
182  vector<float> prevValuesCrys(ECLElementNumbers::c_NCrystals);
183  vector<float> prevValuesCrysUnc(ECLElementNumbers::c_NCrystals);
184 
185  DBObjPtr<Belle2::ECLCrystalCalib> customPrevBhabhaCrystalTimeObject("ECLCrystalTimeOffsetBhabhaPreviousValues");
186  vector<float> prevBhabhaValuesCrys(ECLElementNumbers::c_NCrystals);
187  vector<float> prevBhabhaValuesCrysUnc(ECLElementNumbers::c_NCrystals);
188 
189  if (readPrevCrysPayload) {
190  //..Get vectors of values from the payloads
191  prevValuesCrys = customPrevCrystalTimeObject->getCalibVector();
192  prevValuesCrysUnc = customPrevCrystalTimeObject->getCalibUncVector();
193 
194  prevBhabhaValuesCrys = customPrevBhabhaCrystalTimeObject->getCalibVector();
195  prevBhabhaValuesCrysUnc = customPrevBhabhaCrystalTimeObject->getCalibUncVector();
196 
197  //..Print out a few values for quality control
198  B2INFO("Previous values read from database. Write out for their values for comparison");
199  for (int ic = 0; ic < ECLElementNumbers::c_NCrystals; ic += 500) {
200  B2INFO("ts custom previous payload: cellID " << ic + 1 << " " << prevValuesCrys[ic]);
201  }
202  B2INFO("Previous bhabha values read from database. Write out for their values for comparison");
203  for (int ic = 0; ic < ECLElementNumbers::c_NCrystals; ic += 500) {
204  B2INFO("ts custom previous bhabha payload: cellID " << ic + 1 << " " << prevBhabhaValuesCrys[ic]);
205  }
206  }
207 
208 
209 
210  //------------------------------------------------------------------------
238  //------------------------------------------------------------------------
239  /* Determine the bhabha and radiative bhabha calibration quality*/
240 
241  vector<bool> bhabhaCalibGoodQuality(m_numCrystals, false);
242  vector<bool> bhabhaGammaCalibGoodQuality(m_numCrystals, false);
243  for (int ic = 0; ic < m_numCrystals; ic++) {
244  /* Define a good bhabha calibration value. This is the
245  uncertainty on the calibration constant (e.g. fit mean),
246  not the guassian width of the timing distribution for
247  that crystal (i.e. resolution).
248 
249  Uncertainty stored as ticks so converted to ns for
250  more human readable cut.*/
251  if (bhabhaCalibUnc[ic] != 0
252  && fabs(bhabhaCalibUnc[ic])*TICKS_TO_NS < 2) {
253  // The limits on the uncertainties are not fully optimized !!!!!!!!!!!!!!!!!!!!!!!!!!
254  // Tighten the uncertainty cut after introduction of bhabha gamma calibration. Perhaps checking if the
255  // value is negative as that flags poor fits / the overall hist mean was used. In these cases,
256  // the bhabha gamma calibration should be used (if it has good stats) but until that calibration is
257  // properly made (not all zeros) then the bhabha calibration should be used instead as the only
258  // other option is the cosmic calibration.
259  bhabhaCalibGoodQuality[ic] = true ;
260  }
261  /* Define a good radiative bhabha calibration value, which
262  should be looser than the bhabha requirements since
263  the radiative bhabha calibration is the backup choice.
264  If the radiative bhabha calibration is not good then
265  we resort to using the cosmic calibration so the
266  radiative bhabha requirements should be fairly loose.
267 
268  Uncertainty stored as ticks so converted to ns for
269  more human readable cut.*/
270  if (bhabhaGammaCalibUnc[ic] != 0
271  && fabs(bhabhaGammaCalibUnc[ic])*TICKS_TO_NS <
272  3.5) { // The limits on the uncertainties are not fully optimized !!!!!!!!!!!!!!!!!!!!!!!!!!
273  bhabhaGammaCalibGoodQuality[ic] = true ;
274  }
275  }
276 
277 
278  /* Loop over all crystals and shift the cosmic crystal calibration by
279  the crate calibration because the cosmic calibration was made
280  assuming the crate calibration is 0.*/
281 
282  vector<float> crateCalibShort(m_numCrates);
283  vector<float> cosmicCalibShifted = cosmicCalib;
284  vector<float> cosmicCalibShiftedUnc = cosmicCalibUnc; // Do not modify uncertainty?
285  for (int ic = 0; ic < m_numCrystals; ic++) {
286  cosmicCalibShifted[ic] -= crateCalib[ic];
287  int crate_id_from_crystal = crystalMapper->getCrateID(ic + 1);
288  crateCalibShort[crate_id_from_crystal - 1] = crateCalib[ic];
289  }
290 
291  for (int icrate = 0; icrate < m_numCrates; icrate++) {
292  B2INFO("crate time calibration for crate " <<
293  icrate + 1 << " = " << crateCalibShort[icrate]);
294  }
295 
296 
297  /* Keep track of the mean value of the crystal calibration constants
298  for each crate. Exclude crystals with bad quality or that have
299  a value of 0 (except reference crystals). */
300  vector<float> meanGoodCrystalCalibPerCrate_bhabha(m_numCrates, 0);
301  vector<float> meanGoodCrystalCalibPerCrate_cosmic(m_numCrates, 0);
302 
303  /* Start num entries at 1 because we will skip all 0s but include
304  the reference crystal (ts=0) by just increasing the counter.
305  We only need a counter for the bhabha events since we want to
306  get the same sample of crystals for both the bhabha and cosmic
307  calibrations.*/
308  vector<short> numGoodCrystalCalibPerCrate_bhabha(m_numCrates, 1);
309 
310 
311  /* Loop over all crystals and save the crystal calibration information
312  for each crate. */
313  for (int ic_base1 = 1; ic_base1 <= m_numCrystals; ic_base1++) {
314  int crate_id_from_crystal = crystalMapper->getCrateID(ic_base1);
315 
316  if (!((bhabhaCalib[ic_base1 - 1] == 0) || (! bhabhaCalibGoodQuality[ic_base1 - 1]))) {
317  meanGoodCrystalCalibPerCrate_bhabha[crate_id_from_crystal - 1] += bhabhaCalib[ic_base1 - 1];
318  meanGoodCrystalCalibPerCrate_cosmic[crate_id_from_crystal - 1] += cosmicCalibShifted[ic_base1 - 1];
319  numGoodCrystalCalibPerCrate_bhabha[crate_id_from_crystal - 1]++ ;
320  }
321  }
322 
323  /* Complete the calculation of the mean by dividing the sum by the number of entries */
324  for (int icrate = 0; icrate < m_numCrates; icrate++) {
325  meanGoodCrystalCalibPerCrate_bhabha[icrate] /= numGoodCrystalCalibPerCrate_bhabha[icrate] ;
326  meanGoodCrystalCalibPerCrate_cosmic[icrate] /= numGoodCrystalCalibPerCrate_bhabha[icrate] ;
327  B2INFO("Mean bhabha crystal calibration for crate " << icrate + 1 << " = " << meanGoodCrystalCalibPerCrate_bhabha[icrate]);
328  B2INFO("Mean cosmic crystal calibration for crate " << icrate + 1 << " = " << meanGoodCrystalCalibPerCrate_cosmic[icrate]);
329  B2INFO("Number of good crystal calibrations for crate" << icrate + 1 << " = " << numGoodCrystalCalibPerCrate_bhabha[icrate]);
330  }
331 
332 
335  /* Loop over all crystals and correct the cosmic calibration by the cosmic calibration
336  for each crate by the average difference to the bhabha calibration. */
337  for (int ic_base1 = 1; ic_base1 <= m_numCrystals; ic_base1++) {
338  int crate_id_from_crystal = crystalMapper->getCrateID(ic_base1);
339  cosmicCalibShifted[ic_base1 - 1] += meanGoodCrystalCalibPerCrate_bhabha[crate_id_from_crystal - 1] -
340  meanGoodCrystalCalibPerCrate_cosmic[crate_id_from_crystal - 1] ;
341  }
342 
343 
344  //------------------------------------------------------------------------
354  vector<float> newCalib(m_numCrystals);
355  vector<float> newCalibUnc(m_numCrystals);
356 
357  vector<float> newBhabhaMinusCustomPrevCalib__cid(m_numCrystals);
358  vector<float> newBhabhaMinusCustomPrevBhabhaCalib__cid(m_numCrystals);
359  vector<float> newBhabhaMinusCustomPrevCalib;
360  vector<float> newBhabhaMinusCustomPrevBhabhaCalib;
361 
362 
363  // Loop over each crystal we want to check
364  for (int ic = 0; ic < m_numCrystals; ic++) {
365  B2DEBUG(29, "Merging crystal " << ic + 1);
366  int crate_id_from_crystal = crystalMapper->getCrateID(ic + 1);
367 
368  // Determine if the current crystal is a reference crystal
369  bool isRefCrys = false ;
370  for (int icrate = 0; icrate < m_numCrates; icrate++) {
371  if (ic + 1 == refCrystalPerCrate[icrate]) {
372  isRefCrys = true;
373  B2INFO("Crystal " << ic + 1 << " is a reference crystal");
374  break;
375  }
376  B2DEBUG(29, "Checked reference crystal for crate " << icrate + 1);
377  }
378  B2DEBUG(29, "Checked ref crystal");
379 
380  string whichCalibUsed = "bhabha";
381 
382  // By default set the new calibration to the bhabha calibration
383  newCalib[ic] = bhabhaCalib[ic];
384  newCalibUnc[ic] = fabs(bhabhaCalibUnc[ic]);
385 
386  double newMinusMerged ;
387  double newMinusBhabha ;
388 
389 
390  /* If the crystal is not a reference crystal and there is no bhabha
391  calib for that crystal then use a different calibration. If the
392  crystal is not a reference crystal and the crystal has a bad bhabha
393  crystal calibration uncertainty. */
394  if ((!isRefCrys) &&
395  ((bhabhaCalib[ic] == 0) || (! bhabhaCalibGoodQuality[ic]))) {
396 
397  /* If there is a radiative bhabha calibration for this crystal then
398  use it otherwise use the cosmic calibration */
399  if (bhabhaGammaCalib[ic] != 0 || bhabhaGammaCalibGoodQuality[ic]) {
400  newCalib[ic] = bhabhaGammaCalib[ic] ;
401  newCalibUnc[ic] = fabs(bhabhaGammaCalibUnc[ic]);
402  whichCalibUsed = "bhabhaGamma";
403  } else {
404  newCalib[ic] = cosmicCalibShifted[ic] ;
405  newCalibUnc[ic] = cosmicCalibShiftedUnc[ic];
406  whichCalibUsed = "cosmic";
407  }
408  } else {
409  newMinusMerged = (newCalib[ic] - prevValuesCrys[ic]) * TICKS_TO_NS;
410  newMinusBhabha = (newCalib[ic] - prevBhabhaValuesCrys[ic]) * TICKS_TO_NS;
411 
412  newBhabhaMinusCustomPrevCalib__cid[ic] = newMinusMerged;
413  newBhabhaMinusCustomPrevBhabhaCalib__cid[ic] = newMinusBhabha;
414  newBhabhaMinusCustomPrevCalib.push_back(newMinusMerged);
415  newBhabhaMinusCustomPrevBhabhaCalib.push_back(newMinusBhabha);
416  }
417 
418  newMinusMerged = (newCalib[ic] - prevValuesCrys[ic]) * TICKS_TO_NS;
419  newMinusBhabha = (newCalib[ic] - prevBhabhaValuesCrys[ic]) * TICKS_TO_NS;
420 
421 
422  B2INFO("Crystal " << ic + 1 << ", crate " << crate_id_from_crystal <<
423  "::: bhabha = " << bhabhaCalib[ic] << "+-" << bhabhaCalibUnc[ic] <<
424  " ticks, rad bhabha = " << bhabhaGammaCalib[ic] << "+-" << bhabhaGammaCalibUnc[ic] <<
425  " ticks, cosmic UNshifted = " << cosmicCalib[ic] << "+-" << cosmicCalibUnc[ic] <<
426  " ticks, cosmic shifted = " << cosmicCalibShifted[ic] << "+-" << cosmicCalibShiftedUnc[ic] <<
427  " ticks. ||| New calib = " << newCalib[ic] << " ticks, selected " << whichCalibUsed);
428  B2INFO(" Crystal " << ic + 1 << ", pre calib ts = " << prevValuesCrys[ic] <<
429  ", pre calib bhabha ts = " << prevBhabhaValuesCrys[ic] <<
430  " ticks ||| new - pre calib ts = " << newMinusMerged <<
431  ", new - pre calib bhabha ts = " << newMinusBhabha << " ns");
432  } // end of setting new calibration for each crystal
433 
434 
435 
436  //------------------------------------------------------------------------
437  //..Histograms of calibrations
438 
439  // Just in case, we remember the current TDirectory so we can return to it
440  TDirectory* executeDir = gDirectory;
441 
442  TString fname = debugFilename;
443  TFile hfile(fname, "recreate");
444 
445  TString htitle = "ECLCrystalTimeOffsetBhabha;cellID;Bhabha ts values [ticks]";
446  TH1F* bhabhaPayload = new TH1F("bhabhaPayload", htitle, m_numCrystals, 1, 8737);
447 
448  htitle = "ECLCrystalTimeOffsetBhabhaGamma;cellID;Radiative bhabha ts values [ticks]";
449  TH1F* bhabhaGammaPayload = new TH1F("bhabhaGammaPayload", htitle, m_numCrystals, 1, 8737);
450 
451  htitle = "ECLCrystalTimeOffsetCosmic : unshifted;cellID;Unshifted cosmic ts values [ticks]";
452  TH1F* cosmicPayload = new TH1F("cosmicUnshiftedPayload", htitle, m_numCrystals, 1, 8737);
453 
454  htitle = "ECLCrystalTimeOffsetCosmic : shifted;cellID;Shifted cosmic ts values [ticks]";
455  TH1F* cosmicShiftedPayload = new TH1F("cosmicShiftedPayload", htitle, m_numCrystals, 1, 8737);
456 
457  htitle = "New ECLCrystalTimeOffset;cellID;New (merged) ts values [ticks]";
458  TH1F* newPayload = new TH1F("newPayload", htitle, m_numCrystals, 1, 8737);
459 
460 
461  htitle = "ECLCrystalTimeOffsetBhabha : 'pre-calib' values;cellID;Pre-calibration bhabha ts values [ticks]";
462  TH1F* tsCustomPrevBhabha_payload = new TH1F("tsCustomPrevBhabha_payload", htitle, m_numCrystals, 1, 8737);
463 
464  htitle = "ECLCrystalTimeOffset : 'pre-calib' values;cellID;Pre-calibration merged ts values [ticks]";
465  TH1F* tsCustomPrev_payload = new TH1F("tsCustomPrev_payload", htitle, m_numCrystals, 1, 8737);
466 
467 
468 
469  htitle = "-Only for crystals where the new bhabha ts value is used-;cellID;ts(new | bhabha) - ts(old = 'pre-calib' | merged) [ns]";
470  TH1F* newBhabhaMinusCustomPrev__cid = new TH1F("newBhabhaMinusCustomPrev__cid", htitle, m_numCrystals, 1, 8737);
471 
472  htitle = "-Only for crystals where the new bhabha ts value is used-;cellID;ts(new | bhabha) - ts(old = 'pre-calib' | bhabha) [ns]";
473  TH1F* newBhabhaMinusCustomPrevBhabha__cid = new TH1F("newBhabhaMinusCustomPrevBhabha__cid", htitle, m_numCrystals, 1, 8737);
474 
475  htitle = "-Only for crystals where the new bhabha ts value is used-;ts(new | bhabha) - ts(old = 'pre-calib' | merged) [ns];Number of crystals";
476  auto tsNewBhabha_MINUS_tsCustomPrev = new TH1F("TsNewBhabha_MINUS_TsCustomPrev", htitle, 285, -69.5801, 69.5801);
477 
478  htitle = "-Only for crystals where the new bhabha ts value is used-;ts(new | bhabha) - ts(old = 'pre-calib' | bhabha) [ns];Number of crystals";
479  auto tsNewBhabha_MINUS_tsCustomPrevBhabha = new TH1F("TsNewBhabha_MINUS_TsCustomPrevBhabha", htitle, 285, -69.5801, 69.5801);
480 
481 
482  for (int cellID = 1; cellID <= m_numCrystals; cellID++) {
483  bhabhaPayload->SetBinContent(cellID, bhabhaCalib[cellID - 1]);
484  bhabhaPayload->SetBinError(cellID, fabs(bhabhaCalibUnc[cellID - 1]));
485 
486  bhabhaGammaPayload->SetBinContent(cellID, bhabhaGammaCalib[cellID - 1]);
487  bhabhaGammaPayload->SetBinError(cellID, fabs(bhabhaGammaCalibUnc[cellID - 1]));
488 
489  cosmicPayload->SetBinContent(cellID, cosmicCalib[cellID - 1]);
490  cosmicPayload->SetBinError(cellID, cosmicCalibUnc[cellID - 1]);
491 
492  cosmicShiftedPayload->SetBinContent(cellID, cosmicCalibShifted[cellID - 1]);
493  cosmicShiftedPayload->SetBinError(cellID, cosmicCalibShiftedUnc[cellID - 1]);
494 
495  newPayload->SetBinContent(cellID, newCalib[cellID - 1]);
496  newPayload->SetBinError(cellID, newCalibUnc[cellID - 1]);
497 
498  // Comparisons of change in ts
499  if (readPrevCrysPayload) {
500  newBhabhaMinusCustomPrev__cid->SetBinContent(cellID, newBhabhaMinusCustomPrevCalib__cid[cellID - 1]);
501  newBhabhaMinusCustomPrev__cid->SetBinError(cellID, 0);
502 
503  newBhabhaMinusCustomPrevBhabha__cid->SetBinContent(cellID, newBhabhaMinusCustomPrevBhabhaCalib__cid[cellID - 1]);
504  newBhabhaMinusCustomPrevBhabha__cid->SetBinError(cellID, 0);
505 
506 
507  tsCustomPrev_payload->SetBinContent(cellID, prevValuesCrys[cellID - 1]);
508  tsCustomPrev_payload->SetBinError(cellID, prevValuesCrysUnc[cellID - 1]);
509 
510  tsCustomPrevBhabha_payload->SetBinContent(cellID, prevBhabhaValuesCrys[cellID - 1]);
511  tsCustomPrevBhabha_payload->SetBinError(cellID, fabs(prevBhabhaValuesCrysUnc[cellID - 1]));
512  }
513  }
514 
515  if (readPrevCrysPayload) {
516  for (long unsigned int ib = 0; ib < newBhabhaMinusCustomPrevCalib.size(); ib++) {
517  tsNewBhabha_MINUS_tsCustomPrev->Fill(newBhabhaMinusCustomPrevCalib[ib]);
518  }
519 
520  for (long unsigned int ib = 0; ib < newBhabhaMinusCustomPrevBhabhaCalib.size(); ib++) {
521  tsNewBhabha_MINUS_tsCustomPrevBhabha->Fill(newBhabhaMinusCustomPrevBhabhaCalib[ib]);
522  }
523  }
524 
525 
526  hfile.cd();
527  hfile.Write();
528  hfile.Close();
529  B2INFO("Debugging histograms written to " << fname);
530  // Go back to original TDirectory
531  executeDir->cd();
532 
533 
534  /* Re-save the new bhabha calibrations to a payload. The bhabha calibrations have NOT
535  been changed; however, the best way of controling which payloads get get uploaded to
536  the GT as part of the prommp calibrations is to save a second copy in this calibration
537  directory since we don't want to save all the payloads from the previous directory.
538  See the "<calibration>.save_payloads = <True/False>" code in the airflow steering file.*/
539  ECLCrystalCalib* bhabhaCalibCopy = new ECLCrystalCalib();
540  bhabhaCalibCopy->setCalibVector(bhabhaCalib, bhabhaCalibUnc);
541  saveCalibration(bhabhaCalibCopy, "ECLCrystalTimeOffsetBhabha");
542 
543  // Save the new merged calibrations to a payload
544  ECLCrystalCalib* newCrystalTimes = new ECLCrystalCalib();
545  newCrystalTimes->setCalibVector(newCalib, newCalibUnc);
546  saveCalibration(newCrystalTimes, "ECLCrystalTimeOffset");
547  return c_OK;
548 }
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_Failure
Failed =3 in Python.
const std::vector< Calibration::ExpRun > & getRunList() const
Get the list of runs for which calibration is called.
General DB object to store one calibration number per ECL crystal.
const std::vector< float > & getCalibUncVector() const
Get vector of uncertainties on calibration constants.
const std::vector< float > & getCalibVector() const
Get vector of calibration constants.
void setCalibVector(const std::vector< float > &CalibConst, const std::vector< float > &CalibConstUnc)
Set vector of constants with uncertainties.
This class provides access to ECL channel map that is either a) Loaded from the database (see ecl/dbo...
static double getRF()
See m_rf.
DBObjPtr< ECLCrystalCalib > m_ECLCrystalTimeOffsetBhabha
ECLCrystalTimeOffsetBhabha payload that we want to read from the DB.
DBObjPtr< ECLReferenceCrystalPerCrateCalib > m_ECLReferenceCrystalPerCrateCalib
ECLReferenceCrystalPerCrateCalib payload that we want to read from the DB.
static constexpr int m_numCrates
Number of Crates expected.
DBObjPtr< ECLCrystalCalib > m_ECLCrateTimeOffset
ECLCrateTimeOffset payload that we want to read from the DB.
static constexpr int m_numCrystals
Number of Crystals expected.
bool readPrevCrysPayload
< Read the previous crystal payload values for comparison
DBObjPtr< ECLCrystalCalib > m_ECLCrystalTimeOffsetCosmic
ECLCrystalTimeOffsetCosmic payload that we want to read from the DB.
DBObjPtr< ECLCrystalCalib > m_ECLCrystalTimeOffsetBhabhaGamma
ECLCrystalTimeOffsetBhabhaGamma payload that we want to read from the DB.
const int c_NCrystals
Number of crystals.
Abstract base class for different kinds of events.
Struct containing exp number and run number.
Definition: Splitter.h:51