46template <
class Mapping>
48 : mDoClusters(inp.doClusters), mDoPatterns(inp.doPatterns), mDoDigits(inp.doDigits), mDoCalibData(inp.doCalib), mDoStaggering(inp.doStaggering), mAllowReporting(inp.allowReporting), mVerifyDecoder(inp.verifyDecoder), mInputSpec(inp.inputSpec), mGGCCDBRequest(gr)
54 mLayers = Mapping::NLayers;
55 mEstNDig.resize(mLayers, 0);
56 mEstNClus.resize(mLayers, 0);
57 mEstNClusPatt.resize(mLayers, 0);
58 mEstNCalib.resize(mLayers, 0);
63template <
class Mapping>
77 for (
int iLayer{0}; iLayer < mLayers; ++iLayer) {
79 dec->setUserDataOrigin(dataOrig);
80 dec->setUserDataDescription(dataDesc);
84 std::vector<o2::framework::InputSpec>
filter;
85 for (
const auto feeID : map.getLayer2FEEIDs(iLayer)) {
88 dec->setInputFilter(
filter);
93 }
catch (
const std::exception& e) {
94 LOG(error) <<
"exception was thrown in decoder creation: " << e.what();
97 LOG(error) <<
"non-std::exception was thrown in decoder creation";
100 mApplyNoiseMap = !ic.
options().
get<
bool>(
"ignore-noise-map");
101 mUseClusterDictionary = !ic.
options().
get<
bool>(
"ignore-cluster-dictionary");
103 float fr = ic.
options().
get<
float>(
"rof-length-error-freq");
104 mROFErrRepIntervalMS = fr <= 0. ? -1 :
long(fr * 1e3);
105 mNThreads = std::max(1, ic.
options().
get<
int>(
"nthreads"));
106 mUnmutExtraLanes = ic.
options().
get<
bool>(
"unmute-extra-lanes");
107 mVerbosity = ic.
options().
get<
int>(
"decoder-verbosity");
108 auto dmpSz = ic.
options().
get<
int>(
"stop-raw-data-dumps-after-size");
110 mMaxRawDumpsSize = size_t(dmpSz) * 1024 * 1024;
112 mDumpOnError = ic.
options().
get<
int>(
"raw-data-dumps");
113 if (mDumpOnError < 0) {
114 mDumpOnError = -mDumpOnError;
115 mDumpFrom1stPipeline =
true;
118 throw std::runtime_error(fmt::format(
"unknown raw data dump level {} requested", mDumpOnError));
120 auto dumpDir = ic.
options().
get<std::string>(
"raw-data-dumps-directory");
122 throw std::runtime_error(fmt::format(
"directory {} for raw data dumps does not exist", dumpDir));
124 for (
int iLayer{0}; iLayer < mLayers; ++iLayer) {
125 mDecoder[iLayer]->setNThreads(mNThreads);
126 mDecoder[iLayer]->setAlwaysParseTrigger(ic.
options().
get<
bool>(
"always-parse-trigger"));
127 mDecoder[iLayer]->setAllowEmptyROFs(ic.
options().
get<
bool>(
"allow-empty-rofs"));
128 mDecoder[iLayer]->setRawDumpDirectory(dumpDir);
129 mDecoder[iLayer]->setFillCalibData(mDoCalibData);
130 mDecoder[iLayer]->setVerifyDecoder(mVerifyDecoder);
131 bool ignoreRampUp = !ic.
options().
get<
bool>(
"accept-rof-rampup-data");
132 mDecoder[iLayer]->setSkipRampUpData(ignoreRampUp);
134 }
catch (
const std::exception& e) {
135 LOG(error) <<
"exception was thrown in decoder configuration: " << e.what();
138 LOG(error) <<
"non-std::exception was thrown in decoder configuration";
143 bool enforceEnsureContinuousROFinCalib = ic.
options().
get<
bool>(
"enforce-continuous-rof-with-calib");
144 if (ic.
options().
get<
bool>(
"enforce-continuous-rof-with-calib")) {
145 warnMsg =
"Calibration data requested but the ensureContinuousROF is explicitly enforced!";
147 mRunEnsureContinuousROF =
false;
148 warnMsg =
"Calibration data requested, disabling ensureContinuousROF!";
151 LOGP(alarm,
"{}", warnMsg);
153 LOGP(info,
"{}", warnMsg);
157 mDisableRectifyContinuousROF = ic.
options().
get<
bool>(
"disable-rectify-continuous-rof");
158 if (mDisableRectifyContinuousROF && mRunEnsureContinuousROF) {
159 std::string warnMsg =
"Rectification of clusters/digits is explicitly disabled after the ensureContinuousROF!";
161 LOGP(alarm,
"{}", warnMsg);
163 LOGP(info,
"{}", warnMsg);
168 mClusterer = std::make_unique<Clusterer>();
169 mClusterer->setNChips(Mapping::getNChips());
174template <
class Mapping>
177 updateTimeDependentParams(pc);
178 static bool firstCall =
true;
184 for (
int iLayer{0}; iLayer < mLayers; ++iLayer) {
187 mDecoder[iLayer]->setVerbosity(mDecoder[iLayer]->getInstanceID() == 0 ? mVerbosity : (mUnmutExtraLanes ? mVerbosity : -1));
189 mAllowReporting &= (mDecoder[0]->getInstanceID() == 0) || mUnmutExtraLanes;
193 double timeCPU0 = mTimer.CpuTime(), timeReal0 = mTimer.RealTime();
195 auto orig = Mapping::getOrigin();
198 auto& chipStatus = pc.
outputs().
make<std::vector<char>>(
Output{orig,
"CHIPSSTATUS", 0}, (size_t)Mapping::getNChips());
199 auto& linkErrors = pc.
outputs().
make<std::vector<GBTLinkDecodingStat>>(
Output{orig,
"LinkErrors", 0});
200 auto& decErrors = pc.
outputs().
make<std::vector<ChipError>>(
Output{orig,
"ChipErrors", 0});
201 auto& errMessages = pc.
outputs().
make<std::vector<ErrorMessage>>(
Output{orig,
"ErrorInfo", 0});
202 auto& physTriggers = pc.
outputs().
make<std::vector<PhysTrigger>>(
Output{orig,
"PHYSTRIG", 0});
204 for (uint32_t iLayer{0}; iLayer < mLayers; ++iLayer) {
205 const auto& par = AlpideParam::Instance();
208 int nLayer = mDoStaggering ? iLayer : -1;
209 std::vector<o2::itsmft::CompClusterExt> clusCompVec;
210 std::vector<o2::itsmft::ROFRecord> clusROFVec;
211 std::vector<unsigned char> clusPattVec;
212 std::vector<Digit> digVec;
213 std::vector<GBTCalibData> calVec;
214 std::vector<ROFRecord> digROFVec;
216 digVec.reserve(mEstNDig[iLayer]);
217 digROFVec.reserve(nROFsTF);
220 clusCompVec.reserve(mEstNClus[iLayer]);
221 clusROFVec.reserve(nROFsTF);
222 clusPattVec.reserve(mEstNClusPatt[iLayer]);
225 calVec.reserve(mEstNCalib[iLayer]);
229 mDecoder[iLayer]->startNewTF(pc.
inputs());
230 mDecoder[iLayer]->setDecodeNextAuto(
false);
233 int nTriggersProcessed = mDecoder[iLayer]->getNROFsProcessed();
234 static long lastErrReportTS = 0;
235 while (mDecoder[iLayer]->decodeNextTrigger() >= 0) {
236 if ((!lastIR.isDummy() && lastIR >= mDecoder[iLayer]->getInteractionRecord()) || mFirstIR > mDecoder[iLayer]->getInteractionRecord()) {
237 const int MaxErrLog = 2;
238 static int errLocCount = 0;
239 if (errLocCount++ < MaxErrLog) {
240 LOGP(warn,
"Impossible ROF IR {}{}, previous was {}, TF 1st IR was {}, discarding in decoding", mDecoder[iLayer]->getInteractionRecord().
asString(), ((mDoStaggering) ? std::format(
" on layer {}", iLayer) :
""), lastIR.asString(), mFirstIR.asString());
242 nTriggersProcessed = 0x7fffffff;
245 lastIR = mDecoder[iLayer]->getInteractionRecord();
246 mDecoder[iLayer]->fillChipsStatus(chipStatus);
247 if (mDoDigits || mClusterer->getMaxROFDepthToSquash(nLayer)) {
248 mDecoder[iLayer]->fillDecodedDigits(digVec, digROFVec);
250 mDecoder[iLayer]->fillCalibData(calVec);
253 if (mDoClusters && !mClusterer->getMaxROFDepthToSquash(nLayer)) {
254 mClusterer->process(mNThreads, *mDecoder[iLayer].
get(), &clusCompVec, mDoPatterns ? &clusPattVec :
nullptr, &clusROFVec);
257 nTriggersProcessed = mDecoder[iLayer]->getNROFsProcessed() - nTriggersProcessed - 1;
259 if ((nROFsTF != nTriggersProcessed) && mROFErrRepIntervalMS > 0 && mTFCounter > 1 && nTriggersProcessed > 0) {
260 long currTS = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
261 if (currTS - lastErrReportTS > mROFErrRepIntervalMS) {
262 LOGP(critical,
"Inconsistent number of ROF per TF {}{} from parameters. Received {} from readout (muting further reporting for {} ms)", nROFsTF, ((mDoStaggering) ? std::format(
" on layer {}", iLayer) :
""), nTriggersProcessed, mROFErrRepIntervalMS);
263 lastErrReportTS = currTS;
266 if (mDoClusters && mClusterer->getMaxROFDepthToSquash(nLayer)) {
276 mClusterer->setMaxROFDepthToSquash(mClusterer->getMaxROFDepthToSquash(nLayer));
277 mClusterer->process(mNThreads, reader, &clusCompVec, mDoPatterns ? &clusPattVec :
nullptr, &clusROFVec);
279 }
catch (
const std::exception& e) {
280 static size_t nErr = 0;
282 if (++nErr < maxWarn) {
283 LOGP(alarm,
"EXCEPTION {} in raw decoder{}, abandoning TF decoding {}", e.what(), ((mDoStaggering) ? std::format(
" on layer {}", iLayer) :
""), nErr == maxWarn ?
"(will mute further warnings)" :
"");
287 std::vector<o2::itsmft::ROFRecord> expDigRofVec;
288 if (ensureContinuousROF(digROFVec, expDigRofVec, iLayer, nROFsTF,
"digits") && !mDisableRectifyContinuousROF) {
289 auto oldNDig = digVec.size();
290 rectifyDigits(expDigRofVec, digVec);
291 LOGP(warn,
"Rectified {} digits out of original {} on layer {} following ensureContinuousROF", digVec.size(), oldNDig, iLayer);
295 mEstNDig[iLayer] = std::max(mEstNDig[iLayer],
size_t(digVec.size() * 1.2));
298 mEstNCalib[iLayer] = std::max(mEstNCalib[iLayer],
size_t(calVec.size() * 1.2));
300 LOG(
debug) << mSelfName <<
" Decoded " << digVec.size() <<
" Digits in " << expDigRofVec.size() <<
" ROFs" << ((mDoStaggering) ? std::format(
" on layer {}", iLayer) :
"");
304 std::vector<o2::itsmft::ROFRecord> expClusRofVec;
305 if (ensureContinuousROF(clusROFVec, expClusRofVec, iLayer, nROFsTF,
"clusters") && !mDisableRectifyContinuousROF) {
306 auto oldNClus = clusCompVec.size(), oldNPatt = clusPattVec.size();
307 rectifyClusters(expClusRofVec, clusCompVec, clusPattVec);
308 LOGP(warn,
"Rectified {} clusters and {} patterns out of original {} and {} on layer {} following ensureContinuousROF", clusCompVec.size(), clusPattVec.size(), oldNClus, oldNPatt, iLayer);
313 mEstNClus[iLayer] = std::max(mEstNClus[iLayer],
size_t(clusCompVec.size() * 1.2));
314 mEstNClusPatt[iLayer] = std::max(mEstNClusPatt[iLayer],
size_t(clusPattVec.size() * 1.2));
315 LOG(info) << mSelfName <<
" Built " << clusCompVec.size() <<
" clusters in " << expClusRofVec.size() <<
" ROFs" << ((mDoStaggering) ? std::format(
" on layer {}", iLayer) :
"");
318 mDecoder[iLayer]->collectDecodingErrors(linkErrors, decErrors, errMessages);
319 physTriggers.insert(physTriggers.end(), mDecoder[iLayer]->getExternalTriggers().begin(), mDecoder[iLayer]->getExternalTriggers().end());
324 if (mRawDumpedSize > mMaxRawDumpsSize && mMaxRawDumpsSize > 0) {
325 LOGP(info,
"Max total dumped size {} MB exceeded allowed limit, disabling further dumping", mRawDumpedSize / (1024 * 1024));
333 LOG(
debug) << mSelfName <<
" Total time for TF " << tfID <<
'(' << mTFCounter <<
") : CPU: " << mTimer.CpuTime() - timeCPU0 <<
" Real: " << mTimer.RealTime() - timeReal0;
338template <
class Mapping>
344 mFinalizeDone =
true;
345 LOGF(info,
"%s statistics:", mSelfName);
346 LOGF(info,
"%s Total STF decoding%s timing (w/o disk IO): Cpu: %.3e Real: %.3e s in %d slots", mSelfName,
347 mDoClusters ?
"/clustering" :
"", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
348 for (
int iLayer{0}; iLayer < mLayers && mAllowReporting; ++iLayer) {
349 if (mDecoder[iLayer]) {
350 LOG_IF(info, mDoStaggering) <<
"Report for decoder of layer " << iLayer;
351 mDecoder[iLayer]->printReport();
360template <
class Mapping>
368 const auto& alpParams = DPLAlpideParam<Mapping::getDetID()>::Instance();
375 const auto& clParams = ClustererParam<Mapping::getDetID()>::Instance();
377 LOGP(fatal,
"maxBCDiffToMaskBias = {} and maxBCDiffToMaskBias = {} cannot be set at the same time. Either set masking or squashing with a BCDiff > 0", clParams.
maxBCDiffToMaskBias, clParams.
maxBCDiffToSquashBias);
382 mClusterer->setMaxBCSeparationToMask(nbc);
387 int nROFsToSquash = 0;
388 if (clParams.
maxSOTMUS > 0 && rofBC > 0) {
393 for (
int iLayer{0}; iLayer < mLayers; ++iLayer) {
398 mClusterer->print(
false);
406template <
class Mapping>
413 LOG(info) << Mapping::getName() <<
" noise map updated" << (!mApplyNoiseMap ?
" but masking is disabled" :
"");
414 if (mApplyNoiseMap) {
420 LOG(info) << Mapping::getName() <<
" cluster dictionary updated" << (!mUseClusterDictionary ?
" but its using is disabled" :
"");
421 if (mUseClusterDictionary) {
428 LOG(info) <<
"Alpide param updated";
434template <
class Mapping>
438 mFinalizeDone =
false;
441 for (
int iLayer{0}; iLayer < mLayers; ++iLayer) {
442 if (mDecoder[iLayer]) {
443 mDecoder[iLayer]->reset();
452template <
class Mapping>
453bool STFDecoder<Mapping>::ensureContinuousROF(
const std::vector<ROFRecord>& rofVec, std::vector<ROFRecord>& expROFVec,
int lr,
int nROFsTF,
const char*
name)
455 if (!mRunEnsureContinuousROF) {
459 const auto&
par = AlpideParam::Instance();
463 expROFVec.resize(nROFsTF);
464 for (
int iROF{0}; iROF < nROFsTF; ++iROF) {
465 auto& rof = expROFVec[iROF];
470 rof.setROFrame(iROF);
472 rof.setFirstEntry(-1);
474 uint32_t prevEntry{0};
475 for (
const auto& rof : rofVec) {
476 const auto&
ir = rof.getBCData();
478 LOGP(warn,
"Discard ROF {} preceding TF 1st orbit {}{}",
ir.
asString(), mFirstTFOrbit, ((mDoStaggering) ? std::format(
" on layer {}", lr) :
""));
481 auto irToFirst =
ir - mFirstIR;
482 if (irToFirst.toLong() -
par.getROFDelayInBC(lr) < 0) {
483 LOGP(warn,
"Discard ROF {} preceding TF 1st orbit {} due to imposed ROF delay{}",
ir.
asString(), mFirstTFOrbit, ((mDoStaggering) ? std::format(
" on layer {}", lr) :
""));
486 irToFirst -=
par.getROFDelayInBC(lr);
487 const long irROF = irToFirst.toLong() /
par.getROFLengthInBC(lr);
488 if (irROF >= nROFsTF) {
489 LOGP(warn,
"Discard ROF {} exceeding TF orbit range{}",
ir.
asString(), ((mDoStaggering) ? std::format(
" on layer {}", lr) :
""));
492 auto& expROF = expROFVec[irROF];
493 if (expROF.getNEntries() == 0) {
494 expROF.setFirstEntry(rof.getFirstEntry());
495 expROF.setNEntries(rof.getNEntries());
497 if (expROF.getNEntries() < rof.getNEntries()) {
498 LOGP(warn,
"Repeating {} with {} {}, prefer to already processed instance with {} {}{}", rof.asString(), rof.getNEntries(),
name, expROF.getNEntries(),
name, ((mDoStaggering) ? std::format(
" on layer {}", lr) :
""));
499 expROF.setFirstEntry(rof.getFirstEntry());
500 expROF.setNEntries(rof.getNEntries());
502 LOGP(warn,
"Repeating {} with {} {}, discard preferring already processed instance with {} {}{}", rof.asString(), rof.getNEntries(),
name, expROF.getNEntries(),
name, ((mDoStaggering) ? std::format(
" on layer {}", lr) :
""));
507 bool reReference =
false;
508 for (
auto& rof : expROFVec) {
509 if (rof.getFirstEntry() < 0) {
510 rof.setFirstEntry(prevLast);
511 }
else if (rof.getFirstEntry() != prevLast) {
514 prevLast = rof.getFirstEntry() + rof.getNEntries();
520template <
class Mapping>
521void STFDecoder<Mapping>::rectifyDigits(std::vector<ROFRecord>& rofVec, std::vector<Digit>& digVec)
524 std::vector<Digit> digVecTmp;
525 digVecTmp.reserve(digVec.size());
526 auto beg0 = digVec.begin();
527 for (
auto& rof : rofVec) {
528 int firstEntry = digVecTmp.size();
529 if (rof.getNEntries()) {
530 auto beg = beg0 + rof.getFirstEntry(),
end = beg + rof.getNEntries();
531 std::copy(beg,
end, std::back_inserter(digVecTmp));
533 rof.setFirstEntry(firstEntry);
535 digVec.swap(digVecTmp);
539template <
class Mapping>
540void STFDecoder<Mapping>::rectifyClusters(std::vector<ROFRecord>& rofVec, std::vector<CompClusterExt>& clusVec, std::vector<unsigned char>&
pattVec)
543 std::vector<CompClusterExt> clusVecTmp;
544 clusVecTmp.reserve(clusVec.size());
545 std::vector<unsigned char> pattVecTmp;
546 pattVecTmp.reserve(
pattVec.size());
547 const auto& dict = mClusterer->getDictionary();
548 auto begCl0 = clusVec.begin(), begClForPatt = begCl0;
551 auto skipToLastPattern = [&begClForPatt, &pattIt, &dict](
const decltype(begCl0) tgt) {
552 while (begClForPatt < tgt) {
553 const auto& clp = *begClForPatt;
554 auto pattID = clp.getPatternID();
562 for (
auto& rof : rofVec) {
563 int firstEntry = clusVecTmp.size();
564 if (rof.getNEntries()) {
565 auto begClROF = begCl0 + rof.getFirstEntry(), endClROF = begClROF + rof.getNEntries();
567 if (begClForPatt > begClROF) {
568 begClForPatt = begCl0;
570 skipToLastPattern(begClROF);
571 auto begPattToCopy = pattIt;
572 skipToLastPattern(endClROF);
573 std::copy(begPattToCopy, pattIt, std::back_inserter(pattVecTmp));
575 std::copy(begClROF, endClROF, std::back_inserter(clusVecTmp));
578 rof.setFirstEntry(firstEntry);
580 clusVec.swap(clusVecTmp);
587 std::vector<OutputSpec> outputs;
589 uint32_t nLayers = 1;
595 for (uint32_t iLayer = 0; iLayer < nLayers; ++iLayer) {
597 outputs.emplace_back(inp.
origin,
"DIGITS", iLayer, Lifetime::Timeframe);
598 outputs.emplace_back(inp.
origin,
"DIGITSROF", iLayer, Lifetime::Timeframe);
601 outputs.emplace_back(inp.
origin,
"COMPCLUSTERS", iLayer, Lifetime::Timeframe);
602 outputs.emplace_back(inp.
origin,
"CLUSTERSROF", iLayer, Lifetime::Timeframe);
606 outputs.emplace_back(inp.
origin,
"PATTERNS", iLayer, Lifetime::Timeframe);
610 outputs.emplace_back(inp.
origin,
"GBTCALIB", 0, Lifetime::Timeframe);
612 outputs.emplace_back(inp.
origin,
"PHYSTRIG", 0, Lifetime::Timeframe);
613 outputs.emplace_back(inp.
origin,
"LinkErrors", 0, Lifetime::Timeframe);
614 outputs.emplace_back(inp.
origin,
"ChipErrors", 0, Lifetime::Timeframe);
615 outputs.emplace_back(inp.
origin,
"ErrorInfo", 0, Lifetime::Timeframe);
616 outputs.emplace_back(inp.
origin,
"CHIPSSTATUS", 0, Lifetime::Timeframe);
620 inputs.emplace_back(
"stfDist",
"FLP",
"DISTSUBTIMEFRAME", 0, o2::framework::Lifetime::Timeframe);
622 inputs.emplace_back(
"noise", inp.
origin,
"NOISEMAP", 0, Lifetime::Condition,
624 inputs.emplace_back(
"alppar", inp.
origin,
"ALPIDEPARAM", 0, Lifetime::Condition,
ccdbParamSpec(fmt::format(
"{}/Config/AlpideParam", inp.
origin.
as<std::string>())));
626 inputs.emplace_back(
"cldict", inp.
origin,
"CLUSDICT", 0, Lifetime::Condition,
ccdbParamSpec(fmt::format(
"{}/Calib/ClusterDictionary", inp.
origin.
as<std::string>())));
627 inputs.emplace_back(
"cluspar", inp.
origin,
"CLUSPARAM", 0, Lifetime::Condition,
ccdbParamSpec(fmt::format(
"{}/Config/ClustererParam", inp.
origin.
as<std::string>())));
630 auto ggRequest = std::make_shared<o2::base::GRPGeomRequest>(
false,
645 {
"nthreads", VariantType::Int, 1, {
"Number of decoding/clustering threads"}},
646 {
"decoder-verbosity", VariantType::Int, 0, {
"Verbosity level (-1: silent, 0: errors, 1: headers, 2: data, 3: raw data dump) of 1st lane"}},
647 {
"always-parse-trigger", VariantType::Bool,
false, {
"parse trigger word even if flags continuation of old trigger"}},
648 {
"raw-data-dumps", VariantType::Int,
int(
GBTLink::RawDataDumps::DUMP_NONE), {
"Raw data dumps on error (0: none, 1: HBF for link, 2: whole TF for all links. If negative, dump only on from 1st pipeline."}},
649 {
"raw-data-dumps-directory", VariantType::String,
"", {
"Destination directory for the raw data dumps"}},
650 {
"stop-raw-data-dumps-after-size", VariantType::Int, 1024, {
"Stop dumping once this size in MB is accumulated. 0: no limit"}},
651 {
"unmute-extra-lanes", VariantType::Bool,
false, {
"allow extra lanes to be as verbose as 1st one"}},
652 {
"allow-empty-rofs", VariantType::Bool,
false, {
"record ROFs w/o any hit"}},
653 {
"ignore-noise-map", VariantType::Bool,
false, {
"do not mask pixels flagged in the noise map"}},
654 {
"enforce-continuous-rof-with-calib", VariantType::Bool,
false, {
"enforce ensureContinuousROF call even when calibration data is requested (not recommended)"}},
655 {
"disable-rectify-continuous-rof", VariantType::Bool,
false, {
"do not rectify clusters and digits after ensureContinuousROF (not recommended)"}},
656 {
"accept-rof-rampup-data", VariantType::Bool,
false, {
"do not discard data during ROF ramp up"}},
657 {
"rof-length-error-freq", VariantType::Float, 60.f, {
"do not report ROF length error more frequently than this value, disable if negative"}},
658 {
"ignore-cluster-dictionary", VariantType::Bool,
false, {
"do not use cluster dictionary, always store explicit patterns"}}}};
Definition of the ITS/MFT clusterer settings.
Definition of the ITSMFT compact cluster.
std::string asString(TDataMember const &dm, char *pointer)
Definition of the Alpide pixel reader for MC digits processing.
Declarations of helper classes for the ITS/MFT raw data decoding.
Header of the AggregatedRunInfo struct.
Helper for geometry and GRP related CCDB requests.
Definition of the ITS cluster finder.
Definition of the Alpide pixel reader for raw data processing.
Device to decode ITS/MFT raw data from STF.
Checks validity of hardware address (HW) and transform it to digit AbsId index.
void checkUpdates(o2::framework::ProcessingContext &pc)
static int getNHBFPerTF()
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
void printKeyValues(bool showProv=true, bool useLogger=false, bool withPadding=true, bool showHash=true) const final
static const VerbosityConfig & Instance()
T get(const char *key) const
void snapshot(const Output &spec, T const &object)
decltype(auto) make(const Output &spec, Args... args)
ServiceRegistryRef services()
ConfigParamRegistry const & options()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
static void setNoisyPixels(const NoiseMap *noise)
static void skipPattern(iterator &pattIt)
static constexpr unsigned short InvalidPatternID
void setDigits(const gsl::span< const o2::itsmft::Digit > a)
void setSquashingDist(const int16_t v)
void setMaxBCSeparationToSquash(int n)
void setROFRecords(const gsl::span< const o2::itsmft::ROFRecord > a)
void setSquashingDepth(const int16_t v)
NoiseMap class for the ITS and MFT.
void run(ProcessingContext &pc) final
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj) final
void init(InitContext &ic) final
GLuint const GLchar * name
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLfloat GLfloat GLfloat v2
constexpr o2::header::DataOrigin gDataOriginMFT
constexpr o2::header::DataOrigin gDataOriginITS
constexpr double LHCBunchSpacingMUS
constexpr int LHCMaxBunches
constexpr double LHCBunchSpacingNS
Node par(int index)
Parameters.
Defining ITS Vertex explicitly as messageable.
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
std::vector< InputSpec > select(char const *matcher="")
o2::framework::DataProcessorSpec getSTFDecoderSpec(const STFDecoderInp &inp)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string asString() const
size_t maxInputTimeslices
The maximum number of time pipelining for this device.
size_t inputTimesliceId
The time pipelining id of this particular device.
bool globalRunNumberChanged
float maxSOTMUS
max expected signal over threshold in \mus
int getMaxBCDiffToSquashBias(int layer) const noexcept
int maxBCDiffToSquashBias
squash if 2 ROFs differ by <= StrobeLength + Bias BCs, use value <0 to disable squashing
int maxRowColDiffToMask
pixel may be masked as overflow if such a neighbour in prev frame was fired
int maxBCDiffToMaskBias
mask if 2 ROFs differ by <= StrobeLength + Bias BCs, use value <0 to disable masking
static constexpr int getNLayers()
int getROFLengthInBC(int layer) const noexcept
int roFrameLengthInBC
ROF length in BC for continuous mode.
float roFrameLengthTrig
length of RO frame in ns for triggered mode
o2::header::DataOrigin origin
static bool pathIsDirectory(const std::string_view p)
static std::vector< std::string > tokenize(const std::string &src, char delim, bool trimToken=true, bool skipEmpty=true)
static std::string concat_string(Ts const &... ts)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
o2::InteractionRecord ir(0, 0)
std::vector< unsigned char > pattVec