artdaq_demo  v3_11_00
ASCIIDump_module.cc
1 // Class: ToyDump
3 // Module Type: analyzer
4 // File: ToyDump_module.cc
5 // Description: Prints out information about each event.
7 
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"
13 
14 #include "artdaq-core-demo/Overlays/AsciiFragment.hh"
15 #include "artdaq-core-demo/Overlays/FragmentType.hh"
16 #include "artdaq-core/Data/ContainerFragment.hh"
17 #include "artdaq-core/Data/Fragment.hh"
18 
19 #include <algorithm>
20 #include <cassert>
21 #include <cmath>
22 #include <fstream>
23 #include <iomanip>
24 #include <iostream>
25 #include <vector>
26 
27 namespace demo {
28 class ASCIIDump;
29 } // namespace demo
30 
34 class demo::ASCIIDump : public art::EDAnalyzer
35 {
36 public:
41  explicit ASCIIDump(fhicl::ParameterSet const& pset);
42 
43  ~ASCIIDump() override;
44 
49  void analyze(art::Event const& evt) override;
50 
51 private:
52  ASCIIDump(ASCIIDump const&) = delete;
53  ASCIIDump(ASCIIDump&&) = delete;
54  ASCIIDump& operator=(ASCIIDump const&) = delete;
55  ASCIIDump& operator=(ASCIIDump&&) = delete;
56 
57  std::string raw_data_label_;
58 };
59 
60 demo::ASCIIDump::ASCIIDump(fhicl::ParameterSet const& pset)
61  : EDAnalyzer(pset), raw_data_label_(pset.get<std::string>("raw_data_label", "daq"))
62 {}
63 
64 demo::ASCIIDump::~ASCIIDump() = default;
65 
66 void demo::ASCIIDump::analyze(art::Event const& evt)
67 {
68  art::EventNumber_t eventNumber = evt.event();
69 
70  // ***********************
71  // *** ASCII Fragments ***
72  // ***********************
73 
74  artdaq::Fragments fragments;
75  artdaq::FragmentPtrs containerFragments;
76  std::vector<art::Handle<artdaq::Fragments>> fragmentHandles;
77 #if ART_HEX_VERSION < 0x30900
78  evt.getManyByType(fragmentHandles);
79 #else
80  fragmentHandles = evt.getMany<std::vector<artdaq::Fragment>>();
81 #endif
82 
83  for (const auto& handle : fragmentHandles)
84  {
85  if (!handle.isValid() || handle->empty())
86  {
87  continue;
88  }
89 
90  if (handle->front().type() == artdaq::Fragment::ContainerFragmentType)
91  {
92  for (const auto& cont : *handle)
93  {
94  artdaq::ContainerFragment contf(cont);
95  if (contf.fragment_type() != demo::FragmentType::ASCII)
96  {
97  break;
98  }
99 
100  for (size_t ii = 0; ii < contf.block_count(); ++ii)
101  {
102  containerFragments.push_back(contf[ii]);
103  fragments.push_back(*containerFragments.back());
104  }
105  }
106  }
107  else
108  {
109  if (handle->front().type() == demo::FragmentType::ASCII)
110  {
111  for (auto frag : *handle)
112  {
113  fragments.emplace_back(frag);
114  }
115  }
116  }
117  }
118 
119  std::cout << "######################################################################" << std::endl;
120  std::cout << std::endl;
121  std::cout << "Run " << evt.run() << ", subrun " << evt.subRun() << ", event " << eventNumber << " has "
122  << fragments.size() << " ASCII fragment(s)" << std::endl;
123 
124  for (const auto& frag : fragments)
125  {
126  AsciiFragment bb(frag);
127 
128  std::cout << std::endl;
129  std::cout << "Ascii fragment " << frag.fragmentID() << " is version " << frag.version() << std::endl;
130  std::cout << "Ascii fragment " << frag.fragmentID() << " has " << bb.total_line_characters()
131  << " characters in the line." << std::endl;
132  std::cout << std::endl;
133 
134  if (frag.hasMetadata())
135  {
136  std::cout << std::endl;
137  std::cout << "Fragment metadata: " << std::endl;
138  auto const* md = frag.metadata<AsciiFragment::Metadata>();
139  std::cout << "Chars in line: ";
140  auto mdChars = md->charsInLine;
141  std::cout.write(reinterpret_cast<const char*>(&mdChars), sizeof(uint32_t) / sizeof(char)); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
142  std::cout << std::endl;
143  std::cout << std::endl;
144  }
145 
146  std::ofstream output("out.bin", std::ios::out | std::ios::app | std::ios::binary);
147  for (size_t i_adc = 0; i_adc < bb.total_line_characters(); ++i_adc)
148  {
149  output.write((bb.dataBegin() + i_adc), sizeof(char)); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic)
150  }
151  output.close();
152  std::cout << std::endl;
153  std::cout << std::endl;
154  }
155  std::cout << std::endl;
156 }
157 
158 DEFINE_ART_MODULE(demo::ASCIIDump) // NOLINT(performance-unnecessary-value-param)
void analyze(art::Event const &evt) override
Analyze an event. Called by art for each event in run (based on command line options) ...
An art::EDAnalyzer meant for decoding demo::ASCIIFragment objects.
ASCIIDump(fhicl::ParameterSet const &pset)
ASCIIDump Constructor.