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/FragmentType.hh"
15 #include "artdaq-core-demo/Overlays/ToyFragment.hh"
16 #include "artdaq-core/Data/ContainerFragment.hh"
17 #include "artdaq-core/Data/Fragment.hh"
20 #define TRACE_NAME "CheckIntegrity"
59 virtual void analyze(art::Event
const& evt);
62 std::string raw_data_label_;
66 : EDAnalyzer(pset), raw_data_label_(pset.get<std::string>(
"raw_data_label"))
71 artdaq::Fragments fragments;
72 artdaq::FragmentPtrs containerFragments;
74 std::vector<art::Handle<artdaq::Fragments>> fragmentHandles;
75 evt.getManyByType(fragmentHandles);
77 for (
auto handle : fragmentHandles)
79 if (!handle.isValid() || handle->size() == 0)
continue;
81 if (handle->front().type() == artdaq::Fragment::ContainerFragmentType)
83 for (
auto cont : *handle)
85 artdaq::ContainerFragment contf(cont);
86 if (contf.fragment_type() != demo::FragmentType::TOY1 && contf.fragment_type() != demo::FragmentType::TOY2)
91 for (
size_t ii = 0; ii < contf.block_count(); ++ii)
93 containerFragments.push_back(contf[ii]);
94 fragments.push_back(*containerFragments.back());
100 if (handle->front().type() == demo::FragmentType::TOY1 || handle->front().type() == demo::FragmentType::TOY2)
102 for (
auto frag : *handle)
104 fragments.emplace_back(frag);
110 TLOG(TLVL_DEBUG) <<
"Run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event() <<
" has "
111 << fragments.size() <<
" fragment(s) of type TOY1 or TOY2";
114 for (
const auto& frag : fragments)
116 ToyFragment bb(frag);
118 if (bb.hdr_event_size() *
sizeof(ToyFragment::Header::data_t) !=
119 frag.dataSize() *
sizeof(artdaq::RawDataType))
121 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
122 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID()
123 <<
": Size mismatch!"
124 <<
" ToyFragment Header reports size of "
125 << bb.hdr_event_size() *
sizeof(ToyFragment::Header::data_t)
126 <<
" bytes, Fragment report size of " << frag.dataSize() *
sizeof(artdaq::RawDataType)
132 auto adc_iter = bb.dataBeginADCs();
133 ToyFragment::adc_t expected_adc = 1;
135 for (; adc_iter != bb.dataEndADCs(); adc_iter++, expected_adc++)
137 if (expected_adc > bb.adc_range(frag.metadata<ToyFragment::Metadata>()->num_adc_bits))
141 if (bb.hdr_distribution_type() == 2 && *adc_iter != expected_adc)
143 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
144 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID "
145 << frag.fragmentID() <<
": expected an ADC value of " << expected_adc <<
", got "
153 if (bb.hdr_distribution_type() < 3 &&
154 *adc_iter > bb.adc_range(frag.metadata<ToyFragment::Metadata>()->num_adc_bits))
156 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
157 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID "
158 << frag.fragmentID() <<
": " << *adc_iter
159 <<
" is out-of-range for this Fragment type";
168 TLOG(TLVL_DEBUG) <<
"In run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event()
169 <<
", 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.