Project
Loading...
Searching...
No Matches
RawDumpSpec.cxx
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
15#include "Framework/Task.h"
22#include <cstdio>
23#include <unordered_map>
24#include <filesystem>
25
26namespace o2::raw
27{
28namespace o2h = o2::header;
29using namespace o2::framework;
32
33class RawDump : public Task
34{
35 public:
36 static constexpr o2h::DataDescription DESCRaw{"RAWDATA"}, DESCCRaw{"CRAWDATA"};
37
45
46 RawDump(bool TOFUncompressed = false);
47 void init(InitContext& ic) final;
48 void run(ProcessingContext& pc) final;
49 void endOfStream(EndOfStreamContext& ec) final;
50 static std::string getReadoutType(DetID id);
51
52 private:
53 LinkInfo& getLinkInfo(o2h::DataOrigin detOr, const header::RDHAny* rdh);
54 std::string getFileName(DetID detID, const header::RDHAny* rdh);
55 std::string getBaseFileNameITS(const header::RDHAny* rdh);
56 std::string getBaseFileNameTPC(const header::RDHAny* rdh);
57 std::string getBaseFileNameTRD(const header::RDHAny* rdh);
58 std::string getBaseFileNameTOF(const header::RDHAny* rdh);
59 std::string getBaseFileNameEMC(const header::RDHAny* rdh);
60 std::string getBaseFileNamePHS(const header::RDHAny* rdh);
61 std::string getBaseFileNameCPV(const header::RDHAny* rdh);
62 std::string getBaseFileNameMFT(const header::RDHAny* rdh);
63 std::string getBaseFileNameMID(const header::RDHAny* rdh);
64 std::string getBaseFileNameMCH(const header::RDHAny* rdh);
65 std::string getBaseFileNameCTP(const header::RDHAny* rdh);
66 std::string getBaseFileNameFT0(const header::RDHAny* rdh);
67 std::string getBaseFileNameFV0(const header::RDHAny* rdh);
68 std::string getBaseFileNameFDD(const header::RDHAny* rdh);
69 std::string getBaseFileNameZDC(const header::RDHAny* rdh);
70 std::string getBaseFileNameHMP(const header::RDHAny* rdh);
71
72 bool mFatalOnDeadBeef{false};
73 bool mSkipDump{false};
74 bool mTOFUncompressed{false};
75 bool mImposeSOX{false};
76 int mVerbosity{0};
77 int mTFCount{0};
78 uint64_t mTPCLinkRej{0}; // pattern of TPC links to reject
79 o2::InteractionRecord mFirstIR{};
80 std::string mOutDir{};
81 std::unordered_map<uint64_t, LinkInfo> mLinksInfo{};
82 std::unordered_map<std::string, FILE*> mName2File{};
83 std::unordered_map<int, DetID> mOrigin2DetID{};
84 std::array<std::string, o2::detectors::DetID::getNDetectors()> mConfigEntries{};
85 std::array<int, o2::detectors::DetID::getNDetectors()> mFilesPerDet{};
86};
87
88//________________________________________
89RawDump::RawDump(bool TOFUncompressed) : mTOFUncompressed{TOFUncompressed}
90{
91 for (DetID::ID id = DetID::First; id <= DetID::Last; id++) {
92 mOrigin2DetID[DetID::getDataOrigin(id)] = id;
93 }
94}
95
96//________________________________________
98{
99 mFatalOnDeadBeef = ic.options().get<bool>("fatal-on-deadbeef");
100 mVerbosity = ic.options().get<int>("dump-verbosity");
101 mOutDir = ic.options().get<std::string>("output-directory");
102 mSkipDump = ic.options().get<bool>("skip-dump");
103 mImposeSOX = !ic.options().get<bool>("skip-impose-sox");
104 auto vrej = o2::RangeTokenizer::tokenize<int>(ic.options().get<std::string>("reject-tpc-links"));
105 for (auto i : vrej) {
106 if (i < 63) {
107 mTPCLinkRej |= 0x1UL << i;
108 LOGP(info, "Will reject TPC link {}", i);
109 } else {
110 LOGP(error, "LinkID cannot exceed 63, asked {}", i);
111 }
112 }
113 if (mOutDir.size()) {
114 if (!std::filesystem::exists(mOutDir)) {
115#if defined(__clang__)
116 // clang `create_directories` implementation is misbehaving and can
117 // return false even if the directory is actually successfully created
118 // so we work around that "feature" by not checking the
119 // return value at all but using a second call to `exists`
120 std::filesystem::create_directories(mOutDir);
121 if (!std::filesystem::exists(mOutDir)) {
122 LOG(fatal) << "could not create output directory " << mOutDir;
123 }
124#else
125 if (!std::filesystem::create_directories(mOutDir)) {
126 LOG(fatal) << "could not create output directory " << mOutDir;
127 }
128#endif
129 LOGP(info, "Created output directory {}", mOutDir);
130 }
131 } else {
132 mOutDir = "./";
133 }
134}
135
136//________________________________________
138{
139
140 DPLRawParser parser(pc.inputs());
141
142 auto procDEADBEEF = [this](const o2::header::DataHeader* dh) {
143 static DetID::mask_t repDeadBeef{};
144 if (dh->subSpecification == 0xdeadbeef && dh->payloadSize == 0) {
145 if (this->mFatalOnDeadBeef) {
146 LOGP(fatal, "Found input [{}/{}/{:#x}] TF#{} 1st_orbit:{}", dh->dataOrigin.str, dh->dataDescription.str, dh->subSpecification, dh->tfCounter, dh->firstTForbit);
147 } else {
148 if (!repDeadBeef[DetID(dh->dataOrigin.str)] || this->mVerbosity > 0) {
149 LOGP(warn, "Skipping input [{}/{}/{:#x}] TF#{} 1st_orbit:{}", dh->dataOrigin.str, dh->dataDescription.str, dh->subSpecification, dh->tfCounter, dh->firstTForbit);
150 repDeadBeef |= DetID::getMask(dh->dataOrigin.str);
151 }
152 return false;
153 }
154 }
155 return true;
156 };
157
158 auto isRORC = [](DetID id) {
159 return id == DetID::PHS || id == DetID::EMC || id == DetID::HMP;
160 };
161
162 if (mTFCount == 0 && mImposeSOX) { // make sure all links payload starts with SOX
163 for (auto it = parser.begin(), end = parser.end(); it != end; ++it) {
164 auto const* dh = it.o2DataHeader();
165 if (!procDEADBEEF(dh)) {
166 continue;
167 }
168 const auto rdh = reinterpret_cast<const header::RDHAny*>(it.raw());
169 if (!RDHUtils::checkRDH(rdh, true)) {
171 continue;
172 }
173 auto& lInfo = getLinkInfo(dh->dataOrigin, rdh);
174 if (!lInfo.firstIR.isDummy()) { // already processed
175 continue;
176 }
177 lInfo.firstIR = {0, o2::raw::RDHUtils::getTriggerOrbit(rdh)};
178 if (lInfo.firstIR < mFirstIR) {
179 mFirstIR = lInfo.firstIR;
180 }
181 auto trig = o2::raw::RDHUtils::getTriggerType(rdh);
182 lInfo.hasSOX = trig & (o2::trigger::SOT | o2::trigger::SOC);
183 lInfo.rdhSOX = *rdh;
184 lInfo.detID = mOrigin2DetID[dh->dataOrigin];
185 }
186 // now write RDH with SOX (if needed)
187 for (auto& lit : mLinksInfo) {
188 auto& lInfo = lit.second;
189 if (!lInfo.hasSOX && lInfo.fileHandler) {
190 auto trig = o2::raw::RDHUtils::getTriggerType(lInfo.rdhSOX);
191 if (o2::raw::RDHUtils::getTriggerIR(lInfo.rdhSOX) != mFirstIR) { // need to write cooked header
192 o2::raw::RDHUtils::setTriggerOrbit(lInfo.rdhSOX, mFirstIR.orbit);
195 o2::raw::RDHUtils::setPacketCounter(lInfo.rdhSOX, o2::raw::RDHUtils::getPacketCounter(lInfo.rdhSOX) - 1);
197 o2::raw::RDHUtils::setTriggerType(lInfo.rdhSOX, trig);
198 o2::raw::RDHUtils::setStop(lInfo.rdhSOX, 0x1);
199 if (mVerbosity > 0) {
200 LOGP(info, "Writing cooked up RDH with SOX");
201 o2::raw::RDHUtils::printRDH(lInfo.rdhSOX);
202 }
203 auto ws = std::fwrite(&lInfo.rdhSOX, 1, sizeof(o2::header::RDHAny), lInfo.fileHandler);
204 if (ws != sizeof(o2::header::RDHAny)) {
205 LOGP(fatal, "Failed to write cooked up RDH with SOX");
206 }
207 lInfo.hasSOX = true; // flag that it is already written
208 } // otherwhise data has RDH with orbit matching to SOX, we will simply set a flag while writing the data
209 } else if (lInfo.fileHandler && o2::raw::RDHUtils::getTriggerOrbit(lInfo.rdhSOX) != mFirstIR.orbit) {
210 o2::raw::RDHUtils::printRDH(lInfo.rdhSOX);
211 LOGP(error, "Original data had SOX set but the orbit differs from the smallest seen {}, keep original one", mFirstIR.orbit);
212 }
213 }
214 }
215
216 for (auto it = parser.begin(), end = parser.end(); it != end; ++it) {
217 auto const* dh = it.o2DataHeader();
218 if (!procDEADBEEF(dh)) {
219 continue;
220 }
221 const auto rdh = reinterpret_cast<const header::RDHAny*>(it.raw());
222 if (!RDHUtils::checkRDH(rdh, true)) {
224 continue;
225 }
226 if (mVerbosity > 1) {
228 }
229 FILE* fh = nullptr;
230 auto& lInfo = getLinkInfo(dh->dataOrigin, rdh);
231 if (!mSkipDump && lInfo.fileHandler) {
232 auto sz = o2::raw::RDHUtils::getOffsetToNext(rdh);
233 auto raw = it.raw();
234 if (mTFCount == 0 && !lInfo.hasSOX && o2::raw::RDHUtils::getTriggerIR(rdh) == mFirstIR) { // need to add SOX bit to existing RDH
235 auto trig = o2::raw::RDHUtils::getTriggerType(rdh);
237 auto rdhC = *rdh;
239 if (mVerbosity > 0) {
240 LOGP(info, "Write existing RDH with SOX added");
242 }
243 auto ws = std::fwrite(&rdhC, 1, sizeof(o2::header::RDHAny), lInfo.fileHandler);
244 if (ws != sizeof(o2::header::RDHAny)) {
245 LOGP(fatal, "Failed to write RDH with SOX added");
246 }
247 raw += sizeof(o2::header::RDHAny);
248 sz -= sizeof(o2::header::RDHAny);
249 if (o2::raw::RDHUtils::getStop(rdhC)) {
250 lInfo.hasSOX = true;
251 }
252 }
253 auto ws = std::fwrite(raw, 1, sz, lInfo.fileHandler);
254 if (ws != sz) {
255 LOGP(fatal, "Failed to write payload of {} bytes", sz);
256 }
257 }
258 }
259 mTFCount++;
260}
261
262//____________________________________________________________
264{
265 LOGP(info, "closing {} output files", mName2File.size());
266 for (auto h : mName2File) {
267 std::fclose(h.second);
268 }
269 for (DetID::ID id = DetID::First; id <= DetID::Last; id++) {
270 if (mConfigEntries[id].empty()) {
271 continue;
272 }
273 auto fnm = fmt::format("{}{}{}raw.cfg", mOutDir, mOutDir.back() == '/' ? "" : "/", DetID::getName(id));
274 auto fh = std::fopen(fnm.c_str(), "w");
275 if (!fh) {
276 LOGP(fatal, "Failed to create configuration file {}", fnm);
277 }
278 auto ws = std::fwrite(mConfigEntries[id].data(), 1, mConfigEntries[id].size(), fh);
279 if (ws != mConfigEntries[id].size()) {
280 LOGP(fatal, "Failed to write configuration to {}", fnm);
281 }
282 fclose(fh);
283 LOGP(info, "Wrote configuration for {} {} raw files to {}", DetID::getName(id), mFilesPerDet[id], o2::utils::Str::getFullPath(fnm));
284 }
285}
286
287//_____________________________________________________________________
288RawDump::LinkInfo& RawDump::getLinkInfo(o2h::DataOrigin detOr, const header::RDHAny* rdh)
289{
290 uint32_t feeid = RDHUtils::getFEEID(rdh);
291 uint64_t id = (uint64_t(detOr) << 32) + feeid;
292 auto& linkInfo = mLinksInfo[id];
293 if (!linkInfo.fileHandler) {
294 DetID detID = mOrigin2DetID[detOr];
295 auto name = getFileName(detID, rdh);
296 if (name.empty()) {
297 return linkInfo; // reject data of this RDH
298 }
299 linkInfo.fileHandler = mName2File[name];
300 if (!linkInfo.fileHandler) {
301 linkInfo.fileHandler = std::fopen(name.c_str(), "w");
302 if (!linkInfo.fileHandler) {
303 LOGP(fatal, "Failed to create file {} for Det={} / FeeID=0x{:05x}", name, detOr.str, feeid);
304 }
305 mName2File[name] = linkInfo.fileHandler;
306 mConfigEntries[detID] += fmt::format(
307 "[input-{}-{}]\n"
308 "dataOrigin = {}\n"
309 "dataDescription = {}\n"
310 "readoutCard = {}\n"
311 "filePath = {}\n\n",
312 detOr.str, mFilesPerDet[detID]++, detOr.str, (detID != DetID::TOF || mTOFUncompressed) ? DESCRaw.str : DESCCRaw.str, getReadoutType(detID), o2::utils::Str::getFullPath(name));
313 }
314 if (mVerbosity > 0) {
316 LOGP(info, "Write Det={}/0x{:05x} to {}", detOr.str, feeid, o2::utils::Str::getFullPath(name));
317 }
318 }
319 return linkInfo;
320}
321
322//_____________________________________________________________________
323std::string RawDump::getFileName(DetID detID, const header::RDHAny* rdh)
324{
325 // TODO
326 std::string baseName{};
327 switch (detID) {
328 case DetID::ITS:
329 baseName = getBaseFileNameITS(rdh);
330 break;
331 case DetID::MFT:
332 baseName = getBaseFileNameMFT(rdh);
333 break;
334 case DetID::TPC:
335 baseName = getBaseFileNameTPC(rdh);
336 break;
337 case DetID::TRD:
338 baseName = getBaseFileNameTRD(rdh);
339 break;
340 case DetID::TOF:
341 baseName = getBaseFileNameTOF(rdh);
342 break;
343 case DetID::EMC:
344 baseName = getBaseFileNameEMC(rdh);
345 break;
346 case DetID::PHS:
347 baseName = getBaseFileNamePHS(rdh);
348 break;
349 case DetID::CPV:
350 baseName = getBaseFileNameCPV(rdh);
351 break;
352 case DetID::CTP:
353 baseName = getBaseFileNameCTP(rdh);
354 break;
355 case DetID::MID:
356 baseName = getBaseFileNameMID(rdh);
357 break;
358 case DetID::MCH:
359 baseName = getBaseFileNameMCH(rdh);
360 break;
361 case DetID::FT0:
362 baseName = getBaseFileNameFT0(rdh);
363 break;
364 case DetID::FV0:
365 baseName = getBaseFileNameFV0(rdh);
366 break;
367 case DetID::FDD:
368 baseName = getBaseFileNameFDD(rdh);
369 break;
370 case DetID::ZDC:
371 baseName = getBaseFileNameZDC(rdh);
372 break;
373 case DetID::HMP:
374 baseName = getBaseFileNameHMP(rdh);
375 break;
376
377 default:
378 baseName = fmt::format("feeID0x{:05x}", RDHUtils::getFEEID(rdh));
379 break;
380 }
381 return baseName.empty() ? std::string{} : fmt::format("{}{}{}_{}.raw", mOutDir, mOutDir.back() == '/' ? "" : "/", detID.getName(), baseName);
382}
383
384//_____________________________________________________________________
385std::string RawDump::getBaseFileNameCTP(const header::RDHAny* rdh)
386{
387 return "alio2-cr1-flp163_cru1111_0";
388}
389
390//_____________________________________________________________________
391std::string RawDump::getBaseFileNameFT0(const header::RDHAny* rdh)
392{
393 return fmt::format("alio2-cr1-flp200_cru{}_{}", RDHUtils::getCRUID(rdh), RDHUtils::getEndPointID(rdh));
394}
395
396//_____________________________________________________________________
397std::string RawDump::getBaseFileNameFV0(const header::RDHAny* rdh)
398{
399 return fmt::format("alio2-cr1-flp180_cru{}_{}", RDHUtils::getCRUID(rdh), RDHUtils::getEndPointID(rdh));
400}
401
402//_____________________________________________________________________
403std::string RawDump::getBaseFileNameFDD(const header::RDHAny* rdh)
404{
405 return fmt::format("alio2-cr1-flp201_cru{}_{}", RDHUtils::getCRUID(rdh), RDHUtils::getEndPointID(rdh));
406}
407
408//_____________________________________________________________________
409std::string RawDump::getBaseFileNameHMP(const header::RDHAny* rdh)
410{
411 uint16_t cruID = RDHUtils::getCRUID(rdh);
412 if (cruID < 120 || cruID > 123) {
413 auto flpname = fmt::format("flp-unknown_crorc{}_{}_ddlID{}", cruID, RDHUtils::getLinkID(rdh), RDHUtils::getFEEID(rdh));
414 LOGP(error, "Unrecognized HMP flp, setting to {}", flpname);
415 return flpname;
416 }
417 return fmt::format("alio2-cr1-flp{}_crorc{}_{}", cruID < 122 ? 160 : 161, cruID, RDHUtils::getLinkID(rdh));
418}
419
420//_____________________________________________________________________
421std::string RawDump::getBaseFileNameEMC(const header::RDHAny* rdh)
422{
423 static const std::array<int, 20> CRORCID = {110, 112, 110, 112, 110, 112, 111, 113, 111, 113, 111, 113, 114, 116, 114, 116, 115, 117, 115, 117}; // CRORC ID w.r.t SM
424 static const std::array<int, 40> CRORCLink = {0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 0, 1, 0, 1, 2, 3, 2, 3, 4, -1, 4, 5, 0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 1, 3, 2}; // CRORC link w.r.t FEE ID
425
426 uint16_t ddlID = RDHUtils::getFEEID(rdh), crorc = -1, link = -1, flpID = -1;
427 if (ddlID < 40) {
428 crorc = CRORCID[ddlID / 2];
429 link = CRORCLink[ddlID];
430 flpID = ddlID <= 23 ? 146 : 147;
431 } else if (ddlID == 44) {
432 crorc = 111;
433 link = 5;
434 flpID = 146;
435 } else if (ddlID == 45) {
436 crorc = 117;
437 link = 3;
438 flpID = 147;
439 } else {
440 auto flpname = fmt::format("flp-unknown_crorc{}_{}_ddlID{}", RDHUtils::getCRUID(rdh), RDHUtils::getLinkID(rdh), ddlID);
441 LOGP(error, "Unrecognized EMC flp, setting to {}", flpname);
442 return flpname;
443 }
444 return fmt::format("alio2-cr1-flp{}_crorc{}_{}", flpID, crorc, link);
445}
446
447//_____________________________________________________________________
448std::string RawDump::getBaseFileNamePHS(const header::RDHAny* rdh)
449{
450 uint16_t ddlID = RDHUtils::getFEEID(rdh), crorc = -1, link = -1, flpID = -1;
451 if (ddlID < 6) {
452 flpID = 164;
453 if (ddlID < 2) {
454 crorc = 304;
455 link = ddlID;
456 } else {
457 crorc = 243;
458 link = ddlID - 2;
459 }
460 } else if (ddlID < 14) {
461 flpID = 165;
462 if (ddlID < 10) {
463 crorc = 75;
464 } else {
465 crorc = 106;
466 }
467 link = (ddlID - 6) % 4;
468 }
469 if (crorc < 0) {
470 auto flpname = fmt::format("flp-unknown_crorc{}_{}_ddlID{}", RDHUtils::getCRUID(rdh), RDHUtils::getLinkID(rdh), ddlID);
471 LOGP(error, "Unrecognized PHS flp, setting to {}", flpname);
472 return flpname;
473 }
474 return fmt::format("alio2-cr1-flp{}_crorc{}_{}", flpID, crorc, link);
475}
476
477//_____________________________________________________________________
478std::string RawDump::getBaseFileNameTOF(const header::RDHAny* rdh)
479{
480 constexpr int NLinks = 72;
481 static constexpr int CRUFROMLINK[NLinks] = {
482 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
483 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
484 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
485 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
486 static constexpr Int_t CRUID[4] = {225, 226, 227, 228};
487 static constexpr Int_t FLPFROMCRU[4] = {179, 179, 178, 178};
488 uint16_t feeID = RDHUtils::getFEEID(rdh);
489 if (feeID > 71) {
490 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)), feeID);
491 LOGP(error, "Unrecognized TOF flp, setting to {}", flpname);
492 return flpname;
493 }
494 return fmt::format("alio2-cr1-flp{}_cru{}_{}", FLPFROMCRU[CRUFROMLINK[feeID]], CRUID[CRUFROMLINK[feeID]], RDHUtils::getEndPointID(rdh));
495}
496
497//_____________________________________________________________________
498std::string RawDump::getBaseFileNameMID(const header::RDHAny* rdh)
499{
500 uint16_t feeID = RDHUtils::getFEEID(rdh);
501 if (feeID > 3) {
502 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)), feeID);
503 LOGP(error, "Unrecognized MID flp, setting to {}", flpname);
504 return flpname;
505 }
506 return fmt::format("alio2-cr1-flp159_cru{}_{}", feeID / 2, RDHUtils::getEndPointID(rdh));
507}
508
509//_____________________________________________________________________
510std::string RawDump::getBaseFileNameMCH(const header::RDHAny* rdh)
511{
512 uint16_t cruID = RDHUtils::getCRUID(rdh) & 0xff;
513 if (cruID > 0x1f) {
514 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)), RDHUtils::getFEEID(rdh));
515 LOGP(error, "Unrecognized MCH flp, setting to {}", flpname);
516 return flpname;
517 }
518
519 return fmt::format("alio2-cr1-flp{}_cru{}_{}", 148 + cruID / 3, cruID, RDHUtils::getEndPointID(rdh));
520}
521
522//_____________________________________________________________________
523std::string RawDump::getBaseFileNameZDC(const header::RDHAny* rdh)
524{
525 return fmt::format("alio2-cr1-flp181_cru{}_{}", RDHUtils::getCRUID(rdh), RDHUtils::getEndPointID(rdh));
526}
527
528//_____________________________________________________________________
529std::string RawDump::getBaseFileNameCPV(const header::RDHAny* rdh)
530{
531 uint16_t feeid = RDHUtils::getFEEID(rdh);
532 if (feeid > 2) {
533 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)), RDHUtils::getFEEID(rdh));
534 LOGP(error, "Unrecognized CPV flp, setting to {}", flpname);
535 return flpname;
536 }
537 return fmt::format("alio2-cr1-flp162_cru{}_{}", RDHUtils::getCRUID(rdh), RDHUtils::getEndPointID(rdh));
538}
539
540//_____________________________________________________________________
541std::string RawDump::getBaseFileNameITS(const header::RDHAny* rdh)
542{
543 static const std::unordered_map<int, std::string> cru2name = {
544 {183, "alio2-cr1-flp187"},
545 {172, "alio2-cr1-flp198"},
546 {181, "alio2-cr1-flp188"},
547 {196, "alio2-cr1-flp203"},
548 {184, "alio2-cr1-flp189"},
549 {191, "alio2-cr1-flp189"},
550 {179, "alio2-cr1-flp190"},
551 {192, "alio2-cr1-flp190"},
552 {175, "alio2-cr1-flp191"},
553 {182, "alio2-cr1-flp191"},
554 {187, "alio2-cr1-flp192"},
555 {176, "alio2-cr1-flp192"},
556 {177, "alio2-cr1-flp193"},
557 {178, "alio2-cr1-flp193"},
558 {194, "alio2-cr1-flp194"},
559 {174, "alio2-cr1-flp194"},
560 {180, "alio2-cr1-flp195"},
561 {193, "alio2-cr1-flp195"},
562 {185, "alio2-cr1-flp196"},
563 {189, "alio2-cr1-flp196"},
564 {186, "alio2-cr1-flp197"},
565 {195, "alio2-cr1-flp197"},
566 };
567 auto ent = cru2name.find(RDHUtils::getCRUID(rdh));
568 if (ent == cru2name.end()) {
569 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)), RDHUtils::getFEEID(rdh));
570 LOGP(error, "Unrecognized ITS flp, setting to {}", flpname);
571 return flpname;
572 }
573 return fmt::format("{}_cru{}_{}", ent->second, RDHUtils::getCRUID(rdh), RDHUtils::getEndPointID(rdh));
574}
575
576//_____________________________________________________________________
577std::string RawDump::getBaseFileNameMFT(const header::RDHAny* rdh)
578{
579 static const std::unordered_map<int, std::pair<int, std::string>> cru2name = {
580 {0x800, {570, "alio2-cr1-flp182"}},
581 {0x801, {542, "alio2-cr1-flp186"}},
582 {0x802, {548, "alio2-cr1-flp183"}},
583 {0x803, {211, "alio2-cr1-flp185"}},
584 {0x804, {569, "alio2-cr1-flp184"}},
585 {0x805, {543, "alio2-cr1-flp184"}},
586 {0x806, {552, "alio2-cr1-flp185"}},
587 {0x807, {554, "alio2-cr1-flp183"}},
588 {0x808, {547, "alio2-cr1-flp186"}},
589 {0x809, {567, "alio2-cr1-flp182"}},
590 };
591 auto ent = cru2name.find(RDHUtils::getCRUID(rdh));
592 if (ent == cru2name.end()) {
593 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)), RDHUtils::getFEEID(rdh));
594 LOGP(error, "Unrecognized MFT flp, setting to {}", flpname);
595 return flpname;
596 }
597 return fmt::format("{}_cru{}_{}", ent->second.second, RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)));
598}
599
600//_____________________________________________________________________
601std::string RawDump::getBaseFileNameTPC(const header::RDHAny* rdh)
602{
603 constexpr int NFLP = 361;
604 constexpr const char* CRU_FLPS[NFLP] = {
605 "alio2-cr1-flp070", "alio2-cr1-flp069", "alio2-cr1-flp070", "alio2-cr1-flp069", "alio2-cr1-flp072", "alio2-cr1-flp071", "alio2-cr1-flp072", "alio2-cr1-flp071", "alio2-cr1-flp072", "alio2-cr1-flp071", "alio2-cr1-flp002", "alio2-cr1-flp001", "alio2-cr1-flp002", "alio2-cr1-flp001", "alio2-cr1-flp004", "alio2-cr1-flp003", "alio2-cr1-flp004", "alio2-cr1-flp003",
606 "alio2-cr1-flp004", "alio2-cr1-flp003", "alio2-cr1-flp006", "alio2-cr1-flp005", "alio2-cr1-flp006", "alio2-cr1-flp005", "alio2-cr1-flp008", "alio2-cr1-flp007", "alio2-cr1-flp008", "alio2-cr1-flp007", "alio2-cr1-flp008", "alio2-cr1-flp007", "alio2-cr1-flp010", "alio2-cr1-flp009", "alio2-cr1-flp010", "alio2-cr1-flp009", "alio2-cr1-flp012", "alio2-cr1-flp011",
607 "alio2-cr1-flp012", "alio2-cr1-flp011", "alio2-cr1-flp012", "alio2-cr1-flp011", "alio2-cr1-flp014", "alio2-cr1-flp013", "alio2-cr1-flp014", "alio2-cr1-flp013", "alio2-cr1-flp016", "alio2-cr1-flp015", "alio2-cr1-flp016", "alio2-cr1-flp015", "alio2-cr1-flp016", "alio2-cr1-flp015", "alio2-cr1-flp018", "alio2-cr1-flp017", "alio2-cr1-flp018", "alio2-cr1-flp017",
608 "alio2-cr1-flp020", "alio2-cr1-flp019", "alio2-cr1-flp020", "alio2-cr1-flp019", "alio2-cr1-flp020", "alio2-cr1-flp019", "alio2-cr1-flp022", "alio2-cr1-flp021", "alio2-cr1-flp022", "alio2-cr1-flp021", "alio2-cr1-flp024", "alio2-cr1-flp023", "alio2-cr1-flp024", "alio2-cr1-flp023", "alio2-cr1-flp024", "alio2-cr1-flp023", "alio2-cr1-flp026", "alio2-cr1-flp025",
609 "alio2-cr1-flp026", "alio2-cr1-flp025", "alio2-cr1-flp028", "alio2-cr1-flp027", "alio2-cr1-flp028", "alio2-cr1-flp027", "alio2-cr1-flp028", "alio2-cr1-flp027", "alio2-cr1-flp030", "alio2-cr1-flp029", "alio2-cr1-flp030", "alio2-cr1-flp029", "alio2-cr1-flp032", "alio2-cr1-flp031", "alio2-cr1-flp032", "alio2-cr1-flp031", "alio2-cr1-flp032", "alio2-cr1-flp031",
610 "alio2-cr1-flp034", "alio2-cr1-flp033", "alio2-cr1-flp034", "alio2-cr1-flp033", "alio2-cr1-flp036", "alio2-cr1-flp035", "alio2-cr1-flp036", "alio2-cr1-flp035", "alio2-cr1-flp036", "alio2-cr1-flp035", "alio2-cr1-flp038", "alio2-cr1-flp037", "alio2-cr1-flp038", "alio2-cr1-flp037", "alio2-cr1-flp040", "alio2-cr1-flp039", "alio2-cr1-flp040", "alio2-cr1-flp039",
611 "alio2-cr1-flp040", "alio2-cr1-flp039", "alio2-cr1-flp042", "alio2-cr1-flp041", "alio2-cr1-flp042", "alio2-cr1-flp041", "alio2-cr1-flp044", "alio2-cr1-flp043", "alio2-cr1-flp044", "alio2-cr1-flp043", "alio2-cr1-flp044", "alio2-cr1-flp043", "alio2-cr1-flp046", "alio2-cr1-flp045", "alio2-cr1-flp046", "alio2-cr1-flp045", "alio2-cr1-flp048", "alio2-cr1-flp047",
612 "alio2-cr1-flp048", "alio2-cr1-flp047", "alio2-cr1-flp048", "alio2-cr1-flp047", "alio2-cr1-flp050", "alio2-cr1-flp049", "alio2-cr1-flp050", "alio2-cr1-flp049", "alio2-cr1-flp052", "alio2-cr1-flp051", "alio2-cr1-flp052", "alio2-cr1-flp051", "alio2-cr1-flp052", "alio2-cr1-flp051", "alio2-cr1-flp054", "alio2-cr1-flp053", "alio2-cr1-flp054", "alio2-cr1-flp053",
613 "alio2-cr1-flp056", "alio2-cr1-flp055", "alio2-cr1-flp056", "alio2-cr1-flp055", "alio2-cr1-flp056", "alio2-cr1-flp055", "alio2-cr1-flp058", "alio2-cr1-flp057", "alio2-cr1-flp058", "alio2-cr1-flp057", "alio2-cr1-flp060", "alio2-cr1-flp059", "alio2-cr1-flp060", "alio2-cr1-flp059", "alio2-cr1-flp060", "alio2-cr1-flp059", "alio2-cr1-flp062", "alio2-cr1-flp061",
614 "alio2-cr1-flp062", "alio2-cr1-flp061", "alio2-cr1-flp064", "alio2-cr1-flp063", "alio2-cr1-flp064", "alio2-cr1-flp063", "alio2-cr1-flp064", "alio2-cr1-flp063", "alio2-cr1-flp066", "alio2-cr1-flp065", "alio2-cr1-flp066", "alio2-cr1-flp065", "alio2-cr1-flp068", "alio2-cr1-flp067", "alio2-cr1-flp068", "alio2-cr1-flp067", "alio2-cr1-flp068", "alio2-cr1-flp067",
615 "alio2-cr1-flp074", "alio2-cr1-flp073", "alio2-cr1-flp074", "alio2-cr1-flp073", "alio2-cr1-flp076", "alio2-cr1-flp075", "alio2-cr1-flp076", "alio2-cr1-flp075", "alio2-cr1-flp076", "alio2-cr1-flp075", "alio2-cr1-flp078", "alio2-cr1-flp077", "alio2-cr1-flp078", "alio2-cr1-flp077", "alio2-cr1-flp080", "alio2-cr1-flp079", "alio2-cr1-flp080", "alio2-cr1-flp079",
616 "alio2-cr1-flp080", "alio2-cr1-flp079", "alio2-cr1-flp082", "alio2-cr1-flp081", "alio2-cr1-flp082", "alio2-cr1-flp081", "alio2-cr1-flp084", "alio2-cr1-flp083", "alio2-cr1-flp084", "alio2-cr1-flp083", "alio2-cr1-flp084", "alio2-cr1-flp083", "alio2-cr1-flp086", "alio2-cr1-flp085", "alio2-cr1-flp086", "alio2-cr1-flp085", "alio2-cr1-flp088", "alio2-cr1-flp087",
617 "alio2-cr1-flp088", "alio2-cr1-flp087", "alio2-cr1-flp088", "alio2-cr1-flp087", "alio2-cr1-flp090", "alio2-cr1-flp089", "alio2-cr1-flp090", "alio2-cr1-flp089", "alio2-cr1-flp092", "alio2-cr1-flp091", "alio2-cr1-flp092", "alio2-cr1-flp091", "alio2-cr1-flp092", "alio2-cr1-flp091", "alio2-cr1-flp094", "alio2-cr1-flp093", "alio2-cr1-flp094", "alio2-cr1-flp093",
618 "alio2-cr1-flp096", "alio2-cr1-flp095", "alio2-cr1-flp096", "alio2-cr1-flp095", "alio2-cr1-flp096", "alio2-cr1-flp095", "alio2-cr1-flp098", "alio2-cr1-flp097", "alio2-cr1-flp098", "alio2-cr1-flp097", "alio2-cr1-flp100", "alio2-cr1-flp099", "alio2-cr1-flp100", "alio2-cr1-flp099", "alio2-cr1-flp100", "alio2-cr1-flp099", "alio2-cr1-flp102", "alio2-cr1-flp101",
619 "alio2-cr1-flp102", "alio2-cr1-flp101", "alio2-cr1-flp104", "alio2-cr1-flp103", "alio2-cr1-flp104", "alio2-cr1-flp103", "alio2-cr1-flp104", "alio2-cr1-flp103", "alio2-cr1-flp106", "alio2-cr1-flp105", "alio2-cr1-flp106", "alio2-cr1-flp105", "alio2-cr1-flp108", "alio2-cr1-flp107", "alio2-cr1-flp108", "alio2-cr1-flp107", "alio2-cr1-flp108", "alio2-cr1-flp107",
620 "alio2-cr1-flp110", "alio2-cr1-flp109", "alio2-cr1-flp110", "alio2-cr1-flp109", "alio2-cr1-flp112", "alio2-cr1-flp111", "alio2-cr1-flp112", "alio2-cr1-flp111", "alio2-cr1-flp112", "alio2-cr1-flp111", "alio2-cr1-flp114", "alio2-cr1-flp113", "alio2-cr1-flp114", "alio2-cr1-flp113", "alio2-cr1-flp116", "alio2-cr1-flp115", "alio2-cr1-flp116", "alio2-cr1-flp115",
621 "alio2-cr1-flp116", "alio2-cr1-flp115", "alio2-cr1-flp118", "alio2-cr1-flp117", "alio2-cr1-flp118", "alio2-cr1-flp117", "alio2-cr1-flp120", "alio2-cr1-flp119", "alio2-cr1-flp120", "alio2-cr1-flp119", "alio2-cr1-flp120", "alio2-cr1-flp119", "alio2-cr1-flp122", "alio2-cr1-flp121", "alio2-cr1-flp122", "alio2-cr1-flp121", "alio2-cr1-flp124", "alio2-cr1-flp123",
622 "alio2-cr1-flp124", "alio2-cr1-flp123", "alio2-cr1-flp124", "alio2-cr1-flp123", "alio2-cr1-flp126", "alio2-cr1-flp125", "alio2-cr1-flp126", "alio2-cr1-flp125", "alio2-cr1-flp128", "alio2-cr1-flp127", "alio2-cr1-flp128", "alio2-cr1-flp127", "alio2-cr1-flp128", "alio2-cr1-flp127", "alio2-cr1-flp130", "alio2-cr1-flp129", "alio2-cr1-flp130", "alio2-cr1-flp129",
623 "alio2-cr1-flp132", "alio2-cr1-flp131", "alio2-cr1-flp132", "alio2-cr1-flp131", "alio2-cr1-flp132", "alio2-cr1-flp131", "alio2-cr1-flp134", "alio2-cr1-flp133", "alio2-cr1-flp134", "alio2-cr1-flp133", "alio2-cr1-flp136", "alio2-cr1-flp135", "alio2-cr1-flp136", "alio2-cr1-flp135", "alio2-cr1-flp136", "alio2-cr1-flp135", "alio2-cr1-flp138", "alio2-cr1-flp137",
624 "alio2-cr1-flp138", "alio2-cr1-flp137", "alio2-cr1-flp140", "alio2-cr1-flp139", "alio2-cr1-flp140", "alio2-cr1-flp139", "alio2-cr1-flp140", "alio2-cr1-flp139", "alio2-cr1-flp142", "alio2-cr1-flp141", "alio2-cr1-flp142", "alio2-cr1-flp141", "alio2-cr1-flp144", "alio2-cr1-flp143", "alio2-cr1-flp144", "alio2-cr1-flp143", "alio2-cr1-flp144", "alio2-cr1-flp143",
625 "alio2-cr1-flp145"};
626
627 if (mTPCLinkRej && (mTPCLinkRej & (0x1UL << RDHUtils::getLinkID(rdh)))) {
628 return "";
629 }
630
631 int cru = RDHUtils::getCRUID(rdh);
632 if (cru >= NFLP) {
633 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", RDHUtils::getCRUID(rdh), int(RDHUtils::getEndPointID(rdh)), RDHUtils::getFEEID(rdh));
634 LOGP(error, "Unrecognized TPC flp, setting to {}", flpname);
635 return flpname;
636 }
637 return fmt::format("{}_cru{}_{}", CRU_FLPS[cru], cru, int(RDHUtils::getEndPointID(rdh)));
638}
639
640//_____________________________________________________________________
641std::string RawDump::getBaseFileNameTRD(const header::RDHAny* rdh)
642{
643 constexpr int NLinks = 72;
644 struct TRDCRUMapping {
645 int32_t flpid; // hostname of flp
646 int32_t cruHWID = 0; // cru ID taken from ecs
647 int32_t HCID = 0; // hcid of first link
648 };
649 constexpr TRDCRUMapping trdHWMap[NLinks / 2] = {
650 {166, 250, 0}, {166, 583, 0}, {166, 585, 0}, {167, 248, 0}, {167, 249, 0}, {167, 596, 0}, {168, 246, 0}, {168, 247, 0}, {168, 594, 0}, {169, 252, 0}, {169, 253, 0}, {169, 254, 0}, {170, 245, 0}, {170, 593, 0}, {170, 595, 0}, {171, 258, 0}, {171, 259, 0}, {171, 260, 0}, {172, 579, 0}, {172, 581, 0}, {172, 586, 0}, {173, 578, 0}, {173, 580, 0}, {173, 597, 0}, {174, 256, 0}, {174, 582, 0}, {174, 587, 0}, {175, 251, 0}, {175, 255, 0}, {175, 588, 0}, {176, 264, 0}, {176, 591, 0}, {176, 592, 0}, {177, 263, 0}, {177, 589, 0}, {177, 590, 0}};
651
652 // see DataFormatsTRD/RawData.h
653 uint16_t feeID = RDHUtils::getFEEID(rdh);
654 int ep = feeID & 0x1, supermodule = feeID >> 8, side = (feeID & (0x1 << 4)) & 0x1; // A=0, C=1
655 int link = supermodule * 4 + side * 2 + ep, cru = link / 2;
656 if (link >= NLinks) {
657 auto flpname = fmt::format("flp-unknown_cru{}_ep{}_feeid0x{:05x}", cru, int(RDHUtils::getEndPointID(rdh)), RDHUtils::getFEEID(rdh));
658 LOGP(error, "Got wrong link {}, setting TRF file name to unrecognized flp {}", link, flpname);
659 return flpname;
660 }
661 return fmt::format("alio2-cr1-flp{}_cru{}_{}", trdHWMap[cru].flpid, trdHWMap[cru].cruHWID, ep);
662}
663
664//_____________________________________________________________________
666{
667 return (id == DetID::EMC || id == DetID::HMP || id == DetID::PHS) ? "RORC" : "CRU";
668}
669
670//__________________________________________________________
671DataProcessorSpec getRawDumpSpec(DetID::mask_t detMask, bool TOFUncompressed)
672{
673 std::vector<InputSpec> inputs;
674 o2h::DataOrigin orig;
675 for (DetID::ID id = DetID::First; id <= DetID::Last; id++) {
676 if (detMask[id] && (orig = DetID::getDataOrigin(id)) != o2h::gDataOriginInvalid) {
677 inputs.emplace_back(DetID::getName(id), ConcreteDataTypeMatcher{orig, (id != DetID::TOF || TOFUncompressed) ? RawDump::DESCRaw : RawDump::DESCCRaw}, Lifetime::Timeframe);
678 }
679 }
680 return DataProcessorSpec{
681 "rawdump",
682 inputs,
683 {},
684 AlgorithmSpec{adaptFromTask<RawDump>(TOFUncompressed)},
685 {ConfigParamSpec{"fatal-on-deadbeef", VariantType::Bool, false, {"produce fata if 0xdeadbeef received for some detector"}},
686 ConfigParamSpec{"skip-dump", VariantType::Bool, false, {"do not produce binary data"}},
687 ConfigParamSpec{"dump-verbosity", VariantType::Int, 0, {"0:minimal, 1:report Det/FeeID->filename, 2: print RDH"}},
688 ConfigParamSpec{"reject-tpc-links", VariantType::String, "", {"comma-separated list TPC links to reject"}},
689 ConfigParamSpec{"skip-impose-sox", VariantType::Bool, false, {"do not impose SOX for 1st TF"}},
690 ConfigParamSpec{"output-directory", VariantType::String, "./", {"Output directory (create if needed)"}}}};
691}
692
693} // namespace o2::raw
Definition of the 32 Central Trigger System (CTS) Trigger Types defined in https://twiki....
std::string getName(const TDataMember *dm, int index, int size)
A raw page parser for DPL input.
int32_t i
Helper function to tokenize sequences and ranges of integral numbers.
uint32_t supermodule
Definition RawData.h:3
uint32_t side
Definition RawData.h:0
Class for time synchronization of RawReader instances.
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
static constexpr const char * getName(ID id)
names of defined detectors
Definition DetID.h:145
static constexpr ID CTP
Definition DetID.h:79
static constexpr ID FV0
Definition DetID.h:76
static constexpr ID PHS
Definition DetID.h:67
static constexpr ID MID
Definition DetID.h:73
static constexpr ID ITS
Definition DetID.h:63
static constexpr ID First
Definition DetID.h:94
static constexpr ID MFT
Definition DetID.h:71
static constexpr ID ZDC
Definition DetID.h:74
static constexpr ID FT0
Definition DetID.h:75
static constexpr ID CPV
Definition DetID.h:68
static constexpr ID TRD
Definition DetID.h:65
static constexpr ID Last
if extra detectors added, update this !!!
Definition DetID.h:92
static constexpr ID TPC
Definition DetID.h:64
static constexpr o2h::DataOrigin getDataOrigin(ID id)
Definition DetID.h:147
static constexpr ID EMC
Definition DetID.h:69
static mask_t getMask(const std::string_view detList)
detector masks from any non-alpha-num delimiter-separated list (empty if NONE is supplied)
Definition DetID.cxx:42
static constexpr ID FDD
Definition DetID.h:77
static constexpr ID MCH
Definition DetID.h:72
static constexpr ID HMP
Definition DetID.h:70
static constexpr ID TOF
Definition DetID.h:66
The parser handles transparently input in the format of raw pages.
const_iterator end() const
const_iterator begin() const
ConfigParamRegistry const & options()
Definition InitContext.h:33
InputRecord & inputs()
The inputs associated with this processing context.
static std::string getReadoutType(DetID id)
void run(ProcessingContext &pc) final
void endOfStream(EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(InitContext &ic) final
static constexpr o2h::DataDescription DESCCRaw
static constexpr o2h::DataDescription DESCRaw
RawDump(bool TOFUncompressed=false)
GLsizeiptr size
Definition glcorearb.h:659
GLuint GLuint end
Definition glcorearb.h:469
GLuint const GLchar * name
Definition glcorearb.h:781
GLboolean * data
Definition glcorearb.h:298
GLuint id
Definition glcorearb.h:650
constexpr o2::header::DataOrigin gDataOriginInvalid
Definition DataHeader.h:561
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
O2 data header classes and API, v0.1.
Definition DetID.h:49
o2::framework::DataProcessorSpec getRawDumpSpec(o2::detectors::DetID::mask_t detMask, bool TOFUncompressed)
o2::detectors::DetID DetID
constexpr int NFLP
the number of FLP we have.
Definition Constants.h:37
const TRDCRUMapping trdHWMap[constants::NHALFCRU/2]
Definition Trap2CRU.cxx:57
constexpr uint32_t SOT
Definition Triggers.h:33
constexpr uint32_t TF
Definition Triggers.h:37
constexpr uint32_t ORBIT
Definition Triggers.h:26
constexpr uint32_t SOC
Definition Triggers.h:35
constexpr uint32_t HB
Definition Triggers.h:27
constexpr int NLinks
Definition Constants.h:70
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Common utility functions.
void empty(int)
uint32_t orbit
LHC orbit.
the main header struct
Definition DataHeader.h:618
static void setTriggerType(H &rdh, uint32_t v, NOTPTR(H))
Definition RDHUtils.h:523
static void setMemorySize(H &rdh, uint16_t v, NOTPTR(H))
Definition RDHUtils.h:240
static void printRDH(const RDHv4 &rdh)
Definition RDHUtils.cxx:26
static bool checkRDH(const RDHv4 &rdh, bool verbose=true, bool checkZeros=false)
Definition RDHUtils.cxx:133
static void setPacketCounter(H &rdh, uint8_t v, NOTPTR(H))
Definition RDHUtils.h:272
static void setTriggerOrbit(RDHv4 &rdh, uint32_t v)
Definition RDHUtils.h:467
static void setOffsetToNext(H &rdh, uint16_t v, NOTPTR(H))
Definition RDHUtils.h:224
static void setStop(H &rdh, uint8_t v, NOTPTR(H))
Definition RDHUtils.h:644
o2::InteractionRecord firstIR
o2::header::RDHAny rdhSOX
static std::string getFullPath(const std::string_view p)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
const std::string str