28 return static_cast<uint64_t
>(li.
endPoint) |
29 static_cast<uint64_t
>(li.
linkId) << 8 |
30 static_cast<uint64_t
>(li.
cruId) << 24 |
31 static_cast<uint64_t
>(li.
feeId) << 40;
41 os << fmt::format(
"FEEID {:6d} CRU {:4d} LINK {:4d} EP {:1d}",
46template <
typename ELECMAP,
typename FORMAT,
typename CHARGESUM,
int VERSION>
49 auto s2f = createSolar2FeeLinkMapper<ELECMAP>();
50 return [s2f](uint16_t solarId) -> std::optional<LinkInfo> {
51 auto f = s2f(solarId);
58 li.
feeId =
f->feeId() | extraFeeIdChargeSumMask<CHARGESUM>() | extraFeeIdVersionMask<VERSION>();
59 li.
linkId = linkRemapping<FORMAT>(
f->linkId());
76 static std::array<int, 33> cru2flp = {
90 throw std::invalid_argument(
"cruId should be <= 32");
92 return fmt::format(
"alio2-cr1-flp{}", cru2flp[li.
cruId]);
96 std::string outputBase,
97 const std::set<LinkInfo>& links,
101 std::string
output = fmt::format(
"{:s}.raw", outputBase);
102 for (
auto li : links) {
103 if (filePerLink || filePerCru) {
104 output = fmt::format(
"{:s}_{:s}_cru{:d}_{:d}", outputBase,
flpName(li), li.cruId, li.endPoint);
106 output += fmt::format(
"_feedid{:d}", li.feeId);
115 gsl::span<const std::byte>
buffer,
116 const std::set<LinkInfo>& links,
119 std::set<DataBlockRef> dataBlockRefs;
122 dataBlockRefs.insert(
ref);
125 std::map<o2::InteractionRecord, std::set<LinkInfo>> filled;
128 for (
auto r : dataBlockRefs) {
131 auto solarId =
r.block.header.solarId;
132 auto li = solar2LinkInfo(solarId);
133 if (!li.has_value()) {
134 throw std::runtime_error(fmt::format(
"Could not get fee,cru,link,endpoint for solarId {}", solarId));
139 gsl::span<char>(
const_cast<char*
>(
reinterpret_cast<const char*
>(&
b.payload[0])),
146 static std::array<char, 64> nothing;
148 for (
auto p : filled) {
150 auto& filledLinks = p.second;
151 std::set<LinkInfo> addDataNotAlreadyCalled;
152 std::set_difference(links.begin(), links.end(), filledLinks.begin(), filledLinks.end(),
153 std::inserter(addDataNotAlreadyCalled, addDataNotAlreadyCalled.end()));
154 for (
auto li : addDataNotAlreadyCalled) {
Utility class to write detectors data to (multiple) raw data file(s) respecting CRU format.
Class for time synchronization of RawReader instances.
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)
LinkData & registerLink(uint16_t fee, uint16_t cru, uint8_t link, uint8_t endpoint, std::string_view outFileName)
GLboolean GLboolean GLboolean b
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, UserLogicFormat, SampleMode, 0 >()
Solar2LinkInfo createSolar2LinkInfo()
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, UserLogicFormat, ChargeSumMode, 1 >()
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperGenerated, UserLogicFormat, SampleMode, 0 >()
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, BareFormat, SampleMode, 0 >()
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)
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperGenerated, UserLogicFormat, SampleMode, 1 >()
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 >()
o2::header::RDHAny rdhFromLinkInfo(LinkInfo li)
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperGenerated, UserLogicFormat, ChargeSumMode, 0 >()
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, BareFormat, ChargeSumMode, 0 >()
std::function< std::optional< LinkInfo >(uint16_t)> Solar2LinkInfo
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperDummy, UserLogicFormat, SampleMode, 1 >()
int forEachDataBlockRef(gsl::span< const std::byte > buffer, std::function< void(DataBlockRef ref)> f)
template Solar2LinkInfo createSolar2LinkInfo< ElectronicMapperGenerated, BareFormat, SampleMode, 0 >()
std::string flpName(LinkInfo li)
uint32_t encode(const DsDetId &id)
Create an integer code for the given id.
bool operator<(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
std::ostream & operator<<(std::ostream &stream, o2::InteractionRecord const &ir)
a DataBlockRef is a pair (DataBlock,offset) The offset is an offset into some external buffer
static void setLinkID(H &rdh, uint8_t v, NOTPTR(H))
static void setEndPointID(H &rdh, uint8_t v, NOTPTR(H))
static void setFEEID(RDHv4 &rdh, uint16_t v)
static void setCRUID(H &rdh, uint16_t v, NOTPTR(H))
o2::InteractionRecord ir(0, 0)