diff --git a/algo/detectors/trd2d/UnpackTrd2d.cxx b/algo/detectors/trd2d/UnpackTrd2d.cxx index c067198fa5c925a216a7d5f8349fd1d29c0910fc..d399ad611b2836e09500e96c91af1b4ba3f6394c 100644 --- a/algo/detectors/trd2d/UnpackTrd2d.cxx +++ b/algo/detectors/trd2d/UnpackTrd2d.cxx @@ -32,6 +32,9 @@ namespace cbm::algo // --- Output data resultType result = {}; + // Reset monitoring data + fMonitor = UnpackTrd2dMonitorData(); + // define time wrt start of time slice in TRD/FASP clks [80 MHz]. Contains: // - relative offset of the MS wrt the TS // - FASP epoch offset for current CROB @@ -74,16 +77,17 @@ namespace cbm::algo lFaspOld = fasp_id; } if (data & 0x1) { - LOG(warn) << "UnpackTrd2d - Data corrupted : detect end bit set."; + fMonitor.fNumErrEndBitSet++; continue; } if (data & 0x2000) { - LOG(debug) << "UnpackTrd2d - Self-triggered data."; + fMonitor.fNumSelfTriggeredData++; data &= 0x1fff; } vMess.emplace_back(ch_id, kData, slice, data >> 1, crob_id, lFaspOld); } - result.first = FinalizeComponent(); + result.first = FinalizeComponent(); //TO DO: Original (non-algo) version calls this after MS loop!! + result.second = fMonitor; return result; } @@ -181,7 +185,7 @@ namespace cbm::algo // clear digi buffer wrt the digi which was forwarded to higher structures fDigiBuffer[ipad].clear(); if (nIncomplete > 2) { - LOG(warn) << "FinalizeComponent() skip " << nIncomplete << " incomplete digi at pad " << ipad << ".\n"; + fMonitor.fNumIncompleteDigis++; //TO DO: This must be moved if finalization is done after MS loop } } return outputDigis; diff --git a/algo/detectors/trd2d/UnpackTrd2d.h b/algo/detectors/trd2d/UnpackTrd2d.h index f4d254a2fa1a83e3570a2d3cf9839d24105c7d20..25cc2886c2f0ce76ec94f87d837e8cbae0f20f4e 100644 --- a/algo/detectors/trd2d/UnpackTrd2d.h +++ b/algo/detectors/trd2d/UnpackTrd2d.h @@ -85,22 +85,20 @@ namespace cbm::algo ** @brief Monitoring data for TRD unpacking **/ struct UnpackTrd2dMonitorData { - uint32_t fNumNonHitOrTsbMessage = 0; - uint32_t fNumErrElinkOutOfRange = 0; ///< Elink not contained in parameters - uint32_t fNumErrInvalidFirstMessage = 0; ///< First message is not TS_MSB or second is not EPOCH - uint32_t fNumErrInvalidMsSize = 0; ///< Microslice size is not multiple of message size - uint32_t fNumErrTimestampOverflow = 0; ///< Overflow in 64 bit time stampa + uint32_t fNumSelfTriggeredData = 0; ///< word fulfills data & 0x2000 + uint32_t fNumIncompleteDigis = 0; ///< incomplete digis left in pads after finalization + uint32_t fNumErrEndBitSet = 0; ///< Corrupted data with end bit set + bool HasErrors() { - uint32_t numErrors = fNumNonHitOrTsbMessage + fNumErrElinkOutOfRange + fNumErrInvalidFirstMessage - + fNumErrInvalidMsSize + fNumErrTimestampOverflow; + uint32_t numErrors = fNumErrEndBitSet; return (numErrors > 0 ? true : false); } std::string print() { std::stringstream ss; - ss << "errors " << fNumNonHitOrTsbMessage << " | " << fNumErrElinkOutOfRange << " | " - << fNumErrInvalidFirstMessage << " | " << fNumErrInvalidMsSize << " | " << fNumErrTimestampOverflow << " | "; + ss << "stats " << fNumSelfTriggeredData << " | " << fNumIncompleteDigis << " | errors " << fNumErrEndBitSet + << " | "; return ss.str(); } }; @@ -141,6 +139,8 @@ namespace cbm::algo private: // members UnpackTrd2dPar fParams = {}; ///< Parameter container + UnpackTrd2dMonitorData fMonitor; ///< Container for monitoring data + /** ** @brief Time offset for the system ** @todo This should be module and channel dependent and included into the asic parameters