12 siStripProcessedRawDigiToken_(
17 forceNoRestore_(conf.getParameter<
bool>(
"ForceNoRestore")),
18 inspectAlgo_(conf.getParameter<
std::
string>(
"APVInspectMode")),
19 restoreAlgo_(conf.getParameter<
std::
string>(
"APVRestoreMode")),
21 useRealMeanCM_(conf.getParameter<
bool>(
"useRealMeanCM")),
22 meanCM_(conf.getParameter<int32_t>(
"MeanCM")),
23 deltaCMThreshold_(conf.getParameter<uint32_t>(
"DeltaCMThreshold")),
25 fraction_(conf.getParameter<double>(
"Fraction")),
26 deviation_(conf.getParameter<uint32_t>(
"Deviation")),
28 restoreThreshold_(conf.getParameter<double>(
"restoreThreshold")),
30 nSaturatedStrip_(conf.getParameter<uint32_t>(
"nSaturatedStrip")),
32 nSigmaNoiseDerTh_(conf.getParameter<uint32_t>(
"nSigmaNoiseDerTh")),
33 consecThreshold_(conf.getParameter<uint32_t>(
"consecThreshold")),
34 nSmooth_(conf.getParameter<uint32_t>(
"nSmooth")),
35 distortionThreshold_(conf.getParameter<uint32_t>(
"distortionThreshold")),
36 applyBaselineCleaner_(conf.getParameter<
bool>(
"ApplyBaselineCleaner")),
37 cleaningSequence_(conf.getParameter<uint32_t>(
"CleaningSequence")),
39 slopeX_(conf.getParameter<int32_t>(
"slopeX")),
40 slopeY_(conf.getParameter<int32_t>(
"slopeY")),
42 hitStripThreshold_(conf.getParameter<uint32_t>(
"hitStripThreshold")),
44 minStripsToFit_(conf.getParameter<uint32_t>(
"minStripsToFit")),
45 applyBaselineRejection_(conf.getParameter<
bool>(
"ApplyBaselineRejection")),
46 filteredBaselineMax_(conf.getParameter<double>(
"filteredBaselineMax")),
47 filteredBaselineDerivativeSumSquare_(conf.getParameter<double>(
"filteredBaselineDerivativeSumSquare")),
49 gradient_threshold_(conf.getParameter<
int>(
"discontinuityThreshold")),
50 last_gradient_(conf.getParameter<
int>(
"lastGradient")),
51 size_window_(conf.getParameter<
int>(
"sizeWindow")),
52 width_cluster_(conf.getParameter<
int>(
"widthCluster")) {
55 <<
"The BaselineFollower restore method requires the BaselineFollower (or Hybrid) inspect method";
75 auto nAPVFlagged =
inspect(detId, firstAPV, rawDigisPedSubtracted, vmedians);
76 restore(firstAPV, processedRawDigi);
93 for (
const auto& med : vmedians) {
94 auto iAPV = med.first;
99 uint16_t nAPVFlagged = 0;
116 <<
"SiStripAPVRestorer possibilities: (Null), (AbnormalBaseline), (BaselineFollower), (BaselineAndSaturation), " 117 "(DerivativeFollower), (Hybrid), (HybridEmulation)";
131 for (uint16_t iAPV = firstAPV; iAPV < digis.size() /
nTotStripsPerAPV + firstAPV; ++iAPV) {
133 if (!algoToUse.empty()) {
134 if (algoToUse ==
"Flat") {
136 }
else if (algoToUse ==
"BaselineFollower") {
138 }
else if (algoToUse ==
"DerivativeFollower") {
142 <<
"SiStripAPVRestorer possibilities: (Flat), (BaselineFollower), (DerivativeFollower)";
153 uint16_t nAPVflagged = 0;
154 for (uint16_t iAPV = firstAPV; iAPV < digis.size() /
nTotStripsPerAPV + firstAPV; ++iAPV) {
157 uint16_t stripsPerAPV = 0;
158 singleAPVdigi.clear();
162 singleAPVdigi.push_back(
adc);
167 if (stripsPerAPV > 64) {
181 uint16_t nAPVflagged = 0;
187 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
192 MeanAPVCM = itCMMap->second[iAPV];
194 singleAPVdigi.clear();
197 std::back_inserter(singleAPVdigi));
199 const float DeltaCM =
median_[iAPV] - MeanAPVCM;
213 uint16_t nAPVflagged = 0;
214 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
226 uint16_t nAPVflagged = 0;
232 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
236 MeanAPVCM = itCMMap->second[iAPV];
238 singleAPVdigi.clear();
239 uint16_t nSatStrip = 0;
242 const uint16_t digi = digis[
strip];
243 singleAPVdigi.push_back(digi);
248 const float DeltaCM =
median_[iAPV] - MeanAPVCM;
261 uint16_t nAPVflagged = 0;
267 int devCount = 0, qualityCount = 0, minstrip = 0;
268 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
272 MeanAPVCM = itCMMap->second[iAPV];
284 if (devCount >
fraction_ * qualityCount) {
296 uint16_t nAPVflagged = 0;
297 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
299 int zeroCount = 0, qualityCount = 0;
318 uint16_t nAPVflagged = 0;
324 for (uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size() /
nTotStripsPerAPV; ++iAPV) {
328 MeanAPVCM = itCMMap->second[iAPV];
330 const float DeltaCM =
median_[iAPV] - (MeanAPVCM + 1024) / 2;
390 smoothedpoints.clear();
397 float localmin = 999.9;
398 for (uint16_t jstrip =
std::max(0, static_cast<int>(istrip -
nSmooth_ / 2));
399 jstrip < std::min((int)nTotStripsPerAPV, static_cast<int>(istrip +
nSmooth_ / 2));
401 const float nextvalue = adcs[jstrip];
402 if (nextvalue < localmin)
403 localmin = nextvalue;
405 adcsLocalMinSubtracted[istrip] = adcs[istrip] - localmin;
410 std::vector<uint16_t> nConsStrip;
412 uint16_t consecStrips = 0;
414 const int16_t
adc = adcs[istrip];
416 if (adcsLocalMinSubtracted[istrip] <
418 consecpoints.emplace_hint(consecpoints.end(), istrip,
adc);
420 }
else if (consecStrips > 0) {
421 nConsStrip.push_back(consecStrips);
426 if (consecStrips > 0)
427 nConsStrip.push_back(consecStrips);
430 auto itConsecpoints = consecpoints.begin();
431 float MinSmoothValue = 20000., MaxSmoothValue = 0.;
432 for (
const auto consecStrips : nConsStrip) {
435 uint16_t nFirstStrip = itConsecpoints->first;
437 float smoothValue = 0.0;
438 float stripCount = 1;
439 for (uint16_t
n = 0;
n < consecStrips - 2; ++
n) {
440 smoothValue += itConsecpoints->second;
442 smoothValue /= (
float)stripCount;
443 nLastStrip = nFirstStrip + stripCount - 1;
444 smoothedpoints.emplace_hint(smoothedpoints.end(), nFirstStrip, smoothValue);
445 smoothedpoints.emplace_hint(smoothedpoints.end(), nLastStrip, smoothValue);
446 if (smoothValue > MaxSmoothValue)
447 MaxSmoothValue = smoothValue;
448 if (smoothValue < MinSmoothValue)
449 MinSmoothValue = smoothValue;
450 nFirstStrip = nLastStrip + 1;
459 if (stripCount > 1) {
462 smoothValue /=
static_cast<float>(stripCount);
463 nLastStrip = nFirstStrip + stripCount - 1;
464 smoothedpoints.emplace_hint(smoothedpoints.end(), nFirstStrip, smoothValue);
465 smoothedpoints.emplace_hint(smoothedpoints.end(), nLastStrip, smoothValue);
466 if (smoothValue > MaxSmoothValue)
467 MaxSmoothValue = smoothValue;
468 if (smoothValue < MinSmoothValue)
469 MinSmoothValue = smoothValue;
472 for (
int n = 0;
n < consecStrips; ++
n)
507 if (smoothedpoints.size() < 3)
510 auto it = smoothedpoints.begin();
511 while (smoothedpoints.size() > 3 && it != --(--smoothedpoints.end())) {
514 const float adc1 = it2->second;
515 const float adc2 = (++it2)->
second;
516 const float adc3 = (++it2)->
second;
519 smoothedpoints.erase(--it2);
534 if (smoothedpoints.size() >= 2) {
535 for (
auto it = smoothedpoints.begin(); it != --smoothedpoints.end(); ++it) {
538 const float strip1 = it->first;
539 const float strip2 = itNext->first;
540 const float adc1 = it->second;
541 const float adc2 = itNext->second;
542 const float m = (adc2 - adc1) / (strip2 - strip1);
547 float strip = itStrip + strip1;
548 while (
strip < strip2) {
552 if (
adc < (adc1 +
m * itStrip - 2 *
noise)) {
553 smoothedpoints.emplace_hint(itNext,
strip,
adc);
563 const uint16_t firstStripFlat = smoothedpoints.begin()->first;
564 const uint16_t lastStripFlat = (--smoothedpoints.end())->
first;
565 const int16_t firstStripFlatADC = smoothedpoints.begin()->second;
566 const int16_t lastStripFlatADC = (--smoothedpoints.end())->
second;
567 if (firstStripFlat > 3) {
568 auto it = smoothedpoints.begin();
570 while (
strip < firstStripFlat) {
573 if (
adc < (firstStripFlatADC - 2 *
noise)) {
574 smoothedpoints.emplace_hint(it,
strip,
adc);
581 float strip = lastStripFlat + 1;
585 if (
adc < (lastStripFlatADC - 2 *
noise)) {
586 smoothedpoints.emplace_hint(smoothedpoints.end(),
strip,
adc);
596 if (smoothedpoints.size() < 4)
599 auto it = smoothedpoints.begin();
600 while (smoothedpoints.size() > 2 && it != --smoothedpoints.end()) {
605 const float strip1 = it->first;
606 const float strip2 = itNext->first;
607 const float adc1 = it->second;
608 const float adc2 = itNext->second;
609 const float m = (adc2 - adc1) / (strip2 - strip1);
612 smoothedpoints.erase(itNext);
615 if (it == smoothedpoints.begin())
616 smoothedpoints.erase(it++);
619 smoothedpoints.erase(it--);
635 const auto lastIt = --smoothedpoints.end();
636 const uint16_t firstStripFlat = smoothedpoints.begin()->first;
637 const uint16_t lastStripFlat = lastIt->first;
638 const int16_t firstStripFlatADC = smoothedpoints.begin()->second;
639 const int16_t lastStripFlatADC = lastIt->second;
642 baseline.erase(baseline.begin(), baseline.begin() + firstStripFlat);
643 baseline.insert(baseline.begin(), firstStripFlat, firstStripFlatADC);
645 baseline.erase(baseline.begin() + lastStripFlat, baseline.end());
646 baseline.insert(baseline.end(),
nTotStripsPerAPV - lastStripFlat, lastStripFlatADC);
649 for (
auto itSmoothedpoints = smoothedpoints.begin(); itSmoothedpoints != (--smoothedpoints.end());
650 ++itSmoothedpoints) {
651 auto itNextSmoothedpoints = itSmoothedpoints;
652 ++itNextSmoothedpoints;
653 const float strip1 = itSmoothedpoints->first;
654 const float strip2 = itNextSmoothedpoints->first;
655 const float adc1 = itSmoothedpoints->second;
656 const float adc2 = itNextSmoothedpoints->second;
658 baseline[strip1] = adc1;
659 baseline[strip2] = adc2;
660 const float m = (adc2 - adc1) / (strip2 - strip1);
661 uint16_t itStrip = strip1 + 1;
662 float stripadc = adc1 +
m;
663 while (itStrip < strip2) {
664 baseline[itStrip] = stripadc;
693 static const size_t savitzky_golay_n_l_r = 16;
694 static const float savitzky_golay_coefficient[2 * savitzky_golay_n_l_r + 1][2 * savitzky_golay_n_l_r + 1] = {
749 {0.172078, 0.153076, 0.135099, 0.118148, 0.102221, 0.0873206, 0.073445,
750 0.0605947, 0.0487697, 0.0379699, 0.0281955, 0.0194463, 0.0117225, 0.00502392,
751 -0.000649351, -0.00529733, -0.00892003, -0.0115174, -0.0130895, -0.0136364},
752 {0.123659, 0.116431, 0.109144, 0.101798, 0.0943921, 0.0869268, 0.0794021,
753 0.0718179, 0.0641743, 0.0564712, 0.0487087, 0.0408868, 0.0330054, 0.0250646,
754 0.0170644, 0.00900473, 0.000885613, -0.00729294, -0.0155309, -0.0238283, -0.0321852},
755 {0.0859684, 0.0868154, 0.0869565, 0.0863919, 0.0851214, 0.0831451, 0.080463, 0.0770751,
756 0.0729814, 0.0681818, 0.0626765, 0.0564653, 0.0495483, 0.0419255, 0.0335968, 0.0245624,
757 0.0148221, 0.00437606, -0.00677583, -0.0186335, -0.0311971, -0.0444664},
758 {0.0565217, 0.0628458, 0.0680971, 0.0722756, 0.0753811, 0.0774139, 0.0783738, 0.0782609,
759 0.0770751, 0.0748165, 0.071485, 0.0670807, 0.0616036, 0.0550536, 0.0474308, 0.0387352,
760 0.0289667, 0.0181254, 0.00621118, -0.00677583, -0.0208357, -0.0359684, -0.0521739},
761 {0.0334615, 0.0434281, 0.0521329, 0.0595759, 0.0657571, 0.0706765, 0.0743341, 0.07673,
762 0.0778641, 0.0777364, 0.0763469, 0.0736957, 0.0697826, 0.0646078, 0.0581712, 0.0504728,
763 0.0415126, 0.0312907, 0.0198069, 0.00706142, -0.00694588, -0.022215, -0.0387458, -0.0565385},
764 {0.0153846, 0.0276923, 0.0386622, 0.0482943, 0.0565886, 0.0635452, 0.0691639, 0.0734448, 0.076388,
765 0.0779933, 0.0782609, 0.0771906, 0.0747826, 0.0710368, 0.0659532, 0.0595318, 0.0517726, 0.0426756,
766 0.0322408, 0.0204682, 0.00735786, -0.0070903, -0.0228763, -0.04, -0.0584615},
767 {0.001221, 0.0149451, 0.027326, 0.0383639, 0.0480586, 0.0564103, 0.0634188, 0.0690842, 0.0734066,
768 0.0763858, 0.078022, 0.078315, 0.077265, 0.0748718, 0.0711355, 0.0660562, 0.0596337, 0.0518681,
769 0.0427595, 0.0323077, 0.0205128, 0.00737485, -0.00710623, -0.0229304, -0.0400977, -0.0586081},
770 {-0.00985222, 0.00463138, 0.0178098, 0.029683, 0.0402509, 0.0495137, 0.0574713, 0.0641236, 0.0694708,
771 0.0735127, 0.0762494, 0.0776809, 0.0778073, 0.0766284, 0.0741442, 0.0703549, 0.0652604, 0.0588607,
772 0.0511557, 0.0421456, 0.0318302, 0.0202097, 0.0072839, -0.00694708, -0.0224833, -0.0393247, -0.0574713},
773 {-0.0184729, -0.00369458, 0.00984169, 0.0221359, 0.0331881, 0.0429982, 0.0515662,
774 0.0588923, 0.0649762, 0.0698181, 0.073418, 0.0757758, 0.0768915, 0.0767652,
775 0.0753968, 0.0727864, 0.0689339, 0.0638394, 0.0575028, 0.0499242, 0.0411035,
776 0.0310408, 0.019736, 0.00718917, -0.00659972, -0.0216307, -0.0379037, -0.0554187},
777 {-0.025139, -0.0103925, 0.00318873, 0.0156046, 0.0268552, 0.0369405, 0.0458605, 0.0536151,
778 0.0602045, 0.0656285, 0.0698872, 0.0729806, 0.0749086, 0.0756714, 0.0752688, 0.0737009,
779 0.0709677, 0.0670692, 0.0620054, 0.0557763, 0.0483818, 0.039822, 0.0300969, 0.0192065,
780 0.0071508, -0.00607024, -0.0204566, -0.0360083, -0.0527253},
781 {-0.0302419, -0.0157536, -0.00234785, 0.00997537, 0.021216, 0.0313741, 0.0404497, 0.0484427,
782 0.0553532, 0.0611811, 0.0659264, 0.0695892, 0.0721695, 0.0736672, 0.0740823, 0.0734149,
783 0.0716649, 0.0688324, 0.0649174, 0.0599198, 0.0538396, 0.0466769, 0.0384316, 0.0291038,
784 0.0186934, 0.00720046, -0.00537502, -0.0190331, -0.0337736, -0.0495968},
785 {-0.0340909, -0.0200147, -0.006937, 0.00514208, 0.0162226, 0.0263045, 0.0353878, 0.0434725,
786 0.0505587, 0.0566463, 0.0617353, 0.0658257, 0.0689175, 0.0710107, 0.0721054, 0.0722014,
787 0.0712989, 0.0693978, 0.0664981, 0.0625999, 0.057703, 0.0518076, 0.0449135, 0.0370209,
788 0.0281297, 0.01824, 0.0073516, -0.00453534, -0.0174209, -0.031305, -0.0461877},
789 {-0.0369318, -0.0233688, -0.0107221, 0.00100806, 0.0118218, 0.0217192, 0.0307001, 0.0387647,
790 0.0459128, 0.0521444, 0.0574597, 0.0618585, 0.0653409, 0.0679069, 0.0695565, 0.0702896,
791 0.0701063, 0.0690066, 0.0669905, 0.0640579, 0.0602089, 0.0554435, 0.0497617, 0.0431635,
792 0.0356488, 0.0272177, 0.0178702, 0.0076063, -0.00357405, -0.0156708, -0.028684, -0.0426136},
793 {-0.038961, -0.025974, -0.0138249, -0.00251362, 0.00795978, 0.0175953, 0.026393, 0.0343527, 0.0414747,
794 0.0477587, 0.0532049, 0.0578132, 0.0615836, 0.0645161, 0.0666108, 0.0678676, 0.0682866, 0.0678676,
795 0.0666108, 0.0645161, 0.0615836, 0.0578132, 0.0532049, 0.0477587, 0.0414747, 0.0343527, 0.026393,
796 0.0175953, 0.00795978, -0.00251362, -0.0138249, -0.025974, -0.038961},
797 {-0.0426136, -0.028684, -0.0156708, -0.00357405, 0.0076063, 0.0178702, 0.0272177, 0.0356488,
798 0.0431635, 0.0497617, 0.0554435, 0.0602089, 0.0640579, 0.0669905, 0.0690066, 0.0701063,
799 0.0702896, 0.0695565, 0.0679069, 0.0653409, 0.0618585, 0.0574597, 0.0521444, 0.0459128,
800 0.0387647, 0.0307001, 0.0217192, 0.0118218, 0.00100806, -0.0107221, -0.0233688, -0.0369318},
801 {-0.0461877, -0.031305, -0.0174209, -0.00453534, 0.0073516, 0.01824, 0.0281297, 0.0370209,
802 0.0449135, 0.0518076, 0.057703, 0.0625999, 0.0664981, 0.0693978, 0.0712989, 0.0722014,
803 0.0721054, 0.0710107, 0.0689175, 0.0658257, 0.0617353, 0.0566463, 0.0505587, 0.0434725,
804 0.0353878, 0.0263045, 0.0162226, 0.00514208, -0.006937, -0.0200147, -0.0340909},
805 {-0.0495968, -0.0337736, -0.0190331, -0.00537502, 0.00720046, 0.0186934, 0.0291038, 0.0384316,
806 0.0466769, 0.0538396, 0.0599198, 0.0649174, 0.0688324, 0.0716649, 0.0734149, 0.0740823,
807 0.0736672, 0.0721695, 0.0695892, 0.0659264, 0.0611811, 0.0553532, 0.0484427, 0.0404497,
808 0.0313741, 0.021216, 0.00997537, -0.00234785, -0.0157536, -0.0302419},
809 {-0.0527253, -0.0360083, -0.0204566, -0.00607024, 0.0071508, 0.0192065, 0.0300969, 0.039822,
810 0.0483818, 0.0557763, 0.0620054, 0.0670692, 0.0709677, 0.0737009, 0.0752688, 0.0756714,
811 0.0749086, 0.0729806, 0.0698872, 0.0656285, 0.0602045, 0.0536151, 0.0458605, 0.0369405,
812 0.0268552, 0.0156046, 0.00318873, -0.0103925, -0.025139},
813 {-0.0554187, -0.0379037, -0.0216307, -0.00659972, 0.00718917, 0.019736, 0.0310408,
814 0.0411035, 0.0499242, 0.0575028, 0.0638394, 0.0689339, 0.0727864, 0.0753968,
815 0.0767652, 0.0768915, 0.0757758, 0.073418, 0.0698181, 0.0649762, 0.0588923,
816 0.0515662, 0.0429982, 0.0331881, 0.0221359, 0.00984169, -0.00369458, -0.0184729},
817 {-0.0574713, -0.0393247, -0.0224833, -0.00694708, 0.0072839, 0.0202097, 0.0318302, 0.0421456, 0.0511557,
818 0.0588607, 0.0652604, 0.0703549, 0.0741442, 0.0766284, 0.0778073, 0.0776809, 0.0762494, 0.0735127,
819 0.0694708, 0.0641236, 0.0574713, 0.0495137, 0.0402509, 0.029683, 0.0178098, 0.00463138, -0.00985222},
820 {-0.0586081, -0.0400977, -0.0229304, -0.00710623, 0.00737485, 0.0205128, 0.0323077, 0.0427595, 0.0518681,
821 0.0596337, 0.0660562, 0.0711355, 0.0748718, 0.077265, 0.078315, 0.078022, 0.0763858, 0.0734066,
822 0.0690842, 0.0634188, 0.0564103, 0.0480586, 0.0383639, 0.027326, 0.0149451, 0.001221},
823 {-0.0584615, -0.04, -0.0228763, -0.0070903, 0.00735786, 0.0204682, 0.0322408, 0.0426756, 0.0517726,
824 0.0595318, 0.0659532, 0.0710368, 0.0747826, 0.0771906, 0.0782609, 0.0779933, 0.076388, 0.0734448,
825 0.0691639, 0.0635452, 0.0565886, 0.0482943, 0.0386622, 0.0276923, 0.0153846},
826 {-0.0565385, -0.0387458, -0.022215, -0.00694588, 0.00706142, 0.0198069, 0.0312907, 0.0415126,
827 0.0504728, 0.0581712, 0.0646078, 0.0697826, 0.0736957, 0.0763469, 0.0777364, 0.0778641,
828 0.07673, 0.0743341, 0.0706765, 0.0657571, 0.0595759, 0.0521329, 0.0434281, 0.0334615},
829 {-0.0521739, -0.0359684, -0.0208357, -0.00677583, 0.00621118, 0.0181254, 0.0289667, 0.0387352,
830 0.0474308, 0.0550536, 0.0616036, 0.0670807, 0.071485, 0.0748165, 0.0770751, 0.0782609,
831 0.0783738, 0.0774139, 0.0753811, 0.0722756, 0.0680971, 0.0628458, 0.0565217},
832 {-0.0444664, -0.0311971, -0.0186335, -0.00677583, 0.00437606, 0.0148221, 0.0245624, 0.0335968,
833 0.0419255, 0.0495483, 0.0564653, 0.0626765, 0.0681818, 0.0729814, 0.0770751, 0.080463,
834 0.0831451, 0.0851214, 0.0863919, 0.0869565, 0.0868154, 0.0859684},
835 {-0.0321852, -0.0238283, -0.0155309, -0.00729294, 0.000885613, 0.00900473, 0.0170644,
836 0.0250646, 0.0330054, 0.0408868, 0.0487087, 0.0564712, 0.0641743, 0.0718179,
837 0.0794021, 0.0869268, 0.0943921, 0.101798, 0.109144, 0.116431, 0.123659},
838 {-0.0136364, -0.0130895, -0.0115174, -0.00892003, -0.00529733, -0.000649351, 0.00502392,
839 0.0117225, 0.0194463, 0.0281955, 0.0379699, 0.0487697, 0.0605947, 0.073445,
840 0.0873206, 0.102221, 0.118148, 0.135099, 0.153076, 0.172078},
903 for (
size_t i = 0;
i < savitzky_golay_n_l_r;
i++) {
904 for (
size_t j = 0;
j < savitzky_golay_n_l_r + 1 +
i;
j++) {
905 filtered_baseline[
i] += savitzky_golay_coefficient[
i][
j] * baseline[
j];
912 filtered_baseline[
i] = savitzky_golay_coefficient[savitzky_golay_n_l_r][savitzky_golay_n_l_r] * baseline[
i];
913 for (
size_t j = 0;
j < savitzky_golay_n_l_r;
j++) {
914 filtered_baseline[
i] += savitzky_golay_coefficient[savitzky_golay_n_l_r][
j] *
915 (baseline[
i +
j - savitzky_golay_n_l_r] + baseline[
i -
j + savitzky_golay_n_l_r]);
920 for (
size_t j = 0;
j < 2 * savitzky_golay_n_l_r + 1;
j++) {
922 savitzky_golay_coefficient[savitzky_golay_n_l_r][
j] *
923 baseline[
i +
j - savitzky_golay_n_l_r];
932 filtered_baseline[
i] += savitzky_golay_coefficient[2 * savitzky_golay_n_l_r +
i + 1 -
nTotStripsPerAPV][
j] *
933 baseline[
i +
j - savitzky_golay_n_l_r];
940 filtered_baseline_derivative[
i] = filtered_baseline[
i + 1] - filtered_baseline[
i];
946 double filtered_baseline_max = 0;
947 double filtered_baseline_derivative_sum_square = 0;
950 const double d = filtered_baseline[
i] - baseline[
i];
952 filtered_baseline_max =
std::max(filtered_baseline_max, static_cast<double>(fabs(
d)));
955 filtered_baseline_derivative_sum_square += filtered_baseline_derivative[
i] * filtered_baseline_derivative[
i];
959 std::cerr << __FILE__ <<
':' << __LINE__ <<
": " 960 << filtered_baseline_max <<
' ' 961 << filtered_baseline_derivative_sum_square << std::endl;
985 for (
const auto& rawDigis :
input) {
988 std::vector<float> meanCMDetSet;
989 meanCMDetSet.reserve(nAPVs);
990 for (uint16_t iAPV = 0; iAPV < nAPVs; ++iAPV) {
997 meanCMDetSet.push_back(minPed);
1004 for (
const auto& rawDigis :
input) {
1005 std::vector<float> meanCMNValue;
1006 meanCMNValue.reserve(rawDigis.size());
1019 singleAPVdigi.clear();
1021 singleAPVdigi.push_back(digis[
strip] + 1024);
1024 discontinuities.clear();
1026 digimap_t::iterator itdiscontinuities;
1030 bool isMinimumAndNoMax =
false;
1031 bool isFirstStrip =
false;
1035 int actualStripADC = 0;
1036 int previousStripADC = 0;
1039 int maximum_value = 0;
1040 const uint32_t n_high_maximum_cluster = 1025 + 1024;
1041 int high_maximum_cluster = n_high_maximum_cluster;
1042 int number_good_minimum = 0;
1043 int first_gradient = 0;
1044 int strip_first_gradient = 0;
1045 int adc_start_point_cluster_pw = 0;
1046 int auxiliary_end_cluster = 0;
1047 int first_start_cluster_strip = 0;
1048 int first_start_cluster_ADC = 0;
1049 bool isAuxiliary_Minimum =
false;
1050 bool isPossible_wrong_minimum =
false;
1057 actualStripADC = singleAPVdigi[
strip];
1059 isFirstStrip =
true;
1060 isMinimumAndNoMax =
true;
1061 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip, actualStripADC));
1063 discontinuities.insert(discontinuities.end(), std::pair<uint16_t, int16_t>(
strip, 0 + 1024));
1064 isMinimumAndNoMax =
true;
1065 first_start_cluster_strip =
strip;
1066 first_start_cluster_ADC = 1024;
1070 previousStripADC = actualStripADC;
1071 actualStripADC = singleAPVdigi[
strip];
1072 greadient = actualStripADC - previousStripADC;
1077 discontinuities.size() > 1)) {
1079 isPossible_wrong_minimum =
true;
1080 itdiscontinuities = --discontinuities.end();
1081 if (discontinuities.size() > 1) {
1082 --itdiscontinuities;
1084 strip_first_gradient = itdiscontinuities->first;
1085 adc_start_point_cluster_pw = itdiscontinuities->second;
1086 first_gradient =
std::abs(adc_start_point_cluster_pw - singleAPVdigi[strip_first_gradient + 1]);
1087 discontinuities.erase(++itdiscontinuities);
1088 discontinuities.erase(--discontinuities.end());
1091 if ((discontinuities.size() % 2 == 1) && (!discontinuities.empty())) {
1092 discontinuities.erase(--discontinuities.end());
1095 discontinuities.insert(discontinuities.end(), std::pair<uint16_t, int16_t>(
strip - 1, previousStripADC));
1096 isMinimumAndNoMax =
true;
1098 first_start_cluster_strip =
strip - 1;
1099 first_start_cluster_ADC = previousStripADC;
1101 }
else if ((!isMax) && ((actualStripADC - previousStripADC < 0) && (isMinimumAndNoMax))) {
1103 isMinimumAndNoMax =
false;
1104 high_maximum_cluster = n_high_maximum_cluster;
1105 if ((previousStripADC > maximum_value) && (discontinuities.size() % 2 == 1))
1106 maximum_value = previousStripADC;
1110 if (high_maximum_cluster > (
std::abs(singleAPVdigi[
strip + 1] - actualStripADC))) {
1111 high_maximum_cluster = singleAPVdigi[
strip + 1] - actualStripADC;
1112 auxiliary_end_cluster =
strip + 2;
1118 if ((isMax) && ((actualStripADC - previousStripADC) >= 0) && (
size_window_ > 0) &&
1120 number_good_minimum = 0;
1121 for (uint16_t wintry = 0; wintry <=
size_window_; wintry++) {
1123 ++number_good_minimum;
1125 --number_good_minimum;
1129 isMinimumAndNoMax =
true;
1134 isAuxiliary_Minimum =
true;
1137 if (!discontinuities.empty()) {
1138 itdiscontinuities = --discontinuities.end();
1141 if ((isMax) && (actualStripADC <= first_start_cluster_ADC)) {
1142 if ((
std::abs(first_start_cluster_ADC - singleAPVdigi[
strip + 2]) > first_gradient) &&
1143 (isPossible_wrong_minimum)) {
1144 discontinuities.erase(itdiscontinuities);
1145 discontinuities.insert(discontinuities.end(),
1146 std::pair<int, int>(strip_first_gradient, adc_start_point_cluster_pw));
1147 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip, adc_start_point_cluster_pw));
1149 if ((discontinuities.size() % 2 == 0) && (discontinuities.size() > 1)) {
1150 discontinuities.erase(--discontinuities.end());
1152 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip, actualStripADC));
1155 adc_start_point_cluster_pw = 0;
1156 isPossible_wrong_minimum =
false;
1157 strip_first_gradient = 0;
1158 first_start_cluster_strip = 0;
1159 first_start_cluster_ADC = 0;
1162 if ((isMax) && ((actualStripADC - previousStripADC) >= 0) &&
1163 (!isAuxiliary_Minimum)) {
1164 if ((
std::abs(first_start_cluster_ADC - singleAPVdigi[
strip + 1]) > first_gradient) &&
1165 (isPossible_wrong_minimum)) {
1166 discontinuities.erase(itdiscontinuities);
1167 discontinuities.insert(discontinuities.end(),
1168 std::pair<int, int>(strip_first_gradient, adc_start_point_cluster_pw));
1171 if ((discontinuities.size() % 2 == 0) && (discontinuities.size() > 1)) {
1172 discontinuities.erase(--discontinuities.end());
1174 discontinuities.insert(discontinuities.end(), std::pair<int, int>(
strip - 1, previousStripADC));
1176 adc_start_point_cluster_pw = 0;
1177 isPossible_wrong_minimum =
false;
1178 strip_first_gradient = 0;
1179 first_start_cluster_strip = 0;
1180 first_start_cluster_ADC = 0;
1187 if (!discontinuities.empty()) {
1189 discontinuities.insert(discontinuities.end(),
1191 if ((isMax) && (isAuxiliary_Minimum))
1192 discontinuities.insert(discontinuities.end(),
1193 std::pair<int, int>(auxiliary_end_cluster, first_start_cluster_ADC));
1197 itdiscontinuities = discontinuities.begin();
1198 ++itdiscontinuities;
1199 ++itdiscontinuities;
1200 int firstADC = itdiscontinuities->second;
1201 --itdiscontinuities;
1202 itdiscontinuities->second = firstADC;
1203 --itdiscontinuities;
1204 itdiscontinuities->second = firstADC;
1207 if (!discontinuities.empty()) {
1208 itdiscontinuities = discontinuities.begin();
1209 uint16_t firstStrip = itdiscontinuities->first;
1210 int16_t firstADC = itdiscontinuities->second;
1211 ++itdiscontinuities;
1212 uint16_t lastStrip = itdiscontinuities->first;
1213 int16_t secondADC = itdiscontinuities->second;
1214 ++itdiscontinuities;
1217 if (
strip > lastStrip && itdiscontinuities != discontinuities.end()) {
1218 firstStrip = itdiscontinuities->first;
1219 firstADC = itdiscontinuities->second;
1220 ++itdiscontinuities;
1221 lastStrip = itdiscontinuities->first;
1222 secondADC = itdiscontinuities->second;
1223 ++itdiscontinuities;
1226 if ((firstStrip <=
strip) && (
strip <= lastStrip) &&
1227 (0 < (singleAPVdigi[
strip] - firstADC -
1230 singleAPVdigi[
strip] - firstADC -
1231 (((secondADC - firstADC) / (lastStrip - firstStrip)) * (
strip - firstStrip));
edm::ESWatcher< SiStripQualityRcd > qualityWatcher_
SiStripAPVRestorer(const edm::ParameterSet &conf, edm::ConsumesCollector)
uint32_t nSaturatedStrip_
const Range getRange(const uint32_t &detID) const
void init(const edm::EventSetup &es)
bool IsApvBad(uint32_t detid, short apvNb) const
uint32_t cleaningSequence_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
uint32_t deltaCMThreshold_
void baselineFollowerRestore(uint16_t apvN, uint16_t firstAPV, float median, digivector_t &digis)
bool applyBaselineRejection_
uint16_t baselineAndSaturationInspect(uint16_t firstAPV, const digivector_t &digis)
for(int i=first, nt=offsets[nh];i< nt;i+=gridDim.x *blockDim.x)
A signed Digi for the silicon strip detector, containing only adc information, and suitable for stori...
const SiStripPedestals * pedestalHandle
std::map< uint16_t, digimap_t > smoothedMaps_
uint16_t baselineFollowerInspect(uint16_t firstAPV, const digivector_t &digis)
double filteredBaselineDerivativeSumSquare_
uint32_t nSigmaNoiseDerTh_
const Range getRange(const uint32_t detID) const
void flatRestore(uint16_t apvN, uint16_t firstAPV, digivector_t &digis)
edm::ESGetToken< SiStripQuality, SiStripQualityRcd > qualityToken_
float getPed(const uint16_t &strip, const Range &range) const
static std::string const input
edm::ESWatcher< SiStripNoisesRcd > noiseWatcher_
void baselineFollower(const digimap_t &, digivector_t &baseline, float median)
void loadMeanCMMap(const edm::Event &)
U second(std::pair< T, U > const &p)
const float & adc() const
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > siStripRawDigiToken_
uint16_t hybridEmulationInspect(uint16_t firstAPV, const digivector_t &digis)
std::vector< std::string > apvFlags_
baselinemap_t baselineMap_
static float getNoiseFast(const uint16_t &strip, const Range &range)
const SiStripQuality * qualityHandle
bool checkBaseline(const std::vector< int16_t > &baseline) const
void baselineCleaner(const digivector_t &adcs, digimap_t &smoothedpoints, uint16_t apvN)
void cleaner_LocalMinimumAdder(const digivector_t &adcs, digimap_t &smoothedpoints, uint16_t apvN)
double filteredBaselineMax_
void cleaner_HighSlopeChecker(digimap_t &smoothedpoints)
Abs< T >::type abs(const T &t)
const SiStripNoises * noiseHandle
edm::EDGetTokenT< edm::DetSetVector< SiStripProcessedRawDigi > > siStripProcessedRawDigiToken_
bool flatRegionsFinder(const digivector_t &adcs, digimap_t &smoothedpoints, uint16_t apvN)
void cleaner_MonotonyChecker(digimap_t &smoothedpoints)
uint16_t inspectAndRestore(uint32_t detId, uint16_t firstAPV, const digivector_t &rawDigisPedSubtracted, digivector_t &processedRawDigi, const medians_t &vmedians)
void derivativeFollowerRestore(uint16_t apvN, uint16_t firstAPV, digivector_t &digis)
void createCMMapCMstored(const edm::DetSetVector< SiStripProcessedRawDigi > &input)
edm::ESGetToken< SiStripPedestals, SiStripPedestalsRcd > pedestalToken_
uint32_t consecThreshold_
uint16_t hybridFormatInspect(uint16_t firstAPV, const digivector_t &digis)
edm::ESWatcher< SiStripPedestalsRcd > pedestalWatcher_
std::vector< bool > apvFlagsBoolOverride_
std::map< uint16_t, digi_t > digimap_t
bool IsStripBad(uint32_t detid, short strip) const
edm::ESGetToken< SiStripNoises, SiStripNoisesRcd > noiseToken_
uint16_t nullInspect(uint16_t firstAPV, const digivector_t &digis)
std::vector< std::pair< short, float > > medians_t
std::vector< bool > badAPVs_
bool check(const edm::EventSetup &iSetup)
const Range getRange(const uint32_t detID) const
std::vector< bool > apvFlagsBool_
uint16_t abnormalBaselineInspect(uint16_t firstAPV, const digivector_t &digis)
std::pair< ContainerIterator, ContainerIterator > Range
std::vector< digi_t > digivector_t
bool applyBaselineCleaner_
std::vector< float > median_
uint32_t distortionThreshold_
void restore(uint16_t firstAPV, digivector_t &digis)
uint16_t forceRestoreInspect(uint16_t firstAPV, const digivector_t &digis)
uint32_t hitStripThreshold_
static constexpr uint16_t nTotStripsPerAPV
Log< level::Warning, false > LogWarning
std::pair< ContainerIterator, ContainerIterator > Range
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
void createCMMapRealPed(const edm::DetSetVector< SiStripRawDigi > &input)
uint16_t *__restrict__ uint16_t const *__restrict__ adc
uint16_t inspect(uint32_t detId, uint16_t firstAPV, const digivector_t &digis, const medians_t &vmedians)