32 if (ctx.
options().
get<
bool>(
"filterIncomplete")) {
33 LOG(info) <<
"Enabling filtering of incomplete events in the pixel data";
34 mFilterIncomplete =
true;
36 if (ctx.
options().
get<
bool>(
"displayInconsistent")) {
37 LOG(info) <<
"Display additional information in case of inconsistency between pixel links";
38 mDisplayInconsistent =
true;
40 auto mappingfile = ctx.
options().
get<std::string>(
"pixelmapping");
42 auto chiptype = ctx.
options().
get<std::string>(
"pixeltype");
43 if (chiptype ==
"IB") {
44 LOG(info) <<
"Using mapping type: IB";
46 }
else if (chiptype ==
"OB") {
47 LOG(info) <<
"Using mapping type: OB";
50 LOG(fatal) <<
"Unkown mapping type for pixels: " << chiptype;
52 if (mappingfile ==
"default") {
53 LOG(info) <<
"Using default pixel mapping for pixel type " << chiptype;
54 mPixelMapping = std::make_unique<PixelMapper>(mappingtype);
56 LOG(info) <<
"Using user-defined mapping: " << mappingfile;
58 mPixelMapping->setMappingFile(mappingfile, mappingtype);
64 LOG(info) <<
"Running FOCAL decoding";
66 mTimeframeHasPadData =
false;
67 mTimeframeHasPixelData =
false;
70 std::vector<char> rawbuffer;
71 uint16_t currentfee = 0;
73 std::unordered_map<int, int> numHBFFEE, numEventsFEE;
74 std::unordered_map<int, std::vector<int>> numEventsHBFFEE;
75 int numHBFPadsTF = 0, numEventsPadsTF = 0;
76 std::vector<int> expectFEEs;
78 if (rawData.header !=
nullptr && rawData.payload !=
nullptr) {
80 auto header = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(rawData);
81 LOG(
debug) <<
"Channel " << header->dataOrigin.str <<
"/" << header->dataDescription.str <<
"/" << header->subSpecification;
83 gsl::span<const char> databuffer(rawData.payload, payloadSize);
86 while (currentpos < databuffer.size()) {
87 auto rdh =
reinterpret_cast<const o2::header::RDHAny*
>(databuffer.data() + currentpos);
92 if (o2::raw::RDHUtils::getMemorySize(rdh) > o2::raw::RDHUtils::getHeaderSize(rdh)) {
94 auto payloadsize = o2::raw::RDHUtils::getMemorySize(rdh) - o2::raw::RDHUtils::getHeaderSize(rdh);
95 int endpoint =
static_cast<int>(o2::raw::RDHUtils::getEndPointID(rdh));
96 auto fee = o2::raw::RDHUtils::getFEEID(rdh);
98 LOG(
debug) <<
"Found fee 0x" << std::hex << fee << std::dec <<
" (System " << (fee == 0xcafe ?
"Pads" :
"Pixels") <<
")";
99 LOG(
debug) <<
"Found trigger BC: " << o2::raw::RDHUtils::getTriggerBC(rdh);
100 LOG(
debug) <<
"Found trigger Oribt: " << o2::raw::RDHUtils::getTriggerOrbit(rdh);
101 LOG(
debug) <<
"Found payload size: " << payloadsize;
102 LOG(
debug) <<
"Found offset to next: " << o2::raw::RDHUtils::getOffsetToNext(rdh);
103 LOG(
debug) <<
"Stop bit: " << (o2::raw::RDHUtils::getStop(rdh) ?
"yes" :
"no");
105 auto page_payload = databuffer.subspan(currentpos + o2::raw::RDHUtils::getHeaderSize(rdh), payloadsize);
106 std::copy(page_payload.begin(), page_payload.end(), std::back_inserter(rawbuffer));
109 auto trigger = o2::raw::RDHUtils::getTriggerType(rdh);
112 if (o2::raw::RDHUtils::getStop(rdh)) {
113 LOG(
debug) <<
"Stop bit received - processing payload";
115 if (rawbuffer.size()) {
117 if (currentfee == 0xcafe) {
120 LOG(
debug) <<
"Processing PAD data";
121 auto nEventsPads = decodePadData(rawbuffer, currentIR);
122 mTimeframeHasPadData =
true;
123 auto found = mNumEventsHBFPads.find(nEventsPads);
124 if (found != mNumEventsHBFPads.end()) {
127 mNumEventsHBFPads.insert(std::pair<int, int>{nEventsPads, 1});
129 numEventsPadsTF += nEventsPads;
135 auto feeID = o2::raw::RDHUtils::getFEEID(rdh);
137 auto found = std::find(expectFEEs.begin(), expectFEEs.end(), feeID);
138 if (found == expectFEEs.end()) {
139 expectFEEs.emplace_back(feeID);
143 LOG(
debug) <<
"Processing Pixel data from FEE " << feeID;
144 auto neventsPixels = decodePixelData(rawbuffer, currentIR, feeID);
145 mTimeframeHasPixelData =
true;
146 auto found = numHBFFEE.find(feeID);
147 if (found != numHBFFEE.end()) {
150 numHBFFEE.insert(std::pair<int, int>{feeID, 1});
152 auto evFound = numEventsFEE.find(feeID);
153 if (evFound != numEventsFEE.end()) {
154 evFound->second += neventsPixels;
156 numEventsFEE.insert(std::pair<int, int>{feeID, neventsPixels});
158 auto evHBFFound = numEventsHBFFEE.find(feeID);
159 if (evHBFFound != numEventsHBFFEE.end()) {
160 evHBFFound->second.push_back(neventsPixels);
162 std::vector<int> evbuffer;
163 evbuffer.push_back(neventsPixels);
164 numEventsHBFFEE.insert(std::pair<
int, std::vector<int>>{feeID, evbuffer});
169 LOG(
debug) <<
"Payload size 0 - skip empty HBF";
174 currentIR.
bc = o2::raw::RDHUtils::getTriggerBC(rdh);
175 currentIR.
orbit = o2::raw::RDHUtils::getTriggerOrbit(rdh);
176 currentfee = o2::raw::RDHUtils::getFEEID(rdh);
177 LOG(
debug) <<
"New HBF " << currentIR.
orbit <<
" / " << currentIR.
bc <<
", FEE 0x" << std::hex << currentfee << std::dec;
181 currentpos += o2::raw::RDHUtils::getOffsetToNext(rdh);
184 LOG(error) <<
"Input " << inputs <<
": Either header or payload is nullptr";
189 int numHBFPixelsTF = 0;
190 if (mTimeframeHasPixelData) {
192 if (!consistencyCheckPixelFEE(numHBFFEE)) {
193 LOG(alarm) <<
"Mismatch in number of HBF / TF between pixel FEEs";
194 if (mDisplayInconsistent) {
195 printCounters(numHBFFEE);
197 mNumInconsistencyPixelHBF++;
199 numHBFPixelsTF = maxCounter(numHBFFEE);
200 mNumHBFPixels += numHBFPixelsTF;
201 if (!consistencyCheckPixelFEE(numEventsFEE)) {
202 LOG(alarm) <<
"Mismatch in number of events / TF between pixel FEEs";
203 if (mDisplayInconsistent) {
204 printCounters(numEventsFEE);
206 mNumInconsistencyPixelEvent++;
208 mNumEventsPixels += maxCounter(numEventsFEE);
209 if (!checkEventsHBFConsistency(numEventsHBFFEE)) {
210 LOG(alarm) <<
"Mistmatch number of events / HBF between pixel FEEs";
211 if (mDisplayInconsistent) {
212 printEvents(numEventsHBFFEE);
214 mNumInconsistencyPixelEventHBF++;
216 fillPixelEventHBFCount(numEventsHBFFEE);
218 if (mFilterIncomplete) {
219 LOG(
debug) <<
"Filtering incomplete pixel events";
220 for (
auto& hbf : mHBFs) {
221 auto numErased = filterIncompletePixelsEventsHBF(hbf.second, expectFEEs);
222 mNumEventsPixels -= numErased;
227 LOG(info) <<
"Found " << mHBFs.size() <<
" HBFs in timeframe";
229 LOG(
debug) <<
"EventBuilder: Pixels: " << (mTimeframeHasPixelData ?
"yes" :
"no");
230 LOG(
debug) <<
"EventBuilder: Pads: " << (mTimeframeHasPadData ?
"yes" :
"no");
233 LOG(info) <<
"Found " << mOutputTriggerRecords.size() <<
" events in timeframe";
236 mNumEventsPads += numEventsPadsTF;
237 mNumHBFPads += numHBFPadsTF;
239 auto foundHBFperTFPads = mNumHBFperTFPads.find(numHBFPadsTF);
240 if (foundHBFperTFPads != mNumHBFperTFPads.end()) {
241 foundHBFperTFPads->second++;
243 mNumHBFperTFPads.insert(std::pair<int, int>{numHBFPadsTF, 1});
245 auto foundHBFperTFPixels = mNumHBFperTFPixels.find(numHBFPixelsTF);
246 if (foundHBFperTFPixels != mNumHBFperTFPixels.end()) {
247 foundHBFperTFPixels->second++;
249 mNumHBFperTFPixels.insert(std::pair<int, int>{numHBFPixelsTF, 1});
255 std::cout <<
"Number of timeframes: " << mNumTimeframes << std::endl;
256 std::cout <<
"Number of pad HBFs: " << mNumHBFPads << std::endl;
257 std::cout <<
"Number of pixel HBFs: " << mNumHBFPixels << std::endl;
258 for (
auto& [hbfs, tfs] : mNumHBFperTFPads) {
259 std::cout <<
"Pads - Number of TFs with " << hbfs <<
" HBFs: " << tfs << std::endl;
261 for (
auto& [hbfs, tfs] : mNumHBFperTFPixels) {
262 std::cout <<
"Pixels - Number of TFs with " << hbfs <<
" HBFs: " << tfs << std::endl;
264 std::cout <<
"Number of pad events: " << mNumEventsPads << std::endl;
265 std::cout <<
"Number of pixel events: " << mNumEventsPixels << std::endl;
266 for (
auto& [nevents, nHBF] : mNumEventsHBFPads) {
267 std::cout <<
"Number of HBFs with " << nevents <<
" pad events: " << nHBF << std::endl;
269 for (
auto& [nevents, nHBF] : mNumEventsHBFPixels) {
270 std::cout <<
"Number of HBFs with " << nevents <<
" pixel events: " << nHBF << std::endl;
272 std::cout <<
"Number of inconsistencies between pixel FEEs: " << mNumInconsistencyPixelHBF <<
" HBFs, " << mNumInconsistencyPixelEvent <<
" events, " << mNumInconsistencyPixelEventHBF <<
" events / HBF" << std::endl;
283void RawDecoderSpec::resetContainers()
286 mOutputPadLayers.clear();
287 mOutputPixelChips.clear();
288 mOutputPixelHits.clear();
289 mOutputTriggerRecords.clear();
294 LOG(
debug) <<
"Decoding pad data for Orbit " << hbIR.
orbit <<
", BC " << hbIR.
bc;
295 constexpr std::size_t EVENTSIZEPADGBT = 1180,
296 EVENTSIZECHAR = EVENTSIZEPADGBT *
sizeof(
PadGBTWord) /
sizeof(
char);
297 auto nevents = padWords.size() / (EVENTSIZECHAR);
298 for (
int ievent = 0; ievent < nevents; ievent++) {
299 decodePadEvent(padWords.subspan(EVENTSIZECHAR * ievent, EVENTSIZECHAR), hbIR);
304void RawDecoderSpec::decodePadEvent(
const gsl::span<const char> padWords,
o2::InteractionRecord& hbIR)
306 gsl::span<const PadGBTWord> padWordsGBT(
reinterpret_cast<const PadGBTWord*
>(padWords.data()), padWords.size() /
sizeof(
PadGBTWord));
309 std::map<o2::InteractionRecord, HBFData>::iterator foundHBF = mHBFs.find(hbIR);
310 if (foundHBF == mHBFs.end()) {
313 auto res = mHBFs.insert({hbIR, nexthbf});
314 foundHBF =
res.first;
316 foundHBF->second.mPadEvents.push_back(createPadLayerEvent(mPadDecoder.
getData()));
319int RawDecoderSpec::decodePixelData(
const gsl::span<const char> pixelWords,
o2::InteractionRecord& hbIR,
int feeID)
321 LOG(
debug) <<
"Decoding pixel data for Orbit " << hbIR.
orbit <<
", BC " << hbIR.
bc;
324 LOG(
debug) << pixelWords.size() <<
" Bytes -> " << pixelpayload.size() <<
" GBT words";
325 mPixelDecoder.
reset();
328 std::map<o2::InteractionRecord, HBFData>::iterator foundHBF = mHBFs.end();
331 for (
auto& [trigger, chipdata] : mPixelDecoder.getChipData()) {
332 LOG(
debug) <<
"Found trigger orbit " << trigger.orbit <<
", BC " << trigger.bc;
333 if (trigger.orbit != hbIR.
orbit) {
334 LOG(
debug) <<
"FEE 0x" << std::hex << feeID << std::dec <<
": Discarding spurious trigger with Orbit " << trigger.orbit <<
" (HB " << hbIR.
orbit <<
")";
339 for (
auto& chip : chipdata) {
340 nhits += chip.mHits.size();
347 if (foundHBF == mHBFs.end()) {
349 foundHBF = mHBFs.find(hbIR);
350 if (foundHBF == mHBFs.end()) {
353 auto res = mHBFs.insert({hbIR, nexthbf});
354 foundHBF =
res.first;
358 auto triggerfound = std::find(foundHBF->second.mPixelTriggers.begin(), foundHBF->second.mPixelTriggers.end(), trigger);
359 if (triggerfound != foundHBF->second.mPixelTriggers.end()) {
361 auto index = triggerfound - foundHBF->second.mPixelTriggers.begin();
362 for (
const auto& chip : chipdata) {
364 auto chipPosition = mPixelMapping->getPosition(feeID, chip);
365 fillChipToLayer(foundHBF->second.mPixelEvent[
index][chipPosition.mLayer], chip, feeID);
370 foundHBF->second.mFEEs[
index].push_back(feeID);
373 std::array<PixelLayerEvent, constants::PIXELS_NLAYERS> nextevent;
374 foundHBF->second.mPixelEvent.push_back(nextevent);
375 foundHBF->second.mPixelTriggers.push_back(trigger);
376 auto& current = foundHBF->second.mPixelEvent.back();
377 for (
const auto& chip : chipdata) {
379 auto chipPosition = mPixelMapping->getPosition(feeID, chip);
380 fillChipToLayer(current[chipPosition.mLayer], chip, feeID);
385 foundHBF->second.mFEEs.push_back({feeID});
392std::array<o2::focal::PadLayerEvent, o2::focal::constants::PADS_NLAYERS> RawDecoderSpec::createPadLayerEvent(
const o2::focal::PadData&
data)
const
394 std::array<PadLayerEvent, constants::PADS_NLAYERS>
result;
395 std::array<uint8_t, 8> triggertimes;
397 auto& asic =
data.getDataForASIC(ilayer).getASIC();
400 auto header = asic.getHeader(ihalf);
401 bc[ihalf] = header.mBCID;
402 auto calib = asic.getCalib(ihalf);
403 auto cmn = asic.getCMN(ihalf);
404 result[ilayer].setHeader(ihalf, header.getHeader(), header.getBCID(), header.getWadd(), header.getFourbit(), header.getTrailer());
405 result[ilayer].setCalib(ihalf, calib.getADC(), calib.getTOA(), calib.getTOT());
406 result[ilayer].setCMN(ihalf, cmn.getADC(), cmn.getTOA(), cmn.getTOT());
409 auto channel = asic.getChannel(ichannel);
410 result[ilayer].setChannel(ichannel, channel.getADC(), channel.getTOA(), channel.getTOT());
412 auto triggers =
data.getDataForASIC(ilayer).getTriggerWords();
414 std::fill(triggertimes.begin(), triggertimes.end(), 0);
415 triggertimes[0] = triggers[window].mTrigger0;
416 triggertimes[1] = triggers[window].mTrigger1;
417 triggertimes[2] = triggers[window].mTrigger2;
418 triggertimes[3] = triggers[window].mTrigger3;
419 triggertimes[4] = triggers[window].mTrigger4;
420 triggertimes[5] = triggers[window].mTrigger5;
421 triggertimes[6] = triggers[window].mTrigger6;
422 triggertimes[7] = triggers[window].mTrigger7;
423 result[ilayer].setTrigger(window, triggers[window].mHeader0, triggers[window].mHeader1, triggertimes);
433 int nchipsBefore = pixellayer.
getChips().size();
434 for (
auto& chip : pixellayer.getChips()) {
435 nhitsBefore += chip.mHits.size();
439 int nchipsAfter = pixellayer.
getChips().size();
440 for (
auto& chip : pixellayer.getChips()) {
441 nhitsAfter += chip.mHits.size();
446void RawDecoderSpec::fillEventPixeHitContainer(std::vector<PixelHit>& eventHits, std::vector<PixelChipRecord>& eventChips,
const PixelLayerEvent& pixelLayer,
int layerIndex)
448 for (
auto& chip : pixelLayer.getChips()) {
449 auto starthits = eventHits.size();
450 auto& chipHits = chip.mHits;
451 std::copy(chipHits.begin(), chipHits.end(), std::back_inserter(eventHits));
452 eventChips.emplace_back(layerIndex, chip.mFeeID, chip.mLaneID, chip.mChipID, chip.mStatusCode, starthits, chipHits.size());
456void RawDecoderSpec::buildEvents()
458 LOG(
debug) <<
"Start building events" << std::endl;
459 for (
const auto& [hbir, hbf] : mHBFs) {
460 if (mTimeframeHasPadData && mTimeframeHasPixelData) {
461 LOG(
debug) <<
"Processing HBF with IR: " << hbir.orbit <<
" / " << hbir.bc << std::endl;
464 if ((hbf.mPadEvents.size() != hbf.mPixelEvent.size()) || (hbf.mPadEvents.size() != hbf.mPixelTriggers.size()) || (hbf.mPixelEvent.size() != hbf.mPixelTriggers.size())) {
465 LOG(error) <<
"Inconsistent number of events in HBF for pads (" << hbf.mPadEvents.size() <<
") and pixels (" << hbf.mPixelEvent.size() <<
") - " << hbf.mPixelTriggers.size() <<
" triggers";
468 LOG(
debug) <<
"HBF: " << hbf.mPixelTriggers.size() <<
" triggers, " << hbf.mPadEvents.size() <<
" pad events, " << hbf.mPixelEvent.size() <<
" pixel events" << std::endl;
469 for (std::size_t itrg = 0; itrg < hbf.mPixelTriggers.size(); itrg++) {
470 auto startPads = mOutputPadLayers.size(),
471 startHits = mOutputPixelHits.size(),
472 startChips = mOutputPixelChips.size();
474 mOutputPadLayers.push_back(hbf.mPadEvents[itrg][ilayer]);
476 std::vector<PixelHit> eventHits;
477 std::vector<PixelChipRecord> eventPixels;
479 fillEventPixeHitContainer(eventHits, eventPixels, hbf.mPixelEvent[itrg][ilayer], ilayer);
481 std::copy(eventHits.begin(), eventHits.end(), std::back_inserter(mOutputPixelHits));
482 std::copy(eventPixels.begin(), eventPixels.end(), std::back_inserter(mOutputPixelChips));
484 mOutputTriggerRecords.emplace_back(hbf.mPixelTriggers[itrg], startPads,
constants::PADS_NLAYERS, startChips, eventPixels.size(), startHits, eventHits.size());
486 }
else if (mTimeframeHasPixelData) {
488 if (!(hbf.mPixelEvent.size() == hbf.mPixelTriggers.size())) {
489 LOG(error) <<
"Inconsistent number of pixel events (" << hbf.mPixelEvent.size() <<
") and triggers (" << hbf.mPixelTriggers.size() <<
") in HBF";
492 for (std::size_t itrg = 0; itrg < hbf.mPixelTriggers.size(); itrg++) {
493 auto startPads = mOutputPadLayers.size(),
494 startHits = mOutputPixelHits.size(),
495 startChips = mOutputPixelChips.size();
496 std::vector<PixelHit> eventHits;
497 std::vector<PixelChipRecord> eventPixels;
499 fillEventPixeHitContainer(eventHits, eventPixels, hbf.mPixelEvent[itrg][ilayer], ilayer);
501 std::copy(eventHits.begin(), eventHits.end(), std::back_inserter(mOutputPixelHits));
502 std::copy(eventPixels.begin(), eventPixels.end(), std::back_inserter(mOutputPixelChips));
503 mOutputTriggerRecords.emplace_back(hbf.mPixelTriggers[itrg], startPads, 0, startChips, eventPixels.size(), startHits, eventHits.size());
505 }
else if (mTimeframeHasPadData) {
507 for (std::size_t itrg = 0; itrg < hbf.mPadEvents.size(); itrg++) {
508 auto startPads = mOutputPadLayers.size(),
509 startHits = mOutputPixelHits.size(),
510 startChips = mOutputPixelChips.size();
512 fakeBC.
orbit = hbir.orbit;
513 fakeBC.
bc = hbir.bc + itrg;
515 mOutputPadLayers.push_back(hbf.mPadEvents[itrg][ilayer]);
523int RawDecoderSpec::filterIncompletePixelsEventsHBF(HBFData&
data,
const std::vector<int>& expectFEEs)
525 auto same = [](
const std::vector<int>&
lhs,
const std::vector<int>&
rhs) ->
bool {
526 bool missing =
false;
543 std::vector<int> indexIncomplete;
545 if (
data.mFEEs[
index].size() != expectFEEs.size()) {
546 indexIncomplete.emplace_back(
index);
549 if (!same(
data.mFEEs[
index], expectFEEs)) {
550 indexIncomplete.emplace_back(
index);
553 if (indexIncomplete.size()) {
554 std::sort(indexIncomplete.begin(), indexIncomplete.end(), std::less<>());
556 for (
auto indexIter = indexIncomplete.rbegin(); indexIter != indexIncomplete.rend(); indexIter++) {
557 auto iterPixelEvent =
data.mPixelEvent.begin() + *indexIter;
558 auto iterTrigger =
data.mPixelTriggers.begin() + *indexIter;
559 auto iterFEEs =
data.mFEEs.begin() + *indexIter;
560 data.mPixelEvent.erase(iterPixelEvent);
561 data.mPixelTriggers.erase(iterTrigger);
562 data.mFEEs.erase(iterFEEs);
565 return indexIncomplete.size();
568bool RawDecoderSpec::consistencyCheckPixelFEE(
const std::unordered_map<int, int>&
counters)
const
570 bool initialized =
false;
571 bool discrepancy =
false;
578 if (
value != current) {
587bool RawDecoderSpec::checkEventsHBFConsistency(
const std::unordered_map<
int, std::vector<int>>&
counters)
const
589 bool initialized =
false;
590 bool discrepancy =
false;
591 std::vector<int> current;
592 for (
auto& [fee, events] :
counters) {
597 if (events != current) {
604int RawDecoderSpec::maxCounter(
const std::unordered_map<int, int>&
counters)
const
616void RawDecoderSpec::printCounters(
const std::unordered_map<int, int>&
counters)
const
619 LOG(info) <<
" FEE 0x" << std::hex << fee << std::dec <<
": " <<
counter <<
" counts ...";
623void RawDecoderSpec::printEvents(
const std::unordered_map<
int, std::vector<int>>&
counters)
const
625 for (
auto& [fee, events] :
counters) {
626 std::stringstream stringbuilder;
628 for (
auto ev : events) {
632 stringbuilder <<
", ";
636 LOG(info) <<
" FEE 0x" << std::hex << fee << std::dec <<
": " << stringbuilder.str() <<
" events ...";
640void RawDecoderSpec::fillPixelEventHBFCount(
const std::unordered_map<
int, std::vector<int>>&
counters)
645 for (
auto& [fee, events] :
counters) {
647 for (
auto ev : events) {
657 for (
auto nEventsPixels : en->second) {
658 auto found = mNumEventsHBFPixels.find(nEventsPixels);
659 if (found != mNumEventsHBFPixels.end()) {
662 mNumEventsHBFPixels.insert(std::pair<int, int>{nEventsPixels, 1});
671 std::vector<o2::framework::OutputSpec> outputs;
673 outputs.emplace_back(originFOC,
"PADLAYERS", outputSubspec, o2::framework::Lifetime::Timeframe);
674 outputs.emplace_back(originFOC,
"PIXELHITS", outputSubspec, o2::framework::Lifetime::Timeframe);
675 outputs.emplace_back(originFOC,
"PIXELCHIPS", outputSubspec, o2::framework::Lifetime::Timeframe);
676 outputs.emplace_back(originFOC,
"TRIGGERS", outputSubspec, o2::framework::Lifetime::Timeframe);
680 inputs.emplace_back(
"stdDist",
"FLP",
"DISTSUBTIMEFRAME", 0, o2::framework::Lifetime::Timeframe);
686 o2::framework::adaptFromTask<o2::focal::reco_workflow::RawDecoderSpec>(outputSubspec, usePadData, usePixelData, debugMode),
Definition of the 32 Central Trigger System (CTS) Trigger Types defined in https://twiki....
const PadData & getData() const
void decodeEvent(gsl::span< const PadGBTWord > padpayload)
void decodeEvent(gsl::span< const o2::itsmft::GBTWord > payload)
const std::vector< PixelChip > & getChips() const
void addChip(const PixelChip &chip)
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(framework::InitContext &ctx) final
void run(framework::ProcessingContext &ctx) final
T get(const char *key) const
void snapshot(const Output &spec, T const &object)
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.
float sum(float s, o2::dcs::DataPointValue v)
GLint GLint GLsizei GLuint * counters
GLsizei const GLfloat * value
constexpr o2::header::DataOrigin gDataOriginFOC
constexpr o2::header::DataDescription gDataDescriptionRawData
constexpr int PADLAYER_MODULE_NCHANNELS
constexpr int PADLAYER_MODULE_NHALVES
constexpr int PIXELS_NLAYERS
constexpr int PADLAYER_WINDOW_LENGTH
constexpr int PADS_NLAYERS
framework::DataProcessorSpec getRawDecoderSpec(bool askDISTSTF, uint32_t outputSubspec, bool usePadData, bool usePixelData, bool debugMode)
std::vector< ConfigParamSpec > Options
D const SVectorGPU< T, D > & rhs
uint16_t bc
bunch crossing ID of interaction
std::vector< PixelHit > mHits
static o2::header::DataHeader::PayloadSizeType getPayloadSize(const DataRef &ref)
static void printRDH(const RDHv4 &rdh)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"