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;
388 evtPtr.registerInDataStore();
391 evtPtr.
construct(eventNumberForCrates, run, experiment);
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;