57 const Int_t timeBin,
const Float_t signal)
59 if ((timeBin < mFirstTimeBin) || (timeBin > mLastTimeBin)) {
76 pedestal = mPedestal->getValue(cru.
roc(), sectorRow, pad);
79 noise = mNoise->getValue(cru.
roc(), sectorRow, pad);
83 const Float_t signalCorr = signal - pedestal;
85 if ((signalCorr < mADCMin) || (signalCorr > mADCMax)) {
89 if ((mNoiseThreshold > 0) && (signalCorr < noise * mNoiseThreshold)) {
94 if (mPadMask.size() && std::find(mPadMask.begin(), mPadMask.end(), std::array<int, 3>({int(cru.roc()), sectorRow, pad})) != mPadMask.end()) {
100 addDigit(cru, signalCorr, globalRow, pad, timeBin);
103 ++mTimeBinOccupancy[timeBin - mFirstTimeBin];
191 if ((
a.getTimeStamp() ==
b.getTimeStamp()) && (
a.getRow() ==
b.getRow()) && (
a.getPad() ==
b.getPad())) {
192 LOGP(
debug,
"digit found twice at sector {:2}, cru {:3}, row {:3}, pad {:3}, time {:6}, ADC {:.2} (other: {:.2})",
b.getCRU() / 10,
b.getCRU(),
b.getRow(),
b.getPad(),
b.getTimeStamp(),
b.getChargeFloat(),
a.getChargeFloat());
199 auto&
digits = mDigits[iSec];
204 size_t nDuplicates = 0;
206 const auto last = std::unique(
digits.begin(),
digits.end(), isEqual);
207 nDuplicates = std::distance(last,
digits.end());
211 const auto last =
digits.end();
212 while (++
first != last) {
217 static std::array<size_t, Sector::MAXSECTOR> nWarning{};
218 static std::array<size_t, Sector::MAXSECTOR> suppression{};
219 if (nWarning[iSec] < 5 || nWarning[iSec] == suppression[iSec]) {
220 LOGP(alarm,
"{} {} duplicate digits in sector {}, warned {} times in this sector",
removeDuplicates ?
"removed" :
"found", nDuplicates, iSec, nWarning[iSec]);
221 if (nWarning[iSec] == 4) {
222 suppression[iSec] = 10;
224 suppression[iSec] *= 10;
234 if (!mInitialized || !mTimeBinOccupancy.size()) {
235 LOGP(info,
"Cannot calculate CE position, mInitialized = {}, mTimeBinOccupancy.size() = {}", mInitialized, mTimeBinOccupancy.size());
239 const auto sectorsWithDigits = std::count_if(mDigits.begin(), mDigits.end(), [](
const auto&
v) { return v.size(); });
240 const auto maxElem = std::max_element(mTimeBinOccupancy.begin(), mTimeBinOccupancy.end());
241 const auto maxVal = *maxElem;
243 if (!sectorsWithDigits || maxVal < 10) {
244 LOGP(info,
"No sectors with digits: {} or too few pads with max number of digits: {} < 10, CE detection stopped", sectorsWithDigits, maxVal);
250 if (maxVal < threshold) {
251 LOGP(warning,
"No CE signal found. Number of fired pads is too small {} < {} (with {} sectors having digits)", maxVal, threshold, sectorsWithDigits);
256 const auto posMaxElem = std::distance(mTimeBinOccupancy.begin(), maxElem);
257 const auto cePos = posMaxElem + mFirstTimeBin;
259 if (cePos < posMaxElem) {
260 LOGP(warning,
"Number of time bins to be removed {} is bigger than the CE peak position {}", removeNtimeBinsBefore, posMaxElem);
264 const auto firstTimeBin = cePos - removeNtimeBinsBefore;
265 const auto lastTimeBin = cePos + removeNtimeBinsAfter;
266 LOGP(info,
"CE position found at time bin {}, removing the range {} - {}", cePos, firstTimeBin, lastTimeBin);
269 auto&
digits = mDigits[iSec];
275 const auto itFirstTB = std::lower_bound(
digits.begin(),
digits.end(),
277 [](
const auto& digit,
const auto val) {
278 return digit.getTimeStamp() < val;
282 if (itFirstTB ==
digits.end()) {
286 const auto itLastTB = std::upper_bound(
digits.begin(),
digits.end(),
288 [](
const auto val,
const auto& digit) {
289 return val < digit.getTimeStamp();
295 auto& cpDigits = (*removedDigits)[iSec];
297 std::copy(itFirstTB, itLastTB, std::back_inserter(cpDigits));
301 digits.erase(itFirstTB, itLastTB);
void removeCEdigits(uint32_t removeNtimeBinsBefore=10, uint32_t removeNtimeBinsAfter=100, std::array< std::vector< Digit >, Sector::MAXSECTOR > *removedDigits=nullptr)
remove digits close to the CE