23#include <fmt/format.h>
43 bool continuous =
true;
55 if (!std::filesystem::exists(opt.
outputDir)) {
56 if (!std::filesystem::create_directories(opt.
outputDir)) {
57 LOGP(fatal,
"could not create output directory {}", opt.
outputDir);
59 LOGP(info,
"created output directory {}", opt.
outputDir);
79 if (userLogicVersion == 0) {
81 }
else if (userLogicVersion == 1) {
84 throw std::invalid_argument(
"Version can only be 0 or 1");
91 if (userLogicVersion == 0) {
93 }
else if (userLogicVersion == 1) {
96 throw std::invalid_argument(
"Version can only be 0 or 1");
129 std::set<LinkInfo> links;
130 for (
auto solarId : solarIds) {
131 auto li = solar2LinkInfo(solarId);
132 if (!li.has_value()) {
133 LOGP(fatal,
"Could not find information about solarId {:d}", solarId);
135 links.insert(li.value());
138 LOGP(info,
"MCH: registered {:d} links for {:d} solars",
154 os << fmt::format(
"output dir {} filePerLink {} filePerCruEndpoint {} userLogic {} dummyElecMap {} ulVersion {}\n",
164 mRawFileWriter{
o2::header::DAQID(
o2::header::DAQID::MCH).getO2Origin()},
165 mSolar2LinkInfo{
getSolar2LinkInfo(opts.userLogic, opts.dummyElecMap, opts.userLogicVersion)},
166 mLinks{
getLinks(mSolar2LinkInfo, opts.dummyElecMap)},
170 opts.userLogicVersion,
171 opts.chargeSumMode)},
172 mDigitPayloadEncoder{
getDigit2Elec(opts.dummyElecMap), *(mPayloadEncoder.get())}
179 LOGP(info,
"Adding heartbeats for orbit={}",
orbit);
180 mPayloadEncoder->startHeartbeatFrame(
orbit, 0);
181 mPayloadEncoder->addHeartbeatHeaders(dsElecIds);
186 LOGP(info,
"Encoding {} MCH digits for orbit {} bc {}",
digits.size(),
orbit,
bc);
187 std::vector<std::byte>
buffer;
Header of the General Run Parameters object.
Definition of the Names Generator class.
static std::string getGRPFileName(const std::string_view prefix=STANDARDSIMPREFIX)
void encodeDigits(gsl::span< o2::mch::Digit > digits, uint32_t orbit, uint16_t bc, std::vector< std::byte > &buffer)
DigitRawEncoder(DigitRawEncoderOptions opt={})
void encodeDigits(gsl::span< o2::mch::Digit > digits, uint32_t orbit, uint16_t bc)
void addHeartbeats(std::set< DsElecId > dsElecIds, uint32_t orbit)
bool isDetContinuousReadOut(DetID id) const
test if detector is read out
static GRPObject * loadFrom(const std::string &grpFileName="")
void useRDHVersion(int v)
void setDontFillEmptyHBF(bool v)
void setContinuousReadout()
void writeConfFile(std::string_view origin="FLP", std::string_view description="RAWDATA", std::string_view cfgname="raw.cfg", bool fullPath=true) const
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, UserLogicFormat, ChargeSumMode, 1 >()
std::function< std::optional< DsElecId >(DsDetId)> createDet2ElecMapper< ElectronicMapperDummy >()
std::function< std::optional< std::pair< DsElecId, int > >(const o2::mch::Digit &digit)> Digit2ElecMapper
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, UserLogicFormat, ChargeSumMode, 0 >()
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperGenerated, UserLogicFormat, ChargeSumMode, 1 >()
void paginate(o2::raw::RawFileWriter &rawFileWriter, gsl::span< const std::byte > buffer, const std::set< LinkInfo > &links, Solar2LinkInfo solar2LinkInfo)
Solar2LinkInfo getSolar2LinkInfo(bool userLogic, bool dummyElecMap, int userLogicVersion)
std::function< std::optional< DsElecId >(DsDetId)> createDet2ElecMapper< ElectronicMapperGenerated >()
Solar2FeeLinkMapper getSolar2FeeLink(bool dummyElecMap)
void registerLinks(o2::raw::RawFileWriter &rawFileWriter, std::string outputBase, const std::set< LinkInfo > &links, bool filePerLink, bool filePerCru)
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperGenerated, BareFormat, ChargeSumMode, 0 >()
Digit2ElecMapper createDigit2ElecMapper(Det2ElecMapper det2elec)
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperGenerated, UserLogicFormat, ChargeSumMode, 0 >()
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, BareFormat, ChargeSumMode, 0 >()
std::set< uint16_t > getSolarUIDs< ElectronicMapperGenerated >()
std::function< std::optional< LinkInfo >(uint16_t)> Solar2LinkInfo
Digit2ElecMapper getDigit2Elec(bool dummyElecMap)
std::function< std::optional< FeeLinkId >(uint16_t solarId)> Solar2FeeLinkMapper
From solarId to (feeId,linkId)
std::function< std::optional< FeeLinkId >(uint16_t)> createSolar2FeeLinkMapper< ElectronicMapperDummy >()
std::set< o2::mch::raw::LinkInfo > getLinks(Solar2LinkInfo solar2LinkInfo, bool dummyElecMap)
std::set< uint16_t > getSolarUIDs< ElectronicMapperDummy >()
std::set< uint16_t > getSolarUIDs()
List of Solar Unique Ids for all MCH.
std::function< std::optional< FeeLinkId >(uint16_t)> createSolar2FeeLinkMapper< ElectronicMapperGenerated >()
void setupRawFileWriter(o2::raw::RawFileWriter &fw, const std::set< LinkInfo > &links, DigitRawEncoderOptions opt)
std::unique_ptr< PayloadEncoder > createPayloadEncoder(Solar2FeeLinkMapper solar2feelink, bool userLogic, int version, bool chargeSumMode)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::ostream & operator<<(std::ostream &stream, o2::InteractionRecord const &ir)
int rawFileWriterVerbosity
std::vector< Digit > digits