10 #include <ecl/calibration/eclTimeShiftsAlgorithm.h>
11 #include <ecl/dbobjects/ECLCrystalCalib.h>
12 #include <ecl/dbobjects/ECLReferenceCrystalPerCrateCalib.h>
13 #include <ecl/digitization/EclConfiguration.h>
14 #include <ecl/utility/ECLChannelMapper.h>
18 #include "TDirectory.h"
20 #include <TGraphErrors.h>
29 using namespace Calibration;
33 eclTimeShiftsAlgorithm::eclTimeShiftsAlgorithm():
35 debugFilenameBase(
"ECL_time_offsets"),
36 timeShiftForPlotStyle{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
37 crysCrateShift_min(-20),
38 crysCrateShift_max(20),
39 algorithmReadPayloads(false),
40 m_ECLCrystalTimeOffset(
"ECLCrystalTimeOffset"),
41 m_ECLCrateTimeOffset(
"ECLCrateTimeOffset"),
42 m_refCrysIDzeroingCrate(
"ECLReferenceCrystalPerCrateCalib")
45 "Plots the ecl crystal and crate time calibations."
54 B2INFO(
"eclTimeShiftsAlgorithm parameters:");
57 B2INFO(
"timeShiftForPlotStyle = {");
58 for (
int crateTest = 0; crateTest < 51; crateTest++) {
75 vector< vector<double> > allCrates_crate_times ;
76 vector< vector<double> > allCrates_run_nums ;
77 vector< vector<double> > allCrates_time_unc ;
78 vector< vector<double> > allCrates_crystalCrate_times ;
79 vector< vector<double> > allCrates_crystalCrate_times_unc ;
81 vector<int> allRunNums;
83 vector<double> mean_crystalCrate_time_ns(
m_numCrates, 0);
85 vector< double > blank_vector = {} ;
86 vector< int > blank_vector_int = {} ;
87 for (
int temp_crate_id = 0; temp_crate_id <
m_numCrates; temp_crate_id++) {
88 allCrates_crate_times.push_back(blank_vector) ;
89 allCrates_run_nums.push_back(blank_vector) ;
90 allCrates_time_unc.push_back(blank_vector) ;
91 allCrates_crystalCrate_times.push_back(blank_vector) ;
92 allCrates_crystalCrate_times_unc.push_back(blank_vector) ;
104 auto tree_perCrys = getObjectPtr<TTree>(
"tree_perCrystal");
106 B2ERROR(
"Tree of calibration constants does not exist.");
109 B2INFO(
"Number of Entries in tree_perCrystal was " << tree_perCrys->GetEntries());
110 B2INFO(
"Number of Entries in tree_perCrystal / 8736 = " <<
float(tree_perCrys->GetEntries()) / 8736.0);
116 tree_perCrys->SetBranchAddress(
"crystalID", &
m_crystalID);
117 tree_perCrys->SetBranchAddress(
"crateID", &
m_crateID);
125 int referenceRunNum = -1;
126 int referenceExpNum = -1;
128 int previousRunNumTree = -1 ;
131 vector<double> Crate_time_unc_ns_tree(
m_numCrates) ;
132 vector<double> crystalCrate_time_ns_tree(
m_numCrates);
133 vector<double> crystalCrate_time_unc_ns_tree(
m_numCrates);
136 Int_t numEntriesCrysTree = (Int_t)tree_perCrys->GetEntries();
139 for (Int_t tree_crys_i = 0; tree_crys_i < numEntriesCrysTree; tree_crys_i++) {
140 for (Int_t tree_crys_j = 0; tree_crys_j <
m_numCrystals; tree_crys_j++) {
141 tree_perCrys->GetEntry(tree_crys_i);
148 if (tree_crys_j == 0) {
157 B2ERROR(
"m_exp_perCrystal, referenceExpNum" <<
m_exp_perCrystal <<
", " << referenceExpNum);
158 B2ERROR(
"m_run_perCrystal, referenceRunNum" <<
m_run_perCrystal <<
", " << referenceRunNum);
159 B2ERROR(
"m_run_perCrystal, previousRunNumTree" <<
m_run_perCrystal <<
", " << previousRunNumTree);
160 B2ERROR(
"Exp/run number problem");
168 Crate_time_unc_ns_tree[crateID_temp - 1] =
m_crateTimeUnc * TICKS_TO_NS ;
171 B2INFO(
"m_exp_perCrystal, m_run_perCrystal, cell ID (0..8735), m_crateID, m_crateTimeConst = " <<
m_exp_perCrystal <<
", " <<
175 crystalCrate_time_unc_ns_tree[crateID_temp - 1] = TICKS_TO_NS * sqrt(
178 }
else if (tree_crys_j == 0 || tree_crys_j == 8735) {
179 B2INFO(
"m_exp_perCrystal, m_run_perCrystal, cell ID (0..8735), m_crateID, m_crateTimeConst = " <<
m_exp_perCrystal <<
", " <<
182 B2DEBUG(22,
"m_exp_perCrystal, m_run_perCrystal, cell ID (0..8735), m_crateID, m_crateTimeConst = " <<
m_exp_perCrystal <<
", " <<
191 bool savedThisRunNum =
false;
192 for (
int iCrate = 0; iCrate <
m_numCrates; iCrate++) {
193 double tcrate = Crate_time_ns_tree[iCrate] ;
194 double tcrate_unc = Crate_time_unc_ns_tree[iCrate];
195 double tcrystalCrate = crystalCrate_time_ns_tree[iCrate];
196 double tcrystalCrate_unc = crystalCrate_time_unc_ns_tree[iCrate];
202 allCrates_crate_times[iCrate].push_back(tcrate) ;
204 allCrates_time_unc[iCrate].push_back(tcrate_unc) ;
205 allCrates_crystalCrate_times[iCrate].push_back(tcrystalCrate) ;
206 allCrates_crystalCrate_times_unc[iCrate].push_back(tcrystalCrate_unc) ;
208 mean_crystalCrate_time_ns[iCrate] += tcrystalCrate ;
210 if (!savedThisRunNum) {
212 savedThisRunNum =
true;
220 B2INFO(
"Crate " << ic + 1 <<
", t_crate = " << Crate_time_tick_tree[ic] <<
" ticks = "
221 << Crate_time_ns_tree[ic] <<
" +- " << Crate_time_unc_ns_tree[ic]
222 <<
" ns; t crys+crate (no shifts) = " << crystalCrate_time_ns_tree[ic] <<
" +- "
223 << crystalCrate_time_unc_ns_tree[ic] <<
" ns") ;
231 B2INFO(
"Finished reading tree calibration constants. Now extracting here by stepping through runs.");
241 bool minRunNumBool =
false;
242 bool maxRunNumBool =
false;
248 int expNumber = expRun.first;
249 int runNumber = expRun.second;
250 if (!minRunNumBool) {
251 minExpNum = expNumber;
252 minRunNum = runNumber;
253 minRunNumBool =
true;
255 if (!maxRunNumBool) {
256 maxExpNum = expNumber;
257 maxRunNum = runNumber;
258 maxRunNumBool =
true;
260 if (((minRunNum > runNumber) && (minExpNum >= expNumber)) ||
261 (minExpNum > expNumber)) {
262 minExpNum = expNumber;
263 minRunNum = runNumber;
265 if (((maxRunNum < runNumber) && (maxExpNum <= expNumber)) ||
266 (maxExpNum < expNumber)) {
267 maxExpNum = expNumber;
268 maxRunNum = runNumber;
272 B2INFO(
"minExpNum = " << minExpNum) ;
273 B2INFO(
"minRunNum = " << minRunNum) ;
274 B2INFO(
"maxExpNum = " << maxExpNum) ;
275 B2INFO(
"maxRunNum = " << maxRunNum) ;
278 if (minExpNum != maxExpNum) {
279 B2ERROR(
"The runs must all come from the same experiment");
283 int experiment = minExpNum;
301 ExpRun chosenRun = runs.front();
302 B2INFO(
"merging using the ExpRun (" << chosenRun.second <<
"," << chosenRun.first <<
")");
308 bool allObjectsFound =
true;
313 allObjectsFound =
false;
314 B2ERROR(
"No valid DBObject found for 'ECLCrystalTimeOffset'");
319 allObjectsFound =
false;
320 B2ERROR(
"No valid DBObject found for 'ECLCrateTimeOffset'");
324 allObjectsFound =
false;
325 B2ERROR(
"No valid DBObject found for 'refCrysIDzeroingCrate'");
329 if (allObjectsFound) {
330 B2INFO(
"Valid objects found for 'ECLCrystalTimeOffset'");
331 B2INFO(
"Valid object found for 'ECLCrateTimeOffset'");
332 B2INFO(
"Valid object found for 'refCrysIDzeroingCrate'");
334 B2INFO(
"eclTimeShiftsAlgorithm: Exiting with failure. Some missing valid objects.");
343 B2INFO(
"Loaded 'ECLCrystalTimeOffset' calibrations");
348 B2INFO(
"Loaded 'ECLCrateTimeOffset' calibration with default exp/run");
350 B2INFO(
"eclTimeShiftsAlgorithm:: loaded ECLCrateTimeOffset from the database"
354 for (
int cellID = 1; cellID <=
m_numCrystals; cellID += 511) {
355 B2INFO(
"crystalCalib = " << crystalCalib[cellID - 1]);
356 B2INFO(
"crateCalib = " << crateCalib[cellID - 1]);
360 for (
int icrate = 0; icrate <
m_numCrates; icrate++) {
361 B2INFO(
"reference crystal for crate " << icrate + 1 <<
" = " << refCrystals[icrate]);
368 for (
int run = minRunNum; run <= maxRunNum; run++) {
369 B2INFO(
"---------") ;
370 B2INFO(
"Looking at run " << run) ;
372 vector<int>::iterator it = find(allRunNums.begin(), allRunNums.end(), run);
373 if (it != allRunNums.end()) {
374 int pos = it - allRunNums.begin() ;
375 B2INFO(
"allRunNums[" << pos <<
"] = " << allRunNums[pos]);
376 B2INFO(
"Run " << run <<
" already processed so skipping it.");
379 B2INFO(
"New run. Starting to extract information");
383 int eventNumberForCrates = 1;
391 evtPtr.
construct(eventNumberForCrates, run, experiment);
404 crystalMapper->initFromDB();
407 B2INFO(
"eclTimeShiftsAlgorithm:: loaded ECLCrystalTimeOffset from the database"
410 B2INFO(
"eclTimeShiftsAlgorithm:: loaded ECLCrateTimeOffset from the database"
418 vector<float> crystalTimeOffsetsCalib;
419 vector<float> crystalTimeOffsetsCalibUnc;
423 vector<float> crateTimeOffsetsCalib;
424 vector<float> crateTimeOffsetsCalibUnc;
436 vector<double> crystalCrate_time_unc_ns(
m_numCrates);
439 int crateID_temp = crystalMapper->getCrateID(crysID) ;
440 Crate_time_ns[crateID_temp - 1] = crateTimeOffsetsCalib[crysID - 1] * TICKS_TO_NS ;
441 Crate_time_tick[crateID_temp - 1] = crateTimeOffsetsCalib[crysID - 1] ;
442 Crate_time_unc_ns[crateID_temp - 1] = crateTimeOffsetsCalibUnc[crysID - 1] * TICKS_TO_NS ;
444 if (crysID == refCrystals[crateID_temp - 1]) {
445 crystalCrate_time_ns[crateID_temp - 1] = (crystalTimeOffsetsCalib[crysID - 1] +
446 crateTimeOffsetsCalib[crysID - 1]) * TICKS_TO_NS;
448 crystalCrate_time_unc_ns[crateID_temp - 1] = TICKS_TO_NS * sqrt(
449 (crateTimeOffsetsCalibUnc[crysID - 1] * crateTimeOffsetsCalibUnc[crysID - 1]) +
450 (crystalTimeOffsetsCalibUnc[crysID - 1] * crystalTimeOffsetsCalibUnc[crysID - 1])) ;
455 for (
int iCrate = 0; iCrate <
m_numCrates; iCrate++) {
456 double tcrate = Crate_time_ns[iCrate] ;
457 double tcrate_unc = Crate_time_unc_ns[iCrate];
458 double tcrystalCrate = crystalCrate_time_ns[iCrate];
459 double tcrystalCrate_unc = crystalCrate_time_unc_ns[iCrate];
465 allCrates_crate_times[iCrate].push_back(tcrate) ;
466 allCrates_run_nums[iCrate].push_back(run) ;
467 allCrates_time_unc[iCrate].push_back(tcrate_unc) ;
468 allCrates_crystalCrate_times[iCrate].push_back(tcrystalCrate) ;
469 allCrates_crystalCrate_times_unc[iCrate].push_back(tcrystalCrate_unc) ;
471 mean_crystalCrate_time_ns[iCrate] += tcrystalCrate ;
479 B2INFO(
"Crate " << ic + 1 <<
", t_crate = " << Crate_time_tick[ic] <<
" ticks = "
480 << Crate_time_ns[ic] <<
" +- " << Crate_time_unc_ns[ic]
481 <<
" ns; t crys+crate (no shift) = " << crystalCrate_time_ns[ic] <<
" +- "
482 << crystalCrate_time_unc_ns[ic] <<
" ns") ;
489 B2INFO(
"IOV_exp_high = " << IOV_exp_high);
490 B2INFO(
"IOV_run_high = " << IOV_run_high);
491 if (IOV_run_high == -1) {
492 B2INFO(
"IOV_run_high is -1 so stop looping over all runs");
495 B2INFO(
"Set run number to higher iov run number");
498 B2INFO(
"now set run = " << run);
511 B2INFO(
"Shift all run crys+crate+off times. Show the results for a subset of crates/runs:");
512 for (
int iCrate = 0; iCrate <
m_numCrates; iCrate++) {
513 double mean_time = mean_crystalCrate_time_ns[iCrate] / allCrates_crate_times[iCrate].size() ;
514 B2INFO(
"Mean crys+crate times for all runs used as offset (crate " << iCrate + 1 <<
") = " << mean_time);
516 for (
long unsigned int jRun = 0; jRun < allCrates_crate_times[iCrate].size(); jRun++) {
518 if (jRun < 50 || iCrate == 1 || iCrate == 40 || iCrate == 51) {
519 B2INFO(
"allCrates_crystalCrate_times(crate " << iCrate + 1 <<
", run counter " << jRun + 1 <<
", runNum " <<
520 allCrates_run_nums[iCrate][jRun] <<
" | after shifting mean) = " <<
521 allCrates_crystalCrate_times[iCrate][jRun]);
532 TFile* tcratefile = 0;
535 string runNumsString = string(
"_") + to_string(minExpNum) +
"_" + to_string(minRunNum) + string(
"-") +
536 to_string(maxExpNum) +
"_" + to_string(maxRunNum);
538 TString fname = debugFilename;
540 tcratefile =
new TFile(fname,
"recreate");
542 B2INFO(
"Debugging histograms written to " << fname);
545 B2INFO(
"Starting to make crate time jump plots for crate " << i + 1);
546 shared_ptr< TCanvas > cSmart(
new TCanvas);
548 Double_t* single_crate_crate_times = &allCrates_crate_times[i][0] ;
549 Double_t* single_crate_run_nums = &allCrates_run_nums[i][0] ;
550 Double_t* single_crate_time_unc = &allCrates_time_unc[i][0] ;
551 Double_t* single_crate_crystalCrate_times = &allCrates_crystalCrate_times[i][0] ;
552 Double_t* single_crate_crystalCrate_times_unc = &allCrates_crystalCrate_times_unc[i][0] ;
553 B2INFO(
"Done setting up the arrays for the crate " << i + 1);
556 ss << setw(2) << setfill(
'0') << i + 1 ;
557 string paddedCrateID(ss.str());
560 shared_ptr< TGraphErrors > g_tcrate_vs_runNum(
new TGraphErrors(allCrates_crate_times[i].size(), single_crate_run_nums,
561 single_crate_crate_times, NULL, single_crate_time_unc)) ;
564 string tgraph_title = string(
"e") + to_string(minExpNum) + string(
"r") + to_string(minRunNum) +
565 string(
"-e") + to_string(maxExpNum) + string(
"r") + to_string(maxRunNum) ;
567 string tgraph_name_short =
"crateTimeVSrunNum_" ;
568 tgraph_name_short = tgraph_name_short + runNumsString +
"_crate";
570 tgraph_title = tgraph_title + string(
"_crate") + paddedCrateID ;
571 tgraph_name_short = tgraph_name_short + paddedCrateID ;
572 tgraph_title = tgraph_title + string(
" (") + to_string(
m_tcrate_min_cut) + string(
" < tcrate < ") +
576 g_tcrate_vs_runNum->SetName(tgraph_name_short.c_str()) ;
577 g_tcrate_vs_runNum->SetTitle(tgraph_title.c_str()) ;
578 g_tcrate_vs_runNum->GetXaxis()->SetTitle(
"Run number") ;
579 g_tcrate_vs_runNum->GetYaxis()->SetTitle(
"Crate time [ns]") ;
583 g_tcrate_vs_runNum->Draw(
"AP") ;
584 g_tcrate_vs_runNum->SetMarkerSize(0.8) ;
585 g_tcrate_vs_runNum->Draw(
"AP") ;
587 shared_ptr< TLatex > Leg1(
new TLatex);
589 Leg1->SetTextAlign(11);
590 Leg1->SetTextFont(42);
591 Leg1->SetTextSize(0.035);
592 Leg1->SetTextColor(1);
595 g_tcrate_vs_runNum->Write() ;
596 cSmart->SaveAs((tgraph_name_short +
string(
".pdf")).c_str()) ;
598 B2INFO(
"Saved pdf: " << tgraph_name_short <<
".pdf");
602 shared_ptr< TGraphErrors > g_crateCrystalTime_vs_runNum(
new TGraphErrors(allCrates_crystalCrate_times[i].size(),
603 single_crate_run_nums,
604 single_crate_crystalCrate_times, NULL, single_crate_crystalCrate_times_unc)) ;
606 tgraph_title = string(
"e") + to_string(minExpNum) + string(
"r") + to_string(minRunNum) +
607 string(
"-e") + to_string(maxExpNum) + string(
"r") + to_string(maxRunNum) ;
609 tgraph_name_short =
"crystalCrateTimeVSrunNum_" ;
610 tgraph_name_short = tgraph_name_short + runNumsString +
"_crate";
612 tgraph_title = tgraph_title + string(
"_crate") + paddedCrateID ;
613 tgraph_name_short = tgraph_name_short + paddedCrateID ;
614 tgraph_title = tgraph_title + string(
" (") + to_string(
m_tcrate_min_cut) + string(
" < tcrate < ") +
619 g_crateCrystalTime_vs_runNum->SetName(tgraph_name_short.c_str()) ;
620 g_crateCrystalTime_vs_runNum->SetTitle(tgraph_title.c_str()) ;
621 g_crateCrystalTime_vs_runNum->GetXaxis()->SetTitle(
"Run number") ;
622 g_crateCrystalTime_vs_runNum->GetYaxis()->SetTitle(
"Crate time + Crystal time + centring overall offset [ns]") ;
626 g_crateCrystalTime_vs_runNum->Draw(
"AP") ;
627 g_crateCrystalTime_vs_runNum->SetMarkerSize(0.8) ;
628 g_crateCrystalTime_vs_runNum->Draw(
"AP") ;
630 g_crateCrystalTime_vs_runNum->Write() ;
631 cSmart->SaveAs((tgraph_name_short +
string(
".pdf")).c_str()) ;
633 B2INFO(
"Saved pdf: " << tgraph_name_short <<
".pdf");
642 int numRunsWithCrateTimes = allCrates_crystalCrate_times[i].size();
643 vector<Double_t> counterVec(numRunsWithCrateTimes);
648 vector<pair<int, double> > runNum_index_pairs;
652 for (
int pairIndex = 0; pairIndex < numRunsWithCrateTimes; pairIndex++) {
653 runNum_index_pairs.push_back(make_pair(allCrates_run_nums[i][pairIndex], pairIndex));
656 B2INFO(
"Crate id = " << i + 1);
657 B2INFO(
"Unsorted run numbers");
658 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes; runCounter++) {
659 B2INFO(
"Run number, run number vector index = " << runNum_index_pairs[runCounter].first <<
", " <<
660 runNum_index_pairs[runCounter].second);
664 sort(runNum_index_pairs.begin(), runNum_index_pairs.end());
667 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes; runCounter++) {
668 counterVec[runNum_index_pairs[runCounter].second] = runCounter + 1;
671 B2INFO(
"Run numbers with index and times");
672 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes; runCounter++) {
673 int idx = (int) round(counterVec[runCounter]);
674 B2INFO(
"Vector index, Run number, run number sorting order index, tcrystal+tcrate+shifts = " << runCounter <<
", " <<
675 allCrates_run_nums[i][runCounter] <<
", " << idx <<
", " << single_crate_crystalCrate_times[idx - 1] <<
" ns");
679 if (numRunsWithCrateTimes > 0) {
680 shared_ptr< TGraphErrors > g_crateCrystalTime_vs_runCounter(
new TGraphErrors(numRunsWithCrateTimes, &counterVec[0],
681 single_crate_crystalCrate_times, NULL, single_crate_crystalCrate_times_unc)) ;
683 tgraph_title = string(
"e") + to_string(minExpNum) + string(
"r") + to_string(minRunNum) +
684 string(
"-e") + to_string(maxExpNum) + string(
"r") + to_string(maxRunNum) ;
687 tgraph_name_short =
"crystalCrateTimeVSrunCounter_" ;
688 tgraph_name_short = tgraph_name_short + runNumsString +
"_crate";
691 tgraph_title = tgraph_title + string(
"_crate") + paddedCrateID ;
692 tgraph_name_short = tgraph_name_short + paddedCrateID ;
693 tgraph_title = tgraph_title + string(
" (") + to_string(
m_tcrate_min_cut) + string(
" < tcrate < ") +
698 g_crateCrystalTime_vs_runCounter->SetName(tgraph_name_short.c_str()) ;
699 g_crateCrystalTime_vs_runCounter->SetTitle(tgraph_title.c_str()) ;
700 g_crateCrystalTime_vs_runCounter->GetXaxis()->SetTitle(
"Run counter (remove gaps from run numbers)") ;
701 g_crateCrystalTime_vs_runCounter->GetYaxis()->SetTitle(
"Crate time + Crystal time + centring overall offset [ns]") ;
704 g_crateCrystalTime_vs_runCounter->GetXaxis()->SetRangeUser(0, numRunsWithCrateTimes + 1) ;
706 g_crateCrystalTime_vs_runCounter->Draw(
"AP") ;
707 g_crateCrystalTime_vs_runCounter->SetMarkerSize(0.8) ;
708 g_crateCrystalTime_vs_runCounter->Draw(
"AP") ;
710 g_crateCrystalTime_vs_runCounter->Write() ;
711 cSmart->SaveAs((tgraph_name_short +
string(
".pdf")).c_str()) ;
712 B2INFO(
"Saved pdf: " << tgraph_name_short <<
".pdf");
714 B2INFO(
"Finished making crate time jump plots for crate " << i + 1);
716 B2INFO(
"Crate " << i + 1 <<
" has no entries that pass all the cuts so no crystalCrateTimeVSrunCounter_crate plot will be made.");
725 double smallThreshold = 1 ;
726 double largeThreshold = 6.5 ;
728 B2INFO(
"======================= Crate time jumps =========================");
729 B2INFO(
"======================= Small threshold jumps ====================");
730 B2INFO(
"Crate ID = 1..52");
731 B2INFO(
"==================================================================");
734 int numRunsWithCrateTimes = allCrates_crystalCrate_times[i].size();
735 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes - 1; runCounter++) {
736 int run_i = allCrates_run_nums[i][runCounter] ;
737 int run_f = allCrates_run_nums[i][runCounter + 1] ;
738 double time_i = allCrates_crystalCrate_times[i][runCounter] ;
739 double time_f = allCrates_crystalCrate_times[i][runCounter + 1] ;
741 if (fabs(time_f - time_i) > smallThreshold) {
742 B2INFO(
"Crate " << i + 1 <<
" has crate time jump > " << smallThreshold <<
" ns: t(run " << run_f <<
") = " << time_f <<
743 " ns - t(run " << run_i <<
") = " << time_i <<
" ns = " << time_f - time_i);
749 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~ Large threshold jumps ~~~~~~~~~~~~~~~~~~~~");
750 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
753 int numRunsWithCrateTimes = allCrates_crystalCrate_times[i].size();
754 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes - 1; runCounter++) {
755 int run_i = allCrates_run_nums[i][runCounter] ;
756 int run_f = allCrates_run_nums[i][runCounter + 1] ;
757 double time_i = allCrates_crystalCrate_times[i][runCounter] ;
758 double time_f = allCrates_crystalCrate_times[i][runCounter + 1] ;
760 if (fabs(time_f - time_i) > largeThreshold) {
761 B2INFO(
"WARNING: Crate " << i + 1 <<
" has crate time jump > " << largeThreshold <<
" ns: t(run " << run_f <<
") = " << time_f <<
762 " ns - t(run " << run_i <<
") = " << time_i <<
" ns = " << time_f - time_i);
771 TDirectory* executeDir = gDirectory;
Base class for calibration algorithms.
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.
Singleton class to cache database objects.
static DataStore & Instance()
Instance of singleton Store.
void setInitializeActive(bool active)
Setter for m_initializeActive.
This class provides access to ECL channel map that is either a) Loaded from the database (see ecl/dbo...
static constexpr double m_rf
accelerating RF, http://ptep.oxfordjournals.org/content/2013/3/03A006.full.pdf
Double_t m_crateTimeConst
Crate time calibration constant.
double m_tcrate_unc_min_cut
Minimum value cut for the crate time calibration constant uncertainty for plotting.
bool algorithmReadPayloads
Whether or not to have the algorithm code to loop over all the runs and read the payloads itself.
Int_t m_run_perCrystal
Run number.
const int m_numCrates
Number of Crates expected.
Int_t m_crystalID
Crystal ID number.
double m_tcrate_max_cut
Maximum value cut for the crate time calibration constant for plotting
double m_tcrate_min_cut
Minimum value cut for the crate time calibration constant for plotting.
const int m_numCrystals
Number of Crystals expected.
Double_t m_crystalTimeUnc
Uncertainty on the crystal time calibration constant.
Double_t m_crateTimeUnc
Uncertainty on the crate time calibration constant.
DBObjPtr< ECLReferenceCrystalPerCrateCalib > m_refCrysIDzeroingCrate
payload that we want to read from the DB
double m_tcrate_unc_max_cut
Maximum value cut for the crate time calibration constant uncertainty for plotting.
DBObjPtr< ECLCrystalCalib > m_ECLCrateTimeOffset
ECLCrateTimeOffset payload that we want to read from the DB.
Double_t m_crystalTimeConst
Crystal time calibration constant.
Int_t m_refCrystalID
Crystal ID number for the reference crystal.
EResult calibrate() override
..Run algorithm
Int_t m_exp_perCrystal
Experiment number
double crysCrateShift_max
Plotting time max for crystal+crate shift plots.
double crysCrateShift_min
Plotting time min for crystal+crate shift plots.
std::string debugFilenameBase
Name of file with debug output, eclTimeShiftsAlgorithm.root by default.
DBObjPtr< ECLCrystalCalib > m_ECLCrystalTimeOffset
ECLCrystalTimeOffset payload that we want to read from the DB.
double timeShiftForPlotStyle[52]
List of time offsets, one per crate, used just to centre the time constants around zero.
Int_t m_crateID
Crate ID number.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Type-safe access to single objects in the data store.
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
Class to store variables with their name which were sent to the logging service.
static DBStore & Instance()
Instance of a singleton DBStore.
void updateEvent()
Updates all intra-run dependent objects.
void update()
Updates all objects that are outside their interval of validity.
Abstract base class for different kinds of events.
Struct containing exp number and run number.