1616
1717#include < vector>
1818#include < memory>
19+ #include < algorithm>
1920
2021#include " TString.h"
2122#include " Rtypes.h"
@@ -49,10 +50,11 @@ class CalibRawBase
4950 Ok, // /< Processing ok
5051 Truncated, // /< Read fewer time bins than mTimeBinsPerCall
5152 NoMoreData, // /< No data read
53+ LastEvent, // /< Last event
5254 NoReaders // /< No raw reader configures
5355 };
5456
55- CalibRawBase (PadSubset padSubset = PadSubset::ROC) : mMapper (Mapper::instance()), mNevents (0 ), mTimeBinsPerCall (500 ), mPadSubset (padSubset) {;}
57+ CalibRawBase (PadSubset padSubset = PadSubset::ROC) : mMapper (Mapper::instance()), mNevents (0 ), mTimeBinsPerCall (500 ), mProcessedTimeBins ( 0 ), mPresentEventNumber ( 0 ), mPadSubset (padSubset) {;}
5658
5759 // / Update function called once per digit
5860 // /
@@ -90,7 +92,8 @@ class CalibRawBase
9092 PadSubset getPadSubset () const { return mPadSubset ; }
9193
9294 // / Process one event
93- ProcessStatus ProcessEvent ();
95+ // / \param eventNumber: Either number >=0 or -1 (next event) or -2 (previous event)
96+ ProcessStatus ProcessEvent (int eventNumber=-1 );
9497
9598 void setupContainers (TString fileInfo);
9699
@@ -103,12 +106,20 @@ class CalibRawBase
103106 // / number of processed events
104107 size_t getNumberOfProcessedEvents () const { return mNevents ; }
105108
109+ // / get present event number
110+ size_t getPresentEventNumber () const { return mPresentEventNumber ; }
111+
112+ // / number of processed time bins in last event
113+ size_t getNumberOfProcessedTimeBins () const { return mProcessedTimeBins ; }
114+
106115 protected:
107116 const Mapper& mMapper ; // !< TPC mapper
108117
109118 private:
110119 size_t mNevents ; // !< number of processed events
111- Int_t mTimeBinsPerCall ; // !< numver of time bins to process in ProcessEvent
120+ Int_t mTimeBinsPerCall ; // !< number of time bins to process in ProcessEvent
121+ size_t mProcessedTimeBins ; // !< number of processed time bins in last event
122+ size_t mPresentEventNumber ; // !< present event number
112123 PadSubset mPadSubset ; // !< pad subset type used
113124 std::vector<std::unique_ptr<GBTFrameContainer>> mGBTFrameContainers ; // ! raw reader pointer
114125 std::vector<std::unique_ptr<RawReader>> mRawReaders ; // ! raw reader pointer
@@ -120,20 +131,20 @@ class CalibRawBase
120131 ProcessStatus ProcessEventGBT ();
121132
122133 // / Process one event using RawReader
123- ProcessStatus ProcessEventRawReader ();
134+ ProcessStatus ProcessEventRawReader (int eventNumber=- 1 );
124135
125136};
126137
127138// ----------------------------------------------------------------
128139// Inline Functions
129140// ----------------------------------------------------------------
130- inline CalibRawBase::ProcessStatus CalibRawBase::ProcessEvent ()
141+ inline CalibRawBase::ProcessStatus CalibRawBase::ProcessEvent (int eventNumber )
131142{
132143 if (mGBTFrameContainers .size ()) {
133144 return ProcessEventGBT ();
134145 }
135146 else if (mRawReaders .size ()) {
136- return ProcessEventRawReader ();
147+ return ProcessEventRawReader (eventNumber );
137148 }
138149 else {
139150 return ProcessStatus::NoReaders;
@@ -218,7 +229,7 @@ inline CalibRawBase::ProcessStatus CalibRawBase::ProcessEventGBT()
218229}
219230
220231// ______________________________________________________________________________
221- inline CalibRawBase::ProcessStatus CalibRawBase::ProcessEventRawReader ()
232+ inline CalibRawBase::ProcessStatus CalibRawBase::ProcessEventRawReader (int eventNumber )
222233{
223234 if (!mRawReaders .size ()) return ProcessStatus::NoReaders;
224235 ResetEvent ();
@@ -230,17 +241,33 @@ inline CalibRawBase::ProcessStatus CalibRawBase::ProcessEventRawReader()
230241
231242 ProcessStatus status = ProcessStatus::Ok;
232243
244+ mProcessedTimeBins = 0 ;
233245 int processedReaders = 0 ;
234246 bool hasData = false ;
247+
248+ uint64_t lastEvent = 0 ;
235249 for (auto & reader_ptr : mRawReaders ) {
236250 auto reader = reader_ptr.get ();
237251
238- if (!reader->loadNextEvent ()) continue ;
252+ lastEvent = std::max (lastEvent, reader->getLastEvent ());
253+
254+ if (eventNumber>=0 ) {
255+ reader->loadEvent (eventNumber);
256+ mPresentEventNumber = eventNumber;
257+ }
258+ else if (eventNumber==-1 ) {
259+ mPresentEventNumber = reader->loadNextEvent ();
260+ }
261+ else if (eventNumber==-2 ) {
262+ mPresentEventNumber = reader->loadPreviousEvent ();
263+ }
239264
240265 o2::TPC::PadPos padPos;
241266 while (std::shared_ptr<std::vector<uint16_t >> data = reader->getNextData (padPos)) {
242267 if (!data) continue ;
243268
269+ mProcessedTimeBins = std::max (mProcessedTimeBins , data->size ());
270+
244271 CRU cru (reader->getRegion ());
245272 const int roc = cru.roc ();
246273 // TODO: OROC case needs subtraction of number of pad rows in IROC
@@ -293,6 +320,9 @@ inline CalibRawBase::ProcessStatus CalibRawBase::ProcessEventRawReader()
293320 else if (processedReaders < mRawReaders .size ()) {
294321 status = ProcessStatus::Truncated;
295322 }
323+ else if (mPresentEventNumber == lastEvent) {
324+ status = ProcessStatus::LastEvent;
325+ }
296326
297327 EndEvent ();
298328 ++mNevents ;
0 commit comments