12#ifndef DETECTOR_BASE_RAWFILEWRITER_H
13#define DETECTOR_BASE_RAWFILEWRITER_H
20#include <unordered_map>
30#include <TStopwatch.h>
49 const char*
ptr,
int size,
int splitID,
50 std::vector<char>& trailer, std::vector<char>& header)>;
111 void addData(
const IR&
ir,
const gsl::span<char>
data,
bool preformatted =
false, uint32_t trigger = 0, uint32_t detField = 0);
119 void addDataInternal(
const IR&
ir,
const gsl::span<char>
data,
bool preformatted =
false, uint32_t trigger = 0, uint32_t detField = 0,
bool checkEmpty =
true);
126 void cacheData(
const IR&
ir,
const gsl::span<char>
data,
bool preformatted, uint32_t trigger = 0, uint32_t detField = 0);
131 auto offs =
buffer.size();
137 size_t pushBack(
const char*
ptr,
size_t sz,
bool keepLastOnFlash =
true);
143 return pushBack(
reinterpret_cast<const char*
>(&rdh),
sizeof(
RDHAny),
false);
177 void writeConfFile(std::string_view origin =
"FLP", std::string_view description =
"RAWDATA", std::string_view cfgname =
"raw.cfg",
bool fullPath =
true)
const;
180 LinkData&
registerLink(uint16_t fee, uint16_t cru, uint8_t link, uint8_t
endpoint, std::string_view outFileName);
182 template <
typename H>
185 RDHAny::sanityCheckLoose<H>();
186 auto& linkData =
registerLink(RDHUtils::getFEEID(rdh), RDHUtils::getCRUID(rdh), RDHUtils::getLinkID(rdh), RDHUtils::getEndPointID(rdh), outFileName);
200 template <
typename H>
203 RDHAny::sanityCheckLoose<H>();
204 return mSSpec2Link[
RDHUtils::getSubSpec(RDHUtils::getCRUID(rdh), RDHUtils::getLinkID(rdh), RDHUtils::getEndPointID(rdh), RDHUtils::getFEEID(rdh))];
208 const gsl::span<char>
data,
bool preformatted =
false, uint32_t trigger = 0, uint32_t detField = 0);
210 template <
typename H>
211 void addData(
const H& rdh,
const IR&
ir,
const gsl::span<char>
data,
bool preformatted =
false, uint32_t trigger = 0)
213 RDHAny::sanityCheckLoose<H>();
214 addData(RDHUtils::getFEEID(rdh), RDHUtils::getCRUID(rdh), RDHUtils::getLinkID(rdh), RDHUtils::getEndPointID(rdh),
ir,
data, trigger);
246 auto it = mFName2File.begin();
266 carryOverFunc = [=](
const RDHAny* rdh,
const gsl::span<char>
data,
const char*
ptr,
int size,
int splitID,
267 std::vector<char>& trailer, std::vector<char>& header) ->
int {
268 return t->carryOverMethod(rdh,
data,
ptr,
size, splitID, trailer, header);
275 emptyHBFFunc = [=](
const RDHAny* rdh, std::vector<char>& toAdd) {
276 t->emptyHBFMethod(rdh, toAdd);
283 newRDHFunc = [=](
const RDHAny* rdh,
bool prevEmpty, std::vector<char>& toAdd) {
284 t->newRDHMethod(rdh, prevEmpty, toAdd);
324 std::vector<char>& trailer, std::vector<char>& header)
const
355 assert(
v >= RDHUtils::getVersion<o2::header::RDHLowest>() &&
v <= RDHUtils::getVersion<o2::header::RDHHighest>());
375 mCRUDetector =
false;
396 void fillFromCache();
398 enum RoMode_t { NotSet,
403 std::unordered_map<LinkSubSpec_t, LinkData> mSSpec2Link;
404 std::unordered_map<std::string, OutputFile> mFName2File;
412 int mUseRDHVersion = RDHUtils::getVersion<o2::header::RAWDataHeader>();
413 unsigned char mUseRDHDataFormat = 0;
414 unsigned char mAlignmentSize = 0;
415 unsigned char mAlignmentPaddingFiller = 0xff;
416 int mSuperPageSize = 1024 * 1024;
417 bool mStartTFOnNewSPage =
true;
418 bool mDontFillEmptyHBF =
false;
419 bool mAddSeparateHBFStopPage =
true;
420 bool mUseRDHStop =
true;
421 bool mCRUDetector =
true;
422 bool mApplyCarryOverToLastPage =
false;
425 bool mCachingStage =
false;
426 std::mutex mCacheFileMtx;
427 std::unique_ptr<TFile> mCacheFile;
428 using CacheEntry = std::vector<std::pair<LinkSubSpec_t, size_t>>;
429 std::map<IR, CacheEntry> mCacheMap;
433 RoMode_t mROMode = NotSet;
435 DetLazinessCheck mDetLazyCheck{};
436 bool mDoLazinessCheck =
true;
438 ClassDefNV(RawFileWriter, 1);
static const HBFUtils & Instance()
void setCarryOverCallBack(const T *t)
bool isRDHStopUsed() const
void useRDHVersion(int v)
std::string getOutputFileName(int i) const
void setAlignmentSize(unsigned char v)
int carryOverMethod(const RDHAny *, const gsl::span< char > data, const char *ptr, int maxSize, int splitID, std::vector< char > &trailer, std::vector< char > &header) const
void useRDHDataFormat(unsigned char v)
unsigned char getUsedRDHDataFormat() const
bool getDontFillEmptyHBF() const
void setSuperPageSize(int nbytes)
bool getAddSeparateHBFStopPage() const
int getSuperPageSize() const
void setAlignmentPaddingFiller(unsigned char v)
OutputFile & getOutputFileForLink(const LinkData &lnk)
bool isCarryOverToLastPageApplied() const
void setDontFillEmptyHBF(bool v)
bool isCRUDetector() const
std::function< void(const RDHAny *rdh, std::vector< char > &emptyHBF)> EmptyPageCallBack
int getUsedRDHVersion() const
void addData(uint16_t feeid, uint16_t cru, uint8_t lnk, uint8_t endpoint, const IR &ir, const gsl::span< char > data, bool preformatted=false, uint32_t trigger=0, uint32_t detField=0)
void addData(const H &rdh, const IR &ir, const gsl::span< char > data, bool preformatted=false, uint32_t trigger=0)
void setContinuousReadout()
bool isReadOutModeSet() const
LinkData & registerLink(uint16_t fee, uint16_t cru, uint8_t link, uint8_t endpoint, std::string_view outFileName)
std::function< int(const RDHAny *rdh, const gsl::span< char > data, const char *ptr, int size, int splitID, std::vector< char > &trailer, std::vector< char > &header)> CarryOverCallBack
o2::header::DataOrigin getOrigin() const
void setEmptyPageCallBack(const T *t)
int getNOutputFiles() const
RawFileWriter(o2::header::DataOrigin origin=o2::header::gDataOriginInvalid, bool cru=true)
void writeConfFile(std::string_view origin="FLP", std::string_view description="RAWDATA", std::string_view cfgname="raw.cfg", bool fullPath=true) const
bool isRORCDetector() const
IR getIRMax() const
get highest IR seen so far
void setAddSeparateHBFStopPage(bool v)
bool isContinuousReadout() const
void setContinuousReadout(bool v)
void doLazinessCheck(bool v)
o2::header::RDHAny RDHAny
const HBFUtils & getHBFUtils() const
unsigned char getAlignmentSize() const
LinkData & getLinkWithSubSpec(const H &rdh)
void setTriggeredReadout()
void setNewRDHCallBack(const T *t)
std::function< void(const RDHAny *rdh, bool prevEmpty, std::vector< char > &filler)> NewRDHCallBack
LinkData & registerLink(const H &rdh, std::string_view outFileName)
void setOrigin(o2::header::DataOrigin origin)
bool isLinkRegistered(LinkSubSpec_t ss) const
void setUseRDHStop(bool v=true)
void newRDHMethod(const RDHAny *rdh, bool prevEmpty, std::vector< char > &toAdd) const
void emptyHBFMethod(const RDHAny *rdh, std::vector< char > &toAdd) const
LinkData & getLinkWithSubSpec(LinkSubSpec_t ss)
bool isTriggeredReadout() const
unsigned char getAlignmentPaddingFiller() const
void setApplyCarryOverToLastPage(bool v)
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
constexpr o2::header::DataOrigin gDataOriginInvalid
void assertOutputDirectory(std::string_view outDirName)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
static LinkSubSpec_t getSubSpec(uint16_t cru, uint8_t link, uint8_t endpoint, uint16_t feeId, o2::header::DAQID::ID srcid=o2::header::DAQID::INVALID)
static void setDetectorField(H &rdh, uint32_t v, NOTPTR(H))
void acknowledge(LinkSubSpec_t s, const IR &_ir, bool _preformatted, uint32_t _trigger, uint32_t _detField)
std::unordered_map< LinkSubSpec_t, bool > linksDone
void completeLinks(RawFileWriter *wr, const IR &_ir)
int getCurrentPageSize() const
LinkData & operator=(const LinkData &src)
std::string describe() const
void addPreformattedCRUPage(const gsl::span< char > data)
size_t expandBufferBy(size_t by)
expand buffer by positive increment and return old size
void addData(const IR &ir, const gsl::span< char > data, bool preformatted=false, uint32_t trigger=0, uint32_t detField=0)
static constexpr int MarginToFlush
std::vector< char > buffer
size_t pushBack(const RDHAny &rdh)
add RDH to buffer. In case this requires flushing of the superpage, do not keep the previous page
size_t pushBack(const char *ptr, size_t sz, bool keepLastOnFlash=true)
append to the end of the buffer and return the point where appended to
void flushSuperPage(bool keepLastPage=false)
void fillEmptyHBHs(const IR &ir, bool dataAdded)
void addHBFPage(bool stop=false)
void addDataInternal(const IR &ir, const gsl::span< char > data, bool preformatted=false, uint32_t trigger=0, uint32_t detField=0, bool checkEmpty=true)
std::unique_ptr< TTree > cacheTree
void cacheData(const IR &ir, const gsl::span< char > data, bool preformatted, uint32_t trigger=0, uint32_t detField=0)
void openHBFPage(const RDHAny &rdh, uint32_t trigger=0)
void write(const char *data, size_t size)
OutputFile(const OutputFile &src)
OutputFile & operator=(const OutputFile &src)
=====================================================================================
ClassDefNV(PayloadCache, 1)
std::vector< char > payload
o2::InteractionRecord ir(0, 0)