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"
19 #include "TRACE/tracemf.h"
20 #define TRACE_NAME "CheckIntegrity"
60 void analyze(art::Event
const& evt)
override;
68 std::string raw_data_label_;
69 bool exception_on_integrity_failure_;
74 , raw_data_label_(pset.get<std::string>(
"raw_data_label",
"daq"))
75 , exception_on_integrity_failure_(pset.get<bool>(
"exception_on_integrity_failure", false))
80 artdaq::Fragments fragments;
81 artdaq::FragmentPtrs containerFragments;
83 std::vector<art::Handle<artdaq::Fragments>> fragmentHandles;
84 fragmentHandles = evt.getMany<std::vector<artdaq::Fragment>>();
86 for (
const auto& handle : fragmentHandles)
88 if (!handle.isValid() || handle->empty())
93 if (handle->front().type() == artdaq::Fragment::ContainerFragmentType)
95 for (
const auto& cont : *handle)
97 artdaq::ContainerFragment contf(cont);
98 if (contf.fragment_type() != demo::FragmentType::TOY1 && contf.fragment_type() != demo::FragmentType::TOY2)
103 for (
size_t ii = 0; ii < contf.block_count(); ++ii)
105 containerFragments.push_back(contf[ii]);
106 fragments.push_back(*containerFragments.back());
112 if (handle->front().type() == demo::FragmentType::TOY1 || handle->front().type() == demo::FragmentType::TOY2)
114 for (
auto frag : *handle)
116 fragments.emplace_back(frag);
122 TLOG(TLVL_DEBUG) <<
"Run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event() <<
" has "
123 << fragments.size() <<
" fragment(s) of type TOY1 or TOY2";
126 for (
const auto& frag : fragments)
129 ToyFragment bb(frag);
130 auto dist_type = bb.hdr_distribution_type();
132 auto evtSize = bb.hdr_event_size() *
sizeof(ToyFragment::Header::data_t);
133 if (bb.hdr_event_size() % (
sizeof(artdaq::RawDataType) /
sizeof(ToyFragment::Header::data_t)) != 0) {
134 evtSize = ceil(evtSize / static_cast<double>(
sizeof(artdaq::RawDataType))) *
sizeof(artdaq::RawDataType);
138 frag.dataSize() *
sizeof(artdaq::RawDataType))
140 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
141 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID()
142 <<
": Size mismatch!"
143 <<
" ToyFragment Header reports size of "
144 << bb.hdr_event_size() *
sizeof(ToyFragment::Header::data_t)
145 <<
" bytes, but Fragment reports size of "
146 << frag.dataSize() *
sizeof(artdaq::RawDataType) <<
" bytes.";
148 if (exception_on_integrity_failure_)
150 throw cet::exception(
"CheckIntegrity")
151 <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event()
152 <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID() <<
": Size mismatch!"
153 <<
" ToyFragment Header reports size of "
154 << bb.hdr_event_size() *
sizeof(ToyFragment::Header::data_t)
155 <<
" bytes, but Fragment reports size of " << frag.dataSize() *
sizeof(artdaq::RawDataType)
161 if ((frag.size() - frag.headerSizeWords() - frag.dataSize()) *
sizeof(artdaq::RawDataType) !=
162 sizeof(ToyFragment::Metadata))
164 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
165 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID()
166 <<
": Metadata error!"
167 <<
" ToyFragment metadata size should be " <<
sizeof(ToyFragment::Metadata)
168 <<
" bytes, but Fragment reports size of "
169 << (frag.size() - frag.headerSizeWords() - frag.dataSize()) *
170 sizeof(artdaq::RawDataType)
172 if (exception_on_integrity_failure_)
174 throw cet::exception(
"CheckIntegrity")
175 <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event()
176 <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID() <<
": Metadata error!"
177 <<
" ToyFragment metadata size should be " <<
sizeof(ToyFragment::Metadata)
178 <<
" bytes, but Fragment reports size of "
179 << (frag.size() - frag.headerSizeWords() - frag.dataSize()) *
sizeof(artdaq::RawDataType)
186 auto adc_iter = bb.dataBeginADCs();
187 auto adc_end = bb.dataEndADCs();
188 ToyFragment::adc_t expected_adc = 1;
190 for (; adc_iter != adc_end; adc_iter++, expected_adc++)
192 if (expected_adc > demo::ToyFragment::adc_range(frag.metadata<ToyFragment::Metadata>()->num_adc_bits))
198 if (dist_type == 2 && *adc_iter != expected_adc)
200 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
201 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID "
202 << frag.fragmentID() <<
": expected an ADC value of " << expected_adc <<
", got "
205 if (exception_on_integrity_failure_)
207 throw cet::exception(
"CheckIntegrity")
208 <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event()
209 <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID()
210 <<
": expected an ADC value of " << expected_adc <<
", got " << *adc_iter;
217 if (bb.hdr_distribution_type() < 3 &&
218 *adc_iter > demo::ToyFragment::adc_range(frag.metadata<ToyFragment::Metadata>()->num_adc_bits))
220 TLOG(TLVL_ERROR) <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event "
221 << evt.event() <<
", seqID " << frag.sequenceID() <<
", fragID "
222 << frag.fragmentID() <<
": " << *adc_iter
223 <<
" is out-of-range for this Fragment type";
225 if (exception_on_integrity_failure_)
227 throw cet::exception(
"CheckIntegrity")
228 <<
"Error: in run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event()
229 <<
", seqID " << frag.sequenceID() <<
", fragID " << frag.fragmentID() <<
": " << *adc_iter
230 <<
" is out-of-range for this Fragment type";
239 TLOG(TLVL_DEBUG) <<
"In run " << evt.run() <<
", subrun " << evt.subRun() <<
", event " << evt.event()
240 <<
", everything is fine";
~CheckIntegrity() override=default
Default destructor.
void analyze(art::Event const &evt) override
Analyze an event. Called by art for each event in run (based on command line options) ...
Demonstration art::EDAnalyzer which checks that all ToyFragment ADC counts are in the defined range...
CheckIntegrity(fhicl::ParameterSet const &pset)
CheckIntegrity Constructor.