14 forceNoRestore_(conf.getParameter<
bool>(
"ForceNoRestore")),
15 inspectAlgo_(conf.getParameter<
std::
string>(
"APVInspectMode")),
16 restoreAlgo_(conf.getParameter<
std::
string>(
"APVRestoreMode")),
18 useRealMeanCM_(conf.getParameter<
bool>(
"useRealMeanCM")),
19 meanCM_(conf.getParameter<int32_t>(
"MeanCM")),
20 deltaCMThreshold_(conf.getParameter<uint32_t>(
"DeltaCMThreshold")),
22 fraction_(conf.getParameter<double>(
"Fraction")),
23 deviation_(conf.getParameter<uint32_t>(
"Deviation")),
25 restoreThreshold_(conf.getParameter<double>(
"restoreThreshold")),
27 nSaturatedStrip_(conf.getParameter<uint32_t>(
"nSaturatedStrip")),
29 nSigmaNoiseDerTh_(conf.getParameter<uint32_t>(
"nSigmaNoiseDerTh")),
30 consecThreshold_(conf.getParameter<uint32_t>(
"consecThreshold")),
31 nSmooth_(conf.getParameter<uint32_t>(
"nSmooth")),
32 distortionThreshold_(conf.getParameter<uint32_t>(
"distortionThreshold")),
33 applyBaselineCleaner_(conf.getParameter<
bool>(
"ApplyBaselineCleaner")),
34 cleaningSequence_(conf.getParameter<uint32_t>(
"CleaningSequence")),
36 slopeX_(conf.getParameter<int32_t>(
"slopeX")),
37 slopeY_(conf.getParameter<int32_t>(
"slopeY")),
39 hitStripThreshold_(conf.getParameter<uint32_t>(
"hitStripThreshold")),
41 minStripsToFit_(conf.getParameter<uint32_t>(
"minStripsToFit")),
42 applyBaselineRejection_(conf.getParameter<
bool>(
"ApplyBaselineRejection")),
43 filteredBaselineMax_(conf.getParameter<double>(
"filteredBaselineMax")),
44 filteredBaselineDerivativeSumSquare_(conf.getParameter<double>(
"filteredBaselineDerivativeSumSquare")),
46 gradient_threshold_(conf.getParameter<
int>(
"discontinuityThreshold")),
47 last_gradient_(conf.getParameter<
int>(
"lastGradient")),
48 size_window_(conf.getParameter<
int>(
"sizeWindow")),
49 width_cluster_(conf.getParameter<
int>(
"widthCluster")) {
52 <<
"The BaselineFollower restore method requires the BaselineFollower (or Hybrid) inspect method";
72 auto nAPVFlagged =
inspect(detId, firstAPV, rawDigisPedSubtracted, vmedians);
73 restore(firstAPV, processedRawDigi);
90 for (
const auto& med : vmedians) {
91 auto iAPV = med.first;
96 uint16_t nAPVFlagged = 0;
113 <<
"SiStripAPVRestorer possibilities: (Null), (AbnormalBaseline), (BaselineFollower), (BaselineAndSaturation), "
114 "(DerivativeFollower), (Hybrid), (HybridEmulation)";
128 for (uint16_t iAPV = firstAPV; iAPV < digis.size() /
nTotStripsPerAPV + firstAPV; ++iAPV) {
130 if (!algoToUse.empty()) {
131 if (algoToUse ==
"Flat") {
133 }
else if (algoToUse ==
"BaselineFollower") {
135 }
else if (algoToUse ==
"DerivativeFollower") {
139 <<
"SiStripAPVRestorer possibilities: (Flat), (BaselineFollower), (DerivativeFollower)";
150 uint16_t nAPVflagged = 0;
151 for (uint16_t iAPV = firstAPV; iAPV < digis.size() /
nTotStripsPerAPV + firstAPV; ++iAPV) {
154 uint16_t stripsPerAPV = 0;
155 singleAPVdigi.clear();
159 singleAPVdigi.push_back(
adc);
164 if (stripsPerAPV > 64) {
178 uint16_t nAPVflagged = 0;
184 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
189 MeanAPVCM = itCMMap->second[iAPV];
191 singleAPVdigi.clear();
194 std::back_inserter(singleAPVdigi));
196 const float DeltaCM =
median_[iAPV] - MeanAPVCM;
210 uint16_t nAPVflagged = 0;
211 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
223 uint16_t nAPVflagged = 0;
229 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
233 MeanAPVCM = itCMMap->second[iAPV];
235 singleAPVdigi.clear();
236 uint16_t nSatStrip = 0;
239 const uint16_t digi = digis[
strip];
240 singleAPVdigi.push_back(digi);
245 const float DeltaCM =
median_[iAPV] - MeanAPVCM;
258 uint16_t nAPVflagged = 0;
264 int devCount = 0, qualityCount = 0, minstrip = 0;
265 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
269 MeanAPVCM = itCMMap->second[iAPV];
272 const auto fs = static_cast<int>(digis[istrip - firstAPV *
nTotStripsPerAPV]);
281 if (devCount >
fraction_ * qualityCount) {
293 uint16_t nAPVflagged = 0;
294 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
296 int zeroCount = 0, qualityCount = 0;
298 const auto fs = static_cast<int>(digis[istrip - firstAPV *
nTotStripsPerAPV]);
315 uint16_t nAPVflagged = 0;
321 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
325 MeanAPVCM = itCMMap->second[iAPV];
327 const float DeltaCM =
median_[iAPV] - (MeanAPVCM + 1024) / 2;
387 smoothedpoints.clear();
394 float localmin = 999.9;
395 for (uint16_t jstrip =
std::max(0, static_cast<int>(istrip -
nSmooth_ / 2));
396 jstrip < std::min((int)nTotStripsPerAPV, static_cast<int>(istrip +
nSmooth_ / 2));
398 const float nextvalue = adcs[jstrip];
399 if (nextvalue < localmin)
400 localmin = nextvalue;
402 adcsLocalMinSubtracted[istrip] = adcs[istrip] - localmin;
407 std::vector<uint16_t> nConsStrip;
409 uint16_t consecStrips = 0;
411 const int16_t
adc = adcs[istrip];
413 if (adcsLocalMinSubtracted[istrip] <
415 consecpoints.emplace_hint(consecpoints.end(), istrip,
adc);
417 }
else if (consecStrips > 0) {
418 nConsStrip.push_back(consecStrips);
423 if (consecStrips > 0)
424 nConsStrip.push_back(consecStrips);
427 auto itConsecpoints = consecpoints.begin();
428 float MinSmoothValue = 20000., MaxSmoothValue = 0.;
429 for (
const auto consecStrips : nConsStrip) {
432 uint16_t nFirstStrip = itConsecpoints->first;
434 float smoothValue = 0.0;
435 float stripCount = 1;
436 for (uint16_t
n = 0;
n < consecStrips - 2; ++
n) {
437 smoothValue += itConsecpoints->second;
439 smoothValue /= (
float)stripCount;
440 nLastStrip = nFirstStrip + stripCount - 1;
441 smoothedpoints.emplace_hint(smoothedpoints.end(), nFirstStrip, smoothValue);
442 smoothedpoints.emplace_hint(smoothedpoints.end(), nLastStrip, smoothValue);
443 if (smoothValue > MaxSmoothValue)
444 MaxSmoothValue = smoothValue;
445 if (smoothValue < MinSmoothValue)
446 MinSmoothValue = smoothValue;
447 nFirstStrip = nLastStrip + 1;
456 if (stripCount > 1) {
459 smoothValue /= static_cast<float>(stripCount);
460 nLastStrip = nFirstStrip + stripCount - 1;
461 smoothedpoints.emplace_hint(smoothedpoints.end(), nFirstStrip, smoothValue);
462 smoothedpoints.emplace_hint(smoothedpoints.end(), nLastStrip, smoothValue);
463 if (smoothValue > MaxSmoothValue)
464 MaxSmoothValue = smoothValue;
465 if (smoothValue < MinSmoothValue)
466 MinSmoothValue = smoothValue;
469 for (
int n = 0;
n < consecStrips; ++
n)
504 if (smoothedpoints.size() < 3)
507 auto it = smoothedpoints.begin();
508 while (smoothedpoints.size() > 3 && it != --(--smoothedpoints.end())) {
511 const float adc1 = it2->second;
512 const float adc2 = (++it2)->
second;
513 const float adc3 = (++it2)->
second;
516 smoothedpoints.erase(--it2);
531 if (smoothedpoints.size() >= 2) {
532 for (
auto it = smoothedpoints.begin(); it != --smoothedpoints.end(); ++it) {
535 const float strip1 = it->first;
536 const float strip2 = itNext->first;
537 const float adc1 = it->second;
538 const float adc2 = itNext->second;
539 const float m = (adc2 - adc1) / (strip2 - strip1);
544 float strip = itStrip + strip1;
545 while (
strip < strip2) {
549 if (
adc < (adc1 +
m * itStrip - 2 *
noise)) {
550 smoothedpoints.emplace_hint(itNext,
strip,
adc);
560 const uint16_t firstStripFlat = smoothedpoints.begin()->first;
561 const uint16_t lastStripFlat = (--smoothedpoints.end())->
first;
562 const int16_t firstStripFlatADC = smoothedpoints.begin()->second;
563 const int16_t lastStripFlatADC = (--smoothedpoints.end())->
second;
564 if (firstStripFlat > 3) {
565 auto it = smoothedpoints.begin();
567 while (
strip < firstStripFlat) {
570 if (
adc < (firstStripFlatADC - 2 *
noise)) {
571 smoothedpoints.emplace_hint(it,
strip,
adc);
578 float strip = lastStripFlat + 1;
582 if (
adc < (lastStripFlatADC - 2 *
noise)) {
583 smoothedpoints.emplace_hint(smoothedpoints.end(),
strip,
adc);
593 if (smoothedpoints.size() < 4)
596 auto it = smoothedpoints.begin();
597 while (smoothedpoints.size() > 2 && it != --smoothedpoints.end()) {
602 const float strip1 = it->first;
603 const float strip2 = itNext->first;
604 const float adc1 = it->second;
605 const float adc2 = itNext->second;
606 const float m = (adc2 - adc1) / (strip2 - strip1);
609 smoothedpoints.erase(itNext);
612 if (it == smoothedpoints.begin())
613 smoothedpoints.erase(it++);
616 smoothedpoints.erase(it--);
632 const auto lastIt = --smoothedpoints.end();
633 const uint16_t firstStripFlat = smoothedpoints.begin()->first;
634 const uint16_t lastStripFlat = lastIt->first;
635 const int16_t firstStripFlatADC = smoothedpoints.begin()->second;
636 const int16_t lastStripFlatADC = lastIt->second;
639 baseline.erase(baseline.begin(), baseline.begin() + firstStripFlat);
640 baseline.insert(baseline.begin(), firstStripFlat, firstStripFlatADC);
642 baseline.erase(baseline.begin() + lastStripFlat, baseline.end());
643 baseline.insert(baseline.end(),
nTotStripsPerAPV - lastStripFlat, lastStripFlatADC);
646 for (
auto itSmoothedpoints = smoothedpoints.begin(); itSmoothedpoints != (--smoothedpoints.end());
647 ++itSmoothedpoints) {
648 auto itNextSmoothedpoints = itSmoothedpoints;
649 ++itNextSmoothedpoints;
650 const float strip1 = itSmoothedpoints->first;
651 const float strip2 = itNextSmoothedpoints->first;
652 const float adc1 = itSmoothedpoints->second;
653 const float adc2 = itNextSmoothedpoints->second;
655 baseline[strip1] = adc1;
656 baseline[strip2] = adc2;
657 const float m = (adc2 - adc1) / (strip2 - strip1);
658 uint16_t itStrip = strip1 + 1;
659 float stripadc = adc1 +
m;
660 while (itStrip < strip2) {
661 baseline[itStrip] = stripadc;
690 static const size_t savitzky_golay_n_l_r = 16;
691 static const float savitzky_golay_coefficient[2 * savitzky_golay_n_l_r + 1][2 * savitzky_golay_n_l_r + 1] = {
746 {0.172078, 0.153076, 0.135099, 0.118148, 0.102221, 0.0873206, 0.073445,
747 0.0605947, 0.0487697, 0.0379699, 0.0281955, 0.0194463, 0.0117225, 0.00502392,
748 -0.000649351, -0.00529733, -0.00892003, -0.0115174, -0.0130895, -0.0136364},
749 {0.123659, 0.116431, 0.109144, 0.101798, 0.0943921, 0.0869268, 0.0794021,
750 0.0718179, 0.0641743, 0.0564712, 0.0487087, 0.0408868, 0.0330054, 0.0250646,
751 0.0170644, 0.00900473, 0.000885613, -0.00729294, -0.0155309, -0.0238283, -0.0321852},
752 {0.0859684, 0.0868154, 0.0869565, 0.0863919, 0.0851214, 0.0831451, 0.080463, 0.0770751,
753 0.0729814, 0.0681818, 0.0626765, 0.0564653, 0.0495483, 0.0419255, 0.0335968, 0.0245624,
754 0.0148221, 0.00437606, -0.00677583, -0.0186335, -0.0311971, -0.0444664},
755 {0.0565217, 0.0628458, 0.0680971, 0.0722756, 0.0753811, 0.0774139, 0.0783738, 0.0782609,
756 0.0770751, 0.0748165, 0.071485, 0.0670807, 0.0616036, 0.0550536, 0.0474308, 0.0387352,
757 0.0289667, 0.0181254, 0.00621118, -0.00677583, -0.0208357, -0.0359684, -0.0521739},
758 {0.0334615, 0.0434281, 0.0521329, 0.0595759, 0.0657571, 0.0706765, 0.0743341, 0.07673,
759 0.0778641, 0.0777364, 0.0763469, 0.0736957, 0.0697826, 0.0646078, 0.0581712, 0.0504728,
760 0.0415126, 0.0312907, 0.0198069, 0.00706142, -0.00694588, -0.022215, -0.0387458, -0.0565385},
761 {0.0153846, 0.0276923, 0.0386622, 0.0482943, 0.0565886, 0.0635452, 0.0691639, 0.0734448, 0.076388,
762 0.0779933, 0.0782609, 0.0771906, 0.0747826, 0.0710368, 0.0659532, 0.0595318, 0.0517726, 0.0426756,
763 0.0322408, 0.0204682, 0.00735786, -0.0070903, -0.0228763, -0.04, -0.0584615},
764 {0.001221, 0.0149451, 0.027326, 0.0383639, 0.0480586, 0.0564103, 0.0634188, 0.0690842, 0.0734066,
765 0.0763858, 0.078022, 0.078315, 0.077265, 0.0748718, 0.0711355, 0.0660562, 0.0596337, 0.0518681,
766 0.0427595, 0.0323077, 0.0205128, 0.00737485, -0.00710623, -0.0229304, -0.0400977, -0.0586081},
767 {-0.00985222, 0.00463138, 0.0178098, 0.029683, 0.0402509, 0.0495137, 0.0574713, 0.0641236, 0.0694708,
768 0.0735127, 0.0762494, 0.0776809, 0.0778073, 0.0766284, 0.0741442, 0.0703549, 0.0652604, 0.0588607,
769 0.0511557, 0.0421456, 0.0318302, 0.0202097, 0.0072839, -0.00694708, -0.0224833, -0.0393247, -0.0574713},
770 {-0.0184729, -0.00369458, 0.00984169, 0.0221359, 0.0331881, 0.0429982, 0.0515662,
771 0.0588923, 0.0649762, 0.0698181, 0.073418, 0.0757758, 0.0768915, 0.0767652,
772 0.0753968, 0.0727864, 0.0689339, 0.0638394, 0.0575028, 0.0499242, 0.0411035,
773 0.0310408, 0.019736, 0.00718917, -0.00659972, -0.0216307, -0.0379037, -0.0554187},
774 {-0.025139, -0.0103925, 0.00318873, 0.0156046, 0.0268552, 0.0369405, 0.0458605, 0.0536151,
775 0.0602045, 0.0656285, 0.0698872, 0.0729806, 0.0749086, 0.0756714, 0.0752688, 0.0737009,
776 0.0709677, 0.0670692, 0.0620054, 0.0557763, 0.0483818, 0.039822, 0.0300969, 0.0192065,
777 0.0071508, -0.00607024, -0.0204566, -0.0360083, -0.0527253},
778 {-0.0302419, -0.0157536, -0.00234785, 0.00997537, 0.021216, 0.0313741, 0.0404497, 0.0484427,
779 0.0553532, 0.0611811, 0.0659264, 0.0695892, 0.0721695, 0.0736672, 0.0740823, 0.0734149,
780 0.0716649, 0.0688324, 0.0649174, 0.0599198, 0.0538396, 0.0466769, 0.0384316, 0.0291038,
781 0.0186934, 0.00720046, -0.00537502, -0.0190331, -0.0337736, -0.0495968},
782 {-0.0340909, -0.0200147, -0.006937, 0.00514208, 0.0162226, 0.0263045, 0.0353878, 0.0434725,
783 0.0505587, 0.0566463, 0.0617353, 0.0658257, 0.0689175, 0.0710107, 0.0721054, 0.0722014,
784 0.0712989, 0.0693978, 0.0664981, 0.0625999, 0.057703, 0.0518076, 0.0449135, 0.0370209,
785 0.0281297, 0.01824, 0.0073516, -0.00453534, -0.0174209, -0.031305, -0.0461877},
786 {-0.0369318, -0.0233688, -0.0107221, 0.00100806, 0.0118218, 0.0217192, 0.0307001, 0.0387647,
787 0.0459128, 0.0521444, 0.0574597, 0.0618585, 0.0653409, 0.0679069, 0.0695565, 0.0702896,
788 0.0701063, 0.0690066, 0.0669905, 0.0640579, 0.0602089, 0.0554435, 0.0497617, 0.0431635,
789 0.0356488, 0.0272177, 0.0178702, 0.0076063, -0.00357405, -0.0156708, -0.028684, -0.0426136},
790 {-0.038961, -0.025974, -0.0138249, -0.00251362, 0.00795978, 0.0175953, 0.026393, 0.0343527, 0.0414747,
791 0.0477587, 0.0532049, 0.0578132, 0.0615836, 0.0645161, 0.0666108, 0.0678676, 0.0682866, 0.0678676,
792 0.0666108, 0.0645161, 0.0615836, 0.0578132, 0.0532049, 0.0477587, 0.0414747, 0.0343527, 0.026393,
793 0.0175953, 0.00795978, -0.00251362, -0.0138249, -0.025974, -0.038961},
794 {-0.0426136, -0.028684, -0.0156708, -0.00357405, 0.0076063, 0.0178702, 0.0272177, 0.0356488,
795 0.0431635, 0.0497617, 0.0554435, 0.0602089, 0.0640579, 0.0669905, 0.0690066, 0.0701063,
796 0.0702896, 0.0695565, 0.0679069, 0.0653409, 0.0618585, 0.0574597, 0.0521444, 0.0459128,
797 0.0387647, 0.0307001, 0.0217192, 0.0118218, 0.00100806, -0.0107221, -0.0233688, -0.0369318},
798 {-0.0461877, -0.031305, -0.0174209, -0.00453534, 0.0073516, 0.01824, 0.0281297, 0.0370209,
799 0.0449135, 0.0518076, 0.057703, 0.0625999, 0.0664981, 0.0693978, 0.0712989, 0.0722014,
800 0.0721054, 0.0710107, 0.0689175, 0.0658257, 0.0617353, 0.0566463, 0.0505587, 0.0434725,
801 0.0353878, 0.0263045, 0.0162226, 0.00514208, -0.006937, -0.0200147, -0.0340909},
802 {-0.0495968, -0.0337736, -0.0190331, -0.00537502, 0.00720046, 0.0186934, 0.0291038, 0.0384316,
803 0.0466769, 0.0538396, 0.0599198, 0.0649174, 0.0688324, 0.0716649, 0.0734149, 0.0740823,
804 0.0736672, 0.0721695, 0.0695892, 0.0659264, 0.0611811, 0.0553532, 0.0484427, 0.0404497,
805 0.0313741, 0.021216, 0.00997537, -0.00234785, -0.0157536, -0.0302419},
806 {-0.0527253, -0.0360083, -0.0204566, -0.00607024, 0.0071508, 0.0192065, 0.0300969, 0.039822,
807 0.0483818, 0.0557763, 0.0620054, 0.0670692, 0.0709677, 0.0737009, 0.0752688, 0.0756714,
808 0.0749086, 0.0729806, 0.0698872, 0.0656285, 0.0602045, 0.0536151, 0.0458605, 0.0369405,
809 0.0268552, 0.0156046, 0.00318873, -0.0103925, -0.025139},
810 {-0.0554187, -0.0379037, -0.0216307, -0.00659972, 0.00718917, 0.019736, 0.0310408,
811 0.0411035, 0.0499242, 0.0575028, 0.0638394, 0.0689339, 0.0727864, 0.0753968,
812 0.0767652, 0.0768915, 0.0757758, 0.073418, 0.0698181, 0.0649762, 0.0588923,
813 0.0515662, 0.0429982, 0.0331881, 0.0221359, 0.00984169, -0.00369458, -0.0184729},
814 {-0.0574713, -0.0393247, -0.0224833, -0.00694708, 0.0072839, 0.0202097, 0.0318302, 0.0421456, 0.0511557,
815 0.0588607, 0.0652604, 0.0703549, 0.0741442, 0.0766284, 0.0778073, 0.0776809, 0.0762494, 0.0735127,
816 0.0694708, 0.0641236, 0.0574713, 0.0495137, 0.0402509, 0.029683, 0.0178098, 0.00463138, -0.00985222},
817 {-0.0586081, -0.0400977, -0.0229304, -0.00710623, 0.00737485, 0.0205128, 0.0323077, 0.0427595, 0.0518681,
818 0.0596337, 0.0660562, 0.0711355, 0.0748718, 0.077265, 0.078315, 0.078022, 0.0763858, 0.0734066,
819 0.0690842, 0.0634188, 0.0564103, 0.0480586, 0.0383639, 0.027326, 0.0149451, 0.001221},
820 {-0.0584615, -0.04, -0.0228763, -0.0070903, 0.00735786, 0.0204682, 0.0322408, 0.0426756, 0.0517726,
821 0.0595318, 0.0659532, 0.0710368, 0.0747826, 0.0771906, 0.0782609, 0.0779933, 0.076388, 0.0734448,
822 0.0691639, 0.0635452, 0.0565886, 0.0482943, 0.0386622, 0.0276923, 0.0153846},
823 {-0.0565385, -0.0387458, -0.022215, -0.00694588, 0.00706142, 0.0198069, 0.0312907, 0.0415126,
824 0.0504728, 0.0581712, 0.0646078, 0.0697826, 0.0736957, 0.0763469, 0.0777364, 0.0778641,
825 0.07673, 0.0743341, 0.0706765, 0.0657571, 0.0595759, 0.0521329, 0.0434281, 0.0334615},
826 {-0.0521739, -0.0359684, -0.0208357, -0.00677583, 0.00621118, 0.0181254, 0.0289667, 0.0387352,
827 0.0474308, 0.0550536, 0.0616036, 0.0670807, 0.071485, 0.0748165, 0.0770751, 0.0782609,
828 0.0783738, 0.0774139, 0.0753811, 0.0722756, 0.0680971, 0.0628458, 0.0565217},
829 {-0.0444664, -0.0311971, -0.0186335, -0.00677583, 0.00437606, 0.0148221, 0.0245624, 0.0335968,
830 0.0419255, 0.0495483, 0.0564653, 0.0626765, 0.0681818, 0.0729814, 0.0770751, 0.080463,
831 0.0831451, 0.0851214, 0.0863919, 0.0869565, 0.0868154, 0.0859684},
832 {-0.0321852, -0.0238283, -0.0155309, -0.00729294, 0.000885613, 0.00900473, 0.0170644,
833 0.0250646, 0.0330054, 0.0408868, 0.0487087, 0.0564712, 0.0641743, 0.0718179,
834 0.0794021, 0.0869268, 0.0943921, 0.101798, 0.109144, 0.116431, 0.123659},
835 {-0.0136364, -0.0130895, -0.0115174, -0.00892003, -0.00529733, -0.000649351, 0.00502392,
836 0.0117225, 0.0194463, 0.0281955, 0.0379699, 0.0487697, 0.0605947, 0.073445,
837 0.0873206, 0.102221, 0.118148, 0.135099, 0.153076, 0.172078},
900 for (
size_t i = 0;
i < savitzky_golay_n_l_r;
i++) {
901 for (
size_t j = 0;
j < savitzky_golay_n_l_r + 1 +
i;
j++) {
902 filtered_baseline[
i] += savitzky_golay_coefficient[
i][
j] * baseline[
j];
909 filtered_baseline[
i] = savitzky_golay_coefficient[savitzky_golay_n_l_r][savitzky_golay_n_l_r] * baseline[
i];
910 for (
size_t j = 0;
j < savitzky_golay_n_l_r;
j++) {
911 filtered_baseline[
i] += savitzky_golay_coefficient[savitzky_golay_n_l_r][
j] *
912 (baseline[
i +
j - savitzky_golay_n_l_r] + baseline[
i -
j + savitzky_golay_n_l_r]);
917 for (
size_t j = 0;
j < 2 * savitzky_golay_n_l_r + 1;
j++) {
919 savitzky_golay_coefficient[savitzky_golay_n_l_r][
j] *
920 baseline[
i +
j - savitzky_golay_n_l_r];
929 filtered_baseline[
i] += savitzky_golay_coefficient[2 * savitzky_golay_n_l_r +
i + 1 -
nTotStripsPerAPV][
j] *
930 baseline[
i +
j - savitzky_golay_n_l_r];
937 filtered_baseline_derivative[
i] = filtered_baseline[
i + 1] - filtered_baseline[
i];
943 double filtered_baseline_max = 0;
944 double filtered_baseline_derivative_sum_square = 0;
947 const double d = filtered_baseline[
i] - baseline[
i];
949 filtered_baseline_max =
std::max(filtered_baseline_max, static_cast<double>(fabs(
d)));
952 filtered_baseline_derivative_sum_square += filtered_baseline_derivative[
i] * filtered_baseline_derivative[
i];
956 std::cerr << __FILE__ <<
':' << __LINE__ <<
": "
957 << filtered_baseline_max <<
' '
958 << filtered_baseline_derivative_sum_square << std::endl;
972 iEvent.getByLabel(
"siStripDigis",
"VirginRaw",
input);
976 iEvent.getByLabel(
"MEANAPVCM", inputCM);
982 for (
const auto& rawDigis :
input) {
985 std::vector<float> meanCMDetSet;
986 meanCMDetSet.reserve(nAPVs);
987 for (uint16_t iAPV = 0; iAPV < nAPVs; ++iAPV) {
994 meanCMDetSet.push_back(minPed);
1001 for (
const auto& rawDigis :
input) {
1002 std::vector<float> meanCMNValue;
1003 meanCMNValue.reserve(rawDigis.size());
1016 singleAPVdigi.clear();
1018 singleAPVdigi.push_back(digis[
strip] + 1024);
1021 discontinuities.clear();
1023 digimap_t::iterator itdiscontinuities;
1027 bool isMinimumAndNoMax =
false;
1028 bool isFirstStrip =
false;
1032 int actualStripADC = 0;
1033 int previousStripADC = 0;
1036 int maximum_value = 0;
1037 const uint32_t n_high_maximum_cluster = 1025 + 1024;
1038 int high_maximum_cluster = n_high_maximum_cluster;
1039 int number_good_minimum = 0;
1040 int first_gradient = 0;
1041 int strip_first_gradient = 0;
1042 int adc_start_point_cluster_pw = 0;
1043 int auxiliary_end_cluster = 0;
1044 int first_start_cluster_strip = 0;
1045 int first_start_cluster_ADC = 0;
1046 bool isAuxiliary_Minimum =
false;
1047 bool isPossible_wrong_minimum =
false;
1054 actualStripADC = singleAPVdigi[
strip];
1056 isFirstStrip =
true;
1057 isMinimumAndNoMax =
true;
1058 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip, actualStripADC));
1060 discontinuities.insert(discontinuities.end(), std::pair<uint16_t, int16_t>(
strip, 0 + 1024));
1061 isMinimumAndNoMax =
true;
1062 first_start_cluster_strip =
strip;
1063 first_start_cluster_ADC = 1024;
1067 previousStripADC = actualStripADC;
1068 actualStripADC = singleAPVdigi[
strip];
1069 greadient = actualStripADC - previousStripADC;
1074 discontinuities.size() > 1)) {
1076 isPossible_wrong_minimum =
true;
1077 itdiscontinuities = --discontinuities.end();
1078 if (discontinuities.size() > 1) {
1079 --itdiscontinuities;
1081 strip_first_gradient = itdiscontinuities->first;
1082 adc_start_point_cluster_pw = itdiscontinuities->second;
1083 first_gradient =
std::abs(adc_start_point_cluster_pw - singleAPVdigi[strip_first_gradient + 1]);
1084 discontinuities.erase(++itdiscontinuities);
1085 discontinuities.erase(--discontinuities.end());
1088 if ((discontinuities.size() % 2 == 1) && (!discontinuities.empty())) {
1089 discontinuities.erase(--discontinuities.end());
1092 discontinuities.insert(discontinuities.end(), std::pair<uint16_t, int16_t>(
strip - 1, previousStripADC));
1093 isMinimumAndNoMax =
true;
1095 first_start_cluster_strip =
strip - 1;
1096 first_start_cluster_ADC = previousStripADC;
1098 }
else if ((!isMax) && ((actualStripADC - previousStripADC < 0) && (isMinimumAndNoMax))) {
1100 isMinimumAndNoMax =
false;
1101 high_maximum_cluster = n_high_maximum_cluster;
1102 if ((previousStripADC > maximum_value) && (discontinuities.size() % 2 == 1))
1103 maximum_value = previousStripADC;
1107 if (high_maximum_cluster > (
std::abs(singleAPVdigi[
strip + 1] - actualStripADC))) {
1108 high_maximum_cluster = singleAPVdigi[
strip + 1] - actualStripADC;
1109 auxiliary_end_cluster =
strip + 2;
1115 if ((isMax) && ((actualStripADC - previousStripADC) >= 0) && (
size_window_ > 0) &&
1117 number_good_minimum = 0;
1118 for (uint16_t wintry = 0; wintry <=
size_window_; wintry++) {
1120 ++number_good_minimum;
1122 --number_good_minimum;
1126 isMinimumAndNoMax =
true;
1131 isAuxiliary_Minimum =
true;
1134 if (!discontinuities.empty()) {
1135 itdiscontinuities = --discontinuities.end();
1138 if ((isMax) && (actualStripADC <= first_start_cluster_ADC)) {
1139 if ((
std::abs(first_start_cluster_ADC - singleAPVdigi[
strip + 2]) > first_gradient) &&
1140 (isPossible_wrong_minimum)) {
1141 discontinuities.erase(itdiscontinuities);
1142 discontinuities.insert(discontinuities.end(),
1143 std::pair<int, int>(strip_first_gradient, adc_start_point_cluster_pw));
1144 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip, adc_start_point_cluster_pw));
1146 if ((discontinuities.size() % 2 == 0) && (discontinuities.size() > 1)) {
1147 discontinuities.erase(--discontinuities.end());
1149 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip, actualStripADC));
1152 adc_start_point_cluster_pw = 0;
1153 isPossible_wrong_minimum =
false;
1154 strip_first_gradient = 0;
1155 first_start_cluster_strip = 0;
1156 first_start_cluster_ADC = 0;
1159 if ((isMax) && ((actualStripADC - previousStripADC) >= 0) &&
1160 (!isAuxiliary_Minimum)) {
1161 if ((
std::abs(first_start_cluster_ADC - singleAPVdigi[
strip + 1]) > first_gradient) &&
1162 (isPossible_wrong_minimum)) {
1163 discontinuities.erase(itdiscontinuities);
1164 discontinuities.insert(discontinuities.end(),
1165 std::pair<int, int>(strip_first_gradient, adc_start_point_cluster_pw));
1168 if ((discontinuities.size() % 2 == 0) && (discontinuities.size() > 1)) {
1169 discontinuities.erase(--discontinuities.end());
1171 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip - 1, previousStripADC));
1173 adc_start_point_cluster_pw = 0;
1174 isPossible_wrong_minimum =
false;
1175 strip_first_gradient = 0;
1176 first_start_cluster_strip = 0;
1177 first_start_cluster_ADC = 0;
1184 if (!discontinuities.empty()) {
1186 discontinuities.insert(discontinuities.end(),
1188 if ((isMax) && (isAuxiliary_Minimum))
1189 discontinuities.insert(discontinuities.end(),
1190 std::pair<int, int>(auxiliary_end_cluster, first_start_cluster_ADC));
1194 itdiscontinuities = discontinuities.begin();
1195 ++itdiscontinuities;
1196 ++itdiscontinuities;
1197 int firstADC = itdiscontinuities->second;
1198 --itdiscontinuities;
1199 itdiscontinuities->second = firstADC;
1200 --itdiscontinuities;
1201 itdiscontinuities->second = firstADC;
1204 if (!discontinuities.empty()) {
1205 itdiscontinuities = discontinuities.begin();
1206 uint16_t firstStrip = itdiscontinuities->first;
1207 int16_t firstADC = itdiscontinuities->second;
1208 ++itdiscontinuities;
1209 uint16_t lastStrip = itdiscontinuities->first;
1210 int16_t secondADC = itdiscontinuities->second;
1211 ++itdiscontinuities;
1214 if (
strip > lastStrip && itdiscontinuities != discontinuities.end()) {
1215 firstStrip = itdiscontinuities->first;
1216 firstADC = itdiscontinuities->second;
1217 ++itdiscontinuities;
1218 lastStrip = itdiscontinuities->first;
1219 secondADC = itdiscontinuities->second;
1220 ++itdiscontinuities;
1223 if ((firstStrip <=
strip) && (
strip <= lastStrip) &&
1224 (0 < (singleAPVdigi[
strip] - firstADC -
1227 singleAPVdigi[
strip] - firstADC -
1228 (((secondADC - firstADC) / (lastStrip - firstStrip)) * (
strip - firstStrip));