artdaq_demo  v3_08_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 }
30 
34 class demo::ASCIIDump : public art::EDAnalyzer
35 {
36 public:
41  explicit ASCIIDump(fhicl::ParameterSet const& pset);
42 
43  virtual ~ASCIIDump();
44 
49  void analyze(art::Event const& evt) override;
50 
51 private:
52  std::string raw_data_label_;
53 };
54 
55 demo::ASCIIDump::ASCIIDump(fhicl::ParameterSet const& pset)
56  : EDAnalyzer(pset), raw_data_label_(pset.get<std::string>("raw_data_label", "daq"))
57 {}
58 
59 demo::ASCIIDump::~ASCIIDump() {}
60 
61 void demo::ASCIIDump::analyze(art::Event const& evt)
62 {
63  art::EventNumber_t eventNumber = evt.event();
64 
65  // ***********************
66  // *** ASCII Fragments ***
67  // ***********************
68 
69  artdaq::Fragments fragments;
70  artdaq::FragmentPtrs containerFragments;
71  std::vector<art::Handle<artdaq::Fragments>> fragmentHandles;
72  evt.getManyByType(fragmentHandles);
73 
74  for (auto handle : fragmentHandles)
75  {
76  if (!handle.isValid() || handle->size() == 0) continue;
77 
78  if (handle->front().type() == artdaq::Fragment::ContainerFragmentType)
79  {
80  for (auto cont : *handle)
81  {
82  artdaq::ContainerFragment contf(cont);
83  if (contf.fragment_type() != demo::FragmentType::ASCII)
84  {
85  break;
86  }
87 
88  for (size_t ii = 0; ii < contf.block_count(); ++ii)
89  {
90  containerFragments.push_back(contf[ii]);
91  fragments.push_back(*containerFragments.back());
92  }
93  }
94  }
95  else
96  {
97  if (handle->front().type() == demo::FragmentType::ASCII)
98  {
99  for (auto frag : *handle)
100  {
101  fragments.emplace_back(frag);
102  }
103  }
104  }
105  }
106 
107  std::cout << "######################################################################" << std::endl;
108  std::cout << std::endl;
109  std::cout << "Run " << evt.run() << ", subrun " << evt.subRun() << ", event " << eventNumber << " has "
110  << fragments.size() << " ASCII fragment(s)" << std::endl;
111 
112  for (const auto& frag : fragments)
113  {
114  AsciiFragment bb(frag);
115 
116  std::cout << std::endl;
117  std::cout << "Ascii fragment " << frag.fragmentID() << " is version " << frag.version() << std::endl;
118  std::cout << "Ascii fragment " << frag.fragmentID() << " has " << bb.total_line_characters()
119  << " characters in the line." << std::endl;
120  std::cout << std::endl;
121 
122  if (frag.hasMetadata())
123  {
124  std::cout << std::endl;
125  std::cout << "Fragment metadata: " << std::endl;
126  AsciiFragment::Metadata const* md = frag.metadata<AsciiFragment::Metadata>();
127  std::cout << "Chars in line: ";
128  auto mdChars = md->charsInLine;
129  std::cout.write(reinterpret_cast<const char*>(&mdChars), sizeof(uint32_t) / sizeof(char));
130  std::cout << std::endl;
131  std::cout << std::endl;
132  }
133 
134  std::ofstream output("out.bin", std::ios::out | std::ios::app | std::ios::binary);
135  for (uint32_t i_adc = 0; i_adc < bb.total_line_characters(); ++i_adc)
136  {
137  output.write((char*)(bb.dataBegin() + i_adc), sizeof(char));
138  }
139  output.close();
140  std::cout << std::endl;
141  std::cout << std::endl;
142  }
143  std::cout << std::endl;
144 }
145 
146 DEFINE_ART_MODULE(demo::ASCIIDump)
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.