14#ifndef ALICEO2_ITSMFT_RAWPIXELDECODER_H_
15#define ALICEO2_ITSMFT_RAWPIXELDECODER_H_
17#include <unordered_map>
19#include <TStopwatch.h>
47template <
class Mapping>
64 template <class DigitContainer, class ROFContainer>
67 template <class STATVEC>
70 template <class CalibContainer>
73 template <class LinkErrors, class DecErrors, class ErrMsgs>
101 void printReport(
bool decstat =
true,
bool skipNoErr =
true)
const;
146 int getRUEntrySW(
int ruSW)
const {
return mRUEntry[ruSW]; }
147 RUDecodeData*
getRUDecode(
int ruSW) {
return &mRUDecodeVec[mRUEntry[ruSW]]; }
148 GBTLink*
getGBTLink(
int i) {
return i < 0 ? nullptr : &mGBTLinks[
i]; }
149 RUDecodeData& getCreateRUDecode(
int ruSW);
151 static constexpr uint16_t NORUDECODED = 0xffff;
153 std::vector<o2::framework::InputSpec> mInputFilter;
154 std::vector<GBTLink> mGBTLinks;
155 std::unordered_map<uint32_t, LinkEntry> mSubsSpec2LinkID;
156 std::vector<RUDecodeData> mRUDecodeVec;
157 std::array<short, Mapping::getNRUs()> mRUEntry;
158 std::vector<ChipPixelData*> mOrderedChipsPtr;
159 std::vector<PhysTrigger> mExtTriggers;
160 GBTLink* mLinkForTriggers =
nullptr;
161 std::string mSelfName{};
162 std::string mRawDumpDirectory;
165 uint16_t mCurRUDecodeID = NORUDECODED;
166 int mLastReadChipID = -1;
169 std::unordered_map<o2::InteractionRecord, int> mIRPoll;
170 bool mFillCalibData =
false;
171 bool mAlloEmptyROFs =
false;
172 bool mROFRampUpStage =
false;
173 bool mSkipRampUpData =
false;
174 bool mVerifyDecoder =
false;
175 bool mAlwaysParseTrigger =
false;
180 uint32_t mNChipsFiredROF = 0;
181 uint32_t mNPixelsFiredROF = 0;
182 uint32_t mNLinksDone = 0;
183 size_t mNChipsFired = 0;
184 size_t mNPixelsFired = 0;
185 size_t mNExtTriggers = 0;
186 size_t mInstanceID = 0;
187 size_t mNInstances = 1;
188 TStopwatch mTimerTFStart;
189 TStopwatch mTimerDecode;
190 TStopwatch mTimerFetchData;
195template <
class Mapping>
196template <
class DigitContainer,
class ROFContainer>
199 if (mInteractionRecord.isDummy()) {
202 mTimerFetchData.Start(
false);
204 for (
unsigned int iru = 0; iru < mRUDecodeVec.size(); iru++) {
205 for (
int ic = 0; ic < mRUDecodeVec[iru].nChipsFired; ic++) {
206 const auto& chip = mRUDecodeVec[iru].chipsData[ic];
207 for (
const auto& hit : mRUDecodeVec[iru].chipsData[ic].getData()) {
208 digits.emplace_back(chip.getChipID(), hit.getRow(), hit.getCol());
213 rofs.emplace_back(mInteractionRecord, mROFCounter,
ref, nFilled);
214 mTimerFetchData.Stop();
221template <
class DigitContainer,
class ROFContainer>
224 if (mInteractionRecord.isDummy()) {
227 mTimerFetchData.Start(
false);
229 for (
auto chipData = mOrderedChipsPtr.rbegin(); chipData != mOrderedChipsPtr.rend(); ++chipData) {
230 assert(mLastReadChipID < (*chipData)->getChipID());
231 mLastReadChipID = (*chipData)->getChipID();
232 for (
const auto& hit : (*chipData)->getData()) {
233 digits.emplace_back(mLastReadChipID, hit.getRow(), hit.getCol());
237 rofs.emplace_back(mInteractionRecord, mROFCounter,
ref, nFilled);
238 mTimerFetchData.Stop();
244template <
class Mapping>
245template <
class STATVEC>
248 if (mInteractionRecord.isDummy() || mROFRampUpStage) {
251 for (
unsigned int iru = 0; iru < mRUDecodeVec.size(); iru++) {
252 for (
auto chID : mRUDecodeVec[iru].seenChipIDs) {
253 chipStatus[chID] = 1;
260template <
class Mapping>
261template <
class CalibContainer>
264 if (!mInteractionRecord.isDummy()) {
265 auto curSize = calib.size();
266 calib.resize(curSize + Mapping::getNRUs());
267 for (
unsigned int iru = 0; iru < mRUDecodeVec.size(); iru++) {
268 calib[curSize + mRUDecodeVec[iru].ruSWID] = mRUDecodeVec[iru].calibData;
274template <
class Mapping>
275template <
class LinkErrors,
class DecErrors,
class ErrMsgs>
278 for (
auto& lnk : mGBTLinks) {
279 if (lnk.gbtErrStatUpadated) {
280 linkErrors.push_back(lnk.statistics);
281 lnk.gbtErrStatUpadated =
false;
284 size_t nerr = 0, nerrMsg = 0;
285 for (
auto& ru : mRUDecodeVec) {
286 nerr += ru.chipErrorsTF.size();
287 nerrMsg += ru.errMsgVecTF.size();
289 if (nerr || nerrMsg) {
290 decErrors.reserve(nerr);
291 errInfos.reserve(nerrMsg);
292 for (
auto& ru : mRUDecodeVec) {
293 for (
const auto& err : ru.chipErrorsTF) {
294 decErrors.emplace_back(
ChipError{err.first, err.second.first, err.second.second});
296 for (
auto& err : ru.errMsgVecTF) {
297 errInfos.push_back(err);
299 ru.chipErrorsTF.clear();
300 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 setInputFilter(std::vector< o2::framework::InputSpec > filter)
void fillCalibData(CalibContainer &calib)
const auto & getInputFilter() const noexcept
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)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
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