62 B2INFO(
"eclTimeShiftsAlgorithm parameters:");
65 B2INFO(
"timeShiftForPlotStyle = {");
66 for (
int crateTest = 0; crateTest < 51; crateTest++) {
80 const int iRun = expRunList[0].second;
81 const int iExp = expRunList[0].first;
91 vector< vector<double> > allCrates_crate_times ;
92 vector< vector<double> > allCrates_run_nums ;
93 vector< vector<double> > allCrates_time_unc ;
94 vector< vector<double> > allCrates_crystalCrate_times ;
95 vector< vector<double> > allCrates_crystalCrate_times_unc ;
97 vector<int> allRunNums;
99 vector<double> mean_crystalCrate_time_ns(
m_numCrates, 0);
101 vector< double > blank_vector = {} ;
102 for (
int temp_crate_id = 0; temp_crate_id <
m_numCrates; temp_crate_id++) {
103 allCrates_crate_times.push_back(blank_vector) ;
104 allCrates_run_nums.push_back(blank_vector) ;
105 allCrates_time_unc.push_back(blank_vector) ;
106 allCrates_crystalCrate_times.push_back(blank_vector) ;
107 allCrates_crystalCrate_times_unc.push_back(blank_vector) ;
121 B2ERROR(
"Tree of calibration constants does not exist.");
124 B2INFO(
"Number of Entries in tree_perCrystal was " << tree_perCrys->GetEntries());
131 tree_perCrys->SetBranchAddress(
"crystalID", &
m_crystalID);
132 tree_perCrys->SetBranchAddress(
"crateID", &
m_crateID);
140 int referenceRunNum = -1;
141 int referenceExpNum = -1;
143 int previousRunNumTree = -1 ;
146 vector<double> Crate_time_unc_ns_tree(
m_numCrates) ;
147 vector<double> crystalCrate_time_ns_tree(
m_numCrates);
148 vector<double> crystalCrate_time_unc_ns_tree(
m_numCrates);
151 Int_t numEntriesCrysTree = (Int_t)tree_perCrys->GetEntries();
154 for (Int_t tree_crys_i = 0; tree_crys_i < numEntriesCrysTree; tree_crys_i++) {
155 for (Int_t tree_crys_j = 0; tree_crys_j <
m_numCrystals; tree_crys_j++) {
156 tree_perCrys->GetEntry(tree_crys_i);
163 if (tree_crys_j == 0) {
172 B2ERROR(
"m_exp_perCrystal, referenceExpNum" <<
m_exp_perCrystal <<
", " << referenceExpNum);
173 B2ERROR(
"m_run_perCrystal, referenceRunNum" <<
m_run_perCrystal <<
", " << referenceRunNum);
174 B2ERROR(
"m_run_perCrystal, previousRunNumTree" <<
m_run_perCrystal <<
", " << previousRunNumTree);
175 B2ERROR(
"Exp/run number problem");
183 Crate_time_unc_ns_tree[crateID_temp - 1] =
m_crateTimeUnc * TICKS_TO_NS ;
186 B2INFO(
"exp, run, cell ID (0..8735), m_crateID, m_crateTimeConst = " <<
m_exp_perCrystal <<
", " <<
190 crystalCrate_time_unc_ns_tree[crateID_temp - 1] = TICKS_TO_NS *
sqrt(
193 }
else if (tree_crys_j == 0 || tree_crys_j == 8735) {
194 B2INFO(
"m_exp_perCrystal, m_run_perCrystal, cell ID (0..8735), m_crateID, m_crateTimeConst = " <<
m_exp_perCrystal <<
", " <<
197 B2DEBUG(22,
"m_exp_perCrystal, m_run_perCrystal, cell ID (0..8735), m_crateID, m_crateTimeConst = " <<
m_exp_perCrystal <<
", " <<
206 bool savedThisRunNum =
false;
207 for (
int iCrate = 0; iCrate <
m_numCrates; iCrate++) {
208 double tcrate = Crate_time_ns_tree[iCrate] ;
209 double tcrate_unc = Crate_time_unc_ns_tree[iCrate];
214 double tcrystalCrate = crystalCrate_time_ns_tree[iCrate];
215 double tcrystalCrate_unc = crystalCrate_time_unc_ns_tree[iCrate];
216 allCrates_crate_times[iCrate].push_back(tcrate) ;
218 allCrates_time_unc[iCrate].push_back(tcrate_unc) ;
219 allCrates_crystalCrate_times[iCrate].push_back(tcrystalCrate) ;
220 allCrates_crystalCrate_times_unc[iCrate].push_back(tcrystalCrate_unc) ;
222 mean_crystalCrate_time_ns[iCrate] += tcrystalCrate ;
224 if (!savedThisRunNum) {
226 savedThisRunNum =
true;
234 B2INFO(
"Crate " << ic + 1 <<
", t_crate = " << Crate_time_tick_tree[ic] <<
" ticks = "
235 << Crate_time_ns_tree[ic] <<
" +- " << Crate_time_unc_ns_tree[ic]
236 <<
" ns; t crys+crate (no shifts) = " << crystalCrate_time_ns_tree[ic] <<
" +- "
237 << crystalCrate_time_unc_ns_tree[ic] <<
" ns") ;
245 B2INFO(
"Finished reading tree calibration constants. Now extracting here by stepping through runs.");
255 bool minRunNumBool =
false;
256 bool maxRunNumBool =
false;
262 int expNumber = expRun.first;
263 int runNumber = expRun.second;
264 if (!minRunNumBool) {
265 minExpNum = expNumber;
266 minRunNum = runNumber;
267 minRunNumBool =
true;
269 if (!maxRunNumBool) {
270 maxExpNum = expNumber;
271 maxRunNum = runNumber;
272 maxRunNumBool =
true;
274 if (((minRunNum > runNumber) && (minExpNum >= expNumber)) ||
275 (minExpNum > expNumber)) {
276 minExpNum = expNumber;
277 minRunNum = runNumber;
279 if (((maxRunNum < runNumber) && (maxExpNum <= expNumber)) ||
280 (maxExpNum < expNumber)) {
281 maxExpNum = expNumber;
282 maxRunNum = runNumber;
286 B2INFO(
"minExpNum = " << minExpNum) ;
287 B2INFO(
"minRunNum = " << minRunNum) ;
288 B2INFO(
"maxExpNum = " << maxExpNum) ;
289 B2INFO(
"maxRunNum = " << maxRunNum) ;
292 if (minExpNum != maxExpNum) {
293 B2ERROR(
"The runs must all come from the same experiment");
297 int experiment = minExpNum;
315 ExpRun chosenRun = runs.front();
316 B2INFO(
"merging using the ExpRun (" << chosenRun.second <<
"," << chosenRun.first <<
")");
322 bool allObjectsFound =
true;
327 allObjectsFound =
false;
328 B2ERROR(
"No valid DBObject found for 'ECLCrystalTimeOffset'");
333 allObjectsFound =
false;
334 B2ERROR(
"No valid DBObject found for 'ECLCrateTimeOffset'");
338 allObjectsFound =
false;
339 B2ERROR(
"No valid DBObject found for 'refCrysIDzeroingCrate'");
343 if (allObjectsFound) {
344 B2INFO(
"Valid objects found for 'ECLCrystalTimeOffset'");
345 B2INFO(
"Valid object found for 'ECLCrateTimeOffset'");
346 B2INFO(
"Valid object found for 'refCrysIDzeroingCrate'");
348 B2INFO(
"eclTimeShiftsAlgorithm: Exiting with failure. Some missing valid objects.");
356 B2INFO(
"Loaded 'ECLCrystalTimeOffset' calibrations");
360 B2INFO(
"Loaded 'ECLCrateTimeOffset' calibration with default exp/run");
362 B2INFO(
"eclTimeShiftsAlgorithm:: loaded ECLCrateTimeOffset from the database"
366 for (
int cellID = 1; cellID <=
m_numCrystals; cellID += 511) {
367 B2INFO(
"crystalCalib = " << crystalCalib[cellID - 1]);
368 B2INFO(
"crateCalib = " << crateCalib[cellID - 1]);
372 for (
int icrate = 0; icrate <
m_numCrates; icrate++) {
373 B2INFO(
"reference crystal for crate " << icrate + 1 <<
" = " << refCrystals[icrate]);
380 for (
int run = minRunNum; run <= maxRunNum; run++) {
381 B2INFO(
"---------") ;
382 B2INFO(
"Looking at run " << run) ;
384 vector<int>::iterator it = find(allRunNums.begin(), allRunNums.end(), run);
385 if (it != allRunNums.end()) {
386 int pos = it - allRunNums.begin() ;
387 B2INFO(
"allRunNums[" << pos <<
"] = " << allRunNums[pos]);
388 B2INFO(
"Run " << run <<
" already processed so skipping it.");
391 B2INFO(
"New run. Starting to extract information");
395 int eventNumberForCrates = 1;
403 evtPtr.
construct(eventNumberForCrates, run, experiment);
416 crystalMapper->initFromDB();
419 B2INFO(
"eclTimeShiftsAlgorithm:: loaded ECLCrystalTimeOffset from the database"
422 B2INFO(
"eclTimeShiftsAlgorithm:: loaded ECLCrateTimeOffset from the database"
430 vector<float> crystalTimeOffsetsCalib;
431 vector<float> crystalTimeOffsetsCalibUnc;
435 vector<float> crateTimeOffsetsCalib;
436 vector<float> crateTimeOffsetsCalibUnc;
448 vector<double> crystalCrate_time_unc_ns(
m_numCrates);
451 int crateID_temp = crystalMapper->getCrateID(crysID) ;
452 Crate_time_ns[crateID_temp - 1] = crateTimeOffsetsCalib[crysID - 1] * TICKS_TO_NS ;
453 Crate_time_tick[crateID_temp - 1] = crateTimeOffsetsCalib[crysID - 1] ;
454 Crate_time_unc_ns[crateID_temp - 1] = crateTimeOffsetsCalibUnc[crysID - 1] * TICKS_TO_NS ;
456 if (crysID == refCrystals[crateID_temp - 1]) {
457 crystalCrate_time_ns[crateID_temp - 1] = (crystalTimeOffsetsCalib[crysID - 1] +
458 crateTimeOffsetsCalib[crysID - 1]) * TICKS_TO_NS;
460 crystalCrate_time_unc_ns[crateID_temp - 1] = TICKS_TO_NS *
sqrt(
461 (crateTimeOffsetsCalibUnc[crysID - 1] * crateTimeOffsetsCalibUnc[crysID - 1]) +
462 (crystalTimeOffsetsCalibUnc[crysID - 1] * crystalTimeOffsetsCalibUnc[crysID - 1])) ;
467 for (
int iCrate = 0; iCrate <
m_numCrates; iCrate++) {
468 double tcrate = Crate_time_ns[iCrate] ;
469 double tcrate_unc = Crate_time_unc_ns[iCrate];
474 double tcrystalCrate = crystalCrate_time_ns[iCrate];
475 double tcrystalCrate_unc = crystalCrate_time_unc_ns[iCrate];
476 allCrates_crate_times[iCrate].push_back(tcrate) ;
477 allCrates_run_nums[iCrate].push_back(run) ;
478 allCrates_time_unc[iCrate].push_back(tcrate_unc) ;
479 allCrates_crystalCrate_times[iCrate].push_back(tcrystalCrate) ;
480 allCrates_crystalCrate_times_unc[iCrate].push_back(tcrystalCrate_unc) ;
482 mean_crystalCrate_time_ns[iCrate] += tcrystalCrate ;
490 B2INFO(
"Crate " << ic + 1 <<
", t_crate = " << Crate_time_tick[ic] <<
" ticks = "
491 << Crate_time_ns[ic] <<
" +- " << Crate_time_unc_ns[ic]
492 <<
" ns; t crys+crate (no shift) = " << crystalCrate_time_ns[ic] <<
" +- "
493 << crystalCrate_time_unc_ns[ic] <<
" ns") ;
500 B2INFO(
LogVar(
"IOV_exp_high", IOV_exp_high));
501 B2INFO(
LogVar(
"IOV_run_high", IOV_run_high));
502 if (IOV_run_high == -1) {
503 B2INFO(
"IOV_run_high is -1 so stop looping over all runs");
506 B2INFO(
"Set run number to higher iov run number");
509 B2INFO(
"now set run = " << run);
522 B2INFO(
"Shift all run crys+crate+off times. Show the results for a subset of crates/runs:");
523 for (
int iCrate = 0; iCrate <
m_numCrates; iCrate++) {
524 double mean_time = mean_crystalCrate_time_ns[iCrate] / allCrates_crate_times[iCrate].size() ;
525 B2INFO(
"Mean crys+crate times for all runs used as offset (crate " << iCrate + 1 <<
") = " << mean_time);
527 for (
long unsigned int jRun = 0; jRun < allCrates_crate_times[iCrate].size(); jRun++) {
529 if (jRun < 50 || iCrate == 1 || iCrate == 40 || iCrate == 51) {
530 B2INFO(
"allCrates_crystalCrate_times(crate " << iCrate + 1 <<
", run counter " << jRun + 1 <<
", runNum " <<
531 allCrates_run_nums[iCrate][jRun] <<
" | after shifting mean) = " <<
532 allCrates_crystalCrate_times[iCrate][jRun]);
543 TFile* tcratefile = 0;
546 string runNumsString = string(
"_") + to_string(minExpNum) +
"_" + to_string(minRunNum) + string(
"-") +
547 to_string(maxExpNum) +
"_" + to_string(maxRunNum);
549 TString fname = debugFilename;
551 tcratefile =
new TFile(fname,
"recreate");
553 B2INFO(
"Debugging histograms written to " << fname);
556 B2INFO(
"Starting to make crate time jump plots for crate " << i + 1);
557 shared_ptr< TCanvas > cSmart(
new TCanvas);
559 Double_t* single_crate_crate_times = &allCrates_crate_times[i][0] ;
560 Double_t* single_crate_run_nums = &allCrates_run_nums[i][0] ;
561 Double_t* single_crate_time_unc = &allCrates_time_unc[i][0] ;
562 Double_t* single_crate_crystalCrate_times = &allCrates_crystalCrate_times[i][0] ;
563 Double_t* single_crate_crystalCrate_times_unc = &allCrates_crystalCrate_times_unc[i][0] ;
564 B2INFO(
"Done setting up the arrays for the crate " << i + 1);
567 ss << setw(2) << setfill(
'0') << i + 1 ;
568 string paddedCrateID(ss.str());
571 shared_ptr< TGraphErrors > g_tcrate_vs_runNum(
new TGraphErrors(allCrates_crate_times[i].size(), single_crate_run_nums,
572 single_crate_crate_times, NULL, single_crate_time_unc)) ;
575 string tgraph_title = string(
"e") + to_string(minExpNum) + string(
"r") + to_string(minRunNum) +
576 string(
"-e") + to_string(maxExpNum) + string(
"r") + to_string(maxRunNum) ;
578 string tgraph_name_short =
"crateTimeVSrunNum_" ;
579 tgraph_name_short = tgraph_name_short + runNumsString +
"_crate";
581 tgraph_title = tgraph_title + string(
"_crate") + paddedCrateID ;
582 tgraph_name_short = tgraph_name_short + paddedCrateID ;
583 tgraph_title = tgraph_title + string(
" (") + to_string(
m_tcrate_min_cut) + string(
" < tcrate < ") +
587 g_tcrate_vs_runNum->SetName(tgraph_name_short.c_str()) ;
588 g_tcrate_vs_runNum->SetTitle(tgraph_title.c_str()) ;
589 g_tcrate_vs_runNum->GetXaxis()->SetTitle(
"Run number") ;
590 g_tcrate_vs_runNum->GetYaxis()->SetTitle(
"Crate time [ns]") ;
594 g_tcrate_vs_runNum->Draw(
"AP") ;
595 g_tcrate_vs_runNum->SetMarkerSize(0.8) ;
596 g_tcrate_vs_runNum->Draw(
"AP") ;
598 shared_ptr< TLatex > Leg1(
new TLatex);
600 Leg1->SetTextAlign(11);
601 Leg1->SetTextFont(42);
602 Leg1->SetTextSize(0.035);
603 Leg1->SetTextColor(1);
606 g_tcrate_vs_runNum->Write() ;
607 cSmart->SaveAs((tgraph_name_short +
string(
".pdf")).c_str()) ;
609 B2INFO(
"Saved pdf: " << tgraph_name_short <<
".pdf");
613 shared_ptr< TGraphErrors > g_crateCrystalTime_vs_runNum(
new TGraphErrors(allCrates_crystalCrate_times[i].size(),
614 single_crate_run_nums,
615 single_crate_crystalCrate_times, NULL, single_crate_crystalCrate_times_unc)) ;
617 tgraph_title = string(
"e") + to_string(minExpNum) + string(
"r") + to_string(minRunNum) +
618 string(
"-e") + to_string(maxExpNum) + string(
"r") + to_string(maxRunNum) ;
620 tgraph_name_short =
"crystalCrateTimeVSrunNum_" ;
621 tgraph_name_short = tgraph_name_short + runNumsString +
"_crate";
623 tgraph_title = tgraph_title + string(
"_crate") + paddedCrateID ;
624 tgraph_name_short = tgraph_name_short + paddedCrateID ;
625 tgraph_title = tgraph_title + string(
" (") + to_string(
m_tcrate_min_cut) + string(
" < tcrate < ") +
630 g_crateCrystalTime_vs_runNum->SetName(tgraph_name_short.c_str()) ;
631 g_crateCrystalTime_vs_runNum->SetTitle(tgraph_title.c_str()) ;
632 g_crateCrystalTime_vs_runNum->GetXaxis()->SetTitle(
"Run number") ;
633 g_crateCrystalTime_vs_runNum->GetYaxis()->SetTitle(
"Crate time + Crystal time + centring overall offset [ns]") ;
637 g_crateCrystalTime_vs_runNum->Draw(
"AP") ;
638 g_crateCrystalTime_vs_runNum->SetMarkerSize(0.8) ;
639 g_crateCrystalTime_vs_runNum->Draw(
"AP") ;
641 g_crateCrystalTime_vs_runNum->Write() ;
642 cSmart->SaveAs((tgraph_name_short +
string(
".pdf")).c_str()) ;
644 B2INFO(
"Saved pdf: " << tgraph_name_short <<
".pdf");
653 int numRunsWithCrateTimes = allCrates_crystalCrate_times[i].size();
654 vector<Double_t> counterVec(numRunsWithCrateTimes);
659 vector<pair<int, double> > runNum_index_pairs;
663 for (
int pairIndex = 0; pairIndex < numRunsWithCrateTimes; pairIndex++) {
664 runNum_index_pairs.push_back(make_pair(allCrates_run_nums[i][pairIndex], pairIndex));
667 B2INFO(
"Crate id = " << i + 1);
668 B2INFO(
"Unsorted run numbers");
669 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes; runCounter++) {
670 B2INFO(
"Run number, run number vector index = " << runNum_index_pairs[runCounter].first <<
", " <<
671 runNum_index_pairs[runCounter].second);
675 sort(runNum_index_pairs.begin(), runNum_index_pairs.end());
678 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes; runCounter++) {
679 counterVec[runNum_index_pairs[runCounter].second] = runCounter + 1;
682 B2INFO(
"Run numbers with index and times");
683 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes; runCounter++) {
684 int idx = (int) round(counterVec[runCounter]);
685 B2INFO(
"Vector index, Run number, run number sorting order index, tcrystal+tcrate+shifts = " << runCounter <<
", " <<
686 allCrates_run_nums[i][runCounter] <<
", " << idx <<
", " << single_crate_crystalCrate_times[idx - 1] <<
" ns");
690 if (numRunsWithCrateTimes > 0) {
691 shared_ptr< TGraphErrors > g_crateCrystalTime_vs_runCounter(
new TGraphErrors(numRunsWithCrateTimes, &counterVec[0],
692 single_crate_crystalCrate_times, NULL, single_crate_crystalCrate_times_unc)) ;
694 tgraph_title = string(
"e") + to_string(minExpNum) + string(
"r") + to_string(minRunNum) +
695 string(
"-e") + to_string(maxExpNum) + string(
"r") + to_string(maxRunNum) ;
698 tgraph_name_short =
"crystalCrateTimeVSrunCounter_" ;
699 tgraph_name_short = tgraph_name_short + runNumsString +
"_crate";
702 tgraph_title = tgraph_title + string(
"_crate") + paddedCrateID ;
703 tgraph_name_short = tgraph_name_short + paddedCrateID ;
704 tgraph_title = tgraph_title + string(
" (") + to_string(
m_tcrate_min_cut) + string(
" < tcrate < ") +
709 g_crateCrystalTime_vs_runCounter->SetName(tgraph_name_short.c_str()) ;
710 g_crateCrystalTime_vs_runCounter->SetTitle(tgraph_title.c_str()) ;
711 g_crateCrystalTime_vs_runCounter->GetXaxis()->SetTitle(
"Run counter (remove gaps from run numbers)") ;
712 g_crateCrystalTime_vs_runCounter->GetYaxis()->SetTitle(
"Crate time + Crystal time + centring overall offset [ns]") ;
715 g_crateCrystalTime_vs_runCounter->GetXaxis()->SetRangeUser(0, numRunsWithCrateTimes + 1) ;
717 g_crateCrystalTime_vs_runCounter->Draw(
"AP") ;
718 g_crateCrystalTime_vs_runCounter->SetMarkerSize(0.8) ;
719 g_crateCrystalTime_vs_runCounter->Draw(
"AP") ;
721 g_crateCrystalTime_vs_runCounter->Write() ;
722 cSmart->SaveAs((tgraph_name_short +
string(
".pdf")).c_str()) ;
723 B2INFO(
"Saved pdf: " << tgraph_name_short <<
".pdf");
725 B2INFO(
"Finished making crate time jump plots for crate " << i + 1);
727 B2INFO(
"Crate " << i + 1 <<
" has no entries that pass all the cuts so no crystalCrateTimeVSrunCounter_crate plot will be made.");
736 double smallThreshold = 1 ;
737 double largeThreshold = 6.5 ;
739 B2INFO(
"======================= Crate time jumps =========================");
740 B2INFO(
"======================= Small threshold jumps ====================");
741 B2INFO(
"Crate ID = 1..52");
742 B2INFO(
"==================================================================");
745 int numRunsWithCrateTimes = allCrates_crystalCrate_times[i].size();
746 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes - 1; runCounter++) {
747 int run_i = allCrates_run_nums[i][runCounter] ;
748 int run_f = allCrates_run_nums[i][runCounter + 1] ;
749 double time_i = allCrates_crystalCrate_times[i][runCounter] ;
750 double time_f = allCrates_crystalCrate_times[i][runCounter + 1] ;
752 if (fabs(time_f - time_i) > smallThreshold) {
753 B2INFO(
"Crate " << i + 1 <<
" has crate time jump > " << smallThreshold <<
" ns: t(run " << run_f <<
") = " << time_f <<
754 " ns - t(run " << run_i <<
") = " << time_i <<
" ns = " << time_f - time_i);
760 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~ Large threshold jumps ~~~~~~~~~~~~~~~~~~~~");
761 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
764 int numRunsWithCrateTimes = allCrates_crystalCrate_times[i].size();
765 for (
int runCounter = 0; runCounter < numRunsWithCrateTimes - 1; runCounter++) {
766 int run_i = allCrates_run_nums[i][runCounter] ;
767 int run_f = allCrates_run_nums[i][runCounter + 1] ;
768 double time_i = allCrates_crystalCrate_times[i][runCounter] ;
769 double time_f = allCrates_crystalCrate_times[i][runCounter + 1] ;
771 if (fabs(time_f - time_i) > largeThreshold) {
772 B2INFO(
"WARNING: Crate " << i + 1 <<
" has crate time jump > " << largeThreshold <<
" ns: t(run " << run_f <<
") = " << time_f <<
773 " ns - t(run " << run_i <<
") = " << time_i <<
" ns = " << time_f - time_i);
782 TDirectory* executeDir = gDirectory;