Skip to content

Commit a471abd

Browse files
committed
TRD enable CCDB link mapping
- Fix some minor compiler warnings - Improve error message handling
1 parent 5519fad commit a471abd

11 files changed

Lines changed: 96 additions & 92 deletions

File tree

DataFormats/Detectors/TRD/include/DataFormatsTRD/RawData.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -435,16 +435,6 @@ uint32_t getlinkerrorflag(const HalfCRUHeader& cruhead, const uint32_t link);
435435
uint32_t getlinkdatasize(const HalfCRUHeader& cruhead, const uint32_t link);
436436
uint32_t getlinkerrorflags(const HalfCRUHeader& cruheader, std::array<uint32_t, 15>& linkerrorflags);
437437
uint32_t getlinkdatasizes(const HalfCRUHeader& cruheader, std::array<uint32_t, 15>& linksizes);
438-
std::ostream& operator<<(std::ostream& stream, const TrackletHCHeader& halfchamberheader);
439-
std::ostream& operator<<(std::ostream& stream, const TrackletMCMHeader& mcmhead);
440-
std::ostream& operator<<(std::ostream& stream, const TrackletMCMData& tracklet);
441-
void dumpHalfChamber(o2::trd::TrackletHCHeader& halfchamber);
442-
std::ostream& operator<<(std::ostream& stream, const HalfCRUHeader& halfcru);
443-
bool trackletMCMHeaderSanityCheck(o2::trd::TrackletMCMHeader& header);
444-
bool trackletHCHeaderSanityCheck(o2::trd::TrackletHCHeader& header);
445-
bool digitMCMHeaderSanityCheck(o2::trd::DigitMCMHeader* header);
446-
bool digitMCMADCMaskSanityCheck(o2::trd::DigitMCMADCMask& mask, int numberofbitsset);
447-
bool digitMCMWordSanityCheck(o2::trd::DigitMCMData* word, int adcchannel);
448438
bool halfCRUHeaderSanityCheck(const o2::trd::HalfCRUHeader& header);
449439
void printDigitHCHeader(o2::trd::DigitHCHeader& header, uint32_t headers[3]);
450440

@@ -480,6 +470,7 @@ void printDigitMCMADCMask(const o2::trd::DigitMCMADCMask& digitmcmadcmask);
480470

481471
void printHalfCRUHeader(const o2::trd::HalfCRUHeader& halfcru);
482472
void clearHalfCRUHeader(o2::trd::HalfCRUHeader& halfcru);
473+
bool sanityCheckTrackletHCHeader(const o2::trd::TrackletHCHeader& header);
483474
bool sanityCheckTrackletMCMHeader(const o2::trd::TrackletMCMHeader& header);
484475
bool sanityCheckDigitMCMHeader(const o2::trd::DigitMCMHeader& header);
485476
bool sanityCheckDigitMCMADCMask(const o2::trd::DigitMCMADCMask& mask);

DataFormats/Detectors/TRD/include/DataFormatsTRD/RawDataStats.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ enum ParsingErrors {
4444
TrackletDataWrongOrdering, // the tracklet data is not arriving in increasing MCM order
4545
TrackletDataDuplicateMCM, // we see more than one TrackletMCMHeader for the same MCM
4646
TrackletNoTrackletEndMarker, // got to the end of the buffer with out finding a tracklet end marker.
47+
TrackletNoSecondEndMarker, // we expected to see a second tracklet end marker, but found something else instead
48+
TrackletMCMDataFailure, // invalid word for TrackletMCMData detected
49+
TrackletDataMissing, // we expected tracklet data but got an endmarker instead
4750
TrackletExitingNoTrackletEndMarker, // got to the end of the buffer exiting tracklet parsing with no tracklet end marker
4851
UnparsedTrackletDataRemaining, // the tracklet parsing has finished correctly, but there is still data left on the link (CRU puts incorrect link size or corrupt data?)
4952
UnparsedDigitDataRemaining, // the digit parsing has finished correctly, but there is still data left on the link (CRU puts incorrect link size or corrupt data? RDH > 8kByte before?)
@@ -84,6 +87,9 @@ static const std::unordered_map<int, std::string> ParsingErrorsString = {
8487
{TrackletDataWrongOrdering, "TrackletDataWrongOrdering"},
8588
{TrackletDataDuplicateMCM, "TrackletDataDuplicateMCM"},
8689
{TrackletNoTrackletEndMarker, "TrackletNoTrackletEndMarker"},
90+
{TrackletNoSecondEndMarker, "TrackletNoSecondEndMarker"},
91+
{TrackletMCMDataFailure, "TrackletMCMDataFailure"},
92+
{TrackletDataMissing, "TrackletDataMissing"},
8793
{TrackletExitingNoTrackletEndMarker, "TrackletExitingNoTrackletEndMarker"},
8894
{UnparsedTrackletDataRemaining, "UnparsedTrackletDataRemaining"},
8995
{UnparsedDigitDataRemaining, "UnparsedDigitDataRemaining"},

DataFormats/Detectors/TRD/src/RawData.cxx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,23 @@ bool halfCRUHeaderSanityCheck(const o2::trd::HalfCRUHeader& header)
266266
return true;
267267
}
268268

269+
bool sanityCheckTrackletHCHeader(const o2::trd::TrackletHCHeader& header)
270+
{
271+
if (header.one != 1) {
272+
return false;
273+
}
274+
if (((~header.supermodule) & 0x1f) >= NSECTOR) {
275+
return false;
276+
}
277+
if (((~header.stack) & 0x7) >= NSTACK) {
278+
return false;
279+
}
280+
if (((~header.layer) & 0x7) >= NLAYER) {
281+
return false;
282+
}
283+
return true;
284+
}
285+
269286
bool sanityCheckTrackletMCMHeader(const o2::trd::TrackletMCMHeader& header)
270287
{
271288
// a bit limited to what we can check.
@@ -298,7 +315,7 @@ bool sanityCheckDigitMCMADCMask(const o2::trd::DigitMCMADCMask& mask)
298315
if (mask.j != 0xc) {
299316
return false;
300317
}
301-
int counter = (~mask.c) & 0x1f;
318+
unsigned int counter = (~mask.c) & 0x1f;
302319
std::bitset<NADCMCM> headerMask(mask.adcmask);
303320
return (counter == headerMask.count());
304321
}
@@ -376,7 +393,6 @@ void printDigitHCHeaders(o2::trd::DigitHCHeader& header, uint32_t headers[3], in
376393
void printDigitHCHeader(o2::trd::DigitHCHeader& header, uint32_t headers[3])
377394
{
378395
printDigitHCHeaders(header, headers, -1, 0, true);
379-
int countheaderwords = header.numberHCW;
380396
int index;
381397
//for the currently 3 implemented other header words, they can come in any order, and are identified by their reserved portion
382398
for (int countheaderwords = 0; countheaderwords < header.numberHCW; ++countheaderwords) {

Detectors/TRD/reconstruction/macros/CompareDigitsAndTracklets.C

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,20 @@ void CompareDigitsAndTracklets(bool ignoreTrkltPid = false,
7878
trackletTreereco->GetEvent(iev);
7979

8080
// compare trigger records
81+
bool compareTriggerRecords = true;
8182
if (trigRecs->size() != trigRecsReco->size()) {
8283
LOG(warn) << "Number of trigger records does not match for entry " << iev;
83-
continue;
84+
compareTriggerRecords = false;
8485
}
85-
for (size_t iTrig = 0; iTrig < trigRecs->size(); ++iTrig) {
86-
const auto& trig = trigRecs->at(iTrig);
87-
const auto& trigReco = trigRecsReco->at(iTrig);
88-
if (!(trig == trigReco)) {
89-
LOGF(error, "Trigger records don't match at trigger %lu. Reference orbit/bc (%u/%u), orbit/bc (%u/%u)",
90-
iTrig, trig.getBCData().orbit, trig.getBCData().bc, trigReco.getBCData().orbit, trigReco.getBCData().bc);
91-
break;
86+
if (compareTriggerRecords) {
87+
for (size_t iTrig = 0; iTrig < trigRecs->size(); ++iTrig) {
88+
const auto& trig = trigRecs->at(iTrig);
89+
const auto& trigReco = trigRecsReco->at(iTrig);
90+
if (!(trig == trigReco)) {
91+
LOGF(error, "Trigger records don't match at trigger %lu. Reference orbit/bc (%u/%u), orbit/bc (%u/%u)",
92+
iTrig, trig.getBCData().orbit, trig.getBCData().bc, trigReco.getBCData().orbit, trigReco.getBCData().bc);
93+
break;
94+
}
9295
}
9396
}
9497

Detectors/TRD/reconstruction/src/CruRawReader.cxx

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,10 @@ bool CruRawReader::parseDigitHCHeaders(int hcid)
305305
}
306306
incrementErrors(DigitHCHeader2Problem, hcid);
307307
}
308+
/* Currently we don't do anything with the information stored in DigitHCHeader2
308309
DigitHCHeader2 header2;
309310
header2.word = headers[headerwordcount];
311+
*/
310312
headersfound.set(1);
311313
break;
312314

@@ -466,19 +468,17 @@ bool CruRawReader::processHalfCRU(int iteration)
466468
int cruIdx = mFEEID.supermodule * 2 + mFEEID.side; // 2 CRUs per SM, side defining A/C-side CRU
467469
int halfCruIdx = cruIdx * 2 + mFEEID.endpoint; // endpoint (0 or 1) defines half-CRU
468470
int linkIdxGlobal = halfCruIdx * NLINKSPERHALFCRU + currentlinkindex; // global link ID [0..1079]
469-
int halfChamberId = HelperMethods::getHCIDFromLinkID(linkIdxGlobal);
470-
// int halfChamberId = mLinkMap->getHCID(linkIdxGlobal); FIXME: uncomment, when object available in CCDB
471-
// TODO we keep detector, stack, layer, sector, side for now to be compatible to the current code state,
471+
int halfChamberId = mLinkMap->getHCID(linkIdxGlobal);
472+
// TODO we keep detector, stack, layer, side for now to be compatible to the current code state,
472473
// but halfChamberId contains everything we need to know... More cleanup to be done in second step
473474
int detectorId = halfChamberId / 2;
474475
int stack = HelperMethods::getStack(detectorId);
475476
int layer = HelperMethods::getLayer(detectorId);
476-
int sector = HelperMethods::getSector(detectorId);
477477
int side = halfChamberId % 2;
478478
int stack_layer = stack * NLAYER + layer; // similarly this is also only for graphing so just use the rdh ones for now.
479479
mEventRecords.incLinkErrorFlags(mFEEID.supermodule, side, stack_layer, mCurrentHalfCRULinkErrorFlags[currentlinkindex]);
480-
int currentlinksize32 = mCurrentHalfCRULinkLengths[currentlinkindex] * 8; // x8 to go from 256 bits to 32 bit;
481-
int endOfCurrentLink = mHBFoffset32 + currentlinksize32;
480+
uint32_t currentlinksize32 = mCurrentHalfCRULinkLengths[currentlinkindex] * 8; // x8 to go from 256 bits to 32 bit;
481+
uint32_t endOfCurrentLink = mHBFoffset32 + currentlinksize32;
482482

483483
linksizeAccum32 += currentlinksize32;
484484
if (currentlinksize32 == 0) {
@@ -500,27 +500,25 @@ bool CruRawReader::processHalfCRU(int iteration)
500500
LOGF(info, "Tracklet parser starting at offset %u and processing up to %u words", mHBFoffset32, currentlinksize32);
501501
}
502502
int trackletWordsRejected = 0;
503-
// LOGF(warn, "Starting tracklet parsing for HCID %i", halfChamberId);
504503
int trackletWordsRead = parseTrackletLinkData(currentlinksize32, halfChamberId, trackletWordsRejected);
505504
std::chrono::duration<double, std::micro> trackletparsingtime = std::chrono::high_resolution_clock::now() - trackletparsingstart;
506505
if (trackletWordsRead == -1) {
507-
//something went wrong bailout of here.
508-
if (mMaxWarnPrinted > 0) {
509-
LOG(warn) << "Tracklet parser returned -1 for link " << currentlinkindex;
510-
checkNoWarn();
511-
}
506+
// something went wrong bailout of here.
512507
mHBFoffset32 = hbfOffsetTmp + linksizeAccum32;
513508
incrementErrors(TrackletsReturnedMinusOne, halfChamberId);
514509
continue; // move to next link of this half-CRU
515510
}
516511
mHBFoffset32 += trackletWordsRead;
517512
if (mCurrentHalfCRUHeader.EventType == ETYPEPHYSICSTRIGGER &&
518513
endOfCurrentLink - mHBFoffset32 >= 8) {
514+
/*
515+
// disabled for the same reason as for the warning after the digits parsing below
519516
if (mMaxWarnPrinted > 0) {
520-
LOGF(warn, "After successfully parsing the tracklet data for link %i there are %i words remaining which did not get parsed", currentlinkindex, endOfCurrentLink - mHBFoffset32);
517+
LOGF(warn, "After successfully parsing the tracklet data for link %i there are %u words remaining which did not get parsed", currentlinkindex, endOfCurrentLink - mHBFoffset32);
521518
checkNoWarn();
522519
}
523520
incrementErrors(UnparsedTrackletDataRemaining, halfChamberId, fmt::format("On link {} there are {} words remaining which did not get parsed", currentlinkindex, endOfCurrentLink - mHBFoffset32));
521+
*/
524522
}
525523
mEventRecords.getCurrentEventRecord().incTrackletTime((double)std::chrono::duration_cast<std::chrono::microseconds>(trackletparsingtime).count());
526524
if (mOptions[TRDVerboseBit]) {
@@ -581,10 +579,14 @@ bool CruRawReader::processHalfCRU(int iteration)
581579
if (endOfCurrentLink - mHBFoffset32 >= 8) {
582580
// check if some data is lost (probably due to bug in CRU user logic)
583581
// we should have max 7 padding words to align the link to 256 bits
582+
/*
583+
// due to the current CRU bug this is almost always the case
584+
// TODO enable warning again when CRU UL is fixed
584585
if (mMaxWarnPrinted > 0) {
585-
LOGF(warn, "After successfully parsing the digit data for link %i there are %i words remaining which did not get parsed", currentlinkindex, endOfCurrentLink - mHBFoffset32);
586+
LOGF(warn, "After successfully parsing the digit data for link %i there are %u words remaining which did not get parsed", currentlinkindex, endOfCurrentLink - mHBFoffset32);
586587
checkNoWarn();
587588
}
589+
*/
588590
incrementErrors(UnparsedDigitDataRemaining, halfChamberId, fmt::format("On link {} there are {} words remaining which did not get parsed", currentlinkindex, endOfCurrentLink - mHBFoffset32));
589591
}
590592
mEventRecords.getCurrentEventRecord().incDigitTime((double)std::chrono::duration_cast<std::chrono::microseconds>(digitsparsingtime).count());
@@ -630,7 +632,7 @@ bool CruRawReader::processHalfCRU(int iteration)
630632

631633
bool CruRawReader::isTrackletHCHeaderOK(const TrackletHCHeader& header, int& hcid)
632634
{
633-
if (header.one != 1) {
635+
if (!sanityCheckTrackletHCHeader(header)) {
634636
return false;
635637
}
636638
int detHeader = HelperMethods::getDetector(((~header.supermodule) & 0x1f), ((~header.stack) & 0x7), ((~header.layer) & 0x7));
@@ -644,12 +646,10 @@ bool CruRawReader::isTrackletHCHeaderOK(const TrackletHCHeader& header, int& hci
644646
}
645647

646648
if (hcid != hcidHeader) {
647-
/* FIXME currently would be flooded by these messages, as long as CCDB object not available
648649
if (mMaxWarnPrinted > 0) {
649650
LOGF(alarm, "RDH HCID %i, TrackletHCHeader HCID %i. Taking the TrackletHCHedaer as authority", hcid, hcidHeader);
650651
checkNoWarn();
651652
}
652-
*/
653653
hcid = hcidHeader;
654654
}
655655
return (hcid == hcidHeader);
@@ -658,7 +658,6 @@ bool CruRawReader::isTrackletHCHeaderOK(const TrackletHCHeader& header, int& hci
658658
int CruRawReader::parseDigitLinkData(int maxWords32, int hcid, int& wordsRejected)
659659
{
660660
int wordsRead = 0;
661-
int numberOfDigitsFound = 0;
662661
int state = StateDigitMCMHeader;
663662
DigitMCMHeader mcmHeader;
664663
DigitMCMADCMask adcMask;
@@ -806,11 +805,7 @@ int CruRawReader::parseDigitLinkData(int maxWords32, int hcid, int& wordsRejecte
806805
else if (state == StateSecondEndmarker) {
807806
++wordsRead;
808807
if (currWord != DIGITENDMARKER) {
809-
if (mMaxWarnPrinted > 0) {
810-
LOGF(warn, "Expected second digit end marker, but found 0x%08x instead", currWord);
811-
checkNoWarn();
812-
}
813-
incrementErrors(DigitParsingNoSecondEndmarker, hcid, "No second digit end marker found");
808+
incrementErrors(DigitParsingNoSecondEndmarker, hcid, fmt::format("Expected second digit end marker, but found {:#010x} instead", currWord));
814809
return -1;
815810
}
816811
state = StateFinished;
@@ -825,11 +820,7 @@ int CruRawReader::parseDigitLinkData(int maxWords32, int hcid, int& wordsRejecte
825820
// not good, something went wrong with digit parsing
826821
// e.g. we tried to move to the end marker but reached the link size
827822
// without finding one.
828-
if (mMaxWarnPrinted > 0) {
829-
LOGF(warn, "We exited the digit parser state machine in the state %i and not in the proper finished state", state);
830-
checkNoWarn();
831-
}
832-
incrementErrors(DigitParsingExitInWrongState, hcid, "Done with digit parsing but state is not StateFinished");
823+
incrementErrors(DigitParsingExitInWrongState, hcid, fmt::format("Done with digit parsing but state is not StateFinished but in state {}", state));
833824
return -1;
834825
}
835826
}
@@ -919,16 +910,14 @@ int CruRawReader::parseTrackletLinkData(int linkSize32, int& hcid, int& wordsRej
919910
if (currWord == TRACKLETENDMARKER) {
920911
if ((hcHeader.format & 0x2) == 0x2) {
921912
// format indicates no empty MCM headers are sent, so we should not see an end marker here
922-
// TODO add error message/counter for QC
923-
LOGF(warn, "For the MCM Header 0x%08x we expected a tracklet from CPU %i, but got an endmarker instead", mcmHeader.word, iCpu);
913+
incrementErrors(TrackletDataMissing, hcid, fmt::format("For the MCM Header {:#010x} we expected a tracklet from CPU {}, but got an endmarker instead", mcmHeader.word, iCpu));
924914
}
925915
state = StateSecondEndmarker; // we expect a second tracklet end marker to follow
926916
break;
927917
}
928918
if ((currWord & 0x1) == 0x1) {
929919
// the reserved bit of the trackler MCM data is set
930-
// TODO add error message/counter for QC
931-
LOGF(warn, "Invalid word 0x%08x for the expected TrackletMCMData", currWord);
920+
incrementErrors(TrackletMCMDataFailure, hcid, fmt::format("Invalid word {:#010x} for the expected TrackletMCMData", currWord));
932921
++wordsRejected;
933922
}
934923
TrackletMCMData mcmData;
@@ -971,10 +960,7 @@ int CruRawReader::parseTrackletLinkData(int linkSize32, int& hcid, int& wordsRej
971960
else if (state == StateSecondEndmarker) {
972961
++wordsRead;
973962
if (currWord != TRACKLETENDMARKER) {
974-
if (mMaxWarnPrinted > 0) {
975-
LOGF(warn, "Expected second tracklet end marker, but found 0x%08x instead", currWord);
976-
checkNoWarn();
977-
}
963+
incrementErrors(TrackletNoSecondEndMarker, hcid, fmt::format("Expected second tracklet end marker, but found {:#010x} instead", currWord));
978964
return -1;
979965
}
980966
state = StateFinished;
@@ -1028,7 +1014,9 @@ Tracklet64 CruRawReader::assembleTracklet64(int format, TrackletMCMHeader& mcmHe
10281014
slope ^= 0x80;
10291015
uint32_t hpid = (mcmHeader.word >> (1 + cpu * 8)) & 0xff;
10301016
uint32_t lpid = mcmData.pid;
1031-
uint32_t pid = (hpid << 12) | lpid;
1017+
// The combined 20 bit PID information from the MCM header and the tracklet word
1018+
// is given by ((hpid << 12) | lpid).
1019+
// hpid holds the upper 8 bit and lpid the lower 12 bit.
10321020
int q0, q1, q2;
10331021
if (format & 0x1) {
10341022
// DQR enabled
@@ -1060,12 +1048,10 @@ void CruRawReader::dumpInputPayload() const
10601048

10611049
void CruRawReader::run()
10621050
{
1063-
/* FIXME: uncomment, when object available in CCDB
10641051
if (!mLinkMap) {
10651052
LOG(error) << "No mapping for Link ID to HCID provided from CCDB";
10661053
return;
10671054
}
1068-
*/
10691055
if (mOptions[TRDVerboseBit]) {
10701056
dumpInputPayload();
10711057
}

Detectors/TRD/reconstruction/src/DataReader.cxx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
8181

8282
WorkflowSpec workflow;
8383

84-
std::string iconfig;
85-
std::string inputDescription;
86-
int idevice = 0;
87-
auto orig = o2::header::gDataOriginTRD;
8884
auto inputs = o2::framework::select(std::string("x:TRD/RAWDATA").c_str());
8985
for (auto& inp : inputs) {
9086
// take care of case where our data is not in the time frame
@@ -94,7 +90,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
9490
inputs.emplace_back("stdDist", "FLP", "DISTSUBTIMEFRAME", 0, Lifetime::Timeframe);
9591
}
9692
inputs.emplace_back("trigoffset", "CTP", "Trig_Offset", 0, o2::framework::Lifetime::Condition, o2::framework::ccdbParamSpec("CTP/Config/TriggerOffsets"));
97-
// inputs.emplace_back("linkToHcid", "TRD", "LinkToHcid", 0, o2::framework::Lifetime::Condition, o2::framework::ccdbParamSpec("TRD/Config/LinkToHCIDMapping")); // FIXME: uncomment, when object available in CCDB
93+
inputs.emplace_back("linkToHcid", "TRD", "LinkToHcid", 0, o2::framework::Lifetime::Condition, o2::framework::ccdbParamSpec("TRD/Config/LinkToHCIDMapping"));
9894
workflow.emplace_back(DataProcessorSpec{
9995
std::string("trd-datareader"), // left as a string cast incase we append stuff to the string
10096
inputs,

Detectors/TRD/reconstruction/src/DataReaderTask.cxx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,19 @@ void DataReaderTask::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj)
4949
LOG(info) << " CTP/Config/TriggerOffsets updated.";
5050
o2::ctp::TriggerOffsetsParam::Instance().printKeyValues();
5151
return;
52-
}
53-
/* FIXME uncomment when CCDB object is available
54-
else if (matcher == ConcreteDataMatcher("TRD", "LinkToHcid", 0)) {
52+
} else if (matcher == ConcreteDataMatcher("TRD", "LinkToHcid", 0)) {
5553
LOG(info) << "Updated Link ID to HCID mapping";
5654
mReader.setLinkMap((const o2::trd::LinkToHCIDMapping*)obj);
5755
return;
5856
}
59-
*/
6057
}
6158

6259
void DataReaderTask::updateTimeDependentParams(framework::ProcessingContext& pc)
6360
{
6461
static bool updateOnlyOnce = false;
6562
if (!updateOnlyOnce) {
6663
pc.inputs().get<o2::ctp::TriggerOffsetsParam*>("trigoffset");
67-
// pc.inputs().get<o2::trd::LinkToHCIDMapping*>("linkToHcid"); FIXME uncomment when CCDB object is available
64+
pc.inputs().get<o2::trd::LinkToHCIDMapping*>("linkToHcid");
6865
updateOnlyOnce = true;
6966
}
7067
}

0 commit comments

Comments
 (0)