22template <
class Mapping>
25 assert(mWriter.isReadOutModeSet());
26 mWriter.setCarryOverCallBack(
this);
27 mWriter.setNewRDHCallBack(
this);
30 mRUSWMax = (mRUSWMax < uint8_t(mMAP.getNRUs())) ? mRUSWMax : mMAP.getNRUs() - 1;
33 for (uint8_t ru = mRUSWMin; ru <= mRUSWMax; ru++) {
34 auto& ruData = getCreateRUDecode(ru);
37 auto* link = getGBTLink(ruData.links[il]);
40 if (!mWriter.isLinkRegistered(subspec)) {
41 LOGF(info,
"RU%3d FEEId 0x%04x Link %02d of CRU=0x%94x will be writing to default sink %s",
42 int(ru), link->feeID, link->idInCRU, link->cruID, mDefaultSinkName);
43 mWriter.registerLink(link->feeID, link->cruID, link->idInCRU, link->endPointID, mDefaultSinkName);
46 if (link->packetCounter < 0) {
47 link->packetCounter = 0;
53 LOG(warning) <<
"No GBT links were defined for RU " <<
int(ru) <<
" defining automatically";
54 ruData.links[0] = addGBTLink();
55 auto* link = getGBTLink(ruData.links[0]);
56 link->lanes = mMAP.getCablesOnRUType(ruData.ruInfo->ruType);
60 link->feeID = mMAP.RUSW2FEEId(ruData.ruInfo->idSW, 0);
62 link->packetCounter = 0;
63 mWriter.registerLink(link->feeID, link->cruID, link->idInCRU, link->endPointID, mDefaultSinkName);
64 LOGF(info,
"RU%3d FEEId 0x%04x Link %02d of CRU=0x%04x Lanes: %s -> %s",
int(ru), link->feeID,
65 link->idInCRU, link->cruID, std::bitset<28>(link->lanes).to_string(), mDefaultSinkName);
71 for (
int i = 0;
i < mNLinks;
i++) {
72 const auto* lnk = getGBTLink(
i);
73 mFEEId2Link[lnk->feeID] = lnk;
74 mFEEId2GBTHeader[lnk->feeID].activeLanes = lnk->lanes;
79template <
class Mapping>
86template <
class Mapping>
96 int nDigTot =
digits.size();
101 UShort_t curChipID = 0xffff;
102 for (
const auto& dig :
digits) {
103 if (curChipID != dig.getChipIndex()) {
104 mMAP.getChipInfoSW(dig.getChipIndex(), chInfo);
105 if (chInfo.
ru < mRUSWMin || chInfo.
ru > mRUSWMax) {
108 auto* ru = getRUDecode(chInfo.
ru);
109 curChipID = dig.getChipIndex();
110 curChipData = &ru->chipsData[ru->nChipsFired++];
113 curChipData->
getData().emplace_back(&dig);
117 for (
int iru =
int(mRUSWMin); iru <=
int(mRUSWMax); iru++) {
118 auto& ru = *getRUDecode(iru);
119 uint16_t next2Proc = 0, nchTot = mMAP.getNChipsOnRUType(ru.ruInfo->ruType);
120 for (
int ich = 0; ich < ru.nChipsFired; ich++) {
121 auto& chipData = ru.chipsData[ich];
122 convertEmptyChips(next2Proc, chipData.getChipID(), ru);
123 next2Proc = chipData.getChipID() + 1;
124 convertChip(chipData, ru);
127 convertEmptyChips(next2Proc, nchTot, ru);
133template <
class Mapping>
138 ru.
cableHWID[chip.cableHWPos] = chip.cableHW;
141 [](
auto lhs,
auto rhs) {
142 return (lhs.getRow() < rhs.getRow()) ? true : ((lhs.getRow() > rhs.getRow()) ? false : (lhs.getCol() < rhs.getCol()));
144 ru.
cableData[chip.cableHWPos].ensureFreeCapacity(40 * (2 +
pixels.size()));
145 mCoder.encodeChip(ru.
cableData[chip.cableHWPos], chipData, chip.chipOnModuleHW, mCurrIR.bc);
149template <
class Mapping>
153 for (
int chipIDSW = fromChip; chipIDSW < uptoChip; chipIDSW++) {
154 const auto& chip = *mMAP.getChipOnRUInfo(ru.
ruInfo->
ruType, chipIDSW);
155 ru.
cableHWID[chip.cableHWPos] = chip.cableHW;
156 ru.
cableData[chip.cableHWPos].ensureFreeCapacity(100);
157 mCoder.addEmptyChip(ru.
cableData[chip.cableHWPos], chip.chipOnModuleHW, mCurrIR.bc);
162template <
class Mapping>
170 gbtTrigger.
bc = mCurrIR.bc;
171 gbtTrigger.
orbit = mCurrIR.orbit;
172 gbtTrigger.
internal = isContinuousReadout();
176 auto link = getGBTLink(ru.
links[il]);
181 int nPayLoadWordsNeeded = 0;
183 if ((link->lanes & (0x1 << mMAP.cablePos(ru.
ruInfo->
ruType, icab)))) {
185 nPayLoadWordsNeeded += nb ? 1 + (nb - 1) / 9 : 0;
189 link->data.ensureFreeCapacity((3 + nPayLoadWordsNeeded) * link->wordLength);
191 link->data.addFast(gbtTrigger.
getW8(), link->wordLength);
198 if ((link->lanes & (0x1 << mMAP.cablePos(ru.
ruInfo->
ruType, icab)))) {
200 int nb = cableData.getUnusedSize();
207 int gbtWordStart = link->data.getSize();
208 link->data.addFast(cableData.getPtr(), nb);
209 link->data.addFast(zero16, link->wordLength - nb);
211 cableData.setPtr(cableData.getPtr() + nb);
221 link->data.addFast(gbtTrailer.
getW8(), link->wordLength);
222 LOGF(
debug,
"Filled %s with %d GBT words", link->describe(), nPayLoadWordsNeeded + 3);
225 mWriter.addData(link->feeID, link->cruID, link->idInCRU, link->endPointID, mCurrIR, gsl::span((
char*)link->data.data(), link->data.getSize()));
233template <
class Mapping>
236 assert(ruSW < mMAP.getNRUs());
237 if (mRUEntry[ruSW] < 0) {
238 mRUEntry[ruSW] = mNRUs++;
239 mRUDecodeVec[mRUEntry[ruSW]].ruInfo = mMAP.getRUInfoSW(ruSW);
240 mRUDecodeVec[mRUEntry[ruSW]].chipsData.resize(mMAP.getNChipsOnRUType(mMAP.getRUInfoSW(ruSW)->ruType));
241 LOG(info) <<
"Defining container for RU " << ruSW <<
" at slot " << mRUEntry[ruSW];
243 return mRUDecodeVec[mRUEntry[ruSW]];
247template <
class Mapping>
249 const char*
ptr,
int maxSize,
int splitID,
250 std::vector<char>& trailer, std::vector<char>& header)
const
288 uint feed = RDHUtils::getFEEID(rdh);
292 assert(offs >= 0 &&
size_t(offs + maxSize) <=
data.size());
295 int actualSize = maxSize - wordSize;
297 actualSize -= actualSize % wordSize;
299 char* trailPtr = &
data[
data.size() - wordSize];
301 if ((maxSize <= 2 * wordSize)) {
307 if (
ptr + actualSize >= trailPtr) {
308 actualSize = trailPtr -
ptr - wordSize;
310 actualSize -= actualSize % wordSize;
314 header.resize(wordSize);
315 memcpy(header.data(), &
data[0], wordSize);
318 trailer.resize(wordSize);
319 memcpy(trailer.data(), trailPtr, wordSize);
328template <
class Mapping>
335 if (RDHUtils::getStop(rdh)) {
338 toAdd.resize(wordSize);
339 memcpy(toAdd.data(), diag.
getW8(), wordSize);
342 toAdd.resize(wordSize);
343 memcpy(toAdd.data(), mFEEId2GBTHeader.find(RDHUtils::getFEEID(rdh))->second.getW8(), wordSize);
Definition of the 32 Central Trigger System (CTS) Trigger Types defined in https://twiki....
Declarations of helper classes for the ITS/MFT raw data decoding.
Definition of the ITS/MFT Alpide pixel MC->raw converter.
std::enable_if_t< std::is_signed< T >::value, bool > hasData(const CalArray< T > &cal)
void setChipID(uint16_t id)
uint16_t getChipID() const
const std::vector< PixelData > & getData() const
int carryOverMethod(const o2::header::RDHAny *rdh, const gsl::span< char > data, const char *ptr, int maxSize, int splitID, std::vector< char > &trailer, std::vector< char > &header) const
RUDecodeData & getCreateRUDecode(int ruSW)
void digits2raw(gsl::span< const Digit > digits, const o2::InteractionRecord &bcData)
void newRDHMethod(const header::RDHAny *rdh, bool empty, std::vector< char > &toAdd) const
GLint GLint GLsizei GLint GLenum GLenum const void * pixels
uint8_t itsSharedClusterMap uint8_t
constexpr int GBTPaddedWordLength
constexpr int GBTWordLength
const ChipOnRUInfo * chOnRU
const uint8_t * getW8() const
uint64_t internal
0:11 12 lowest bits of trigger type received from CTP
uint64_t orbit
28:31 reserved
uint64_t packetDone
56:63 reserved
std::array< int, MaxLinksPerRU > links
std::array< PayLoadCont, MaxCablesPerRU > cableData
static constexpr int MaxLinksPerRU
std::array< uint8_t, MaxCablesPerRU > cableHWID
static LinkSubSpec_t getSubSpec(uint16_t cru, uint8_t link, uint8_t endpoint, uint16_t feeId, o2::header::DAQID::ID srcid=o2::header::DAQID::INVALID)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits