artdaq_demo  v3_06_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/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<std::string> fragment_type_labels{"ASCII", "ContainerASCII"};
72 
73  for ( auto label : fragment_type_labels )
74  {
75  art::Handle<artdaq::Fragments> fragments_with_label;
76 
77  evt.getByLabel( raw_data_label_, label, fragments_with_label );
78  if ( !fragments_with_label.isValid() ) continue;
79 
80  // for (int i_l = 0; i_l < static_cast<int>(fragments_with_label->size()); ++i_l) {
81  // fragments.emplace_back( (*fragments_with_label)[i_l] );
82  // }
83 
84  if ( label == "Container" || label == "ContainerASCII" )
85  {
86  for ( auto cont : *fragments_with_label )
87  {
88  artdaq::ContainerFragment contf( cont );
89  for ( size_t ii = 0; ii < contf.block_count(); ++ii )
90  {
91  containerFragments.push_back( contf[ ii ] );
92  fragments.push_back( *containerFragments.back() );
93  }
94  }
95  }
96  else
97  {
98  for ( auto frag : *fragments_with_label ) { fragments.emplace_back( frag ); }
99  }
100  }
101 
102  std::cout << "######################################################################" << std::endl;
103  std::cout << std::endl;
104  std::cout << "Run " << evt.run() << ", subrun " << evt.subRun() << ", event " << eventNumber << " has "
105  << fragments.size() << " ASCII fragment(s)" << std::endl;
106 
107  for ( const auto& frag : fragments )
108  {
109  AsciiFragment bb( frag );
110 
111  std::cout << std::endl;
112  std::cout << "Ascii fragment " << frag.fragmentID() << " is version " << frag.version() << std::endl;
113  std::cout << "Ascii fragment " << frag.fragmentID() << " has " << bb.total_line_characters()
114  << " characters in the line." << std::endl;
115  std::cout << std::endl;
116 
117  if ( frag.hasMetadata() )
118  {
119  std::cout << std::endl;
120  std::cout << "Fragment metadata: " << std::endl;
121  AsciiFragment::Metadata const* md = frag.metadata<AsciiFragment::Metadata>();
122  std::cout << "Chars in line: ";
123  auto mdChars = md->charsInLine;
124  std::cout.write( reinterpret_cast<const char*>( &mdChars ), sizeof( uint32_t ) / sizeof( char ) );
125  std::cout << std::endl;
126  std::cout << std::endl;
127  }
128 
129  std::ofstream output( "out.bin", std::ios::out | std::ios::app | std::ios::binary );
130  for ( uint32_t i_adc = 0; i_adc < bb.total_line_characters(); ++i_adc )
131  { output.write( (char*)( bb.dataBegin() + i_adc ), sizeof( char ) ); }
132  output.close();
133  std::cout << std::endl;
134  std::cout << std::endl;
135  }
136  std::cout << std::endl;
137 }
138 
139 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.