8 #include "art/Framework/Core/EDAnalyzer.h"
9 #include "art/Framework/Core/ModuleMacros.h"
10 #include "art/Framework/Principal/Event.h"
11 #include "art/Framework/Principal/Handle.h"
12 #include "canvas/Utilities/Exception.h"
14 #include "artdaq-core-demo/Overlays/ToyFragment.hh"
15 #include "artdaq-core/Data/ContainerFragment.hh"
16 #include "artdaq-core/Data/Fragment.hh"
19 #define TRACE_NAME "CheckIntegrity"
58 virtual void analyze(art::Event
const& evt);
61 std::string raw_data_label_;
65 : EDAnalyzer(pset), raw_data_label_(pset.get<std::string>(
"raw_data_label"))
70 artdaq::Fragments fragments;
71 artdaq::FragmentPtrs containerFragments;
72 std::vector<std::string> fragment_type_labels{
"TOY1",
"TOY2",
"ContainerTOY1",
"ContainerTOY2"};
74 for (
auto label : fragment_type_labels)
76 art::Handle<artdaq::Fragments> fragments_with_label;
78 evt.getByLabel(raw_data_label_, label, fragments_with_label);
79 if (!fragments_with_label.isValid())
continue;
81 if (label ==
"Container" || label ==
"ContainerTOY1" || label ==
"ContainerTOY2")
83 for (
auto cont : *fragments_with_label)
85 artdaq::ContainerFragment contf(cont);
86 for (
size_t ii = 0; ii < contf.block_count(); ++ii)
88 containerFragments.push_back(contf[ii]);
89 fragments.push_back(*containerFragments.back());
95 for (
auto frag : *fragments_with_label) { fragments.emplace_back(frag); }
99 TLOG(TLVL_INFO) <<
"Run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event() <<
" has "
100 << fragments.size() <<
" fragment(s) of type TOY1 or TOY2";
103 for (
const auto& frag : fragments)
105 ToyFragment bb(frag);
107 if (bb.hdr_event_size() *
sizeof(ToyFragment::Header::data_t) !=
108 frag.dataSize() *
sizeof(artdaq::RawDataType))
110 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
111 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID()
112 <<
": Size mismatch!"
113 <<
" ToyFragment Header reports size of "
114 << bb.hdr_event_size() *
sizeof(ToyFragment::Header::data_t)
115 <<
" bytes, Fragment report size of " << frag.dataSize() *
sizeof(artdaq::RawDataType)
121 auto adc_iter = bb.dataBeginADCs();
122 ToyFragment::adc_t expected_adc = 1;
124 for (; adc_iter != bb.dataEndADCs(); adc_iter++, expected_adc++)
126 if (expected_adc > bb.adc_range(frag.metadata<ToyFragment::Metadata>()->num_adc_bits))
130 if (bb.hdr_distribution_type() == 2 && *adc_iter != expected_adc)
132 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
133 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID "
134 << frag.fragmentID() <<
": expected an ADC value of " << expected_adc <<
", got "
142 if (bb.hdr_distribution_type() < 3 &&
143 *adc_iter > bb.adc_range(frag.metadata<ToyFragment::Metadata>()->num_adc_bits))
145 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
146 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID "
147 << frag.fragmentID() <<
": " << *adc_iter
148 <<
" is out-of-range for this Fragment type";
157 TLOG(TLVL_DEBUG) <<
"In run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event()
158 <<
", everything is fine";
virtual void analyze(art::Event const &evt)
Analyze an event. Called by art for each event in run (based on command line options) ...
virtual ~CheckIntegrity()=default
Default destructor.
Demonstration art::EDAnalyzer which checks that all ToyFragment ADC counts are in the defined range...
CheckIntegrity(fhicl::ParameterSet const &pset)
CheckIntegrity Constructor.