8 #define TRACE_NAME (app_name + "_FragmentWatcher").c_str()
9 #include "artdaq/DAQdata/Globals.hh"
11 #include "art/Framework/Core/EDAnalyzer.h"
12 #include "art/Framework/Core/ModuleMacros.h"
13 #include "art/Framework/Principal/Event.h"
14 #include "art/Framework/Principal/Handle.h"
16 #include "artdaq-core/Data/ContainerFragment.hh"
17 #include "artdaq-core/Data/Fragment.hh"
24 class FragmentWatcher;
52 void analyze(art::Event
const& evt)
override;
60 std::bitset<3> mode_bitset_;
61 int metrics_reporting_level_;
63 int events_processed_;
64 int expected_number_of_fragments_;
66 int events_with_missing_fragments_;
67 int events_with_empty_fragments_;
69 int events_with_10pct_missing_fragments_;
70 int events_with_10pct_empty_fragments_;
71 int events_with_50pct_missing_fragments_;
72 int events_with_50pct_empty_fragments_;
74 std::map<int, int> empty_fragments_by_fragmentID_;
76 const int BASIC_COUNTS_MODE = 0;
77 const int FRACTIONAL_COUNTS_MODE = 1;
78 const int DETAILED_COUNTS_MODE = 2;
82 : EDAnalyzer(pset), mode_bitset_(std::bitset<3>(pset.get<int>(
"mode_bitmask", 0x1))), metrics_reporting_level_(pset.get<int>(
"metrics_reporting_level", 1)), events_processed_(0), expected_number_of_fragments_(0), events_with_missing_fragments_(0), events_with_empty_fragments_(0), events_with_10pct_missing_fragments_(0), events_with_10pct_empty_fragments_(0), events_with_50pct_missing_fragments_(0), events_with_50pct_empty_fragments_(0)
84 fhicl::ParameterSet metric_pset;
87 metric_pset = pset.get<fhicl::ParameterSet>(
"metrics");
88 if (metricMan !=
nullptr)
90 metricMan->initialize(metric_pset,
"FragmentWatcher.");
91 metricMan->do_start();
96 TLOG(TLVL_INFO) <<
"Unable to find the metrics parameters in the metrics "
97 <<
"ParameterSet: \"" + pset.to_string() +
"\".";
103 if (metricMan !=
nullptr)
105 metricMan->do_stop();
106 metricMan->shutdown();
115 std::vector<art::Handle<std::vector<artdaq::Fragment> > > fragmentHandles;
116 evt.getManyByType(fragmentHandles);
119 int total_fragments_this_event = 0;
120 for (
auto const& hndl : fragmentHandles)
122 total_fragments_this_event += hndl->size();
126 if (total_fragments_this_event > expected_number_of_fragments_) { expected_number_of_fragments_ = total_fragments_this_event; }
129 int missing_fragments = expected_number_of_fragments_ - total_fragments_this_event;
132 int empty_fragment_count_this_event = 0;
133 std::set<int> empty_fragmentID_list_this_event;
134 for (
auto const& hndl : fragmentHandles)
136 std::string instance_name = hndl.provenance()->productInstanceName();
137 std::size_t found = instance_name.find(
"Empty");
138 if (found != std::string::npos)
140 empty_fragment_count_this_event += hndl->size();
143 for (
auto const& fragment : *hndl)
145 int fragID = fragment.fragmentID();
146 if (empty_fragments_by_fragmentID_.count(fragID) == 0)
148 empty_fragments_by_fragmentID_[fragID] = 1;
152 empty_fragments_by_fragmentID_[fragID] += 1;
154 empty_fragmentID_list_this_event.insert(fragID);
160 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": total_fragments=" << total_fragments_this_event <<
", missing_fragments="
161 << missing_fragments <<
", empty_fragments=" << empty_fragment_count_this_event <<
" (" << events_processed_
162 <<
" events processed)";
163 if (!empty_fragmentID_list_this_event.empty())
165 std::ostringstream oss;
166 bool firstLoop =
true;
167 for (
auto const& fragID : empty_fragmentID_list_this_event)
169 if (!firstLoop) { oss <<
", "; }
173 TLOG(TLVL_WARNING) <<
"Event " << evt.event() <<
": total_fragments=" << total_fragments_this_event
174 <<
", fragmentIDs for empty_fragments: " << oss.str();
178 if (metricMan !=
nullptr && (mode_bitset_.test(BASIC_COUNTS_MODE) || mode_bitset_.test(FRACTIONAL_COUNTS_MODE)))
180 metricMan->sendMetric(
"EventsProcessed", events_processed_,
"events", metrics_reporting_level_,
181 artdaq::MetricMode::LastPoint);
185 if (metricMan !=
nullptr && mode_bitset_.test(BASIC_COUNTS_MODE))
187 if (missing_fragments > 0) { ++events_with_missing_fragments_; }
188 if (empty_fragment_count_this_event > 0) { ++events_with_empty_fragments_; }
190 metricMan->sendMetric(
"EventsWithMissingFragments", events_with_missing_fragments_,
"events",
191 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
192 metricMan->sendMetric(
"EventsWithEmptyFragments", events_with_empty_fragments_,
"events",
193 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
195 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": events_with_missing_fragments=" << events_with_missing_fragments_
196 <<
", events_with_empty_fragments=" << events_with_empty_fragments_;
200 if (metricMan !=
nullptr && mode_bitset_.test(FRACTIONAL_COUNTS_MODE))
202 if (((static_cast<double>(missing_fragments) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 10.0)
204 ++events_with_10pct_missing_fragments_;
206 if (((static_cast<double>(missing_fragments) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 50.0)
208 ++events_with_50pct_missing_fragments_;
211 if (((static_cast<double>(empty_fragment_count_this_event) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 10.0)
213 ++events_with_10pct_empty_fragments_;
215 if (((static_cast<double>(empty_fragment_count_this_event) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 50.0)
217 ++events_with_50pct_empty_fragments_;
220 metricMan->sendMetric(
"EventsWith10PctMissingFragments", events_with_10pct_missing_fragments_,
"events",
221 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
222 metricMan->sendMetric(
"EventsWith50PctMissingFragments", events_with_50pct_missing_fragments_,
"events",
223 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
225 metricMan->sendMetric(
"EventsWith10PctEmptyFragments", events_with_10pct_empty_fragments_,
"events",
226 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
227 metricMan->sendMetric(
"EventsWith50PctEmptyFragments", events_with_50pct_empty_fragments_,
"events",
228 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
230 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": events_with_10pct_missing_fragments=" << events_with_10pct_missing_fragments_
231 <<
", events_with_10pct_empty_fragments=" << events_with_10pct_empty_fragments_;
232 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": events_with_50pct_missing_fragments=" << events_with_50pct_missing_fragments_
233 <<
", events_with_50pct_empty_fragments=" << events_with_50pct_empty_fragments_;
237 if (metricMan !=
nullptr && mode_bitset_.test(DETAILED_COUNTS_MODE))
241 if (empty_fragment_count_this_event > 0)
243 std::ostringstream oss;
244 oss <<
"<eventbuilder_snapshot app_name=\"" << app_name <<
"\"><events_processed>" << events_processed_
245 <<
"</events_processed><empty_fragment_counts>";
246 for (
auto const& mapIter : empty_fragments_by_fragmentID_)
248 oss <<
"<count fragment_id=" << mapIter.first <<
">" << mapIter.second <<
"</count>";
250 oss <<
"</empty_fragment_counts></eventbuilder_snapshot>";
252 metricMan->sendMetric(
"EmptyFragmentSnapshot", oss.str(),
"xml_string",
253 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
258 =====================================================
260 event_builder_snapshot : {
261 name:
"EventBuilder5"
262 timestamp:
"20190408T124433"
265 sender_list: [
"felix501",
"felix501",
"ssp101",
"ssp102" ]
266 valid_fragment_counts: [ 105, 105, 102, 104 ]
267 empty_fragment_counts: [ 0, 0, 2, 0 ]
268 missing_fragment_counts: [ 0, 0, 1, 1 ]
271 =====================================================
273 <event_builder_snapshot name=
"EventBuilder5">
274 <timestamp>20190408T124433</timestamp>
275 <events_built>105</events_built
278 <sender index=0>felix501</sender>
279 <sender index=1>felix502</sender>
280 <sender index=2>ssp101</sender>
281 <sender index=3>ssp102</sender>
284 <valid_fragment_counts>
285 <count index=0>105</count>
286 <count index=1>105</count>
287 <count index=2>102</count>
288 <count index=3>104</count>
289 </valid_fragment_counts>
291 <empty_fragment_counts>
292 <count index=2>2</count>
293 </empty_fragment_counts>
295 <missing_fragment_counts>
296 <count index=2>1</count>
297 <count index=3>1</count>
298 </missing_fragment_counts>
299 </event_builder_snapshot>
301 =====================================================
FragmentWatcher(fhicl::ParameterSet const &pset)
FragmentWatcher Constructor.
An art::EDAnalyzer module which checks events for certain error conditions (missing fragments...
void analyze(art::Event const &evt) override
Analyze each event, using the configured mode bitmask.
~FragmentWatcher() override
Virtual Destructor. Shuts down MetricManager if one is present.