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.