14#ifndef ALICEO2_ITSMFT_RAWPIXELDECODER_H_
15#define ALICEO2_ITSMFT_RAWPIXELDECODER_H_
18#include <TStopwatch.h>
32#include <unordered_map>
46template <
class Mapping>
63 template <class DigitContainer, class ROFContainer>
66 template <class STATVEC>
69 template <class CalibContainer>
72 template <class LinkErrors, class DecErrors, class ErrMsgs>
97 void printReport(
bool decstat =
true,
bool skipNoErr =
true)
const;
142 int getRUEntrySW(
int ruSW)
const {
return mRUEntry[ruSW]; }
143 RUDecodeData*
getRUDecode(
int ruSW) {
return &mRUDecodeVec[mRUEntry[ruSW]]; }
144 GBTLink*
getGBTLink(
int i) {
return i < 0 ? nullptr : &mGBTLinks[
i]; }
145 RUDecodeData& getCreateRUDecode(
int ruSW);
147 static constexpr uint16_t NORUDECODED = 0xffff;
149 std::vector<GBTLink> mGBTLinks;
150 std::unordered_map<uint32_t, LinkEntry> mSubsSpec2LinkID;
151 std::vector<RUDecodeData> mRUDecodeVec;
152 std::array<
short, Mapping::getNRUs()> mRUEntry;
153 std::vector<ChipPixelData*> mOrderedChipsPtr;
154 std::vector<PhysTrigger> mExtTriggers;
155 GBTLink* mLinkForTriggers =
nullptr;
156 std::string mSelfName{};
157 std::string mRawDumpDirectory;
160 uint16_t mCurRUDecodeID = NORUDECODED;
161 int mLastReadChipID = -1;
164 std::unordered_map<o2::InteractionRecord, int> mIRPoll;
165 bool mFillCalibData =
false;
166 bool mAlloEmptyROFs =
false;
167 bool mROFRampUpStage =
false;
168 bool mSkipRampUpData =
false;
169 bool mVerifyDecoder =
false;
170 bool mAlwaysParseTrigger =
false;
175 uint32_t mNChipsFiredROF = 0;
176 uint32_t mNPixelsFiredROF = 0;
177 uint32_t mNLinksDone = 0;
178 size_t mNChipsFired = 0;
179 size_t mNPixelsFired = 0;
180 size_t mNExtTriggers = 0;
181 size_t mInstanceID = 0;
182 size_t mNInstances = 1;
183 TStopwatch mTimerTFStart;
184 TStopwatch mTimerDecode;
185 TStopwatch mTimerFetchData;
190template <
class Mapping>
191template <
class DigitContainer,
class ROFContainer>
194 if (mInteractionRecord.isDummy()) {
197 mTimerFetchData.Start(
false);
199 for (
unsigned int iru = 0; iru < mRUDecodeVec.size(); iru++) {
200 for (
int ic = 0; ic < mRUDecodeVec[iru].nChipsFired; ic++) {
201 const auto& chip = mRUDecodeVec[iru].chipsData[ic];
202 for (
const auto& hit : mRUDecodeVec[iru].chipsData[ic].getData()) {
203 digits.emplace_back(chip.getChipID(), hit.getRow(), hit.getCol());
208 rofs.emplace_back(mInteractionRecord, mROFCounter,
ref, nFilled);
209 mTimerFetchData.Stop();
216template <
class DigitContainer,
class ROFContainer>
219 if (mInteractionRecord.isDummy()) {
222 mTimerFetchData.Start(
false);
224 for (
auto chipData = mOrderedChipsPtr.rbegin(); chipData != mOrderedChipsPtr.rend(); ++chipData) {
225 assert(mLastReadChipID < (*chipData)->getChipID());
226 mLastReadChipID = (*chipData)->getChipID();
227 for (
const auto& hit : (*chipData)->getData()) {
228 digits.emplace_back(mLastReadChipID, hit.getRow(), hit.getCol());
232 rofs.emplace_back(mInteractionRecord, mROFCounter,
ref, nFilled);
233 mTimerFetchData.Stop();
239template <
class Mapping>
240template <
class STATVEC>
243 if (mInteractionRecord.isDummy() || mROFRampUpStage) {
246 for (
unsigned int iru = 0; iru < mRUDecodeVec.size(); iru++) {
247 for (
auto chID : mRUDecodeVec[iru].seenChipIDs) {
248 chipStatus[chID] = 1;
255template <
class Mapping>
256template <
class CalibContainer>
259 if (!mInteractionRecord.isDummy()) {
260 auto curSize = calib.size();
261 calib.resize(curSize + Mapping::getNRUs());
262 for (
unsigned int iru = 0; iru < mRUDecodeVec.size(); iru++) {
263 calib[curSize + mRUDecodeVec[iru].ruSWID] = mRUDecodeVec[iru].calibData;
269template <
class Mapping>
270template <
class LinkErrors,
class DecErrors,
class ErrMsgs>
273 for (
auto& lnk : mGBTLinks) {
274 if (lnk.gbtErrStatUpadated) {
275 linkErrors.push_back(lnk.statistics);
276 lnk.gbtErrStatUpadated =
false;
279 size_t nerr = 0, nerrMsg = 0;
280 for (
auto& ru : mRUDecodeVec) {
281 nerr += ru.chipErrorsTF.size();
282 nerrMsg += ru.errMsgVecTF.size();
284 if (nerr || nerrMsg) {
285 decErrors.reserve(nerr);
286 errInfos.reserve(nerrMsg);
287 for (
auto& ru : mRUDecodeVec) {
288 for (
const auto& err : ru.chipErrorsTF) {
289 decErrors.emplace_back(
ChipError{err.first, err.second.first, err.second.second});
291 for (
auto& err : ru.errMsgVecTF) {
292 errInfos.push_back(err);
294 ru.chipErrorsTF.clear();
295 ru.errMsgVecTF.clear();
Declarations of helper classes for the ITS/MFT raw data decoding.
Transient data classes for single pixel and set of pixels from current chip.
Abstract class for Alpide data reader class.
Declaration of the Readout Unite decoder class.
Checks validity of hardware address (HW) and transform it to digit AbsId index.
PixelReader class for the ITSMFT.
void fillCalibData(CalibContainer &calib)
const std::vector< PhysTrigger > & getExternalTriggers() const
void setFormat(GBTLink::Format f)
void fillChipsStatus(STATVEC &chipStatus)
const RUDecodeData * getRUDecode(int ruSW) const
void setInstanceID(size_t i)
void setNInstances(size_t n)
void setRawDumpDirectory(const std::string &s)
void ensureChipOrdering()
void startNewTF(o2::framework::InputRecord &inputs)
auto getNROFsProcessed() const
auto getUserDataOrigin() const
auto getRawDumpDirectory() const
bool getAllowEmptyROFs() const
void setUserDataOrigin(header::DataOrigin orig)
bool getSkipRampUpData() const
size_t produceRawDataDumps(int dump, const o2::framework::TimingInfo &tinfo)
void printReport(bool decstat=true, bool skipNoErr=true) const
void setVerifyDecoder(bool v)
bool getNextChipData(ChipPixelData &chipData) final
const GBTLink * getGBTLink(int i) const
auto getNInstances() const
size_t getNPixelsFired() const
uint16_t getSquashingDepth()
TStopwatch & getTimerExtract()
void setFillCalibData(bool v)
void setUserDataDescription(header::DataDescription desc)
auto getInstanceID() const
TStopwatch & getTimerTFStart()
void setSkipRampUpData(bool v=true)
bool isRampUpStage() const
void setAllowEmptyROFs(bool v)
void clearStat(bool resetRaw=false)
std::vector< PhysTrigger > & getExternalTriggers()
uint32_t getNPixelsFiredROF() const
void collectDecodingErrors(LinkErrors &linkErrors, DecErrors &decErrors, ErrMsgs &errInfos)
bool getAlwaysParseTrigger() const
int decodeNextTrigger() final
int fillDecodedDigits(DigitContainer &digits, ROFContainer &rofs)
void collectROFCableData(int iru)
auto getUserDataDescription() const
size_t getNChipsFired() const
bool getVerifyDecoder() const
~RawPixelDecoder() final=default
uint32_t getNChipsFiredROF() const
void setAlwaysParseTrigger(bool v)
bool getFillCalibData() const
TStopwatch & getTimerDecode()
void dump(const std::string what, DPMAP m, int verbose)
constexpr o2::header::DataDescription gDataDescriptionInvalid
constexpr o2::header::DataOrigin gDataOriginInvalid
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
support for the GBT single link data
std::vector< Digit > digits