10 #include <ecl/calibration/eclTValidationAlgorithm.h>
13 #include <ecl/dataobjects/ECLElementNumbers.h>
14 #include <ecl/dbobjects/ECLCrystalCalib.h>
15 #include <ecl/dbobjects/ECLReferenceCrystalPerCrateCalib.h>
16 #include <ecl/digitization/EclConfiguration.h>
17 #include <ecl/geometry/ECLGeometryPar.h>
18 #include <ecl/mapper/ECLChannelMapper.h>
21 #include <framework/database/DBImportObjPtr.h>
22 #include <framework/database/DBObjPtr.h>
23 #include <framework/database/DBStore.h>
24 #include <framework/dataobjects/EventMetaData.h>
25 #include <framework/datastore/DataStore.h>
26 #include <framework/datastore/StoreObjPtr.h>
32 #include <TGraphAsymmErrors.h>
33 #include <TGraphErrors.h>
36 #include <TMultiGraph.h>
49 eclTValidationAlgorithm::eclTValidationAlgorithm():
53 cellIDHi(ECLElementNumbers::c_NCrystals),
54 readPrevCrysPayload(false),
55 meanCleanRebinFactor(1),
56 meanCleanCutMinFactor(0),
57 clusterTimesFractionWindow_maxtime(8),
58 debugFilenameBase(
"eclTValidationAlgorithm")
60 setDescription(
"Fit gaussian function to the cluster times to validate results.");
74 cellIDHi(ECLElementNumbers::c_NCrystals),
75 readPrevCrysPayload(false),
76 meanCleanRebinFactor(1),
77 meanCleanCutMinFactor(0),
78 clusterTimesFractionWindow_maxtime(8),
79 debugFilenameBase(
"eclTValidationAlgorithm")
81 setDescription(
"Fit gaussian function to the cluster times to validate results.");
94 B2INFO(
"eclTValidationAlgorithm parameters:");
104 auto clusterTime = getObjectPtr<TH1F>(
"clusterTime");
105 auto clusterTime_cid = getObjectPtr<TH2F>(
"clusterTime_cid");
106 auto clusterTime_run = getObjectPtr<TH2F>(
"clusterTime_run");
107 auto clusterTimeClusterE = getObjectPtr<TH2F>(
"clusterTimeClusterE");
108 auto dt99_clusterE = getObjectPtr<TH2F>(
"dt99_clusterE");
109 auto eventT0 = getObjectPtr<TH1F>(
"eventT0");
110 auto clusterTimeE0E1diff = getObjectPtr<TH1F>(
"clusterTimeE0E1diff");
113 auto cutflow = getObjectPtr<TH1F>(
"cutflow");
115 vector <int> binProjectionLeft_Time_vs_E_runDep ;
116 vector <int> binProjectionRight_Time_vs_E_runDep ;
118 for (
int binCounter = 1; binCounter <= clusterTimeClusterE->GetNbinsX(); binCounter++) {
119 binProjectionLeft_Time_vs_E_runDep.push_back(binCounter);
120 binProjectionRight_Time_vs_E_runDep.push_back(binCounter);
135 int numCrysWithNonZeroEntries = 0 ;
136 int numCrysWithGoodFit = 0 ;
138 int minNumEntries = 40;
144 bool minRunNumBool =
false;
145 bool maxRunNumBool =
false;
151 int expNumber = expRun.first;
152 int runNumber = expRun.second;
153 if (!minRunNumBool) {
154 minExpNum = expNumber;
155 minRunNum = runNumber;
156 minRunNumBool =
true;
158 if (!maxRunNumBool) {
159 maxExpNum = expNumber;
160 maxRunNum = runNumber;
161 maxRunNumBool =
true;
163 if (((minRunNum > runNumber) && (minExpNum >= expNumber)) ||
164 (minExpNum > expNumber)) {
165 minExpNum = expNumber;
166 minRunNum = runNumber;
168 if (((maxRunNum < runNumber) && (maxExpNum <= expNumber)) ||
169 (maxExpNum < expNumber))
172 maxExpNum = expNumber;
173 maxRunNum = runNumber;
178 string runNumsString = string(
"_") + to_string(minExpNum) +
"_" + to_string(minRunNum) + string(
"-") +
179 to_string(maxExpNum) +
"_" + to_string(maxRunNum);
187 int eventNumberForCrates = 1;
199 evtPtr.
construct(eventNumberForCrates, minRunNum, minExpNum);
208 B2INFO(
"Uploading payload for exp " << minExpNum <<
", run " << minRunNum <<
", event " << eventNumberForCrates);
211 crystalMapper->initFromDB();
220 B2INFO(
"Dumping payload");
223 std::vector<float> currentValuesCrys = crystalTimeObject->
getCalibVector();
227 B2INFO(
"Values read from database. Write out for their values for comparison against those from tcol");
229 B2INFO(
"ts: cellID " << ic + 1 <<
" " << currentValuesCrys[ic] <<
" +/- " << currentUncCrys[ic]);
241 B2INFO(
"Previous values read from database. Write out for their values for comparison against those from tcol");
243 B2INFO(
"ts custom previous payload: cellID " << ic + 1 <<
" " << prevValuesCrys[ic]);
251 B2INFO(
"Debug output rootfile: " << debugFilename);
252 histfile =
new TFile(debugFilename.c_str(),
"recreate");
255 clusterTime ->Write();
256 clusterTime_cid ->Write();
257 clusterTime_run ->Write();
258 clusterTimeClusterE ->Write();
259 dt99_clusterE ->Write();
261 clusterTimeE0E1diff ->Write();
266 double hist_tmin = clusterTime->GetXaxis()->GetXmin();
267 double hist_tmax = clusterTime->GetXaxis()->GetXmax();
268 int hist_nTbins = clusterTime->GetNbinsX();
270 B2INFO(
"hist_tmin = " << hist_tmin);
271 B2INFO(
"hist_tmax = " << hist_tmax);
272 B2INFO(
"hist_nTbins = " << hist_nTbins);
274 double time_fit_min = hist_tmax;
275 double time_fit_max = hist_tmin;
281 auto peakClusterTimes =
new TH1F(
"peakClusterTimes",
282 "-For crystals with at least one hit-;Peak cluster time [ns];Number of crystals",
283 hist_nTbins, hist_tmin, hist_tmax);
284 auto peakClusterTimesGoodFit =
new TH1F(
"peakClusterTimesGoodFit",
285 "-For crystals with a good fit to distribution of hits-;Peak cluster time [ns];Number of crystals",
286 hist_nTbins, hist_tmin, hist_tmax);
288 auto peakClusterTimesGoodFit__cid =
new TH1F(
"peakClusterTimesGoodFit__cid",
289 "-For crystals with a good fit to distribution of hits-;cell id (only crystals with good fit);Peak cluster time [ns]",
294 auto tsNew_MINUS_tsCustomPrev__cid =
new TH1F(
"TsNew_MINUS_TsCustomPrev__cid",
295 ";cell id; ts(new|merged) - ts(old = 'pre-calib'|merged) [ns]",
298 auto tsNew_MINUS_tsCustomPrev =
new TH1F(
"TsNew_MINUS_TsCustomPrev",
299 ";ts(new | merged) - ts(old = 'pre-calib' | merged) [ns];Number of crystals",
300 285, -69.5801, 69.5801);
306 B2INFO(
"timeWindow_maxTime = " << timeWindow_maxTime);
307 int binyLeft = clusterTime_cid->GetYaxis()->FindBin(-timeWindow_maxTime);
308 int binyRight = clusterTime_cid->GetYaxis()->FindBin(timeWindow_maxTime);
309 double windowLowTimeFromBin = clusterTime_cid->GetYaxis()->GetBinLowEdge(binyLeft);
310 double windowHighTimeFromBin = clusterTime_cid->GetYaxis()->GetBinLowEdge(binyRight + 1);
311 std::string s_lowTime = std::to_string(windowLowTimeFromBin);
312 std::string s_highTime = std::to_string(windowHighTimeFromBin);
313 TString fracWindowTitle =
"Fraction of cluster times in window [" + s_lowTime +
", " + s_highTime +
314 "] ns;cell id;Fraction of cluster times in window";
315 B2INFO(
"fracWindowTitle = " << fracWindowTitle);
316 TString fracWindowInGoodECLRingsTitle =
"Fraction of cluster times in window [" + s_lowTime +
", " + s_highTime +
317 "] ns and in good ECL theta rings;cell id;Fraction cluster times in window + good ECL rings";
318 B2INFO(
"fracWindowInGoodECLRingsTitle = " << fracWindowInGoodECLRingsTitle);
319 B2INFO(
"Good ECL rings skip gaps in the acceptance, and includes ECL theta IDs: 3-10, 15-39, 44-56, 61-66.");
321 TString fracWindowHistTitle =
"Fraction of cluster times in window [" + s_lowTime +
", " + s_highTime +
322 "] ns;Fraction of cluster times in window;Number of crystals";
326 auto clusterTimeNumberInWindowInGoodECLRings__cid =
new TH1F(
"clusterTimeNumberInWindowInGoodECLRings__cid", fracWindowTitle,
331 auto clusterTimeFractionInWindow =
new TH1F(
"clusterTimeFractionInWindow", fracWindowHistTitle, 110, 0.0, 1.1);
333 clusterTimeNumberInWindow__cid->Sumw2();
334 clusterTimeNumberInWindowInGoodECLRings__cid->Sumw2();
335 clusterTimeNumber__cid->Sumw2();
345 double clusterTime_mean = 0;
346 double clusterTime_mean_unc = 0;
348 B2INFO(
"Crystal cell id = " << crys_id);
357 TH1D* h_time = clusterTime_cid->ProjectionY((std::string(
"h_time_psi__") + std::to_string(crys_id)).c_str(),
359 TH1D* h_timeMask = (TH1D*)h_time->Clone();
360 TH1D* h_timeMasked = (TH1D*)h_time->Clone((std::string(
"h_time_psi_masked__") + std::to_string(crys_id)).c_str());
361 TH1D* h_timeRebin = (TH1D*)h_time->Clone();
368 h_timeMask->Scale(0.0);
370 time_fit_min = hist_tmax;
371 time_fit_max = hist_tmin;
374 double histRebin_max = h_timeRebin->GetMaximum();
376 bool maskedOutNonZeroBin =
false;
378 for (
int bin = 1; bin <= h_timeRebin->GetNbinsX(); bin++) {
381 if (nonRebinnedBinNumber < h_time->GetNbinsX()) {
383 h_timeMask->SetBinContent(nonRebinnedBinNumber, 1);
386 double x_lower = h_timeRebin->GetXaxis()->GetBinLowEdge(bin);
387 double x_upper = h_timeRebin->GetXaxis()->GetBinUpEdge(bin);
388 if (x_lower < time_fit_min) {
389 time_fit_min = x_lower;
391 if (x_upper > time_fit_max) {
392 time_fit_max = x_upper;
396 if (h_time->GetBinContent(nonRebinnedBinNumber) > 0) {
397 B2DEBUG(22,
"Setting bin " << nonRebinnedBinNumber <<
" from " << h_timeMasked->GetBinContent(nonRebinnedBinNumber) <<
" to 0");
398 maskedOutNonZeroBin =
true;
400 h_timeMasked->SetBinContent(nonRebinnedBinNumber, 0);
405 B2INFO(
"Bins with non-zero values have been masked out: " << maskedOutNonZeroBin);
406 h_timeMasked->ResetStats();
407 h_timeMask->ResetStats();
412 double default_meanMasked = h_timeMasked->GetMean();
414 B2INFO(
"default_meanMasked = " << default_meanMasked);
418 double default_mean = h_time->GetMean();
419 double default_mean_unc = h_time->GetMeanError();
420 double default_sigma = h_time->GetStdDev();
422 B2INFO(
"Fitting crystal between " << time_fit_min <<
" and " << time_fit_max);
425 TF1* gaus =
new TF1(
"func",
"gaus(0)", time_fit_min, time_fit_max);
426 gaus->SetParNames(
"numCrystalHitsNormalization",
"mean",
"sigma");
433 double hist_max = h_time->GetMaximum();
436 double stddev = h_time->GetStdDev();
441 gaus->SetParameter(0, hist_max / 2.);
442 gaus->SetParameter(1, mean);
443 gaus->SetParameter(2, sigma);
450 h_timeMasked->Fit(gaus,
"LQR");
452 double fit_mean = gaus->GetParameter(1);
453 double fit_mean_unc = gaus->GetParError(1);
454 double fit_sigma = gaus->GetParameter(2);
456 double meanDiff = fit_mean - default_mean;
457 double meanUncDiff = fit_mean_unc - default_mean_unc;
458 double sigmaDiff = fit_sigma - default_sigma;
460 bool good_fit =
false;
462 if ((fabs(meanDiff) > 10) ||
463 (fabs(meanUncDiff) > 10) ||
464 (fabs(sigmaDiff) > 10) ||
465 (fit_mean_unc > 3) ||
467 (fit_mean < time_fit_min) ||
468 (fit_mean > time_fit_max)) {
469 B2INFO(
"Crystal cell id = " << crys_id);
470 B2INFO(
"fit mean, default mean = " << fit_mean <<
", " << default_mean);
471 B2INFO(
"fit mean unc, default mean unc = " << fit_mean_unc <<
", " << default_mean_unc);
472 B2INFO(
"fit sigma, default sigma = " << fit_sigma <<
", " << default_sigma);
474 B2INFO(
"crystal fit mean - hist mean = " << meanDiff);
475 B2INFO(
"fit mean unc. - hist mean unc. = " << meanUncDiff);
476 B2INFO(
"fit sigma - hist sigma = " << sigmaDiff);
478 B2INFO(
"fit_mean = " << fit_mean);
479 B2INFO(
"time_fit_min = " << time_fit_min);
480 B2INFO(
"time_fit_max = " << time_fit_max);
482 if (fabs(meanDiff) > 10) B2INFO(
"fit mean diff too large");
483 if (fabs(meanUncDiff) > 10) B2INFO(
"fit mean unc diff too large");
484 if (fabs(sigmaDiff) > 10) B2INFO(
"fit mean sigma diff too large");
485 if (fit_mean_unc > 3) B2INFO(
"fit mean unc too large");
486 if (fit_sigma < 0.1) B2INFO(
"fit sigma too small");
490 numCrysWithGoodFit++;
491 crysHasGoodFit[crys_id - 1] = true ;
495 int numEntries = h_time->GetEntries();
498 if ((numEntries >= minNumEntries) && good_fit) {
499 clusterTime_mean = fit_mean;
500 clusterTime_mean_unc = fit_mean_unc;
501 crysHasGoodFitandStats[crys_id - 1] = true ;
503 clusterTime_mean = default_mean;
504 clusterTime_mean_unc = default_mean_unc;
507 if (numEntries < minNumEntries) B2INFO(
"Number of entries less than minimum");
508 if (numEntries == 0) B2INFO(
"Number of entries == 0");
511 t_offsets[crys_id - 1] = clusterTime_mean ;
512 t_offsets_unc[crys_id - 1] = clusterTime_mean_unc ;
513 numClusterPerCrys[crys_id - 1] = numEntries ;
515 histfile->WriteTObject(h_time, (std::string(
"h_time_psi") + std::to_string(crys_id)).c_str());
516 histfile->WriteTObject(h_timeMasked, (std::string(
"h_time_psi_masked") + std::to_string(crys_id)).c_str());
519 peakClusterTime_cid->SetBinContent(crys_id, t_offsets[crys_id - 1]);
520 peakClusterTime_cid->SetBinError(crys_id, t_offsets_unc[crys_id - 1]);
524 if (numEntries > 0) {
525 peakClusterTimes->Fill(t_offsets[crys_id - 1]);
526 numCrysWithNonZeroEntries++ ;
528 if ((numEntries >= minNumEntries) && good_fit) {
529 peakClusterTimesGoodFit->Fill(t_offsets[crys_id - 1]);
530 peakClusterTimesGoodFit__cid->SetBinContent(crys_id, t_offsets[crys_id - 1]);
531 peakClusterTimesGoodFit__cid->SetBinError(crys_id, t_offsets_unc[crys_id - 1]);
536 double numClusterTimesWithinWindowFraction = h_time->Integral(binyLeft, binyRight) ;
537 double clusterTimesWithinWindowFraction = numClusterTimesWithinWindowFraction;
538 if (numEntries > 0) {
539 clusterTimesWithinWindowFraction /= numEntries;
541 clusterTimesWithinWindowFraction = -0.1;
544 B2INFO(
"Crystal cell id = " << crys_id <<
", theta id = " <<
545 thetaID <<
", clusterTimesWithinWindowFraction = " <<
546 numClusterTimesWithinWindowFraction <<
" / " << numEntries <<
" = " <<
547 clusterTimesWithinWindowFraction);
549 clusterTimeFractionInWindow->Fill(clusterTimesWithinWindowFraction);
550 clusterTimeNumberInWindow__cid->SetBinContent(crys_id, numClusterTimesWithinWindowFraction);
551 clusterTimeNumber__cid->SetBinContent(crys_id, numEntries);
553 if ((thetaID >= 3 && thetaID <= 10) ||
554 (thetaID >= 15 && thetaID <= 39) ||
555 (thetaID >= 44 && thetaID <= 56) ||
556 (thetaID >= 61 && thetaID <= 66)) {
557 clusterTimeNumberInWindowInGoodECLRings__cid->SetBinContent(crys_id, numClusterTimesWithinWindowFraction);
565 auto g_clusterTimeFractionInWindow__cid =
new TGraphAsymmErrors(clusterTimeNumberInWindow__cid, clusterTimeNumber__cid,
"w");
566 auto g_clusterTimeFractionInWindowInGoodECLRings__cid =
new TGraphAsymmErrors(clusterTimeNumberInWindowInGoodECLRings__cid,
567 clusterTimeNumber__cid,
"w");
568 g_clusterTimeFractionInWindow__cid->SetTitle(fracWindowTitle);
569 g_clusterTimeFractionInWindowInGoodECLRings__cid->SetTitle(fracWindowInGoodECLRingsTitle);
572 peakClusterTime_cid->ResetStats();
573 peakClusterTimesGoodFit__cid->ResetStats();
575 histfile->WriteTObject(peakClusterTime_cid,
"peakClusterTime_cid");
576 histfile->WriteTObject(peakClusterTimes,
"peakClusterTimes");
577 histfile->WriteTObject(peakClusterTimesGoodFit__cid,
"peakClusterTimesGoodFit__cid");
578 histfile->WriteTObject(peakClusterTimesGoodFit,
"peakClusterTimesGoodFit");
579 histfile->WriteTObject(g_clusterTimeFractionInWindow__cid,
"g_clusterTimeFractionInWindow__cid");
580 histfile->WriteTObject(g_clusterTimeFractionInWindowInGoodECLRings__cid,
"g_clusterTimeFractionInWindowInGoodECLRings__cid");
581 histfile->WriteTObject(clusterTimeFractionInWindow,
"clusterTimeFractionInWindow");
588 vector <int> binProjectionLeft = binProjectionLeft_Time_vs_E_runDep;
589 vector <int> binProjectionRight = binProjectionRight_Time_vs_E_runDep;
591 auto h2 = clusterTimeClusterE;
594 double max_E = h2->GetXaxis()->GetXmax();
597 vector <double> E_binEdges(binProjectionLeft.size() + 1);
598 for (
long unsigned int x_bin = 0; x_bin < binProjectionLeft.size(); x_bin++) {
599 TH1D* h_E_t_slice = h2->ProjectionX(
"h_E_t_slice", 1, 1) ;
600 E_binEdges[x_bin] = h_E_t_slice->GetXaxis()->GetBinLowEdge(binProjectionLeft[x_bin]) ;
601 B2INFO(
"E_binEdges[" << x_bin <<
"] = " << E_binEdges[x_bin]);
602 if (x_bin == binProjectionLeft.size() - 1) {
603 E_binEdges[x_bin + 1] = max_E ;
604 B2INFO(
"E_binEdges[" << x_bin + 1 <<
"] = " << E_binEdges[x_bin + 1]);
609 auto clusterTimePeak_ClusterEnergy_varBin =
new TH1F(
"clusterTimePeak_ClusterEnergy_varBin",
610 ";ECL cluster energy [GeV];Cluster time fit position [ns]", E_binEdges.size() - 1, &(E_binEdges[0]));
611 auto clusterTimePeakWidth_ClusterEnergy_varBin =
new TH1F(
"clusterTimePeakWidth_ClusterEnergy_varBin",
612 ";ECL cluster energy [GeV];Cluster time fit width [ns]", E_binEdges.size() - 1, &(E_binEdges[0]));
614 int Ebin_counter = 1 ;
617 for (
long unsigned int x_bin = 0; x_bin < binProjectionLeft.size(); x_bin++) {
618 double clusterTime_mean = 0;
619 double clusterTime_mean_unc = 0;
620 double clusterTime_sigma = 0;
622 B2INFO(
"x_bin = " << x_bin);
626 TH1D* h_time = h2->ProjectionY((
"h_time_E_slice_" + std::to_string(x_bin)).c_str(), binProjectionLeft[x_bin],
627 binProjectionRight[x_bin]) ;
630 TH1D* h_E_t_slice = h2->ProjectionX(
"h_E_t_slice", 1, 1) ;
631 double lowE = h_E_t_slice->GetXaxis()->GetBinLowEdge(binProjectionLeft[x_bin]) ;
632 double highE = h_E_t_slice->GetXaxis()->GetBinUpEdge(binProjectionRight[x_bin]) ;
633 double meanE = (lowE + highE) / 2.0 ;
635 B2INFO(
"bin " << Ebin_counter <<
": low E = " << lowE <<
", high E = " << highE <<
" GeV");
637 TH1D* h_timeMask = (TH1D*)h_time->Clone();
638 TH1D* h_timeMasked = (TH1D*)h_time->Clone((std::string(
"h_time_E_slice_masked__") + std::to_string(meanE)).c_str());
639 TH1D* h_timeRebin = (TH1D*)h_time->Clone();
646 h_timeMask->Scale(0.0);
648 time_fit_min = hist_tmax;
649 time_fit_max = hist_tmin;
652 double histRebin_max = h_timeRebin->GetMaximum();
654 bool maskedOutNonZeroBin =
false;
656 for (
int bin = 1; bin <= h_timeRebin->GetNbinsX(); bin++) {
659 if (nonRebinnedBinNumber < h_time->GetNbinsX()) {
661 h_timeMask->SetBinContent(nonRebinnedBinNumber, 1);
664 double x_lower = h_timeRebin->GetXaxis()->GetBinLowEdge(bin);
665 double x_upper = h_timeRebin->GetXaxis()->GetBinUpEdge(bin);
666 if (x_lower < time_fit_min) {
667 time_fit_min = x_lower;
669 if (x_upper > time_fit_max) {
670 time_fit_max = x_upper;
674 if (h_time->GetBinContent(nonRebinnedBinNumber) > 0) {
675 B2DEBUG(22,
"Setting bin " << nonRebinnedBinNumber <<
" from " << h_timeMasked->GetBinContent(nonRebinnedBinNumber) <<
" to 0");
676 maskedOutNonZeroBin =
true;
678 h_timeMasked->SetBinContent(nonRebinnedBinNumber, 0);
683 B2INFO(
"Bins with non-zero values have been masked out: " << maskedOutNonZeroBin);
684 h_timeMasked->ResetStats();
685 h_timeMask->ResetStats();
691 double default_meanMasked = h_timeMasked->GetMean();
693 B2INFO(
"default_meanMasked = " << default_meanMasked);
697 double default_mean = h_time->GetMean();
698 double default_mean_unc = h_time->GetMeanError();
699 double default_sigma = h_time->GetStdDev();
701 B2INFO(
"Fitting crystal between " << time_fit_min <<
" and " << time_fit_max);
704 TF1* gaus =
new TF1(
"func",
"gaus(0)", time_fit_min, time_fit_max);
705 gaus->SetParNames(
"numCrystalHitsNormalization",
"mean",
"sigma");
712 double hist_max = h_time->GetMaximum();
715 double stddev = h_time->GetStdDev();
720 gaus->SetParameter(0, hist_max / 2.);
721 gaus->SetParameter(1, mean);
722 gaus->SetParameter(2, sigma);
729 h_timeMasked->Fit(gaus,
"LQR");
731 double fit_mean = gaus->GetParameter(1);
732 double fit_mean_unc = gaus->GetParError(1);
733 double fit_sigma = gaus->GetParameter(2);
735 double meanDiff = fit_mean - default_mean;
736 double meanUncDiff = fit_mean_unc - default_mean_unc;
737 double sigmaDiff = fit_sigma - default_sigma;
739 bool good_fit =
false;
741 if ((fabs(meanDiff) > 10) ||
742 (fabs(meanUncDiff) > 10) ||
743 (fabs(sigmaDiff) > 10) ||
744 (fit_mean_unc > 3) ||
746 (fit_mean < time_fit_min) ||
747 (fit_mean > time_fit_max)) {
748 B2INFO(
"x_bin = " << x_bin);
749 B2INFO(
"fit mean, default mean = " << fit_mean <<
", " << default_mean);
750 B2INFO(
"fit mean unc, default mean unc = " << fit_mean_unc <<
", " << default_mean_unc);
751 B2INFO(
"fit sigma, default sigma = " << fit_sigma <<
", " << default_sigma);
753 B2INFO(
"crystal fit mean - hist mean = " << meanDiff);
754 B2INFO(
"fit mean unc. - hist mean unc. = " << meanUncDiff);
755 B2INFO(
"fit sigma - hist sigma = " << sigmaDiff);
757 B2INFO(
"fit_mean = " << fit_mean);
758 B2INFO(
"time_fit_min = " << time_fit_min);
759 B2INFO(
"time_fit_max = " << time_fit_max);
761 if (fabs(meanDiff) > 10) B2INFO(
"fit mean diff too large");
762 if (fabs(meanUncDiff) > 10) B2INFO(
"fit mean unc diff too large");
763 if (fabs(sigmaDiff) > 10) B2INFO(
"fit mean sigma diff too large");
764 if (fit_mean_unc > 3) B2INFO(
"fit mean unc too large");
765 if (fit_sigma < 0.1) B2INFO(
"fit sigma too small");
772 int numEntries = h_time->GetEntries();
776 if ((numEntries >= minNumEntries) && good_fit) {
777 clusterTime_mean = fit_mean;
778 clusterTime_mean_unc = fit_mean_unc;
779 clusterTime_sigma = fit_sigma;
781 clusterTime_mean = default_mean;
782 clusterTime_mean_unc = default_mean_unc;
783 clusterTime_sigma = default_sigma;
786 if (numEntries < minNumEntries) B2INFO(
"Number of entries less than minimum");
787 if (numEntries == 0) B2INFO(
"Number of entries == 0");
789 histfile->WriteTObject(h_time, (std::string(
"h_time_E_slice") + std::to_string(meanE)).c_str());
790 histfile->WriteTObject(h_timeMasked, (std::string(
"h_time_E_slice_masked") + std::to_string(meanE)).c_str());
793 clusterTimePeak_ClusterEnergy_varBin->SetBinContent(Ebin_counter, clusterTime_mean);
794 clusterTimePeak_ClusterEnergy_varBin->SetBinError(Ebin_counter, clusterTime_mean_unc);
796 clusterTimePeakWidth_ClusterEnergy_varBin->SetBinContent(Ebin_counter, clusterTime_sigma);
797 clusterTimePeakWidth_ClusterEnergy_varBin->SetBinError(Ebin_counter, 0);
813 vector< pair<double, int> > fitClusterTime__crystalIDBase0__pairs;
817 fitClusterTime__crystalIDBase0__pairs.push_back(make_pair(0.0, cid));
822 fitClusterTime__crystalIDBase0__pairs[crys_id - 1] = make_pair(fabs(t_offsets[crys_id - 1]), crys_id - 1) ;
826 sort(fitClusterTime__crystalIDBase0__pairs.begin(), fitClusterTime__crystalIDBase0__pairs.end());
830 B2INFO(
"-------- List of the (fitted) peak cluster times sorted by their absolute value ----------");
831 B2INFO(
"------------------------------------------------------------------------------------------");
832 B2INFO(
"------------------------------------------------------------------------------------------");
833 B2INFO(
"Quoted # of clusters is before the cutting off of the distribution tails, cellID=1..ECLElementNumbers::c_NCrystals, crysID=0..8735");
835 bool hasHitThresholdBadTimes = false ;
837 int cid = fitClusterTime__crystalIDBase0__pairs[iSortedTimes].second ;
838 if (!hasHitThresholdBadTimes && fitClusterTime__crystalIDBase0__pairs[iSortedTimes].first > 2) {
839 B2INFO(
"======== |t_fit| > Xns threshold ======");
840 hasHitThresholdBadTimes =
true;
843 B2INFO(
"cid = " << cid <<
", peak clust t = " << t_offsets[cid] <<
" +- " << t_offsets_unc[cid] <<
" ns, # clust = " <<
844 numClusterPerCrys[cid] <<
", good fit = " << crysHasGoodFit[cid] <<
", good fit & stats = " << crysHasGoodFitandStats[cid]);
852 B2INFO(
"######## List of poor (fitted) peak cluster times sorted by their absolute value #########");
853 B2INFO(
"##########################################################################################");
854 B2INFO(
"##########################################################################################");
857 int cid = fitClusterTime__crystalIDBase0__pairs[iSortedTimes].second ;
858 if (fitClusterTime__crystalIDBase0__pairs[iSortedTimes].first > 2 && crysHasGoodFitandStats[cid]) {
859 B2INFO(
"WARNING: cid = " << cid <<
", peak clust t = " << t_offsets[cid] <<
" +- " << t_offsets_unc[cid] <<
" ns, # clust = " <<
860 numClusterPerCrys[cid] <<
", good fit = " << crysHasGoodFit[cid] <<
", good fit & stats = " << crysHasGoodFitandStats[cid]);
866 B2INFO(
"Number of crystals with non-zero number of hits = " << numCrysWithNonZeroEntries);
867 B2INFO(
"Number of crystals with good quality fits = " << numCrysWithGoodFit);
870 clusterTimePeak_ClusterEnergy_varBin->ResetStats();
871 clusterTimePeakWidth_ClusterEnergy_varBin->ResetStats();
873 histfile->WriteTObject(clusterTimePeak_ClusterEnergy_varBin,
"clusterTimePeak_ClusterEnergy_varBin");
874 histfile->WriteTObject(clusterTimePeakWidth_ClusterEnergy_varBin,
"clusterTimePeakWidth_ClusterEnergy_varBin");
880 B2INFO(
"Filling histograms for difference in crystal payload values and the pre-calibration values. These older values may be from a previous bucket or older reprocessing of the data.");
882 double tsDiffCustomOld_ns = -999;
884 tsDiffCustomOld_ns = (currentValuesCrys[crys_id - 1] - prevValuesCrys[crys_id - 1]) * TICKS_TO_NS;
885 B2INFO(
"Crystal " << crys_id <<
": ts new merged - 'before 1st iter' merged = (" <<
886 currentValuesCrys[crys_id - 1] <<
" - " << prevValuesCrys[crys_id - 1] <<
887 ") ticks * " << TICKS_TO_NS <<
" ns/tick = " << tsDiffCustomOld_ns <<
" ns");
890 tsNew_MINUS_tsCustomPrev__cid->SetBinContent(crys_id, tsDiffCustomOld_ns);
891 tsNew_MINUS_tsCustomPrev__cid->SetBinError(crys_id, 0);
892 tsNew_MINUS_tsCustomPrev__cid->ResetStats();
894 tsNew_MINUS_tsCustomPrev->Fill(tsDiffCustomOld_ns);
895 tsNew_MINUS_tsCustomPrev->ResetStats();
898 histfile->WriteTObject(tsNew_MINUS_tsCustomPrev__cid,
"tsNew_MINUS_tsCustomPrev__cid");
899 histfile->WriteTObject(tsNew_MINUS_tsCustomPrev,
"tsNew_MINUS_tsCustomPrev");
904 B2INFO(
"Finished validations algorithm");
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.
const std::vector< float > & getCalibUncVector() const
Get vector of uncertainties on calibration constants.
const std::vector< float > & getCalibVector() const
Get vector of calibration constants.
This class provides access to ECL channel map that is either a) Loaded from the database (see ecl/dbo...
The Class for ECL Geometry Parameters.
static ECLGeometryPar * Instance()
Static method to get a reference to the ECLGeometryPar instance.
void Mapping(int cid)
Mapping theta, phi Id.
int GetThetaID()
Get Theta Id.
static double getRF()
See m_rf.
eclTValidationAlgorithm()
..Constructor
int cellIDHi
Fit crystals with cellID0 in the inclusive range [cellIDLo,cellIDHi].
int cellIDLo
Fit crystals with cellID0 in the inclusive range [cellIDLo,cellIDHi].
double meanCleanRebinFactor
Rebinning factor for mean calculation.
double clusterTimesFractionWindow_maxtime
Maximum time for window to calculate cluster time fraction, in ns.
double meanCleanCutMinFactor
After rebinning, create a mask for bins that have values less than meanCleanCutMinFactor times the ma...
bool readPrevCrysPayload
Read the previous crystal payload values for comparison.
EResult calibrate() override
..Run algorithm on events
std::string debugFilenameBase
Name of file with debug output, eclTValidationAlgorithm.root by default.
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.
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.
const int c_NCrystals
Number of crystals.
Abstract base class for different kinds of events.