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