Skip to content

Commit b60b2ca

Browse files
wiechulashahor02
authored andcommitted
Add possibility to read data from several CRUs per file
1 parent 7246990 commit b60b2ca

File tree

3 files changed

+64
-97
lines changed

3 files changed

+64
-97
lines changed

Detectors/TPC/calibration/include/TPCCalibration/CalibRawBase.h

Lines changed: 2 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -422,94 +422,8 @@ inline CalibRawBase::ProcessStatus CalibRawBase::processEventRawReaderCRU(int ev
422422

423423
const bool skipEvent = mSkipIncomplete && !isPresentEventComplete();
424424
if (!skipEvent) {
425-
for (auto& reader_ptr : mRawReaderCRUManager.getReaders()) {
426-
auto reader = reader_ptr.get();
427-
428-
LOG(INFO) << "Processing event number " << eventNumber << " (" << mNevents << ") - RawReader#: " << processedReaders << " ptr: " << reader;
429-
430-
if (eventNumber >= 0) {
431-
mPresentEventNumber = eventNumber;
432-
} else if (eventNumber == -1) {
433-
if (mPresentEventNumber == std::numeric_limits<size_t>::max()) {
434-
mPresentEventNumber = 0;
435-
} else {
436-
mPresentEventNumber = (reader->getEventNumber() + 1) % reader->getNumberOfEvents();
437-
}
438-
} else if (eventNumber == -2) {
439-
auto readerNumber = reader->getEventNumber();
440-
if (readerNumber > 0) {
441-
mPresentEventNumber = readerNumber - 1;
442-
} else {
443-
mPresentEventNumber = reader->getNumberOfEvents() - 1;
444-
}
445-
}
446-
reader->setEventNumber(mPresentEventNumber);
447-
448-
// process data
449-
reader->processLinks();
450-
hasData = true;
451-
452-
const auto& cru = reader->getCRU();
453-
const int roc = cru.roc();
454-
455-
// TODO: OROC case needs subtraction of number of pad rows in IROC
456-
const PadRegionInfo& regionInfo = mMapper.getPadRegionInfo(cru.region());
457-
const PartitionInfo& partInfo = mMapper.getPartitionInfo(cru.partition());
458-
459-
//LOG(INFO) << " Found ADC values: " << reader->getADCMap().size();
460-
// loop over pads
461-
for (const auto& pair : reader->getADCMap()) {
462-
const auto& padPos = pair.first;
463-
const auto& dataVector = pair.second;
464-
465-
// TODO: fix this?
466-
mProcessedTimeBins = std::max(mProcessedTimeBins, dataVector.size());
467-
468-
// row is local in region (CRU)
469-
const int row = padPos.getRow();
470-
const int pad = padPos.getPad();
471-
if (row == 255 || pad == 255)
472-
continue;
473-
474-
int timeBin = 0;
475-
476-
int rowOffset = 0;
477-
switch (mPadSubset) {
478-
case PadSubset::ROC: {
479-
rowOffset = regionInfo.getGlobalRowOffset();
480-
rowOffset -= (cru.isOROC()) * nRowIROC;
481-
break;
482-
}
483-
case PadSubset::Region: {
484-
break;
485-
}
486-
case PadSubset::Partition: {
487-
rowOffset = regionInfo.getGlobalRowOffset();
488-
rowOffset -= partInfo.getGlobalRowOffset();
489-
break;
490-
}
491-
}
492-
493-
//const FECInfo& fecInfo = mMapper.getFECInfo(PadROCPos(roc, row, pad));
494-
495-
for (const auto& signalI : dataVector) {
496-
// modify row depending on the calibration type used
497-
const float signal = float(signalI);
498-
//printf("Call update: %d, %d (%d), %d, %d, %.3f -- cru: %03d, reg: %02d -- FEC: %02d, Chip: %02d, Chn: %02d\n", roc, row, rowOffset, pad, timeBin, signal, cru.number(), cru.region(), fecInfo.getIndex(), fecInfo.getSampaChip(), fecInfo.getSampaChannel());
499-
updateCRU(cru, row, pad, timeBin, signal);
500-
updateROC(roc, row + rowOffset, pad, timeBin, signal);
501-
++timeBin;
502-
hasData = true;
503-
}
504-
}
505-
LOG(INFO) << "Found time bins: " << mProcessedTimeBins << "\n";
506-
507-
reader->clearMap();
508-
509-
// notify that one raw reader processing finalized for this event
510-
endReader();
511-
++processedReaders;
512-
}
425+
hasData = true;
426+
mRawReaderCRUManager.processEvent(mPresentEventNumber, [this]() { endReader(); });
513427
// set status, don't overwrite decision
514428
if (!hasData) {
515429
return ProcessStatus::NoMoreData;

Detectors/TPC/reconstruction/include/TPCReconstruction/RawReaderCRU.h

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,9 @@ class RawReaderCRUEventSync
303303

304304
using RDH = o2::header::RAWDataHeader;
305305

306+
/// default ctor
307+
RawReaderCRUEventSync() { reset(); }
308+
306309
// ---------------------------------------------------------------------------
307310
/// \struct LinkInfo
308311
/// \brief helper to store link information in an event
@@ -449,13 +452,19 @@ class RawReaderCRUEventSync
449452
void setLinksSeen(const CRU cru, const std::bitset<MaxNumberOfLinks>& links);
450453

451454
/// set a cru as seen
452-
void setCRUSeen(const CRU cru) { mCRUSeen[cru] = true; }
455+
void setCRUSeen(const CRU cru, const uint16_t reader = 0) { mCRUSeen[cru] = reader; }
456+
457+
/// return CRU seen information
458+
const auto& getCRUSeen() const { return mCRUSeen; }
459+
460+
/// get the reader associated to the CRU
461+
uint32_t getReaderNumber(uint32_t cru) { return mCRUSeen[cru]; }
453462

454463
/// reset all information
455464
void reset()
456465
{
457466
mEventInformation.clear();
458-
mCRUSeen.reset();
467+
mCRUSeen.fill(-1);
459468
}
460469

461470
/// overloading output stream operator
@@ -466,9 +475,9 @@ class RawReaderCRUEventSync
466475
}
467476

468477
private:
469-
EventInfoVector mEventInformation{}; ///< event information
470-
EventInfo* mLastEvent{nullptr}; ///< Last event that was created
471-
std::bitset<CRU::MaxCRU> mCRUSeen{}; ///< if cru was seen
478+
EventInfoVector mEventInformation{}; ///< event information
479+
EventInfo* mLastEvent{nullptr}; ///< Last event that was created
480+
std::array<int16_t, CRU::MaxCRU> mCRUSeen{}; ///< if cru was seen, number is for which decoder
472481

473482
ClassDefNV(RawReaderCRUEventSync, 0); // event synchronisation for raw reader instances
474483
}; // class RawReaderCRUEventSync
@@ -493,12 +502,14 @@ class RawReaderCRU
493502
uint32_t stream = 0,
494503
uint32_t debugLevel = 0,
495504
uint32_t verbosity = 0,
496-
const std::string_view outputFilePrefix = "")
505+
const std::string_view outputFilePrefix = "",
506+
uint32_t readerNumber = 0)
497507
: mDebugLevel(debugLevel),
498508
mVerbosity(verbosity),
499509
mNumTimeBins(numTimeBins),
500510
mLink(link),
501511
mStream(stream),
512+
mReaderNumber(readerNumber),
502513
mCRU(),
503514
mFileSize(-1),
504515
mPacketsPerLink(),
@@ -544,9 +555,15 @@ class RawReaderCRU
544555
/// set event number
545556
void setEventNumber(uint32_t eventNumber = 0) { mEventNumber = eventNumber; }
546557

558+
/// set the reader number in the manager
559+
void setReaderNumber(uint32_t readerNumber) { mReaderNumber = readerNumber; }
560+
547561
/// set filling of ADC data map
548562
void setFillADCdataMap(bool fill) { mFillADCdataMap = fill; }
549563

564+
/// get filling of ADC data map
565+
bool getFillADCdataMap() const { return mFillADCdataMap; }
566+
550567
/// get event number
551568
uint32_t getEventNumber() const { return mEventNumber; }
552569

@@ -699,6 +716,7 @@ class RawReaderCRU
699716
uint32_t mLink; ///< present link being processed
700717
uint32_t mStream; ///< present stream being processed
701718
uint32_t mEventNumber = 0; ///< current event number to process
719+
uint32_t mReaderNumber = 0; ///< raw reader number in manager
702720
CRU mCRU; ///< CRU
703721
size_t mFileSize; ///< size of the input file
704722
bool mDumpTextFiles = false; ///< dump debugging text files
@@ -851,6 +869,7 @@ class RawReaderCRUManager
851869
{
852870
public:
853871
using ADCDataCallback = std::function<Int_t(const PadROCPos&, const CRU&, const gsl::span<const uint32_t>)>;
872+
using EndReaderCallback = std::function<void()>;
854873

855874
/// constructor
856875
RawReaderCRUManager() = default;
@@ -865,7 +884,7 @@ class RawReaderCRUManager
865884
const std::string_view outputFilePrefix = "")
866885
//RawReaderCRU& createReader(std::string_view fileName, uint32_t numTimeBins)
867886
{
868-
mRawReadersCRU.emplace_back(std::make_unique<RawReaderCRU>(inputFileName, numTimeBins, 0, stream, debugLevel, verbosity, outputFilePrefix));
887+
mRawReadersCRU.emplace_back(std::make_unique<RawReaderCRU>(inputFileName, numTimeBins, 0, stream, debugLevel, verbosity, outputFilePrefix, mRawReadersCRU.size()));
869888
mRawReadersCRU.back()->setManager(this);
870889
return *mRawReadersCRU.back().get();
871890
}
@@ -948,6 +967,9 @@ class RawReaderCRUManager
948967
/// set a callback function
949968
void setADCDataCallback(ADCDataCallback function) { mADCDataCallback = function; }
950969

970+
/// process event calling mADCDataCallback to process values
971+
void processEvent(uint32_t eventNumber, EndReaderCallback endReader = nullptr);
972+
951973
private:
952974
std::vector<std::unique_ptr<RawReaderCRU>> mRawReadersCRU{}; ///< cru type raw readers
953975
RawReaderCRUEventSync mEventSync{}; ///< event synchronisation

Detectors/TPC/reconstruction/src/RawReaderCRU.cxx

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void RawReaderCRUEventSync::analyse()
8080
for (size_t iCRU = 0; iCRU < event.CRUInfoArray.size(); ++iCRU) {
8181
const auto& cruInfo = event.CRUInfoArray[iCRU];
8282
if (!cruInfo.isPresent()) {
83-
if (mCRUSeen[iCRU]) {
83+
if (mCRUSeen[iCRU] >= 0) {
8484
event.IsComplete = false;
8585
break;
8686
}
@@ -125,6 +125,14 @@ void RawReaderCRUEventSync::streamTo(std::ostream& output) const
125125
const std::string bold("\033[1m");
126126
const std::string clear("\033[0m");
127127

128+
std::cout << "CRU information";
129+
for (size_t iCRU = 0; iCRU < mCRUSeen.size(); ++iCRU) {
130+
const auto readerNumber = mCRUSeen[iCRU];
131+
if (readerNumber >= 0) {
132+
std::cout << fmt::format("CRU {:2} found in reader {}\n", iCRU, readerNumber);
133+
}
134+
}
135+
128136
std::cout << "Detailed event information\n";
129137
// event loop
130138
for (int i = 0; i < mEventInformation.size(); ++i) {
@@ -291,7 +299,7 @@ int RawReaderCRU::scanFile()
291299
lastHeartbeatOrbit = heartbeatOrbit;
292300
}
293301
linkInfo = &mManager->mEventSync.getLinkInfo(rdh, mManager->getDataType());
294-
mManager->mEventSync.setCRUSeen(mCRU);
302+
mManager->mEventSync.setCRUSeen(mCRU, mReaderNumber);
295303
}
296304
//std::cout << "block length: " << blockLength << '\n';
297305

@@ -1021,6 +1029,7 @@ void RawReaderCRUManager::setupReaders(const std::string_view inputFileNames,
10211029
for (auto file : *arr) {
10221030
// fix the number of time bins
10231031
auto& reader = createReader(file->GetName(), numTimeBins);
1032+
reader.setReaderNumber(mRawReadersCRU.size() - 1);
10241033
reader.setVerbosity(verbosity);
10251034
reader.setDebugLevel(debugLevel);
10261035
O2INFO("Adding file: %s\n", file->GetName());
@@ -1042,3 +1051,25 @@ void RawReaderCRUManager::copyEvents(const std::string_view inputFileNames, cons
10421051
manager.setupReaders(inputFileNames);
10431052
manager.copyEvents(eventNumbers, outputDirectory, mode);
10441053
}
1054+
1055+
void RawReaderCRUManager::processEvent(uint32_t eventNumber, EndReaderCallback endReader)
1056+
{
1057+
const auto& cruSeen = mEventSync.getCRUSeen();
1058+
1059+
for (size_t iCRU = 0; iCRU < cruSeen.size(); ++iCRU) {
1060+
const auto readerNumber = cruSeen[iCRU];
1061+
if (readerNumber >= 0) {
1062+
auto& reader = mRawReadersCRU[readerNumber];
1063+
if (reader->getFillADCdataMap()) {
1064+
LOGF(warning, "Filling of ADC data map not supported in RawReaderCRUManager::processEvent, it is disabled now. use ADCDataCallback");
1065+
reader->setFillADCdataMap(false);
1066+
}
1067+
reader->setEventNumber(eventNumber);
1068+
reader->forceCRU(iCRU);
1069+
reader->processLinks();
1070+
if (endReader) {
1071+
endReader();
1072+
}
1073+
}
1074+
}
1075+
}

0 commit comments

Comments
 (0)