11 quality_cache_id(-1), noise_cache_id(-1), pedestal_cache_id(-1),
12 forceNoRestore_(conf.getParameter<
bool>(
"ForceNoRestore")),
13 inspectAlgo_(conf.getParameter<
std::
string>(
"APVInspectMode")),
14 restoreAlgo_(conf.getParameter<
std::
string>(
"APVRestoreMode")),
16 useRealMeanCM_(conf.getParameter<
bool>(
"useRealMeanCM")),
17 meanCM_(conf.getParameter<int32_t>(
"MeanCM")),
18 deltaCMThreshold_(conf.getParameter<uint32_t>(
"DeltaCMThreshold")),
20 fraction_(conf.getParameter<double>(
"Fraction")),
21 deviation_(conf.getParameter<uint32_t>(
"Deviation")),
23 restoreThreshold_(conf.getParameter<double>(
"restoreThreshold")),
25 nSaturatedStrip_(conf.getParameter<uint32_t>(
"nSaturatedStrip")),
27 nSigmaNoiseDerTh_(conf.getParameter<uint32_t>(
"nSigmaNoiseDerTh")),
28 consecThreshold_(conf.getParameter<uint32_t>(
"consecThreshold")),
29 nSmooth_(conf.getParameter<uint32_t>(
"nSmooth")),
30 distortionThreshold_(conf.getParameter<uint32_t>(
"distortionThreshold")),
31 applyBaselineCleaner_(conf.getParameter<
bool>(
"ApplyBaselineCleaner")),
32 cleaningSequence_(conf.getParameter<uint32_t>(
"CleaningSequence")),
34 slopeX_(conf.getParameter<int32_t>(
"slopeX")),
35 slopeY_(conf.getParameter<int32_t>(
"slopeY")),
37 hitStripThreshold_(conf.getParameter<uint32_t>(
"hitStripThreshold")),
39 minStripsToFit_(conf.getParameter<uint32_t>(
"minStripsToFit")),
40 applyBaselineRejection_(conf.getParameter<
bool>(
"ApplyBaselineRejection")),
41 filteredBaselineMax_(conf.getParameter<double>(
"filteredBaselineMax")),
42 filteredBaselineDerivativeSumSquare_(conf.getParameter<double>(
"filteredBaselineDerivativeSumSquare")),
44 gradient_threshold_(conf.getParameter<
int>(
"discontinuityThreshold")),
45 last_gradient_(conf.getParameter<
int>(
"lastGradient")),
46 size_window_(conf.getParameter<
int>(
"sizeWindow")),
47 width_cluster_(conf.getParameter<
int>(
"widthCluster"))
50 throw cms::Exception(
"Incompatible Algorithm") <<
"The BaselineFollower restore method requires the BaselineFollower inspect method";
83 auto nAPVFlagged =
inspect(detId, firstAPV, rawDigisPedSubtracted, vmedians);
84 restore(firstAPV, processedRawDigi);
99 for (
const auto & med : vmedians ) {
100 auto iAPV = med.first;
105 uint16_t nAPVFlagged = 0;
121 throw cms::Exception(
"Unregistered Inspect Algorithm") <<
"SiStripAPVRestorer possibilities: (Null), (AbnormalBaseline), (BaselineFollower), (BaselineAndSaturation), (DerivativeFollower), (Hybrid), (HybridEmulation)";
135 for ( uint16_t iAPV=firstAPV; iAPV < digis.size()/
nTotStripsPerAPV + firstAPV; ++iAPV ) {
137 if ( !algoToUse.empty()) {
138 if ( algoToUse ==
"Flat" ) {
140 }
else if ( algoToUse ==
"BaselineFollower" ) {
142 }
else if ( algoToUse ==
"DerivativeFollower" ) {
145 throw cms::Exception(
"Unregistered Restore Algorithm") <<
"SiStripAPVRestorer possibilities: (Flat), (BaselineFollower), (DerivativeFollower)";
156 uint16_t nAPVflagged = 0;
157 for ( uint16_t iAPV = firstAPV; iAPV < digis.size()/
nTotStripsPerAPV + firstAPV; ++iAPV ) {
160 uint16_t stripsPerAPV = 0;
161 singleAPVdigi.clear();
164 singleAPVdigi.push_back(adc);
165 if ( adc > 0 ) ++stripsPerAPV;
168 if ( stripsPerAPV > 64 ) {
182 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 const float DeltaCM =
median_[iAPV] - MeanAPVCM;
212 uint16_t nAPVflagged = 0;
213 for ( uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size()/
nTotStripsPerAPV; ++iAPV ) {
225 uint16_t nAPVflagged = 0;
230 for ( uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size()/
nTotStripsPerAPV; ++iAPV ) {
234 MeanAPVCM = itCMMap->second[iAPV];
236 singleAPVdigi.clear();
237 uint16_t nSatStrip = 0;
239 const uint16_t digi = digis[
strip];
240 singleAPVdigi.push_back(digi);
241 if ( digi >= 1023 ) ++nSatStrip;
244 const float DeltaCM =
median_[iAPV] - MeanAPVCM;
258 uint16_t nAPVflagged = 0;
263 int devCount = 0, qualityCount = 0, minstrip = 0;
264 for ( uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size()/
nTotStripsPerAPV; ++iAPV ) {
268 MeanAPVCM = itCMMap->second[iAPV];
280 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;
301 if ( fs < 1 ) zeroCount++;
315 uint16_t nAPVflagged = 0;
320 for ( uint16_t iAPV = firstAPV; iAPV < firstAPV + digis.size()/
nTotStripsPerAPV; ++iAPV ) {
324 MeanAPVCM = itCMMap->second[iAPV];
326 const float DeltaCM =
median_[iAPV] - MeanAPVCM;
361 digis[nTotStripsPerAPV*(apvN-firstAPV)+itStrip] -= baseline[itStrip] - median;
374 digis[nTotStripsPerAPV*(apvN-firstAPV)+itStrip] = baseline[itStrip];
382 smoothedpoints.clear();
389 float localmin = 999.9;
390 for ( uint16_t jstrip =
std::max(0, static_cast<int>(istrip-
nSmooth_/2)); jstrip < std::min((int)nTotStripsPerAPV, static_cast<int>(istrip+
nSmooth_/2)); ++jstrip ) {
391 const float nextvalue = adcs[jstrip];
392 if (nextvalue < localmin) localmin = nextvalue;
394 adcsLocalMinSubtracted[istrip] = adcs[istrip] - localmin;
399 std::vector<uint16_t> nConsStrip;
401 uint16_t consecStrips = 0;
403 const int16_t
adc = adcs[istrip];
406 consecpoints.emplace_hint(consecpoints.end(), istrip,
adc);
408 }
else if ( consecStrips > 0 ) {
409 nConsStrip.push_back(consecStrips);
414 if ( consecStrips > 0 ) nConsStrip.push_back(consecStrips);
417 auto itConsecpoints = consecpoints.begin();
418 float MinSmoothValue=20000., MaxSmoothValue=0.;
419 for (
const auto consecStrips : nConsStrip ) {
422 uint16_t nFirstStrip = itConsecpoints->first;
424 float smoothValue = 0.0;
425 float stripCount = 1;
426 for ( uint16_t
n = 0;
n < consecStrips-2; ++
n ) {
427 smoothValue += itConsecpoints->second;
429 smoothValue /= (
float)stripCount;
430 nLastStrip = nFirstStrip + stripCount - 1;
431 smoothedpoints.emplace_hint(smoothedpoints.end(), nFirstStrip, smoothValue);
432 smoothedpoints.emplace_hint(smoothedpoints.end(), nLastStrip, smoothValue);
433 if ( smoothValue > MaxSmoothValue ) MaxSmoothValue = smoothValue;
434 if ( smoothValue < MinSmoothValue ) MinSmoothValue = smoothValue;
435 nFirstStrip = nLastStrip+1;
444 if ( stripCount > 1 ) {
447 smoothValue /=
static_cast<float>(stripCount);
448 nLastStrip = nFirstStrip + stripCount -1;
449 smoothedpoints.emplace_hint(smoothedpoints.end(), nFirstStrip, smoothValue);
450 smoothedpoints.emplace_hint(smoothedpoints.end(), nLastStrip, smoothValue);
451 if ( smoothValue > MaxSmoothValue ) MaxSmoothValue = smoothValue;
452 if ( smoothValue < MinSmoothValue ) MinSmoothValue = smoothValue;
455 for(
int n =0;
n< consecStrips ; ++
n) ++itConsecpoints;
491 if ( smoothedpoints.size() < 3 )
return;
493 auto it = smoothedpoints.begin();
494 while ( smoothedpoints.size() > 3 && it != --(--smoothedpoints.end()) ) {
497 const float adc1 = it2->second;
498 const float adc2 = (++it2)->
second;
499 const float adc3 = (++it2)->
second;
502 smoothedpoints.erase(--it2);
516 if ( smoothedpoints.size() >= 2 ) {
517 for (
auto it = smoothedpoints.begin(); it != --smoothedpoints.end(); ++it ) {
518 auto itNext = it; ++itNext;
519 const float strip1 = it->first;
520 const float strip2 = itNext->first;
521 const float adc1 = it->second;
522 const float adc2 = itNext->second;
523 const float m = (adc2 -adc1)/(strip2 -strip1);
528 float strip = itStrip + strip1;
529 while ( strip < strip2 ) {
532 if ( adc < (adc1 + m * itStrip - 2 * noise) ) {
533 smoothedpoints.emplace_hint(itNext, strip, adc);
543 const uint16_t firstStripFlat = smoothedpoints.begin()->first;
544 const uint16_t lastStripFlat = (--smoothedpoints.end())->
first;
545 const int16_t firstStripFlatADC = smoothedpoints.begin()->second;
546 const int16_t lastStripFlatADC = (--smoothedpoints.end())->
second;
547 if ( firstStripFlat > 3 ) {
548 auto it = smoothedpoints.begin();
550 while ( strip < firstStripFlat ) {
553 if ( adc < ( firstStripFlatADC - 2 * noise ) ) {
554 smoothedpoints.emplace_hint(it, strip, adc);
561 float strip = lastStripFlat+1;
565 if ( adc < ( lastStripFlatADC - 2 * noise ) ) {
566 smoothedpoints.emplace_hint(smoothedpoints.end(),
strip,
adc);
577 if ( smoothedpoints.size() < 4 )
return;
579 auto it = smoothedpoints.begin();
580 while ( smoothedpoints.size() > 2 && it != --smoothedpoints.end() ) {
583 auto itNext = it; ++itNext;
584 const float strip1 = it->first;
585 const float strip2 = itNext->first;
586 const float adc1 = it->second;
587 const float adc2 = itNext->second;
588 const float m = (adc2 -adc1)/(strip2 -strip1);
591 smoothedpoints.erase(itNext);
592 }
else if ( m < -2 ) {
594 if ( it == smoothedpoints.begin() )
595 smoothedpoints.erase(it++);
597 else smoothedpoints.erase(it--);
612 const auto lastIt = --smoothedpoints.end();
613 const uint16_t firstStripFlat = smoothedpoints.begin()->first;
614 const uint16_t lastStripFlat = lastIt->first;
615 const int16_t firstStripFlatADC= smoothedpoints.begin()->second;
616 const int16_t lastStripFlatADC= lastIt->second;
619 baseline.erase(baseline.begin(), baseline.begin()+firstStripFlat);
620 baseline.insert(baseline.begin(), firstStripFlat, firstStripFlatADC);
622 baseline.erase(baseline.begin()+lastStripFlat, baseline.end());
623 baseline.insert(baseline.end(),
nTotStripsPerAPV - lastStripFlat, lastStripFlatADC);
626 for (
auto itSmoothedpoints = smoothedpoints.begin(); itSmoothedpoints != (--smoothedpoints.end()); ++itSmoothedpoints ) {
627 auto itNextSmoothedpoints = itSmoothedpoints;
628 ++itNextSmoothedpoints;
629 const float strip1 = itSmoothedpoints->first;
630 const float strip2 = itNextSmoothedpoints->first;
631 const float adc1 = itSmoothedpoints->second;
632 const float adc2 = itNextSmoothedpoints->second;
634 baseline[strip1] = adc1;
635 baseline[strip2] = adc2;
636 const float m = (adc2 -adc1)/(strip2 -strip1);
637 uint16_t itStrip = strip1 +1;
638 float stripadc = adc1 +
m;
639 while ( itStrip < strip2 ) {
640 baseline[itStrip] = stripadc;
671 static const size_t savitzky_golay_n_l_r = 16;
672 static const float savitzky_golay_coefficient
673 [2 * savitzky_golay_n_l_r + 1][2 * savitzky_golay_n_l_r + 1] = {
674 { 0.422085, 0.325077, 0.23839, 0.162023, 0.0959752, 0.0402477,
675 -0.00515996, -0.0402477, -0.0650155, -0.0794634, -0.0835913,
676 -0.0773994, -0.0608875, -0.0340557, 0.00309598, 0.0505676,
678 { 0.315789, 0.254902, 0.19969, 0.150155, 0.106295, 0.0681115,
679 0.0356037, 0.00877193, -0.0123839, -0.0278638, -0.0376677,
680 -0.0417957, -0.0402477, -0.0330237, -0.0201238, -0.00154799,
681 0.0227038, 0.0526316 },
682 { 0.234586, 0.198496, 0.165207, 0.134719, 0.107032, 0.0821465,
683 0.0600619, 0.0407784, 0.024296, 0.0106148, -0.000265369,
684 -0.00834439, -0.0136223, -0.0160991, -0.0157747, -0.0126493,
685 -0.00672269, 0.00200501, 0.0135338 },
686 { 0.172078, 0.153076, 0.135099, 0.118148, 0.102221, 0.0873206,
687 0.073445, 0.0605947, 0.0487697, 0.0379699, 0.0281955,
688 0.0194463, 0.0117225, 0.00502392, -0.000649351, -0.00529733,
689 -0.00892003, -0.0115174, -0.0130895, -0.0136364 },
690 { 0.123659, 0.116431, 0.109144, 0.101798, 0.0943921, 0.0869268,
691 0.0794021, 0.0718179, 0.0641743, 0.0564712, 0.0487087,
692 0.0408868, 0.0330054, 0.0250646, 0.0170644, 0.00900473,
693 0.000885613, -0.00729294, -0.0155309, -0.0238283,
695 { 0.0859684, 0.0868154, 0.0869565, 0.0863919, 0.0851214,
696 0.0831451, 0.080463, 0.0770751, 0.0729814, 0.0681818,
697 0.0626765, 0.0564653, 0.0495483, 0.0419255, 0.0335968,
698 0.0245624, 0.0148221, 0.00437606, -0.00677583, -0.0186335,
699 -0.0311971, -0.0444664 },
700 { 0.0565217, 0.0628458, 0.0680971, 0.0722756, 0.0753811,
701 0.0774139, 0.0783738, 0.0782609, 0.0770751, 0.0748165,
702 0.071485, 0.0670807, 0.0616036, 0.0550536, 0.0474308,
703 0.0387352, 0.0289667, 0.0181254, 0.00621118, -0.00677583,
704 -0.0208357, -0.0359684, -0.0521739 },
705 { 0.0334615, 0.0434281, 0.0521329, 0.0595759, 0.0657571,
706 0.0706765, 0.0743341, 0.07673, 0.0778641, 0.0777364,
707 0.0763469, 0.0736957, 0.0697826, 0.0646078, 0.0581712,
708 0.0504728, 0.0415126, 0.0312907, 0.0198069, 0.00706142,
709 -0.00694588, -0.022215, -0.0387458, -0.0565385 },
710 { 0.0153846, 0.0276923, 0.0386622, 0.0482943, 0.0565886,
711 0.0635452, 0.0691639, 0.0734448, 0.076388, 0.0779933,
712 0.0782609, 0.0771906, 0.0747826, 0.0710368, 0.0659532,
713 0.0595318, 0.0517726, 0.0426756, 0.0322408, 0.0204682,
714 0.00735786, -0.0070903, -0.0228763, -0.04, -0.0584615 },
715 { 0.001221, 0.0149451, 0.027326, 0.0383639, 0.0480586,
716 0.0564103, 0.0634188, 0.0690842, 0.0734066, 0.0763858,
717 0.078022, 0.078315, 0.077265, 0.0748718, 0.0711355,
718 0.0660562, 0.0596337, 0.0518681, 0.0427595, 0.0323077,
719 0.0205128, 0.00737485, -0.00710623, -0.0229304, -0.0400977,
721 { -0.00985222, 0.00463138, 0.0178098, 0.029683, 0.0402509,
722 0.0495137, 0.0574713, 0.0641236, 0.0694708, 0.0735127,
723 0.0762494, 0.0776809, 0.0778073, 0.0766284, 0.0741442,
724 0.0703549, 0.0652604, 0.0588607, 0.0511557, 0.0421456,
725 0.0318302, 0.0202097, 0.0072839, -0.00694708, -0.0224833,
726 -0.0393247, -0.0574713 },
727 { -0.0184729, -0.00369458, 0.00984169, 0.0221359, 0.0331881,
728 0.0429982, 0.0515662, 0.0588923, 0.0649762, 0.0698181,
729 0.073418, 0.0757758, 0.0768915, 0.0767652, 0.0753968,
730 0.0727864, 0.0689339, 0.0638394, 0.0575028, 0.0499242,
731 0.0411035, 0.0310408, 0.019736, 0.00718917, -0.00659972,
732 -0.0216307, -0.0379037, -0.0554187 },
733 { -0.025139, -0.0103925, 0.00318873, 0.0156046, 0.0268552,
734 0.0369405, 0.0458605, 0.0536151, 0.0602045, 0.0656285,
735 0.0698872, 0.0729806, 0.0749086, 0.0756714, 0.0752688,
736 0.0737009, 0.0709677, 0.0670692, 0.0620054, 0.0557763,
737 0.0483818, 0.039822, 0.0300969, 0.0192065, 0.0071508,
738 -0.00607024, -0.0204566, -0.0360083, -0.0527253 },
739 { -0.0302419, -0.0157536, -0.00234785, 0.00997537, 0.021216,
740 0.0313741, 0.0404497, 0.0484427, 0.0553532, 0.0611811,
741 0.0659264, 0.0695892, 0.0721695, 0.0736672, 0.0740823,
742 0.0734149, 0.0716649, 0.0688324, 0.0649174, 0.0599198,
743 0.0538396, 0.0466769, 0.0384316, 0.0291038, 0.0186934,
744 0.00720046, -0.00537502, -0.0190331, -0.0337736,
746 { -0.0340909, -0.0200147, -0.006937, 0.00514208, 0.0162226,
747 0.0263045, 0.0353878, 0.0434725, 0.0505587, 0.0566463,
748 0.0617353, 0.0658257, 0.0689175, 0.0710107, 0.0721054,
749 0.0722014, 0.0712989, 0.0693978, 0.0664981, 0.0625999,
750 0.057703, 0.0518076, 0.0449135, 0.0370209, 0.0281297,
751 0.01824, 0.0073516, -0.00453534, -0.0174209, -0.031305,
753 { -0.0369318, -0.0233688, -0.0107221, 0.00100806, 0.0118218,
754 0.0217192, 0.0307001, 0.0387647, 0.0459128, 0.0521444,
755 0.0574597, 0.0618585, 0.0653409, 0.0679069, 0.0695565,
756 0.0702896, 0.0701063, 0.0690066, 0.0669905, 0.0640579,
757 0.0602089, 0.0554435, 0.0497617, 0.0431635, 0.0356488,
758 0.0272177, 0.0178702, 0.0076063, -0.00357405, -0.0156708,
759 -0.028684, -0.0426136 },
760 { -0.038961, -0.025974, -0.0138249, -0.00251362, 0.00795978,
761 0.0175953, 0.026393, 0.0343527, 0.0414747, 0.0477587,
762 0.0532049, 0.0578132, 0.0615836, 0.0645161, 0.0666108,
763 0.0678676, 0.0682866, 0.0678676, 0.0666108, 0.0645161,
764 0.0615836, 0.0578132, 0.0532049, 0.0477587, 0.0414747,
765 0.0343527, 0.026393, 0.0175953, 0.00795978, -0.00251362,
766 -0.0138249, -0.025974, -0.038961 },
767 { -0.0426136, -0.028684, -0.0156708, -0.00357405, 0.0076063,
768 0.0178702, 0.0272177, 0.0356488, 0.0431635, 0.0497617,
769 0.0554435, 0.0602089, 0.0640579, 0.0669905, 0.0690066,
770 0.0701063, 0.0702896, 0.0695565, 0.0679069, 0.0653409,
771 0.0618585, 0.0574597, 0.0521444, 0.0459128, 0.0387647,
772 0.0307001, 0.0217192, 0.0118218, 0.00100806, -0.0107221,
773 -0.0233688, -0.0369318 },
774 { -0.0461877, -0.031305, -0.0174209, -0.00453534, 0.0073516,
775 0.01824, 0.0281297, 0.0370209, 0.0449135, 0.0518076,
776 0.057703, 0.0625999, 0.0664981, 0.0693978, 0.0712989,
777 0.0722014, 0.0721054, 0.0710107, 0.0689175, 0.0658257,
778 0.0617353, 0.0566463, 0.0505587, 0.0434725, 0.0353878,
779 0.0263045, 0.0162226, 0.00514208, -0.006937, -0.0200147,
781 { -0.0495968, -0.0337736, -0.0190331, -0.00537502, 0.00720046,
782 0.0186934, 0.0291038, 0.0384316, 0.0466769, 0.0538396,
783 0.0599198, 0.0649174, 0.0688324, 0.0716649, 0.0734149,
784 0.0740823, 0.0736672, 0.0721695, 0.0695892, 0.0659264,
785 0.0611811, 0.0553532, 0.0484427, 0.0404497, 0.0313741,
786 0.021216, 0.00997537, -0.00234785, -0.0157536, -0.0302419 },
787 { -0.0527253, -0.0360083, -0.0204566, -0.00607024, 0.0071508,
788 0.0192065, 0.0300969, 0.039822, 0.0483818, 0.0557763,
789 0.0620054, 0.0670692, 0.0709677, 0.0737009, 0.0752688,
790 0.0756714, 0.0749086, 0.0729806, 0.0698872, 0.0656285,
791 0.0602045, 0.0536151, 0.0458605, 0.0369405, 0.0268552,
792 0.0156046, 0.00318873, -0.0103925, -0.025139 },
793 { -0.0554187, -0.0379037, -0.0216307, -0.00659972, 0.00718917,
794 0.019736, 0.0310408, 0.0411035, 0.0499242, 0.0575028,
795 0.0638394, 0.0689339, 0.0727864, 0.0753968, 0.0767652,
796 0.0768915, 0.0757758, 0.073418, 0.0698181, 0.0649762,
797 0.0588923, 0.0515662, 0.0429982, 0.0331881, 0.0221359,
798 0.00984169, -0.00369458, -0.0184729 },
799 { -0.0574713, -0.0393247, -0.0224833, -0.00694708, 0.0072839,
800 0.0202097, 0.0318302, 0.0421456, 0.0511557, 0.0588607,
801 0.0652604, 0.0703549, 0.0741442, 0.0766284, 0.0778073,
802 0.0776809, 0.0762494, 0.0735127, 0.0694708, 0.0641236,
803 0.0574713, 0.0495137, 0.0402509, 0.029683, 0.0178098,
804 0.00463138, -0.00985222 },
805 { -0.0586081, -0.0400977, -0.0229304, -0.00710623, 0.00737485,
806 0.0205128, 0.0323077, 0.0427595, 0.0518681, 0.0596337,
807 0.0660562, 0.0711355, 0.0748718, 0.077265, 0.078315,
808 0.078022, 0.0763858, 0.0734066, 0.0690842, 0.0634188,
809 0.0564103, 0.0480586, 0.0383639, 0.027326, 0.0149451,
811 { -0.0584615, -0.04, -0.0228763, -0.0070903, 0.00735786,
812 0.0204682, 0.0322408, 0.0426756, 0.0517726, 0.0595318,
813 0.0659532, 0.0710368, 0.0747826, 0.0771906, 0.0782609,
814 0.0779933, 0.076388, 0.0734448, 0.0691639, 0.0635452,
815 0.0565886, 0.0482943, 0.0386622, 0.0276923, 0.0153846 },
816 { -0.0565385, -0.0387458, -0.022215, -0.00694588, 0.00706142,
817 0.0198069, 0.0312907, 0.0415126, 0.0504728, 0.0581712,
818 0.0646078, 0.0697826, 0.0736957, 0.0763469, 0.0777364,
819 0.0778641, 0.07673, 0.0743341, 0.0706765, 0.0657571,
820 0.0595759, 0.0521329, 0.0434281, 0.0334615 },
821 { -0.0521739, -0.0359684, -0.0208357, -0.00677583, 0.00621118,
822 0.0181254, 0.0289667, 0.0387352, 0.0474308, 0.0550536,
823 0.0616036, 0.0670807, 0.071485, 0.0748165, 0.0770751,
824 0.0782609, 0.0783738, 0.0774139, 0.0753811, 0.0722756,
825 0.0680971, 0.0628458, 0.0565217 },
826 { -0.0444664, -0.0311971, -0.0186335, -0.00677583, 0.00437606,
827 0.0148221, 0.0245624, 0.0335968, 0.0419255, 0.0495483,
828 0.0564653, 0.0626765, 0.0681818, 0.0729814, 0.0770751,
829 0.080463, 0.0831451, 0.0851214, 0.0863919, 0.0869565,
830 0.0868154, 0.0859684 },
831 { -0.0321852, -0.0238283, -0.0155309, -0.00729294, 0.000885613,
832 0.00900473, 0.0170644, 0.0250646, 0.0330054, 0.0408868,
833 0.0487087, 0.0564712, 0.0641743, 0.0718179, 0.0794021,
834 0.0869268, 0.0943921, 0.101798, 0.109144, 0.116431,
836 { -0.0136364, -0.0130895, -0.0115174, -0.00892003, -0.00529733,
837 -0.000649351, 0.00502392, 0.0117225, 0.0194463, 0.0281955,
838 0.0379699, 0.0487697, 0.0605947, 0.073445, 0.0873206,
839 0.102221, 0.118148, 0.135099, 0.153076, 0.172078 },
840 { 0.0135338, 0.00200501, -0.00672269, -0.0126493, -0.0157747,
841 -0.0160991, -0.0136223, -0.00834439, -0.000265369, 0.0106148,
842 0.024296, 0.0407784, 0.0600619, 0.0821465, 0.107032,
843 0.134719, 0.165207, 0.198496, 0.234586 },
844 { 0.0526316, 0.0227038, -0.00154799, -0.0201238, -0.0330237,
845 -0.0402477, -0.0417957, -0.0376677, -0.0278638, -0.0123839,
846 0.00877193, 0.0356037, 0.0681115, 0.106295, 0.150155,
847 0.19969, 0.254902, 0.315789 },
848 { 0.108359, 0.0505676, 0.00309598, -0.0340557, -0.0608875,
849 -0.0773994, -0.0835913, -0.0794634, -0.0650155, -0.0402477,
850 -0.00515996, 0.0402477, 0.0959752, 0.162023, 0.23839,
861 for (
size_t i = 0;
i < savitzky_golay_n_l_r;
i++) {
862 for (
size_t j = 0; j < savitzky_golay_n_l_r + 1 +
i; j++) {
863 filtered_baseline[
i] +=
864 savitzky_golay_coefficient[
i][j] * baseline[j];
870 for (
size_t i = savitzky_golay_n_l_r;
872 filtered_baseline[
i] =
873 savitzky_golay_coefficient
874 [savitzky_golay_n_l_r][savitzky_golay_n_l_r] * baseline[
i];
875 for (
size_t j = 0; j < savitzky_golay_n_l_r; j++) {
876 filtered_baseline[
i] +=
877 savitzky_golay_coefficient[savitzky_golay_n_l_r][j] *
878 (baseline[
i + j - savitzky_golay_n_l_r] +
879 baseline[
i - j + savitzky_golay_n_l_r]);
884 for (
size_t j = 0; j < 2 * savitzky_golay_n_l_r + 1; j++) {
886 savitzky_golay_coefficient[savitzky_golay_n_l_r][j] *
887 baseline[
i + j - savitzky_golay_n_l_r];
895 for (
size_t j = 0; j < nTotStripsPerAPV -
i + savitzky_golay_n_l_r; j++) {
896 filtered_baseline[
i] +=
897 savitzky_golay_coefficient
899 baseline[
i + j - savitzky_golay_n_l_r];
905 for (
size_t i = 0;
i < (nTotStripsPerAPV-1);
i++) {
906 filtered_baseline_derivative[
i] =
907 filtered_baseline[
i + 1] - filtered_baseline[
i];
913 double filtered_baseline_max = 0;
914 double filtered_baseline_derivative_sum_square = 0;
917 const double d = filtered_baseline[
i] - baseline[
i];
919 filtered_baseline_max =
921 static_cast<double>(fabs(d)));
923 for (
size_t i = 0;
i < (nTotStripsPerAPV-1);
i++) {
924 filtered_baseline_derivative_sum_square +=
925 filtered_baseline_derivative[
i] *
926 filtered_baseline_derivative[
i];
930 std::cerr << __FILE__ <<
':' << __LINE__ <<
": " 931 << filtered_baseline_max <<
' ' 932 << filtered_baseline_derivative_sum_square << std::endl;
947 iEvent.
getByLabel(
"siStripDigis",
"VirginRaw", input);
958 for (
const auto& rawDigis : input ) {
961 std::vector<float> meanCMDetSet; meanCMDetSet.reserve(nAPVs);
962 for ( uint16_t iAPV = 0; iAPV < nAPVs; ++iAPV ) {
966 if (ped < minPed) minPed = ped;
968 meanCMDetSet.push_back(minPed);
976 for (
const auto& rawDigis : input ) {
977 std::vector<float> meanCMNValue;
978 meanCMNValue.reserve(rawDigis.size());
990 singleAPVdigi.clear();
994 discontinuities.clear();
996 digimap_t::iterator itdiscontinuities;
1000 bool isMinimumAndNoMax =
false;
1001 bool isFirstStrip =
false;
1005 int actualStripADC = 0;
1006 int previousStripADC = 0;
1010 int maximum_value=0;
1011 const uint32_t n_high_maximum_cluster = 1025 + 1024;
1012 int high_maximum_cluster = n_high_maximum_cluster;
1013 int number_good_minimum = 0;
1014 int first_gradient = 0;
1015 int strip_first_gradient = 0;
1016 int adc_start_point_cluster_pw = 0;
1017 int auxiliary_end_cluster = 0;
1018 int first_start_cluster_strip = 0;
1019 int first_start_cluster_ADC = 0;
1020 bool isAuxiliary_Minimum =
false;
1021 bool isPossible_wrong_minimum =
false;
1028 actualStripADC = singleAPVdigi[
strip];
1031 isMinimumAndNoMax=
true;
1032 discontinuities.insert(discontinuities.end(), std::pair<int, int >(
strip, actualStripADC));
1034 discontinuities.insert(discontinuities.end(), std::pair<uint16_t, int16_t >(
strip, 0+1024));
1035 isMinimumAndNoMax=
true;
1036 first_start_cluster_strip=
strip;
1037 first_start_cluster_ADC=1024;
1041 previousStripADC = actualStripADC;
1042 actualStripADC = singleAPVdigi[
strip];
1043 greadient = actualStripADC - previousStripADC;
1049 isPossible_wrong_minimum=
true;
1050 itdiscontinuities = --discontinuities.end();
1051 if(discontinuities.size()>1){
1052 --itdiscontinuities;
1054 strip_first_gradient= itdiscontinuities->first;
1055 adc_start_point_cluster_pw= itdiscontinuities->second;
1056 first_gradient =
std::abs(adc_start_point_cluster_pw - singleAPVdigi[strip_first_gradient+1]);
1057 discontinuities.erase(++itdiscontinuities);
1058 discontinuities.erase(--discontinuities.end());
1061 if ((discontinuities.size()%2==1)&&(!discontinuities.empty())){
1062 discontinuities.erase(--discontinuities.end());
1065 discontinuities.insert(discontinuities.end(), std::pair<uint16_t, int16_t >(
strip-1, previousStripADC));
1066 isMinimumAndNoMax=
true;
1068 first_start_cluster_strip=strip -1;
1069 first_start_cluster_ADC=previousStripADC;
1071 }
else if ((!isMax)&&((actualStripADC-previousStripADC<0)&&(isMinimumAndNoMax))){
1073 isMinimumAndNoMax=
false;
1074 high_maximum_cluster = n_high_maximum_cluster;
1075 if ((previousStripADC > maximum_value)&&(discontinuities.size()%2==1)) maximum_value = previousStripADC;
1079 if (high_maximum_cluster>(
std::abs(singleAPVdigi[
strip+1]- actualStripADC))){
1080 high_maximum_cluster = singleAPVdigi[
strip+1]- actualStripADC;
1081 auxiliary_end_cluster =
strip+2;
1088 number_good_minimum = 0;
1089 for (uint16_t wintry=0; wintry <=
size_window_; wintry++){
1092 --number_good_minimum;
1096 isMinimumAndNoMax=
true;
1101 isAuxiliary_Minimum=
true;
1105 if (!discontinuities.empty()){
1106 itdiscontinuities = --discontinuities.end();
1109 if ((isMax)&&(actualStripADC<=first_start_cluster_ADC)) {
1111 if ((
std::abs(first_start_cluster_ADC - singleAPVdigi[
strip+2])>first_gradient)&&(isPossible_wrong_minimum)) {
1112 discontinuities.erase(itdiscontinuities);
1113 discontinuities.insert(discontinuities.end(), std::pair<int, int >(strip_first_gradient, adc_start_point_cluster_pw));
1114 discontinuities.insert(discontinuities.end(), std::pair<int, int >(
strip, adc_start_point_cluster_pw));
1116 if ((discontinuities.size()%2==0)&&(discontinuities.size()>1)){
1117 discontinuities.erase(--discontinuities.end());
1119 discontinuities.insert(discontinuities.end(), std::pair<int, int >(
strip, actualStripADC));
1122 adc_start_point_cluster_pw=0;
1123 isPossible_wrong_minimum=
false;
1124 strip_first_gradient=0;
1125 first_start_cluster_strip=0;
1126 first_start_cluster_ADC=0;
1129 if ((isMax)&&((actualStripADC-previousStripADC)>=0)&&(!isAuxiliary_Minimum)){
1130 if ((
std::abs(first_start_cluster_ADC - singleAPVdigi[
strip+1])>first_gradient)&&(isPossible_wrong_minimum)) {
1131 discontinuities.erase(itdiscontinuities);
1132 discontinuities.insert(discontinuities.end(), std::pair<int, int >(strip_first_gradient, adc_start_point_cluster_pw));
1135 if ((discontinuities.size()%2==0)&&(discontinuities.size()>1)){
1136 discontinuities.erase(--discontinuities.end());
1138 discontinuities.insert(discontinuities.end(), std::pair<int, int >(
strip-1, previousStripADC));
1140 adc_start_point_cluster_pw=0;
1141 isPossible_wrong_minimum=
false;
1142 strip_first_gradient=0;
1143 first_start_cluster_strip=0;
1144 first_start_cluster_ADC=0;
1151 if(!discontinuities.empty()){
1152 if ((first_start_cluster_strip)==(
nTotStripsPerAPV-1)-1) discontinuities.insert(discontinuities.end(), std::pair<int, int >((
nTotStripsPerAPV-1), first_start_cluster_ADC));
1153 if ((isMax)&&(isAuxiliary_Minimum)) discontinuities.insert(discontinuities.end(), std::pair<int, int >(auxiliary_end_cluster, first_start_cluster_ADC));
1157 itdiscontinuities=discontinuities.begin();
1158 ++itdiscontinuities;
1159 ++itdiscontinuities;
1160 int firstADC= itdiscontinuities->second;
1161 --itdiscontinuities;
1162 itdiscontinuities->second=firstADC;
1163 --itdiscontinuities;
1164 itdiscontinuities->second=firstADC;
1167 if(!discontinuities.empty()){
1168 itdiscontinuities=discontinuities.begin();
1169 uint16_t firstStrip = itdiscontinuities->first;
1170 int16_t firstADC = itdiscontinuities->second;
1171 ++itdiscontinuities;
1172 uint16_t lastStrip = itdiscontinuities->first;
1173 int16_t secondADC = itdiscontinuities->second;
1174 ++itdiscontinuities;
1177 if (
strip > lastStrip&&itdiscontinuities!=discontinuities.end()){
1178 firstStrip = itdiscontinuities->first;
1179 firstADC = itdiscontinuities->second;
1180 ++itdiscontinuities;
1181 lastStrip = itdiscontinuities->first;
1182 secondADC = itdiscontinuities->second;
1183 ++itdiscontinuities;
1187 digis[(apvN-firstAPV)*nTotStripsPerAPV+
strip]= singleAPVdigi[
strip]- firstADC - (((secondADC-firstADC)/(lastStrip-firstStrip))*(
strip-firstStrip));
1188 edm::LogWarning(
"NoBaseline") <<
"No baseline " << digis[(apvN-firstAPV)*nTotStripsPerAPV+
strip] <<
"\n";
1190 digis[(apvN-firstAPV)*nTotStripsPerAPV+
strip]=0;
int adc(sample_type sample)
get the ADC sample (12 bits)
bool IsApvBad(const uint32_t &detid, const short &apvNb) const
bool checkBaseline(const std::vector< int16_t > &baseline) const
uint32_t nSaturatedStrip_
void init(const edm::EventSetup &es)
uint32_t cleaningSequence_
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)
A signed Digi for the silicon strip detector, containing only adc information, and suitable for stori...
bool IsStripBad(const uint32_t &detid, const short &strip) const
uint32_t pedestal_cache_id
std::map< uint16_t, digimap_t > smoothedMaps_
uint16_t baselineFollowerInspect(uint16_t firstAPV, const digivector_t &digis)
double filteredBaselineDerivativeSumSquare_
uint32_t nSigmaNoiseDerTh_
uint32_t quality_cache_id
edm::ESHandle< SiStripPedestals > pedestalHandle
void flatRestore(uint16_t apvN, uint16_t firstAPV, digivector_t &digis)
static std::string const input
void baselineFollower(const digimap_t &, digivector_t &baseline, float median)
float getPed(const uint16_t &strip, const Range &range) const
void loadMeanCMMap(const edm::Event &)
U second(std::pair< T, U > const &p)
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)
edm::ESHandle< SiStripQuality > qualityHandle
std::vector< std::pair< short, float >> medians_t
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)
static uint16_t nTotStripsPerAPV
bool flatRegionsFinder(const digivector_t &adcs, digimap_t &smoothedpoints, uint16_t apvN)
void cleaner_MonotonyChecker(digimap_t &smoothedpoints)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
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)
uint32_t consecThreshold_
uint16_t hybridFormatInspect(uint16_t firstAPV, const digivector_t &digis)
std::vector< bool > apvFlagsBoolOverride_
std::map< uint16_t, digi_t > digimap_t
edm::ESHandle< SiStripNoises > noiseHandle
const float & adc() const
uint16_t nullInspect(uint16_t firstAPV, const digivector_t &digis)
std::vector< bool > badAPVs_
std::vector< bool > apvFlagsBool_
const Range getRange(const uint32_t detID) const
uint16_t abnormalBaselineInspect(uint16_t firstAPV, const digivector_t &digis)
const Range getRange(const uint32_t detID) const
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)
const Range getRange(const uint32_t &detID) const
uint32_t hitStripThreshold_
std::pair< ContainerIterator, ContainerIterator > Range
void createCMMapRealPed(const edm::DetSetVector< SiStripRawDigi > &input)
SiStripAPVRestorer(const edm::ParameterSet &conf)
uint16_t inspect(uint32_t detId, uint16_t firstAPV, const digivector_t &digis, const medians_t &vmedians)