54 ExpRun chosenRun = runs.front();
55 B2INFO(
"merging using the ExpRun (" << chosenRun.second <<
"," << chosenRun.first <<
")");
64 crystalMapper->initFromDB();
68 bool allObjectsFound =
true;
73 allObjectsFound =
false;
74 B2ERROR(
"No valid DBObject found for 'ECLCrystalTimeOffsetBhabha'");
77 allObjectsFound =
false;
78 B2ERROR(
"No valid DBObject found for 'ECLCrystalTimeOffsetBhabhaGamma'");
81 allObjectsFound =
false;
82 B2ERROR(
"No valid DBObject found for 'ECLCrystalTimeOffsetCosmic'");
87 allObjectsFound =
false;
88 B2ERROR(
"No valid DBObject found for 'ECLReferenceCrystalPerCrateCalib'");
93 allObjectsFound =
false;
94 B2ERROR(
"No valid DBObject found for 'ECLCrateTimeOffset'");
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'");
103 B2INFO(
"Exiting with failure");
115 bool minRunNumBool =
false;
116 bool maxRunNumBool =
false;
122 int expNumber = expRun.first;
123 int runNumber = expRun.second;
124 if (!minRunNumBool) {
125 minExpNum = expNumber;
126 minRunNum = runNumber;
127 minRunNumBool =
true;
129 if (!maxRunNumBool) {
130 maxExpNum = expNumber;
131 maxRunNum = runNumber;
132 maxRunNumBool =
true;
134 if (((minRunNum > runNumber) && (minExpNum >= expNumber)) ||
135 (minExpNum > expNumber)) {
136 minExpNum = expNumber;
137 minRunNum = runNumber;
139 if (((maxRunNum < runNumber) && (maxExpNum <= expNumber)) ||
140 (maxExpNum < expNumber))
143 maxExpNum = expNumber;
144 maxRunNum = runNumber;
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");
168 B2INFO(
"Loaded 'ECLCrystalTimeOffset*' calibrations");
173 B2INFO(
"Loaded 'ECLReferenceCrystalPerCrateCalib' calibration");
177 B2INFO(
"Loaded 'ECLCrateTimeOffset' calibration");
191 prevValuesCrys = customPrevCrystalTimeObject->getCalibVector();
192 prevValuesCrysUnc = customPrevCrystalTimeObject->getCalibUncVector();
194 prevBhabhaValuesCrys = customPrevBhabhaCrystalTimeObject->getCalibVector();
195 prevBhabhaValuesCrysUnc = customPrevBhabhaCrystalTimeObject->getCalibUncVector();
198 B2INFO(
"Previous values read from database. Write out for their values for comparison");
200 B2INFO(
"ts custom previous payload: cellID " << ic + 1 <<
" " << prevValuesCrys[ic]);
202 B2INFO(
"Previous bhabha values read from database. Write out for their values for comparison");
204 B2INFO(
"ts custom previous bhabha payload: cellID " << ic + 1 <<
" " << prevBhabhaValuesCrys[ic]);
242 vector<bool> bhabhaGammaCalibGoodQuality(
m_numCrystals,
false);
251 if (bhabhaCalibUnc[ic] != 0
252 && fabs(bhabhaCalibUnc[ic])*TICKS_TO_NS < 2) {
259 bhabhaCalibGoodQuality[ic] = true ;
270 if (bhabhaGammaCalibUnc[ic] != 0
271 && fabs(bhabhaGammaCalibUnc[ic])*TICKS_TO_NS <
273 bhabhaGammaCalibGoodQuality[ic] = true ;
283 vector<float> cosmicCalibShifted = cosmicCalib;
284 vector<float> cosmicCalibShiftedUnc = cosmicCalibUnc;
286 cosmicCalibShifted[ic] -= crateCalib[ic];
287 int crate_id_from_crystal = crystalMapper->getCrateID(ic + 1);
288 crateCalibShort[crate_id_from_crystal - 1] = crateCalib[ic];
291 for (
int icrate = 0; icrate <
m_numCrates; icrate++) {
292 B2INFO(
"crate time calibration for crate " <<
293 icrate + 1 <<
" = " << crateCalibShort[icrate]);
300 vector<float> meanGoodCrystalCalibPerCrate_bhabha(
m_numCrates, 0);
301 vector<float> meanGoodCrystalCalibPerCrate_cosmic(
m_numCrates, 0);
308 vector<short> numGoodCrystalCalibPerCrate_bhabha(
m_numCrates, 1);
313 for (
int ic_base1 = 1; ic_base1 <=
m_numCrystals; ic_base1++) {
314 int crate_id_from_crystal = crystalMapper->getCrateID(ic_base1);
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]++ ;
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]);
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] ;
347 const int firstHiStatCellID = 673;
348 const int lastHiStatCellID = 8160;
350 double averageBhabhaCalibPerCrate[
m_numCrates] = {};
353 for (
int cellID = firstHiStatCellID; cellID <= lastHiStatCellID; cellID++) {
354 int crysID = cellID - 1;
355 int crateID = crystalMapper->getCrateID(cellID);
356 if (bhabhaCalibGoodQuality[crysID]) {
357 nGoodBhabhaPerCrate[crateID - 1]++;
358 averageBhabhaCalibPerCrate[crateID - 1] += bhabhaCalib[crysID];
363 for (
int crateID = 1; crateID <=
m_numCrates; crateID++) {
364 if (nGoodBhabhaPerCrate[crateID - 1] != 0) {
365 averageBhabhaCalibPerCrate[crateID - 1] /= nGoodBhabhaPerCrate[crateID - 1];
367 B2INFO(
"crateID " << crateID <<
" nGood " << nGoodBhabhaPerCrate[crateID - 1] <<
" average Bhabha calib " <<
368 averageBhabhaCalibPerCrate[crateID - 1]);
385 vector<float> newBhabhaMinusCustomPrevCalib__cid(
m_numCrystals);
386 vector<float> newBhabhaMinusCustomPrevBhabhaCalib__cid(
m_numCrystals);
387 vector<float> newBhabhaMinusCustomPrevCalib;
388 vector<float> newBhabhaMinusCustomPrevBhabhaCalib;
393 B2DEBUG(29,
"Merging crystal " << ic + 1);
394 int crate_id_from_crystal = crystalMapper->getCrateID(ic + 1);
397 bool isRefCrys = false ;
398 for (
int icrate = 0; icrate <
m_numCrates; icrate++) {
399 if (ic + 1 == refCrystalPerCrate[icrate]) {
401 B2INFO(
"Crystal " << ic + 1 <<
" is a reference crystal");
404 B2DEBUG(29,
"Checked reference crystal for crate " << icrate + 1);
406 B2DEBUG(29,
"Checked ref crystal");
408 string whichCalibUsed =
"bhabha";
411 newCalib[ic] = bhabhaCalib[ic];
412 newCalibUnc[ic] = fabs(bhabhaCalibUnc[ic]);
414 double newMinusMerged ;
415 double newMinusBhabha ;
423 ((bhabhaCalib[ic] == 0) || (! bhabhaCalibGoodQuality[ic]))) {
427 if (bhabhaGammaCalib[ic] != 0 || bhabhaGammaCalibGoodQuality[ic]) {
428 newCalib[ic] = bhabhaGammaCalib[ic] + averageBhabhaCalibPerCrate[crate_id_from_crystal - 1];
429 newCalibUnc[ic] = fabs(bhabhaGammaCalibUnc[ic]);
430 whichCalibUsed =
"bhabhaGamma";
432 newCalib[ic] = cosmicCalibShifted[ic] ;
433 newCalibUnc[ic] = cosmicCalibShiftedUnc[ic];
434 whichCalibUsed =
"cosmic";
437 newMinusMerged = (newCalib[ic] - prevValuesCrys[ic]) * TICKS_TO_NS;
438 newMinusBhabha = (newCalib[ic] - prevBhabhaValuesCrys[ic]) * TICKS_TO_NS;
440 newBhabhaMinusCustomPrevCalib__cid[ic] = newMinusMerged;
441 newBhabhaMinusCustomPrevBhabhaCalib__cid[ic] = newMinusBhabha;
442 newBhabhaMinusCustomPrevCalib.push_back(newMinusMerged);
443 newBhabhaMinusCustomPrevBhabhaCalib.push_back(newMinusBhabha);
446 newMinusMerged = (newCalib[ic] - prevValuesCrys[ic]) * TICKS_TO_NS;
447 newMinusBhabha = (newCalib[ic] - prevBhabhaValuesCrys[ic]) * TICKS_TO_NS;
450 B2INFO(
"Crystal " << ic + 1 <<
", crate " << crate_id_from_crystal <<
451 "::: bhabha = " << bhabhaCalib[ic] <<
"+-" << bhabhaCalibUnc[ic] <<
452 " ticks, rad bhabha = " << bhabhaGammaCalib[ic] <<
"+-" << bhabhaGammaCalibUnc[ic] <<
453 " ticks, cosmic UNshifted = " << cosmicCalib[ic] <<
"+-" << cosmicCalibUnc[ic] <<
454 " ticks, cosmic shifted = " << cosmicCalibShifted[ic] <<
"+-" << cosmicCalibShiftedUnc[ic] <<
455 " ticks. ||| New calib = " << newCalib[ic] <<
" ticks, selected " << whichCalibUsed);
456 B2INFO(
" Crystal " << ic + 1 <<
", pre calib ts = " << prevValuesCrys[ic] <<
457 ", pre calib bhabha ts = " << prevBhabhaValuesCrys[ic] <<
458 " ticks ||| new - pre calib ts = " << newMinusMerged <<
459 ", new - pre calib bhabha ts = " << newMinusBhabha <<
" ns");
468 TDirectory* executeDir = gDirectory;
470 TString fname = debugFilename;
471 TFile hfile(fname,
"recreate");
473 TString htitle =
"ECLCrystalTimeOffsetBhabha;cellID;Bhabha ts values [ticks]";
474 TH1F* bhabhaPayload =
new TH1F(
"bhabhaPayload", htitle,
m_numCrystals, 1, 8737);
476 htitle =
"ECLCrystalTimeOffsetBhabhaGamma;cellID;Radiative bhabha ts values [ticks]";
477 TH1F* bhabhaGammaPayload =
new TH1F(
"bhabhaGammaPayload", htitle,
m_numCrystals, 1, 8737);
479 htitle =
"ECLCrystalTimeOffsetCosmic : unshifted;cellID;Unshifted cosmic ts values [ticks]";
480 TH1F* cosmicPayload =
new TH1F(
"cosmicUnshiftedPayload", htitle,
m_numCrystals, 1, 8737);
482 htitle =
"ECLCrystalTimeOffsetCosmic : shifted;cellID;Shifted cosmic ts values [ticks]";
483 TH1F* cosmicShiftedPayload =
new TH1F(
"cosmicShiftedPayload", htitle,
m_numCrystals, 1, 8737);
485 htitle =
"New ECLCrystalTimeOffset;cellID;New (merged) ts values [ticks]";
486 TH1F* newPayload =
new TH1F(
"newPayload", htitle,
m_numCrystals, 1, 8737);
489 htitle =
"ECLCrystalTimeOffsetBhabha : 'pre-calib' values;cellID;Pre-calibration bhabha ts values [ticks]";
490 TH1F* tsCustomPrevBhabha_payload =
new TH1F(
"tsCustomPrevBhabha_payload", htitle,
m_numCrystals, 1, 8737);
492 htitle =
"ECLCrystalTimeOffset : 'pre-calib' values;cellID;Pre-calibration merged ts values [ticks]";
493 TH1F* tsCustomPrev_payload =
new TH1F(
"tsCustomPrev_payload", htitle,
m_numCrystals, 1, 8737);
497 htitle =
"-Only for crystals where the new bhabha ts value is used-;cellID;ts(new | bhabha) - ts(old = 'pre-calib' | merged) [ns]";
498 TH1F* newBhabhaMinusCustomPrev__cid =
new TH1F(
"newBhabhaMinusCustomPrev__cid", htitle,
m_numCrystals, 1, 8737);
500 htitle =
"-Only for crystals where the new bhabha ts value is used-;cellID;ts(new | bhabha) - ts(old = 'pre-calib' | bhabha) [ns]";
501 TH1F* newBhabhaMinusCustomPrevBhabha__cid =
new TH1F(
"newBhabhaMinusCustomPrevBhabha__cid", htitle,
m_numCrystals, 1, 8737);
503 htitle =
"-Only for crystals where the new bhabha ts value is used-;ts(new | bhabha) - ts(old = 'pre-calib' | merged) [ns];Number of crystals";
504 auto tsNewBhabha_MINUS_tsCustomPrev =
new TH1F(
"TsNewBhabha_MINUS_TsCustomPrev", htitle, 285, -69.5801, 69.5801);
506 htitle =
"-Only for crystals where the new bhabha ts value is used-;ts(new | bhabha) - ts(old = 'pre-calib' | bhabha) [ns];Number of crystals";
507 auto tsNewBhabha_MINUS_tsCustomPrevBhabha =
new TH1F(
"TsNewBhabha_MINUS_TsCustomPrevBhabha", htitle, 285, -69.5801, 69.5801);
511 bhabhaPayload->SetBinContent(cellID, bhabhaCalib[cellID - 1]);
512 bhabhaPayload->SetBinError(cellID, fabs(bhabhaCalibUnc[cellID - 1]));
514 bhabhaGammaPayload->SetBinContent(cellID, bhabhaGammaCalib[cellID - 1]);
515 bhabhaGammaPayload->SetBinError(cellID, fabs(bhabhaGammaCalibUnc[cellID - 1]));
517 cosmicPayload->SetBinContent(cellID, cosmicCalib[cellID - 1]);
518 cosmicPayload->SetBinError(cellID, cosmicCalibUnc[cellID - 1]);
520 cosmicShiftedPayload->SetBinContent(cellID, cosmicCalibShifted[cellID - 1]);
521 cosmicShiftedPayload->SetBinError(cellID, cosmicCalibShiftedUnc[cellID - 1]);
523 newPayload->SetBinContent(cellID, newCalib[cellID - 1]);
524 newPayload->SetBinError(cellID, newCalibUnc[cellID - 1]);
528 newBhabhaMinusCustomPrev__cid->SetBinContent(cellID, newBhabhaMinusCustomPrevCalib__cid[cellID - 1]);
529 newBhabhaMinusCustomPrev__cid->SetBinError(cellID, 0);
531 newBhabhaMinusCustomPrevBhabha__cid->SetBinContent(cellID, newBhabhaMinusCustomPrevBhabhaCalib__cid[cellID - 1]);
532 newBhabhaMinusCustomPrevBhabha__cid->SetBinError(cellID, 0);
535 tsCustomPrev_payload->SetBinContent(cellID, prevValuesCrys[cellID - 1]);
536 tsCustomPrev_payload->SetBinError(cellID, prevValuesCrysUnc[cellID - 1]);
538 tsCustomPrevBhabha_payload->SetBinContent(cellID, prevBhabhaValuesCrys[cellID - 1]);
539 tsCustomPrevBhabha_payload->SetBinError(cellID, fabs(prevBhabhaValuesCrysUnc[cellID - 1]));
544 for (
long unsigned int ib = 0; ib < newBhabhaMinusCustomPrevCalib.size(); ib++) {
545 tsNewBhabha_MINUS_tsCustomPrev->Fill(newBhabhaMinusCustomPrevCalib[ib]);
548 for (
long unsigned int ib = 0; ib < newBhabhaMinusCustomPrevBhabhaCalib.size(); ib++) {
549 tsNewBhabha_MINUS_tsCustomPrevBhabha->Fill(newBhabhaMinusCustomPrevBhabhaCalib[ib]);
557 B2INFO(
"Debugging histograms written to " << fname);