12#ifndef ALICEO2_TPC_CALIBRAWBASE_H_
13#define ALICEO2_TPC_CALIBRAWBASE_H_
75 const Int_t timeBin,
const Float_t signal) = 0;
85 const Int_t timeBin,
const Float_t signal) = 0;
172 int mTimeBinsPerCall;
173 size_t mProcessedTimeBins;
174 size_t mPresentEventNumber;
175 bool mSkipIncomplete{
true};
178 std::vector<std::unique_ptr<GBTFrameContainer>> mGBTFrameContainers;
179 std::vector<std::unique_ptr<RawReader>> mRawReaders;
182 std::unique_ptr<TChain> mDigitTree{};
186 template <
typename T>
187 bool fillFromDigits(std::array<T, Sector::MAXSECTOR>&
digits);
196 ProcessStatus processEventRawReaderCRU(
int eventNumber = -1);
210 if (mGBTFrameContainers.size()) {
212 }
else if (mRawReaders.size()) {
216 }
else if (mDigitTree) {
217 return mDigitTree->GetEntries();
218 }
else if (mExternalDigits) {
227 if (mGBTFrameContainers.size()) {
228 return processEventGBT();
229 }
else if (mRawReaders.size()) {
230 return processEventRawReader(eventNumber);
232 return processEventRawReaderCRU(eventNumber);
233 }
else if (mDigitTree) {
234 return processEventDigitTree(eventNumber);
235 }
else if (mExternalDigits) {
236 return processExternalDigits();
245 if (!mGBTFrameContainers.size()) {
257 std::vector<Digit>
digits(80);
258 for (
auto& reader_ptr : mGBTFrameContainers) {
259 auto reader = reader_ptr.get();
260 int readTimeBins = 0;
261 for (
int i = 0;
i < mTimeBinsPerCall; ++
i) {
262 if (reader->getData(
digits)) {
263 for (
auto& digi :
digits) {
264 CRU cru(digi.getCRU());
265 const int roc = cru.roc();
271 const int row = digi.getRow();
272 const int pad = digi.getPad();
273 if (
row == 255 || pad == 255) {
278 switch (mPadSubset) {
280 rowOffset = regionInfo.getGlobalRowOffset();
281 rowOffset -= (cru.isOROC()) * nRowIROC;
288 rowOffset = regionInfo.getGlobalRowOffset();
289 rowOffset -= partInfo.getGlobalRowOffset();
295 const int timeBin =
i;
296 const float signal = digi.getChargeFloat();
309 if (readTimeBins == 0) {
311 }
else if (readTimeBins < mTimeBinsPerCall) {
328 if (!mRawReaders.size()) {
340 mProcessedTimeBins = 0;
341 size_t processedReaders = 0;
344 int64_t lastEvent = 0;
345 for (
auto& reader_ptr : mRawReaders) {
346 auto reader = reader_ptr.get();
348 lastEvent = std::max(lastEvent, reader->getLastEvent());
350 if (eventNumber >= 0) {
351 reader->loadEvent(eventNumber);
352 mPresentEventNumber = eventNumber;
353 }
else if (eventNumber == -1) {
354 mPresentEventNumber = reader->loadNextEvent();
355 }
else if (eventNumber == -2) {
356 mPresentEventNumber = reader->loadPreviousEvent();
360 while (std::shared_ptr<std::vector<uint16_t>>
data = reader->getNextData(padPos)) {
365 mProcessedTimeBins = std::max(mProcessedTimeBins,
data->size());
367 CRU cru(reader->getRegion());
368 const int roc = cru.roc();
374 const int row = padPos.getRow();
375 const int pad = padPos.getPad();
376 if (
row == 255 || pad == 255) {
381 for (
const auto& signalI : *
data) {
384 switch (mPadSubset) {
386 rowOffset = regionInfo.getGlobalRowOffset();
394 rowOffset = regionInfo.getGlobalRowOffset();
395 rowOffset -= partInfo.getGlobalRowOffset();
401 const float signal =
float(signalI);
419 }
else if (processedReaders < mRawReaders.size()) {
421 }
else if (mPresentEventNumber ==
size_t(lastEvent)) {
438 mRawReaderCRUManager.
init();
444 mProcessedTimeBins = 0;
448 const int64_t lastEvent = numberOfEvents - 1;
450 if (eventNumber >= 0) {
451 mPresentEventNumber = eventNumber;
452 }
else if (eventNumber == -1) {
453 if (mPresentEventNumber == std::numeric_limits<size_t>::max()) {
454 mPresentEventNumber = 0;
456 mPresentEventNumber = (mPresentEventNumber + 1) % numberOfEvents;
458 }
else if (eventNumber == -2) {
459 if (mPresentEventNumber > 0) {
460 mPresentEventNumber -= 1;
462 mPresentEventNumber = numberOfEvents - 1;
475 }
else if (mPresentEventNumber >=
size_t(lastEvent)) {
483 if (mPresentEventNumber >=
size_t(lastEvent)) {
488 LOG(info) <<
"Present event number : " << mPresentEventNumber << (skipEvent ?
" (skipped, incomplete)" :
"");
489 LOG(info) <<
"Last event : " << lastEvent;
490 LOG(info) <<
"Status : " <<
int(status);
506 mProcessedTimeBins = 0;
508 const int64_t numberOfEvents = mDigitTree->GetEntries();
509 const int64_t lastEvent = numberOfEvents - 1;
511 if (eventNumber >= 0) {
512 mPresentEventNumber = eventNumber;
513 }
else if (eventNumber == -1) {
514 if (mPresentEventNumber == std::numeric_limits<size_t>::max()) {
515 mPresentEventNumber = 0;
517 mPresentEventNumber = (mPresentEventNumber + 1) % numberOfEvents;
519 }
else if (eventNumber == -2) {
520 if (mPresentEventNumber > 0) {
521 mPresentEventNumber -= 1;
523 mPresentEventNumber = numberOfEvents - 1;
526 LOG(info) <<
"Processing event number " << mPresentEventNumber <<
" (" << mNevents <<
")";
530 if (!mDigitTree->GetBranch(
"TPCDigit_0")->GetAddress()) {
532 mDigitTree->SetBranchAddress(Form(
"TPCDigit_%d", iSec), &
digits[iSec]);
543 mDigitTree->GetEntry(mPresentEventNumber);
547 LOG(info) <<
"Found time bins: " << mProcessedTimeBins <<
"\n";
551 }
else if (mPresentEventNumber ==
size_t(lastEvent)) {
559 LOG(info) <<
"Present event number : " << mPresentEventNumber;
560 LOG(info) <<
"Last event : " << lastEvent;
561 LOG(info) <<
"Status : " <<
int(status);
570 if (!mExternalDigits) {
575 const bool hasData = fillFromDigits(*mExternalDigits);
577 LOG(info) <<
"Found time bins: " << mProcessedTimeBins <<
"\n";
595 const int pad = padROCPos.
getPad();
596 if (
row == 255 || pad == 255) {
603 const int globalRow =
row + (cru.
isOROC()) * nRowIROC;
604 const int rowInRegion = globalRow - regionInfo.getGlobalRowOffset();
606 switch (mPadSubset) {
615 rowOffset = (cru.
isOROC()) * nRowIROC;
626 for (
int i = 0;
i <
data.size();
i += 16) {
627 const float signal = float(
data[
i]);
630 updateCRU(cru, rowInRegion, pad, timeBin, signal);
639bool CalibRawBase::fillFromDigits(std::array<T, Sector::MAXSECTOR>&
digits)
641 using digitVec_t =
typename std::conditional<std::is_pointer_v<T>, T,
typename std::add_pointer<T>::type>
::type;
644 for (
auto& vecSector :
digits) {
645 digitVec_t vecDigits;
646 if constexpr (std::is_pointer_v<T>) {
647 vecDigits = vecSector;
649 vecDigits = &vecSector;
651 for (
const auto& digit : *vecDigits) {
654 const CRU cru(digit.getCRU());
655 const int roc = cru.roc();
656 const int row = digit.getRow();
657 const int pad = digit.getPad();
658 const size_t timeBin = digit.getTimeStamp();
660 mProcessedTimeBins = std::max(mProcessedTimeBins, timeBin);
666 if (
row == 255 || pad == 255) {
671 switch (mPadSubset) {
680 rowOffset -= partInfo.getGlobalRowOffset();
686 const float signal = digit.getChargeFloat();
Container class for the GBT Frames.
std::enable_if_t< std::is_signed< T >::value, bool > hasData(const CalArray< T > &cal)
unsigned char region() const
unsigned char partition() const
Base class for raw data calibrations.
size_t getPresentEventNumber() const
get present event number
void setNumberOfProcessedTimeBins(size_t timeBins)
number of processed time bins in last event
PadSubset getPadSubset() const
return pad subset type used
virtual ~CalibRawBase()=default
bool getSkipIncompleteEvents() const
get skipping of incomplete events
Int_t update(const PadROCPos &padROCPos, const CRU &cru, const gsl::span< const uint32_t > data)
void incrementNEvents()
increment number of events
virtual Int_t updateROC(const Int_t roc, const Int_t row, const Int_t pad, const Int_t timeBin, const Float_t signal)=0
void addGBTFrameContainer(GBTFrameContainer *cont)
add GBT frame container to process
virtual void endEvent()=0
void setDebugLevel(int debugLevel=1)
bool isPresentEventValie() const
void setDigits(std::array< std::vector< Digit >, Sector::MAXSECTOR > *digits)
set external digits
virtual void dumpToFile(const std::string filename, uint32_t type=0)
Dump the relevant data to file.
int getNumberOfEvents() const
return number of events
void setTimeBinsPerCall(Int_t nTimeBins)
set number of time bins to process in one call to processEvent
virtual void resetEvent()=0
ProcessStatus processEvent(int eventNumber=-1)
void setupContainers(TString fileInfo, uint32_t verbosity=0, uint32_t debugLevel=0)
void rewindEvents()
Rewind the events.
@ Truncated
Read fewer time bins than mTimeBinsPerCall.
@ NoMoreData
No data read.
@ NoReaders
No raw reader configures.
@ IncompleteEvent
Read data is incomplete.
int mDebugLevel
debug level
bool isPresentEventComplete() const
check if present event is complete
void setSkipIncompleteEvents(bool skip)
set skipping of incomplete events
size_t getNumberOfProcessedEvents() const
number of processed events
CalibRawBase(PadSubset padSubset=PadSubset::ROC)
void setPresentEventNumber(size_t eventNr)
set present event number
const Mapper & mMapper
TPC mapper.
int getDebugLevel() const
Debug level.
void addRawReader(RawReader *reader)
add RawReader
size_t getNumberOfProcessedTimeBins() const
number of processed time bins in last event
Int_t getTimeBinsPerCall() const
return the number of time bins processed in one call to processEvent
virtual Int_t updateCRU(const CRU &cru, const Int_t row, const Int_t pad, const Int_t timeBin, const Float_t signal)=0
GBT Frame container class.
const PartitionInfo & getPartitionInfo(const unsigned char partition) const
int getNumberOfRowsROC(ROC roc) const
const PadRegionInfo & getPadRegionInfo(const unsigned char region) const
Pad and row inside a ROC.
const ROC & getROC() const
unsigned char getGlobalRowOffset() const
static constexpr int MAXSECTOR
void init()
initialize all readers
void processEvent(uint32_t eventNumber, EndReaderCallback endReader=nullptr)
process event calling mADCDataCallback to process values
auto getNumberOfReaders() const
return number of configured raw readers
size_t getNumberOfEvents() const
get number of all events
bool isEventComplete(size_t eventNumber) const
check if event is complete
GLint GLint GLsizei GLint GLenum GLenum type
PadSubset
Definition of the different pad subsets.
@ Partition
Partitions (up to 36*5)
@ Region
Regions (up to 36*10)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
std::vector< o2::ctf::BufferType > vec
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits