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"
51 explicit ToyDump(fhicl::ParameterSet
const& pset);
62 virtual void analyze(art::Event
const& evt);
65 std::string raw_data_label_;
66 uint32_t num_adcs_to_show_;
69 uint32_t columns_to_display_on_screen_;
75 , raw_data_label_(pset.get<std::string>(
"raw_data_label",
"daq"))
76 , num_adcs_to_show_(pset.get<uint32_t>(
"num_adcs_to_show", 0))
77 , dump_to_file_(pset.get<bool>(
"dump_to_file", true))
78 , dump_to_screen_(pset.get<bool>(
"dump_to_screen", false))
79 , columns_to_display_on_screen_(pset.get<uint32_t>(
"columns_to_display_on_screen", 10)) {}
85 art::EventNumber_t eventNumber = evt.event();
91 artdaq::Fragments fragments;
92 std::vector<std::string> fragment_type_labels{
"TOY1",
"TOY2",
"Container"};
94 for (
auto label : fragment_type_labels)
96 art::Handle<artdaq::Fragments> fragments_with_label;
98 evt.getByLabel(raw_data_label_, label, fragments_with_label);
99 if (!fragments_with_label.isValid())
continue;
105 if (label ==
"Container")
107 for (
auto cont : *fragments_with_label)
109 artdaq::ContainerFragment contf(cont);
110 for (
size_t ii = 0; ii < contf.block_count(); ++ii)
112 size_t fragSize = contf.fragSize(ii);
113 artdaq::Fragment thisfrag;
114 thisfrag.resizeBytes(fragSize);
117 memcpy(thisfrag.headerAddress(), contf.at(ii), fragSize);
120 fragments.push_back(thisfrag);
126 for (
auto frag : *fragments_with_label)
128 fragments.emplace_back(frag);
135 std::cout <<
"######################################################################" << std::endl;
136 std::cout << std::endl;
137 std::cout <<
"Run " << evt.run() <<
", subrun " << evt.subRun()
138 <<
", event " << eventNumber <<
" has " << fragments.size()
139 <<
" fragment(s) of type TOY1 or TOY2" << std::endl;
141 for (
const auto& frag : fragments)
143 ToyFragment bb(frag);
145 std::cout << std::endl;
146 std::cout << fragmentTypeToString(static_cast<demo::detail::FragmentType>(frag.type())) <<
" fragment " << frag.fragmentID() <<
" w/ seqID " << frag.sequenceID() <<
" has total ADC counts = "
147 << bb.total_adc_values() << std::endl;
150 if (frag.hasMetadata())
152 std::cout << std::endl;
153 std::cout <<
"Fragment metadata: " << std::endl;
154 ToyFragment::Metadata
const* md =
155 frag.metadata<ToyFragment::Metadata>();
156 std::cout << std::showbase <<
"Board serial number = "
157 << ((int)md->board_serial_number) <<
", sample bits = "
158 << ((int)md->num_adc_bits)
159 <<
" -> max ADC value = "
160 << bb.adc_range((
int)md->num_adc_bits)
165 if (num_adcs_to_show_ == 0)
167 num_adcs_to_show_ = bb.total_adc_values();
170 if (num_adcs_to_show_ > 0)
172 if (num_adcs_to_show_ > bb.total_adc_values())
174 throw cet::exception(
"num_adcs_to_show is larger than total number of adcs in fragment");
178 std::cout << std::endl;
179 std::cout <<
"First " << num_adcs_to_show_
180 <<
" ADC values in the fragment: "
186 std::ofstream output(
"out.bin", std::ios::out | std::ios::app | std::ios::binary);
187 for (uint32_t i_adc = 0; i_adc < num_adcs_to_show_; ++i_adc)
189 output.write((
char*)(bb.dataBeginADCs() + i_adc),
sizeof(ToyFragment::adc_t));
196 std::cout << std::right;
197 int rows = 1 + (int)((num_adcs_to_show_ - 1) / columns_to_display_on_screen_);
198 uint32_t adc_counter = 0;
199 for (
int idx = 0; idx < rows; ++idx)
201 std::cout << std::setw(4) << std::setfill(
'.');
202 std::cout << (idx * columns_to_display_on_screen_) <<
": ";
203 for (uint32_t jdx = 0; jdx < columns_to_display_on_screen_; ++jdx)
205 if (adc_counter >= num_adcs_to_show_) {
break; }
206 std::cout << std::setw(6) << std::setfill(
' ');
207 std::cout << bb.adc_value(adc_counter);
210 std::cout << std::endl;
214 std::cout << std::endl;
217 std::cout << std::endl;
ToyDump(fhicl::ParameterSet const &pset)
ToyDump Constructor.
An art::EDAnalyzer module designed to display the data from demo::ToyFragment objects.
virtual ~ToyDump()
ToyDump Destructor.
virtual void analyze(art::Event const &evt)
Analyze an event. Called by art for each event in run (based on command line options) ...