16#include <fmt/format.h>
32 return fmt::format(
"{} FirstIdx: {:5d} LastIdx: {:5d}",
38 return fmt::format(
"DetID {:4d} PadId {:10d} ADC {:10d} TFtime {:10d} NofSamples {:5d} {}",
43std::map<o2::mch::ROFRecord, int64_t> computeMinTimeDistances(gsl::span<const o2::mch::ROFRecord> rofs)
45 std::map<o2::mch::ROFRecord, int64_t> minTimeDistances;
47 for (
auto i = 0;
i < rofs.size() - 1;
i++) {
48 auto const&
r = rofs[
i];
51 minTimeDistances[
r] = std::numeric_limits<int64_t>::max();
54 rofs[
j].getBCData().orbit};
55 auto d = irj.differenceInBC(iri);
57 minTimeDistances[rofs[
i]] = std::min(minTimeDistances[rofs[
i]], d);
60 return minTimeDistances;
63void printRofs(std::ostream& os, gsl::span<const o2::mch::ROFRecord> rofs)
65 auto minTimeDistances = computeMinTimeDistances(rofs);
67 os << fmt::format(
"{:=^70}\n", fmt::format(
"{} rofs", rofs.size()));
69 for (
const auto&
r : rofs) {
70 os << fmt::format(
"[{:6d}] {}",
i,
asString(
r));
71 if (minTimeDistances[
r] < 4) {
72 os << fmt::format(
" min distance {} !", minTimeDistances[
r]);
79struct DigitIdComparator {
89void printDigitsAndRofs(std::ostream& os,
90 gsl::span<const o2::mch::Digit>
digits,
91 gsl::span<const o2::mch::ROFRecord> rofs)
94 os << fmt::format(
"{:=^70}\n", fmt::format(
"{} digits",
digits.size()));
97 for (
const auto&
r : rofs) {
98 os << fmt::format(
"{:-^95}\n", fmt::format(
"ROF {:4d} with {:5d} digits",
99 irof,
r.getNEntries()));
101 std::map<o2::mch::Digit, uint16_t, DigitIdComparator> dids;
102 for (
auto j =
r.getFirstIdx();
j <=
r.getLastIdx();
j++) {
107 for (
auto& p : dids) {
108 const auto& d = p.first;
109 os << fmt::format(
"[{:6d}] ({:6d}) {}\n", digitIndex,
i,
asString(d));
115 for (
auto& p : dids) {
117 os <<
"!!! ERROR : got a duplicated digit (not merged?) : " << p.first <<
" appears " << p.second <<
" times\n";
128DigitSink::DigitSink(std::ostream& os,
DigitFileFormat format,
size_t maxSize) : mOutput(os), mBinary(true), mFileFormat(
format), mMaxSize(maxSize)
131 os.write(
reinterpret_cast<char*
>(&mFileFormat),
sizeof(
DigitFileFormat));
135DigitSink::DigitSink(std::ostream& os) : mOutput(os), mBinary(false), mImpl{}
139DigitSink::~DigitSink() =
default;
141bool DigitSink::write(gsl::span<const Digit>
digits,
142 gsl::span<const ROFRecord> rofs)
151 auto pos =
static_cast<size_t>(mOutput.tellp());
152 auto newSize = (
pos +
digits.size_bytes() + rofs.size_bytes()) / 1024;
153 if (newSize >= mMaxSize) {
156 ok = mImpl->write(mOutput,
digits, rofs);
158 printDigitsAndRofs(mOutput,
digits, rofs);
std::string asString(TDataMember const &dm, char *pointer)
MCH digit implementation.
uint16_t getNofSamples() const
int getLastIdx() const
get the index of the last associated object
const BCData & getBCData() const
get the interaction record
int getFirstIdx() const
get the index of the first associated object
GLint GLint GLsizei GLint GLenum format
std::unique_ptr< DigitSinkImpl > createDigitSinkImpl(int version)
std::string asString() const
uint16_t bc
bunch crossing ID of interaction
std::vector< Digit > digits