Project
Loading...
Searching...
No Matches
CalibRawBase.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef ALICEO2_TPC_CALIBRAWBASE_H_
13#define ALICEO2_TPC_CALIBRAWBASE_H_
14
17
18#include <limits>
19#include <vector>
20#include <memory>
21#include <algorithm>
22#include <gsl/span>
23
24#include "TString.h"
25#include "Rtypes.h"
26#include "TChain.h"
27
28#include "DataFormatsTPC/Defs.h"
29#include "TPCBase/Mapper.h"
30#include "TPCBase/PadROCPos.h"
31
36
37namespace o2
38{
39namespace tpc
40{
41
50
52{
53 public:
54 enum class ProcessStatus : char {
55 Ok,
56 Truncated,
58 LastEvent,
59 NoReaders,
61 };
62
63 CalibRawBase(PadSubset padSubset = PadSubset::ROC) : mMapper(Mapper::instance()), mDebugLevel(0), mNevents(0), mTimeBinsPerCall(500), mProcessedTimeBins(0), mPresentEventNumber(std::numeric_limits<size_t>::max()), mPadSubset(padSubset), mGBTFrameContainers(), mRawReaders() { ; }
64
65 virtual ~CalibRawBase() = default;
66
74 virtual Int_t updateROC(const Int_t roc, const Int_t row, const Int_t pad,
75 const Int_t timeBin, const Float_t signal) = 0;
76
84 virtual Int_t updateCRU(const CRU& cru, const Int_t row, const Int_t pad,
85 const Int_t timeBin, const Float_t signal) = 0;
86
87 Int_t update(const PadROCPos& padROCPos, const CRU& cru, const gsl::span<const uint32_t> data);
88
90 void addGBTFrameContainer(GBTFrameContainer* cont) { mGBTFrameContainers.push_back(std::unique_ptr<GBTFrameContainer>(cont)); }
91
93 void addRawReader(RawReader* reader) { mRawReaders.push_back(std::unique_ptr<RawReader>(reader)); }
94
96 void setTimeBinsPerCall(Int_t nTimeBins) { mTimeBinsPerCall = nTimeBins; }
97
99 Int_t getTimeBinsPerCall() const { return mTimeBinsPerCall; }
100
102 PadSubset getPadSubset() const { return mPadSubset; }
103
106 ProcessStatus processEvent(int eventNumber = -1);
107
112 void setupContainers(TString fileInfo, uint32_t verbosity = 0, uint32_t debugLevel = 0);
113
116 void setDebugLevel(int debugLevel = 1) { mDebugLevel = debugLevel; }
117
119 void rewindEvents();
120
122 virtual void dumpToFile(const std::string filename, uint32_t type = 0) {}
123
125 void incrementNEvents() { ++mNevents; }
126
128 size_t getNumberOfProcessedEvents() const { return mNevents; }
129
131 void setPresentEventNumber(size_t eventNr) { mPresentEventNumber = eventNr; }
132
134 size_t getPresentEventNumber() const { return mPresentEventNumber; }
135
136 bool isPresentEventValie() const { return mPresentEventNumber != std::numeric_limits<size_t>::max(); }
137
139 int getNumberOfEvents() const;
140
142 bool isPresentEventComplete() const { return mRawReaderCRUManager.isEventComplete(mPresentEventNumber); }
143
145 void setNumberOfProcessedTimeBins(size_t timeBins) { mProcessedTimeBins = timeBins; }
146
148 size_t getNumberOfProcessedTimeBins() const { return mProcessedTimeBins; }
149
151 int getDebugLevel() const { return mDebugLevel; }
152
154 void setSkipIncompleteEvents(bool skip) { mSkipIncomplete = skip; }
155
157 bool getSkipIncompleteEvents() const { return mSkipIncomplete; }
158
160 void setDigits(std::array<std::vector<Digit>, Sector::MAXSECTOR>* digits) { mExternalDigits = digits; }
161
162 virtual void resetEvent() = 0;
163 virtual void endEvent() = 0;
164 virtual void endReader(){};
165
166 protected:
169
170 private:
171 size_t mNevents;
172 int mTimeBinsPerCall;
173 size_t mProcessedTimeBins;
174 size_t mPresentEventNumber;
175 bool mSkipIncomplete{true};
176
177 PadSubset mPadSubset;
178 std::vector<std::unique_ptr<GBTFrameContainer>> mGBTFrameContainers;
179 std::vector<std::unique_ptr<RawReader>> mRawReaders;
180 rawreader::RawReaderCRUManager mRawReaderCRUManager{};
181
182 std::unique_ptr<TChain> mDigitTree{};
183 std::array<std::vector<Digit>, Sector::MAXSECTOR>* mExternalDigits{nullptr};
184
186 template <typename T>
187 bool fillFromDigits(std::array<T, Sector::MAXSECTOR>& digits);
188
190 ProcessStatus processEventGBT();
191
193 ProcessStatus processEventRawReader(int eventNumber = -1);
194
196 ProcessStatus processEventRawReaderCRU(int eventNumber = -1);
197
199 ProcessStatus processEventDigitTree(int eventNumber = -1);
200
202 ProcessStatus processExternalDigits();
203};
204
205//----------------------------------------------------------------
206// Inline Functions
207//----------------------------------------------------------------
209{
210 if (mGBTFrameContainers.size()) {
211 return 0; // to be checked
212 } else if (mRawReaders.size()) {
213 return 0; // to be checked
214 } else if (mRawReaderCRUManager.getNumberOfReaders()) {
215 return mRawReaderCRUManager.getNumberOfEvents();
216 } else if (mDigitTree) {
217 return mDigitTree->GetEntries();
218 } else if (mExternalDigits) {
219 return 1;
220 } else {
221 return 0;
222 }
223}
224
226{
227 if (mGBTFrameContainers.size()) {
228 return processEventGBT();
229 } else if (mRawReaders.size()) {
230 return processEventRawReader(eventNumber);
231 } else if (mRawReaderCRUManager.getNumberOfReaders()) {
232 return processEventRawReaderCRU(eventNumber);
233 } else if (mDigitTree) {
234 return processEventDigitTree(eventNumber);
235 } else if (mExternalDigits) {
236 return processExternalDigits();
237 } else {
239 }
240}
241
242//______________________________________________________________________________
243inline CalibRawBase::ProcessStatus CalibRawBase::processEventGBT()
244{
245 if (!mGBTFrameContainers.size()) {
247 }
248 resetEvent();
249
250 // loop over raw readers, fill digits for 500 time bins and process
251 // digits
252
253 const int nRowIROC = mMapper.getNumberOfRowsROC(0);
254
256
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();
266 // TODO: OROC case needs subtraction of number of pad rows in IROC
267 const PadRegionInfo& regionInfo = mMapper.getPadRegionInfo(cru.region());
268 const PartitionInfo& partInfo = mMapper.getPartitionInfo(cru.partition());
269
270 // row is local in region (CRU)
271 const int row = digi.getRow();
272 const int pad = digi.getPad();
273 if (row == 255 || pad == 255) {
274 continue;
275 }
276
277 int rowOffset = 0;
278 switch (mPadSubset) {
279 case PadSubset::ROC: {
280 rowOffset = regionInfo.getGlobalRowOffset();
281 rowOffset -= (cru.isOROC()) * nRowIROC;
282 break;
283 }
284 case PadSubset::Region: {
285 break;
286 }
288 rowOffset = regionInfo.getGlobalRowOffset();
289 rowOffset -= partInfo.getGlobalRowOffset();
290 break;
291 }
292 }
293
294 // modify row depending on the calibration type used
295 const int timeBin = i; // digi.getTimeStamp();
296 const float signal = digi.getChargeFloat();
297
298 updateCRU(cru, row, pad, timeBin, signal);
299 updateROC(roc, row + rowOffset, pad, timeBin, signal);
300 }
301 ++readTimeBins;
302 }
303
304 digits.clear();
305 }
306
307 // set status, don't overwrite decision
308 if (status == ProcessStatus::Ok) {
309 if (readTimeBins == 0) {
311 } else if (readTimeBins < mTimeBinsPerCall) {
313 }
314 }
315
316 // notify that one raw reader processing finalized for this event
317 endReader();
318 }
319
320 endEvent();
321 ++mNevents;
322 return status;
323}
324
325//______________________________________________________________________________
326inline CalibRawBase::ProcessStatus CalibRawBase::processEventRawReader(int eventNumber)
327{
328 if (!mRawReaders.size()) {
330 }
331 resetEvent();
332
333 // loop over raw readers, fill digits for 500 time bins and process
334 // digits
335
336 const int nRowIROC = mMapper.getNumberOfRowsROC(0);
337
339
340 mProcessedTimeBins = 0;
341 size_t processedReaders = 0;
342 bool hasData = false;
343
344 int64_t lastEvent = 0;
345 for (auto& reader_ptr : mRawReaders) {
346 auto reader = reader_ptr.get();
347
348 lastEvent = std::max(lastEvent, reader->getLastEvent());
349
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();
357 }
358
359 o2::tpc::PadPos padPos;
360 while (std::shared_ptr<std::vector<uint16_t>> data = reader->getNextData(padPos)) {
361 if (!data) {
362 continue;
363 }
364
365 mProcessedTimeBins = std::max(mProcessedTimeBins, data->size());
366
367 CRU cru(reader->getRegion());
368 const int roc = cru.roc();
369 // TODO: OROC case needs subtraction of number of pad rows in IROC
370 const PadRegionInfo& regionInfo = mMapper.getPadRegionInfo(cru.region());
371 const PartitionInfo& partInfo = mMapper.getPartitionInfo(cru.partition());
372
373 // row is local in region (CRU)
374 const int row = padPos.getRow();
375 const int pad = padPos.getPad();
376 if (row == 255 || pad == 255) {
377 continue;
378 }
379
380 int timeBin = 0;
381 for (const auto& signalI : *data) {
382
383 int rowOffset = 0;
384 switch (mPadSubset) {
385 case PadSubset::ROC: {
386 rowOffset = regionInfo.getGlobalRowOffset();
387 rowOffset -= (cru.rocType() == RocType::OROC) * nRowIROC;
388 break;
389 }
390 case PadSubset::Region: {
391 break;
392 }
394 rowOffset = regionInfo.getGlobalRowOffset();
395 rowOffset -= partInfo.getGlobalRowOffset();
396 break;
397 }
398 }
399
400 // modify row depending on the calibration type used
401 const float signal = float(signalI);
402 // const FECInfo& fecInfo = mTPCmapper.getFECInfo(PadSecPos(roc, row, pad));
403 // printf("Call update: %d, %d, %d, %d (%d), %.3f -- reg: %02d -- FEC: %02d, Chip: %02d, Chn: %02d\n", roc, row, pad, timeBin, i, signal, cru.region(), fecInfo.getIndex(), fecInfo.getSampaChip(), fecInfo.getSampaChannel());
404 updateCRU(cru, row, pad, timeBin, signal);
405 updateROC(roc, row + rowOffset, pad, timeBin, signal);
406 ++timeBin;
407 hasData = true;
408 }
409 }
410
411 // notify that one raw reader processing finalized for this event
412 endReader();
413 ++processedReaders;
414 }
415
416 // set status, don't overwrite decision
417 if (!hasData) {
419 } else if (processedReaders < mRawReaders.size()) {
421 } else if (mPresentEventNumber == size_t(lastEvent)) {
423 }
424
425 endEvent();
426 ++mNevents;
427 return status;
428}
429
430//______________________________________________________________________________
431inline CalibRawBase::ProcessStatus CalibRawBase::processEventRawReaderCRU(int eventNumber)
432{
433 if (!mRawReaderCRUManager.getNumberOfReaders()) {
435 }
436 resetEvent();
437
438 mRawReaderCRUManager.init();
439
440 const int nRowIROC = mMapper.getNumberOfRowsROC(0);
441
443
444 mProcessedTimeBins = 0;
445 bool hasData = false;
446
447 const int64_t numberOfEvents = mRawReaderCRUManager.getNumberOfEvents();
448 const int64_t lastEvent = numberOfEvents - 1;
449
450 if (eventNumber >= 0) {
451 mPresentEventNumber = eventNumber;
452 } else if (eventNumber == -1) {
453 if (mPresentEventNumber == std::numeric_limits<size_t>::max()) {
454 mPresentEventNumber = 0;
455 } else {
456 mPresentEventNumber = (mPresentEventNumber + 1) % numberOfEvents;
457 }
458 } else if (eventNumber == -2) {
459 if (mPresentEventNumber > 0) {
460 mPresentEventNumber -= 1;
461 } else {
462 mPresentEventNumber = numberOfEvents - 1;
463 }
464 }
465
466 const bool skipEvent = mSkipIncomplete && !isPresentEventComplete();
467 if (!skipEvent) {
468 hasData = true;
469 mRawReaderCRUManager.processEvent(mPresentEventNumber, [this]() { endReader(); });
470 // set status, don't overwrite decision
471 if (!hasData) {
473 } else if (!isPresentEventComplete()) {
475 } else if (mPresentEventNumber >= size_t(lastEvent)) {
477 }
478
479 endEvent();
480 ++mNevents;
481 } else {
483 if (mPresentEventNumber >= size_t(lastEvent)) {
485 }
486 }
487
488 LOG(info) << "Present event number : " << mPresentEventNumber << (skipEvent ? " (skipped, incomplete)" : "");
489 LOG(info) << "Last event : " << lastEvent;
490 LOG(info) << "Status : " << int(status);
491
492 return status;
493}
494
495//______________________________________________________________________________
496inline CalibRawBase::ProcessStatus CalibRawBase::processEventDigitTree(int eventNumber)
497{
498
499 if (!mDigitTree) {
501 }
502 resetEvent();
503
505
506 mProcessedTimeBins = 0;
507
508 const int64_t numberOfEvents = mDigitTree->GetEntries();
509 const int64_t lastEvent = numberOfEvents - 1;
510
511 if (eventNumber >= 0) {
512 mPresentEventNumber = eventNumber;
513 } else if (eventNumber == -1) {
514 if (mPresentEventNumber == std::numeric_limits<size_t>::max()) {
515 mPresentEventNumber = 0;
516 } else {
517 mPresentEventNumber = (mPresentEventNumber + 1) % numberOfEvents;
518 }
519 } else if (eventNumber == -2) {
520 if (mPresentEventNumber > 0) {
521 mPresentEventNumber -= 1;
522 } else {
523 mPresentEventNumber = numberOfEvents - 1;
524 }
525 }
526 LOG(info) << "Processing event number " << mPresentEventNumber << " (" << mNevents << ")";
527
528 // set up branches
529 static std::array<std::vector<Digit>*, Sector::MAXSECTOR> digits{};
530 if (!mDigitTree->GetBranch("TPCDigit_0")->GetAddress()) {
531 for (int iSec = 0; iSec < Sector::MAXSECTOR; ++iSec) {
532 mDigitTree->SetBranchAddress(Form("TPCDigit_%d", iSec), &digits[iSec]);
533 }
534 }
535
536 for (auto vec : digits) {
537 if (vec) {
538 vec->clear();
539 }
540 }
541
542 // loop over digits for selected event
543 mDigitTree->GetEntry(mPresentEventNumber);
544
545 const bool hasData = fillFromDigits(digits);
546
547 LOG(info) << "Found time bins: " << mProcessedTimeBins << "\n";
548 // set status, don't overwrite decision
549 if (!hasData) {
551 } else if (mPresentEventNumber == size_t(lastEvent)) {
553 }
554
555 endEvent();
556 endReader();
557 ++mNevents;
558
559 LOG(info) << "Present event number : " << mPresentEventNumber;
560 LOG(info) << "Last event : " << lastEvent;
561 LOG(info) << "Status : " << int(status);
562
563 return status;
564}
565
566//______________________________________________________________________________
567inline CalibRawBase::ProcessStatus CalibRawBase::processExternalDigits()
568{
569
570 if (!mExternalDigits) {
572 }
573 resetEvent();
574
575 const bool hasData = fillFromDigits(*mExternalDigits);
576
577 LOG(info) << "Found time bins: " << mProcessedTimeBins << "\n";
578 // set status, don't overwrite decision
579 if (!hasData) {
581 }
582
583 endEvent();
584 endReader();
585 ++mNevents;
586
587 return ProcessStatus::Ok;
588}
589
590//______________________________________________________________________________
591inline Int_t CalibRawBase::update(const PadROCPos& padROCPos, const CRU& cru, const gsl::span<const uint32_t> data)
592{
593 // LOG(info) << " Found ADC values: " << data.size();
594 const int row = padROCPos.getRow();
595 const int pad = padROCPos.getPad();
596 if (row == 255 || pad == 255) {
597 return 1;
598 }
599
600 int rowOffset = 0;
601 const int nRowIROC = mMapper.getNumberOfRowsROC(0);
602 const auto& regionInfo = mMapper.getPadRegionInfo(cru.region());
603 const int globalRow = row + (cru.isOROC()) * nRowIROC;
604 const int rowInRegion = globalRow - regionInfo.getGlobalRowOffset();
605
606 switch (mPadSubset) {
607 case PadSubset::ROC: {
608 break;
609 }
610 case PadSubset::Region: {
611 break;
612 }
614 const PartitionInfo& partInfo = mMapper.getPartitionInfo(cru.partition());
615 rowOffset = (cru.isOROC()) * nRowIROC;
616 rowOffset -= partInfo.getGlobalRowOffset();
617 break;
618 }
619 }
620
621 // const FECInfo& fecInfo = mMapper.getFECInfo(padROCPos);
622 const int roc = padROCPos.getROC();
623 int timeBin = 0;
624 // for (const auto& signalI : data) {
625 // for the moment data of all 16 channels are passed, starting with the present channel
626 for (int i = 0; i < data.size(); i += 16) {
627 const float signal = float(data[i]);
628 // 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());
629 // TODO: To be implemented
630 updateCRU(cru, rowInRegion, pad, timeBin, signal);
631 updateROC(roc, row + rowOffset, pad, timeBin, signal);
632 ++timeBin;
633 }
634 return timeBin;
635}
636
637//______________________________________________________________________________
638template <typename T>
639bool CalibRawBase::fillFromDigits(std::array<T, Sector::MAXSECTOR>& digits)
640{
641 using digitVec_t = typename std::conditional<std::is_pointer_v<T>, T, typename std::add_pointer<T>::type>::type;
642 bool hasData = false;
643 const int nRowIROC = mMapper.getNumberOfRowsROC(0);
644 for (auto& vecSector : digits) {
645 digitVec_t vecDigits;
646 if constexpr (std::is_pointer_v<T>) {
647 vecDigits = vecSector;
648 } else {
649 vecDigits = &vecSector;
650 }
651 for (const auto& digit : *vecDigits) {
652
653 // cluster information
654 const CRU cru(digit.getCRU());
655 const int roc = cru.roc();
656 const int row = digit.getRow(); // row is global in sector
657 const int pad = digit.getPad();
658 const size_t timeBin = digit.getTimeStamp();
659 //
660 mProcessedTimeBins = std::max(mProcessedTimeBins, timeBin);
661
662 // TODO: OROC case needs subtraction of number of pad rows in IROC
663 const PadRegionInfo& regionInfo = mMapper.getPadRegionInfo(cru.region());
664 const PartitionInfo& partInfo = mMapper.getPartitionInfo(cru.partition());
665
666 if (row == 255 || pad == 255) {
667 continue;
668 }
669
670 int rowOffset = 0;
671 switch (mPadSubset) {
672 case PadSubset::ROC: {
673 rowOffset -= (cru.rocType() == RocType::OROC) * nRowIROC;
674 break;
675 }
676 case PadSubset::Region: {
677 break;
678 }
680 rowOffset -= partInfo.getGlobalRowOffset();
681 break;
682 }
683 }
684
685 // modify row depending on the calibration type used
686 const float signal = digit.getChargeFloat();
687 // const FECInfo& fecInfo = mMapper.getFECInfo(PadROCPos(roc, row, pad));
688 // 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());
689 updateCRU(cru, row, pad, timeBin, signal);
690 updateROC(roc, row + rowOffset, pad, timeBin, signal);
691 hasData = true;
692 }
693 }
694 return hasData;
695}
696
697} // namespace tpc
698
699} // namespace o2
700#endif
#define verbosity
Container class for the GBT Frames.
int32_t i
std::enable_if_t< std::is_signed< T >::value, bool > hasData(const CalArray< T > &cal)
Definition Painter.cxx:515
uint32_t roc
Definition RawData.h:3
unsigned char region() const
Definition CRU.h:64
bool isOROC() const
Definition CRU.h:68
unsigned char partition() const
Definition CRU.h:63
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)
virtual void endReader()
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.
@ 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
Definition Mapper.h:389
int getNumberOfRowsROC(ROC roc) const
Definition Mapper.h:305
const PadRegionInfo & getPadRegionInfo(const unsigned char region) const
Definition Mapper.h:385
Pad and row inside a ROC.
Definition PadROCPos.h:37
const ROC & getROC() const
Definition PadROCPos.h:55
int getPad() const
Definition PadROCPos.h:79
int getRow() const
Definition PadROCPos.h:75
unsigned char getGlobalRowOffset() const
Reader for RAW TPC data.
Definition RawReader.h:38
static constexpr int MAXSECTOR
Definition Sector.h:44
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
Definition glcorearb.h:275
GLboolean * data
Definition glcorearb.h:298
@ OROC
Definition Defs.h:49
PadSubset
Definition of the different pad subsets.
Definition Defs.h:63
@ Partition
Partitions (up to 36*5)
@ ROC
ROCs (up to 72)
@ 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::string filename()
constexpr size_t max
std::vector< o2::ctf::BufferType > vec
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits
std::vector< int > row