35template <
typename RAWCHECKER>
36std::string
getSummary(
const RAWCHECKER& checker,
size_t maxErrors)
39 if (checker.getNEventsFaulty() >= maxErrors) {
40 ss <<
"Too many errors found (" << checker.getNEventsFaulty() <<
"): abort check!\n";
42 ss <<
"Number of busy raised: " << checker.getNBusyRaised() <<
"\n";
43 ss <<
"Fraction of faulty events: " << checker.getNEventsFaulty() <<
" / " << checker.getNEventsProcessed() <<
" = " <<
static_cast<double>(checker.getNEventsFaulty()) / ((checker.getNEventsProcessed() > 0) ?
static_cast<double>(checker.getNEventsProcessed()) : 1.);
47template <
typename RAWCHECKER>
56 auto syncTrigger = ic.
options().
get<
int>(
"mid-checker-sync-trigger");
57 mChecker.setSyncTrigger(syncTrigger);
59 auto outFilename = ic.
options().
get<std::string>(
"mid-checker-outfile");
60 mChecker.setElectronicsDelay(mElectronicsDelay);
61 if constexpr (std::is_same_v<RAWCHECKER, RawDataChecker>) {
62 mChecker.init(mCrateMasks);
63 if (outFilename.empty()) {
64 outFilename =
"raw_checker_out.txt";
68 auto feeId = mFeeIds[idx];
69 mChecker.init(feeId, mCrateMasks.
getMask(feeId));
70 if (outFilename.empty()) {
72 ss <<
"raw_checker_out_GBT_" << feeId <<
".txt";
73 outFilename = ss.str();
77 mOutFile.open(outFilename.c_str());
79 auto stop = [
this]() {
80 if constexpr (std::is_same_v<RAWCHECKER, RawDataChecker>) {
81 if (!mChecker.checkMissingLinks()) {
82 mOutFile << mChecker.getDebugMessage() <<
"\n";
85 bool hasProcessed = (mChecker.getNEventsProcessed() > 0);
86 double scaleFactor = (mChecker.getNEventsProcessed() > 0) ? 1.e6 /
static_cast<double>(mChecker.getNEventsProcessed()) : 0.;
87 LOG(info) <<
"Processing time / " << mChecker.getNEventsProcessed() <<
" BCs: full: " << mTimer.count() * scaleFactor <<
" us checker: " << mTimerAlgo.count() * scaleFactor <<
" us";
88 std::string summary =
getSummary(mChecker, mMaxErrors);
89 mOutFile << summary <<
"\n";
94 mMaxErrors = ic.
options().
get<
int>(
"mid-checker-max-errors");
99 if (mChecker.getNEventsFaulty() >= mMaxErrors) {
104 auto tStart = std::chrono::high_resolution_clock::now();
107 auto data = o2::framework::DataRefUtils::as<const ROBoard>(
msg);
110 auto inROFRecords = o2::framework::DataRefUtils::as<const ROFRecord>(msgROF);
112 std::vector<ROFRecord> dummy;
113 auto tAlgoStart = std::chrono::high_resolution_clock::now();
114 if (!mChecker.process(
data, inROFRecords, dummy)) {
115 mOutFile << mChecker.getDebugMessage() <<
"\n";
117 mTimerAlgo += std::chrono::high_resolution_clock::now() - tAlgoStart;
118 mTimer += std::chrono::high_resolution_clock::now() - tStart;
122 RAWCHECKER mChecker{};
123 std::vector<uint16_t> mFeeIds{};
124 CrateMasks mCrateMasks{};
125 ElectronicsDelay mElectronicsDelay{};
126 size_t mMaxErrors{0};
127 std::ofstream mOutFile{};
128 std::chrono::duration<double> mTimer{0};
129 std::chrono::duration<double> mTimerAlgo{0};
141 o2::framework::adaptFromTask<RawCheckerDeviceDPL<GBTRawDataChecker>>(feeIds, crateMasks, electronicsDelay)}
142 : o2::framework::adaptFromTask<RawCheckerDeviceDPL<RawDataChecker>>(feeIds, crateMasks, electronicsDelay),
143 o2::framework::Options{{
"mid-checker-sync-trigger",
o2::framework::VariantType::Int, 0x1, {
"Trigger used for synchronisation (default is orbit 0x1)"}}, {
"mid-checker-max-errors",
o2::framework::VariantType::Int, 10000, {
"Maximum number of errors"}}, {
"mid-checker-outfile",
o2::framework::VariantType::String,
"", {
"Checker output file"}}}};
Data processor spec for MID raw checker device.
Class to check the raw data.
T get(const char *key) const
ServiceRegistryRef services()
ConfigParamRegistry const & options()
InputRecord & inputs()
The inputs associated with this processing context.
uint8_t getMask(uint16_t feeId) const
Gets the mask for the feeId.
void init(o2::framework::InitContext &ic)
void run(o2::framework::ProcessingContext &pc)
RawCheckerDeviceDPL(const std::vector< uint16_t > &feeIds, const CrateMasks &crateMasks, const ElectronicsDelay &electronicsDelay)
constexpr o2::header::DataOrigin gDataOriginMID
std::vector< ConfigParamSpec > Options
std::vector< OutputSpec > Outputs
framework::DataProcessorSpec getRawCheckerSpec(const std::vector< uint16_t > &feeIds, const CrateMasks &crateMasks, const ElectronicsDelay &electronicsDelay, bool perGBT=false)
std::string getSummary(const RAWCHECKER &checker, size_t maxErrors)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
uint64_t const void const *restrict const msg