Project
Loading...
Searching...
No Matches
RawFileReader.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 DETECTOR_BASE_RAWFILEREADER_H
13#define DETECTOR_BASE_RAWFILEREADER_H
14
18
19#include <cstdio>
20#include <unordered_map>
21#include <map>
22#include <tuple>
23#include <vector>
24#include <string>
25#include <utility>
26#include <Rtypes.h>
28#include "Headers/DataHeader.h"
31
32namespace o2
33{
34namespace raw
35{
36
39
40struct ReaderInp {
41 std::string inifile{};
42 std::string rawChannelConfig{};
43 std::string dropTF{};
44 std::string metricChannel{};
45 std::string onlyDet{};
46 size_t spSize = 1024L * 1024L;
47 size_t bufferSize = 1024L * 1024L;
48 size_t minSHM = 0;
49 int loop = 1;
50 int runNumber = 0;
51 uint32_t delay_us = 0;
52 uint32_t errMap = 0xffffffff;
53 uint32_t minTF = 0;
54 uint32_t maxTF = 0xffffffff;
55 bool partPerSP = true;
56 bool cache = false;
57 bool autodetectTF0 = false;
58 bool preferCalcTF = false;
59 bool sup0xccdb = false;
60};
61
63{
64 using LinkSpec_t = uint64_t; // = (origin<<32) | LinkSubSpec
65 public:
66 //================================================================================
69 static constexpr std::string_view CardNames[] = {"CRU", "RORC"};
70 //================================================================================
84
85 enum class FirstTFDetection : int { Disabled,
86 Pending,
87 Done };
88
89 static constexpr std::string_view ErrNames[] = {
90 // long names for error codes
91 "Wrong RDH.packetCounter increment", // ErrWrongPacketCounterIncrement
92 "Wrong RDH.pageCnt increment", // ErrWrongPageCounterIncrement
93 "RDH.stop set of 1st HBF page", // ErrHBFStopOnFirstPage
94 "New HBF starts w/o closing old one", // ErrHBFNoStop
95 "Data does not start with TF/HBF", // ErrWrongFirstPage
96 "Number of HBFs per TF not as expected", // ErrWrongHBFsPerTF
97 "Number of TFs is less than expected", // ErrWrongNumberOfTF
98 "Wrong HBF orbit increment", // ErrHBFJump
99 "TF does not start by new superpage", // ErrNoSuperPageForTF
100 "No SOX found on 1st page", // ErrNoSOX
101 "Mismatch between flagged and calculated new TF start" // ErrMismatchTF
102 };
103 static constexpr std::string_view ErrNamesShort[] = {
104 // short names for error codes
105 "packet-increment", // ErrWrongPacketCounterIncrement
106 "page-increment", // ErrWrongPageCounterIncrement
107 "stop-on-page0", // ErrHBFStopOnFirstPage
108 "missing-stop", // ErrHBFNoStop
109 "starts-with-tf", // ErrWrongFirstPage
110 "hbf-per-tf", // ErrWrongHBFsPerTF
111 "tf-per-link", // ErrWrongNumberOfTF
112 "hbf-jump", // ErrHBFJump
113 "no-spage-for-tf", // ErrNoSuperPageForTF
114 "no-sox", // ErrNoSOX
115 "tf-start-mismatch" // ErrMismatchTF
116 };
117 static constexpr bool ErrCheckDefaults[] = {
118 true, // ErrWrongPacketCounterIncrement
119 true, // ErrWrongPageCounterIncrement
120 false, // ErrHBFStopOnFirstPage
121 true, // ErrHBFNoStop
122 true, // ErrWrongFirstPage
123 true, // ErrWrongHBFsPerTF
124 true, // ErrWrongNumberOfTF
125 true, // ErrHBFJump
126 false, // ErrNoSuperPageForTF
127 false, // ErrNoSOX
128 true, // ErrMismatchTF
129 };
130 //================================================================================
131
134 using OrigDescCard = std::tuple<o2::header::DataOrigin, o2::header::DataDescription, ReadoutCardType>;
135 using InputsMap = std::map<OrigDescCard, std::vector<std::string>>;
136
137 //=====================================================================================
138
139 // reference on blocks making single message part
140 struct PartStat {
141 int size; // total size
142 int nBlocks; // number of consecutive LinkBlock objects
143 };
144
145 // info on the smallest block of data to be read when fetching the HBF
146 struct LinkBlock {
147 enum { StartTF = 0x1,
148 StartHB = 0x1 << 1,
149 StartSP = 0x1 << 2,
150 EndHB = 0x1 << 3 };
151 size_t offset = 0;
152 uint32_t size = 0;
153 uint32_t tfID = 0;
154 IR ir = 0;
155 uint16_t fileID = 0;
156 uint8_t flags = 0;
157 std::unique_ptr<char[]> dataCache;
158 LinkBlock() = default;
159 LinkBlock(int fid, size_t offs) : offset(offs), fileID(fid) {}
160 void setFlag(uint8_t fl, bool v = true)
161 {
162 if (v) {
163 flags |= fl;
164 } else {
165 flags &= ~fl;
166 }
167 }
168 bool testFlag(uint8_t fl) const { return (flags & fl) == fl; }
169 void print(const std::string& pref = "") const;
170 };
171
172 //=====================================================================================
173 struct LinkData {
176 LinkSpec_t spec = 0;
178 uint32_t nTimeFrames = 0;
179 uint32_t nHBFrames = 0;
180 uint32_t nSPages = 0;
181 uint64_t nCRUPages = 0;
182 bool cruDetector = true;
183 bool continuousRO = true;
184
187 int nErrors = 0;
188 std::vector<LinkBlock> blocks;
189 std::vector<std::pair<int, uint32_t>> tfStartBlock;
190 //
191 // transient info during processing
192 bool openHB = false;
193 int nHBFinTF = 0;
195
196 LinkData() = default;
197 template <typename H>
198 LinkData(const H& rdh, RawFileReader* r) : rdhl(rdh), reader(r)
199 {
200 }
201 bool preprocessCRUPage(const RDHAny& rdh, bool newSPage);
202 size_t getLargestSuperPage() const;
203 size_t getLargestTF() const;
204 size_t getNextHBFSize() const;
205 size_t getNextTFSize() const;
206 size_t getNextTFSuperPagesStat(std::vector<PartStat>& parts) const;
207 int getNHBFinTF() const;
208
209 size_t readNextHBF(char* buff);
210 size_t readNextTF(char* buff);
211 size_t readNextSuperPage(char* buff, const PartStat* pstat = nullptr);
212 size_t skipNextHBF();
213 size_t skipNextTF();
214
215 bool rewindToTF(uint32_t tf);
216 void print(bool verbose = false, const std::string& pref = "") const;
217 std::string describe() const;
218
219 private:
220 RawFileReader* reader = nullptr;
221 };
222
223 //=====================================================================================
224
225 RawFileReader(const std::string& config = "", int verbosity = 0, size_t buffsize = 50 * 1024UL, const std::string& onlyDet = {});
227
228 void loadFromInputsMap(const InputsMap& inp);
229 bool init();
230 void clear();
231 bool addFile(const std::string& sname, o2::header::DataOrigin origin, o2::header::DataDescription desc, ReadoutCardType t = CRU);
232 bool addFile(const std::string& sname) { return addFile(sname, mDefDataOrigin, mDefDataDescription, mDefCardType); }
233 void setDefaultReadoutCardType(ReadoutCardType t = CRU) { mDefCardType = t; }
234 void setDefaultDataOrigin(const std::string& orig) { mDefDataOrigin = getDataOrigin(orig); }
235 void setDefaultDataDescription(const std::string& desc) { mDefDataDescription = getDataDescription(desc); }
236 void setDefaultDataOrigin(const o2::header::DataOrigin o) { mDefDataOrigin = o; }
237 void setDefaultDataDescription(const o2::header::DataDescription d) { mDefDataDescription = d; }
238 int getNLinks() const { return mLinksData.size(); }
239 int getNFiles() const { return mFiles.size(); }
240
241 uint32_t getNextTFToRead() const { return mNextTF2Read; }
242 void setNextTFToRead(uint32_t tf) { mNextTF2Read = tf; }
243
244 const std::vector<int>& getLinksOrder() const { return mOrderedIDs; }
245 const LinkData& getLink(int i) const { return mLinksData[mOrderedIDs[i]]; }
246 const LinkData& getLinkWithSpec(LinkSpec_t s) const { return mLinksData[mLinkEntries.at(s)]; }
247 LinkData& getLink(int i) { return mLinksData[mOrderedIDs[i]]; }
249 LinkSpec_t getLinkSpec(int i) const { return getLink(i).spec; }
250
251 void printStat(bool verbose = false) const;
252
253 void setVerbosity(int v = 1) { mVerbosity = v; }
254 void setCheckErrors(uint32_t m = 0xffffffff) { mCheckErrors = m & ((0x1 << NErrorsDefined) - 1); }
255 int getVerbosity() const { return mVerbosity; }
256 uint32_t getCheckErrors() const { return mCheckErrors; }
257 bool isProcessingStopped() const { return mStopProcessing; }
258
259 void setNominalSPageSize(int n = 0x1 << 20) { mNominalSPageSize = n > (0x1 << 15) ? n : (0x1 << 15); }
260 int getNominalSPageSize() const { return mNominalSPageSize; }
261
262 void setBufferSize(size_t s) { mBufferSize = s < sizeof(RDHAny) ? sizeof(RDHAny) : s; }
263 size_t getBufferSize() const { return mBufferSize; }
264
265 void setMaxTFToRead(uint32_t n) { mMaxTFToRead = n; }
266 bool isEmpty() const { return mEmpty; }
267 uint32_t getMaxTFToRead() const { return mMaxTFToRead; }
268 uint32_t getNTimeFrames() const { return mNTimeFrames; }
269 uint32_t getOrbitMin() const { return mOrbitMin; }
270 uint32_t getOrbitMax() const { return mOrbitMax; }
271
272 bool getCacheData() const { return mCacheData; }
273 void setCacheData(bool v) { mCacheData = v; }
274
275 o2::header::DataOrigin getDefaultDataOrigin() const { return mDefDataOrigin; }
276 o2::header::DataDescription getDefaultDataSpecification() const { return mDefDataDescription; }
277 ReadoutCardType getDefaultReadoutCardType() const { return mDefCardType; }
278
279 void imposeFirstTF(uint32_t orbit);
280 void setTFAutodetect(FirstTFDetection v) { mFirstTFAutodetect = v; }
281 void setPreferCalculatedTFStart(bool v) { mPreferCalculatedTFStart = v; }
282 FirstTFDetection getTFAutodetect() const { return mFirstTFAutodetect; }
283
285
286 static o2::header::DataOrigin getDataOrigin(const std::string& ors);
287 static o2::header::DataDescription getDataDescription(const std::string& ors);
288 static InputsMap parseInput(const std::string& confUri, const std::string& onlyDet = {}, bool verbose = false);
289 static std::string nochk_opt(ErrTypes e);
290 static std::string nochk_expl(ErrTypes e);
291
292 private:
293 int getLinkLocalID(const RDHAny& rdh, int fileID);
294 bool preprocessFile(int ifl);
295 static LinkSpec_t createSpec(o2::header::DataOrigin orig, LinkSubSpec_t ss) { return (LinkSpec_t(orig) << 32) | ss; }
296
297 static constexpr o2::header::DataOrigin DEFDataOrigin = o2::header::gDataOriginFLP;
298 static constexpr o2::header::DataDescription DEFDataDescription = o2::header::gDataDescriptionRawData;
299 static constexpr ReadoutCardType DEFCardType = CRU;
300 o2::header::DataOrigin mDefDataOrigin = DEFDataOrigin;
301 o2::header::DataDescription mDefDataDescription = DEFDataDescription;
302 ReadoutCardType mDefCardType = CRU;
303 std::vector<std::string> mFileNames;
304 std::vector<FILE*> mFiles;
305 std::vector<std::unique_ptr<char[]>> mFileBuffers;
306 std::vector<OrigDescCard> mDataSpecs;
307 bool mInitDone = false;
308 bool mEmpty = true;
309 std::unordered_map<LinkSpec_t, int> mLinkEntries;
310 std::vector<LinkData> mLinksData;
311 std::vector<int> mOrderedIDs;
312 uint32_t mMaxTFToRead = 0xffffffff;
313 uint32_t mNTimeFrames = 0;
314 uint32_t mNextTF2Read = 0;
315 uint32_t mOrbitMin = 0xffffffff;
316 uint32_t mOrbitMax = 0;
317 size_t mBufferSize = 5 * 1024UL;
318 int mNominalSPageSize = 0x1 << 20;
319 int mCurrentFileID = 0;
320 long int mPosInFile = 0;
321 bool mMultiLinkFile = false;
322 bool mCacheData = false;
323 bool mStopProcessing = false;
324 uint32_t mCheckErrors = 0;
325 FirstTFDetection mFirstTFAutodetect = FirstTFDetection::Disabled;
326 bool mPreferCalculatedTFStart = false;
327 int mVerbosity = 0;
328 ClassDefNV(RawFileReader, 1);
329};
330
331} // namespace raw
332} // namespace o2
333
334#endif //DETECTOR_BASE_RAWFILEREADER_H
#define verbosity
uint64_t orbit
Definition RawEventData.h:6
void print() const
int32_t i
bool o
Definition of the RAW Data Header.
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
const std::vector< int > & getLinksOrder() const
uint32_t getOrbitMax() const
void printStat(bool verbose=false) const
uint32_t getNextTFToRead() const
void setVerbosity(int v=1)
static InputsMap parseInput(const std::string &confUri, const std::string &onlyDet={}, bool verbose=false)
ReadoutCardType getDefaultReadoutCardType() const
std::tuple< o2::header::DataOrigin, o2::header::DataDescription, ReadoutCardType > OrigDescCard
void setNextTFToRead(uint32_t tf)
void setDefaultDataDescription(const std::string &desc)
static std::string nochk_expl(ErrTypes e)
void setTFAutodetect(FirstTFDetection v)
FirstTFDetection getTFAutodetect() const
void setBufferSize(size_t s)
void setDefaultDataOrigin(const std::string &orig)
std::map< OrigDescCard, std::vector< std::string > > InputsMap
void setNominalSPageSize(int n=0x1<< 20)
uint32_t getMaxTFToRead() const
void setDefaultDataDescription(const o2::header::DataDescription d)
bool addFile(const std::string &sname)
static constexpr std::string_view CardNames[]
LinkSubSpec_t getLinkSubSpec(int i) const
void setDefaultDataOrigin(const o2::header::DataOrigin o)
uint32_t getCheckErrors() const
void loadFromInputsMap(const InputsMap &inp)
int getNominalSPageSize() const
void setMaxTFToRead(uint32_t n)
bool isProcessingStopped() const
LinkSpec_t getLinkSpec(int i) const
size_t getBufferSize() const
static constexpr bool ErrCheckDefaults[]
static constexpr std::string_view ErrNamesShort[]
uint32_t getNTimeFrames() const
static o2::header::DataDescription getDataDescription(const std::string &ors)
static std::string nochk_opt(ErrTypes e)
void setCheckErrors(uint32_t m=0xffffffff)
const LinkData & getLink(int i) const
LinkData & getLink(int i)
void setIROfSOX(const o2::InteractionRecord &ir)
void setDefaultReadoutCardType(ReadoutCardType t=CRU)
o2::header::DataDescription getDefaultDataSpecification() const
static o2::header::DataOrigin getDataOrigin(const std::string &ors)
const LinkData & getLinkWithSpec(LinkSpec_t s) const
void imposeFirstTF(uint32_t orbit)
static constexpr std::string_view ErrNames[]
uint32_t getOrbitMin() const
o2::header::DataOrigin getDefaultDataOrigin() const
bool addFile(const std::string &sname, o2::header::DataOrigin origin, o2::header::DataDescription desc, ReadoutCardType t=CRU)
void setPreferCalculatedTFStart(bool v)
GLdouble n
Definition glcorearb.h:1982
const GLfloat * m
Definition glcorearb.h:4066
GLsizeiptr size
Definition glcorearb.h:659
const GLdouble * v
Definition glcorearb.h:832
GLintptr offset
Definition glcorearb.h:660
GLbitfield flags
Definition glcorearb.h:1570
GLboolean r
Definition glcorearb.h:1233
constexpr o2::header::DataDescription gDataDescriptionInvalid
Definition DataHeader.h:596
constexpr o2::header::DataOrigin gDataOriginFLP
Definition DataHeader.h:562
constexpr o2::header::DataOrigin gDataOriginInvalid
Definition DataHeader.h:561
constexpr o2::header::DataDescription gDataDescriptionRawData
Definition DataHeader.h:597
RAWDataHeaderV7 RAWDataHeader
uint32_t LinkSubSpec_t
Definition RDHUtils.h:34
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::unique_ptr< GPUReconstructionTimeframe > tf
bool testFlag(uint8_t fl) const
std::unique_ptr< char[]> dataCache
different flags
void setFlag(uint8_t fl, bool v=true)
LinkBlock()=default
optional cache for fast access
uint16_t fileID
ir starting the block
LinkBlock(int fid, size_t offs)
bool preprocessCRUPage(const RDHAny &rdh, bool newSPage)
LinkSubSpec_t subspec
Link subspec augmented by its origin.
o2::header::DataOrigin origin
size_t readNextSuperPage(char *buff, const PartStat *pstat=nullptr)
uint32_t nTimeFrames
subspec according to DataDistribution
o2::header::DataDescription description
o2::InteractionRecord irOfSOX
RDH with the running info of the last RDH seen.
LinkData(const H &rdh, RawFileReader *r)
std::vector< LinkBlock > blocks
size_t getNextTFSuperPagesStat(std::vector< PartStat > &parts) const
LinkData()=default
next block which should be read
std::vector< std::pair< int, uint32_t > > tfStartBlock
bool continuousRO
CRU vs RORC detector.
std::string rawChannelConfig
std::string inifile
std::string onlyDet
std::string metricChannel
o2::InteractionRecord ir(0, 0)