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 virtual void analyze(art::Event
const& evt);
55 std::bitset<3> mode_bitset_;
56 int metrics_reporting_level_;
58 int events_processed_;
59 int expected_number_of_fragments_;
61 int events_with_missing_fragments_;
62 int events_with_empty_fragments_;
64 int events_with_10pct_missing_fragments_;
65 int events_with_10pct_empty_fragments_;
66 int events_with_50pct_missing_fragments_;
67 int events_with_50pct_empty_fragments_;
69 std::map<int, int> empty_fragments_by_fragmentID_;
71 const int BASIC_COUNTS_MODE = 0;
72 const int FRACTIONAL_COUNTS_MODE = 1;
73 const int DETAILED_COUNTS_MODE = 2;
77 : 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), empty_fragments_by_fragmentID_()
79 fhicl::ParameterSet metric_pset;
82 metric_pset = pset.get<fhicl::ParameterSet>(
"metrics");
83 if (metricMan !=
nullptr)
85 metricMan->initialize(metric_pset,
"FragmentWatcher.");
86 metricMan->do_start();
91 TLOG(TLVL_INFO) <<
"Unable to find the metrics parameters in the metrics "
92 <<
"ParameterSet: \"" + pset.to_string() +
"\".";
98 if (metricMan !=
nullptr)
100 metricMan->do_stop();
101 metricMan->shutdown();
110 std::vector<art::Handle<std::vector<artdaq::Fragment> > > fragmentHandles;
111 evt.getManyByType(fragmentHandles);
114 int total_fragments_this_event = 0;
115 for (
auto const& hndl : fragmentHandles)
117 total_fragments_this_event += hndl->size();
121 if (total_fragments_this_event > expected_number_of_fragments_) { expected_number_of_fragments_ = total_fragments_this_event; }
124 int missing_fragments = expected_number_of_fragments_ - total_fragments_this_event;
127 int empty_fragment_count_this_event = 0;
128 std::set<int> empty_fragmentID_list_this_event;
129 for (
auto const& hndl : fragmentHandles)
131 std::string instance_name = hndl.provenance()->productInstanceName();
132 std::size_t found = instance_name.find(
"Empty");
133 if (found != std::string::npos)
135 empty_fragment_count_this_event += hndl->size();
138 for (
auto const& fragment : *hndl)
140 int fragID = fragment.fragmentID();
141 if (empty_fragments_by_fragmentID_.count(fragID) == 0)
143 empty_fragments_by_fragmentID_[fragID] = 1;
147 empty_fragments_by_fragmentID_[fragID] += 1;
149 empty_fragmentID_list_this_event.insert(fragID);
155 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": total_fragments=" << total_fragments_this_event <<
", missing_fragments="
156 << missing_fragments <<
", empty_fragments=" << empty_fragment_count_this_event <<
" (" << events_processed_
157 <<
" events processed)";
158 if (empty_fragmentID_list_this_event.size() > 0)
160 std::ostringstream oss;
161 bool firstLoop =
true;
162 for (
auto const& fragID : empty_fragmentID_list_this_event)
164 if (!firstLoop) { oss <<
", "; }
168 TLOG(TLVL_WARNING) <<
"Event " << evt.event() <<
": total_fragments=" << total_fragments_this_event
169 <<
", fragmentIDs for empty_fragments: " << oss.str();
173 if (metricMan !=
nullptr && (mode_bitset_.test(BASIC_COUNTS_MODE) || mode_bitset_.test(FRACTIONAL_COUNTS_MODE)))
175 metricMan->sendMetric(
"EventsProcessed", events_processed_,
"events", metrics_reporting_level_,
176 artdaq::MetricMode::LastPoint);
180 if (metricMan !=
nullptr && mode_bitset_.test(BASIC_COUNTS_MODE))
182 if (missing_fragments > 0) { ++events_with_missing_fragments_; }
183 if (empty_fragment_count_this_event > 0) { ++events_with_empty_fragments_; }
185 metricMan->sendMetric(
"EventsWithMissingFragments", events_with_missing_fragments_,
"events",
186 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
187 metricMan->sendMetric(
"EventsWithEmptyFragments", events_with_empty_fragments_,
"events",
188 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
190 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": events_with_missing_fragments=" << events_with_missing_fragments_
191 <<
", events_with_empty_fragments=" << events_with_empty_fragments_;
195 if (metricMan !=
nullptr && mode_bitset_.test(FRACTIONAL_COUNTS_MODE))
197 if (((static_cast<double>(missing_fragments) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 10.0)
199 ++events_with_10pct_missing_fragments_;
201 if (((static_cast<double>(missing_fragments) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 50.0)
203 ++events_with_50pct_missing_fragments_;
206 if (((static_cast<double>(empty_fragment_count_this_event) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 10.0)
208 ++events_with_10pct_empty_fragments_;
210 if (((static_cast<double>(empty_fragment_count_this_event) * 100.0) / static_cast<double>(expected_number_of_fragments_)) >= 50.0)
212 ++events_with_50pct_empty_fragments_;
215 metricMan->sendMetric(
"EventsWith10PctMissingFragments", events_with_10pct_missing_fragments_,
"events",
216 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
217 metricMan->sendMetric(
"EventsWith50PctMissingFragments", events_with_50pct_missing_fragments_,
"events",
218 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
220 metricMan->sendMetric(
"EventsWith10PctEmptyFragments", events_with_10pct_empty_fragments_,
"events",
221 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
222 metricMan->sendMetric(
"EventsWith50PctEmptyFragments", events_with_50pct_empty_fragments_,
"events",
223 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
225 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": events_with_10pct_missing_fragments=" << events_with_10pct_missing_fragments_
226 <<
", events_with_10pct_empty_fragments=" << events_with_10pct_empty_fragments_;
227 TLOG(TLVL_TRACE) <<
"Event " << evt.event() <<
": events_with_50pct_missing_fragments=" << events_with_50pct_missing_fragments_
228 <<
", events_with_50pct_empty_fragments=" << events_with_50pct_empty_fragments_;
232 if (metricMan !=
nullptr && mode_bitset_.test(DETAILED_COUNTS_MODE))
236 if (empty_fragment_count_this_event > 0)
238 std::ostringstream oss;
239 oss <<
"<eventbuilder_snapshot app_name=\"" << app_name <<
"\"><events_processed>" << events_processed_
240 <<
"</events_processed><empty_fragment_counts>";
241 for (
auto const& mapIter : empty_fragments_by_fragmentID_)
243 oss <<
"<count fragment_id=" << mapIter.first <<
">" << mapIter.second <<
"</count>";
245 oss <<
"</empty_fragment_counts></eventbuilder_snapshot>";
247 metricMan->sendMetric(
"EmptyFragmentSnapshot", oss.str(),
"xml_string",
248 metrics_reporting_level_, artdaq::MetricMode::LastPoint);
253 =====================================================
255 event_builder_snapshot : {
256 name:
"EventBuilder5"
257 timestamp:
"20190408T124433"
260 sender_list: [
"felix501",
"felix501",
"ssp101",
"ssp102" ]
261 valid_fragment_counts: [ 105, 105, 102, 104 ]
262 empty_fragment_counts: [ 0, 0, 2, 0 ]
263 missing_fragment_counts: [ 0, 0, 1, 1 ]
266 =====================================================
268 <event_builder_snapshot name=
"EventBuilder5">
269 <timestamp>20190408T124433</timestamp>
270 <events_built>105</events_built
273 <sender index=0>felix501</sender>
274 <sender index=1>felix502</sender>
275 <sender index=2>ssp101</sender>
276 <sender index=3>ssp102</sender>
279 <valid_fragment_counts>
280 <count index=0>105</count>
281 <count index=1>105</count>
282 <count index=2>102</count>
283 <count index=3>104</count>
284 </valid_fragment_counts>
286 <empty_fragment_counts>
287 <count index=2>2</count>
288 </empty_fragment_counts>
290 <missing_fragment_counts>
291 <count index=2>1</count>
292 <count index=3>1</count>
293 </missing_fragment_counts>
294 </event_builder_snapshot>
296 =====================================================
virtual ~FragmentWatcher()
Virtual Destructor. Shuts down MetricManager if one is present.
FragmentWatcher(fhicl::ParameterSet const &pset)
FragmentWatcher Constructor.
An art::EDAnalyzer module which checks events for certain error conditions (missing fragments...
virtual void analyze(art::Event const &evt)
Analyze each event, using the configured mode bitmask.