00001
00002
00003
00004
00005
00007
00008 #include "art/Framework/Core/EDAnalyzer.h"
00009 #include "art/Framework/Core/ModuleMacros.h"
00010 #include "art/Framework/Principal/Event.h"
00011 #include "art/Framework/Principal/Handle.h"
00012 #include "canvas/Utilities/Exception.h"
00013
00014 #include "artdaq-core-demo/Overlays/FragmentType.hh"
00015 #include "artdaq-core-demo/Overlays/AsciiFragment.hh"
00016 #include "artdaq-core/Data/ContainerFragment.hh"
00017 #include "artdaq-core/Data/Fragment.hh"
00018
00019 #include <algorithm>
00020 #include <cassert>
00021 #include <cmath>
00022 #include <fstream>
00023 #include <iomanip>
00024 #include <vector>
00025 #include <iostream>
00026
00027 namespace demo
00028 {
00029 class ASCIIDump;
00030 }
00031
00035 class demo::ASCIIDump : public art::EDAnalyzer
00036 {
00037 public:
00042 explicit ASCIIDump(fhicl::ParameterSet const& pset);
00043
00044 virtual ~ASCIIDump();
00045
00050 void analyze(art::Event const& evt) override;
00051
00052 private:
00053 std::string raw_data_label_;
00054 };
00055
00056
00057 demo::ASCIIDump::ASCIIDump(fhicl::ParameterSet const& pset)
00058 : EDAnalyzer(pset)
00059 , raw_data_label_(pset.get<std::string>("raw_data_label", "daq")) {}
00060
00061 demo::ASCIIDump::~ASCIIDump() {}
00062
00063 void demo::ASCIIDump::analyze(art::Event const& evt)
00064 {
00065 art::EventNumber_t eventNumber = evt.event();
00066
00067
00068
00069
00070
00071 artdaq::Fragments fragments;
00072 artdaq::FragmentPtrs containerFragments;
00073 std::vector<std::string> fragment_type_labels{"ASCII", "ContainerASCII"};
00074
00075 for (auto label : fragment_type_labels)
00076 {
00077 art::Handle<artdaq::Fragments> fragments_with_label;
00078
00079 evt.getByLabel(raw_data_label_, label, fragments_with_label);
00080 if (!fragments_with_label.isValid()) continue;
00081
00082
00083
00084
00085
00086 if (label == "Container" || label == "ContainerASCII")
00087 {
00088 for (auto cont : *fragments_with_label)
00089 {
00090 artdaq::ContainerFragment contf(cont);
00091 for (size_t ii = 0; ii < contf.block_count(); ++ii)
00092 {
00093 containerFragments.push_back(contf[ii]);
00094 fragments.push_back(*containerFragments.back());
00095 }
00096 }
00097 }
00098 else
00099 {
00100 for (auto frag : *fragments_with_label)
00101 {
00102 fragments.emplace_back(frag);
00103 }
00104 }
00105 }
00106
00107 std::cout << "######################################################################" << std::endl;
00108 std::cout << std::endl;
00109 std::cout << "Run " << evt.run() << ", subrun " << evt.subRun()
00110 << ", event " << eventNumber << " has " << fragments.size()
00111 << " ASCII fragment(s)" << std::endl;
00112
00113 for (const auto& frag : fragments)
00114 {
00115 AsciiFragment bb(frag);
00116
00117 std::cout << std::endl;
00118 std::cout << "Ascii fragment " << frag.fragmentID() << " is version " << frag.version() << std::endl;
00119 std::cout << "Ascii fragment " << frag.fragmentID() << " has "
00120 << bb.total_line_characters() << " characters in the line." << std::endl;
00121 std::cout << std::endl;
00122
00123 if (frag.hasMetadata())
00124 {
00125 std::cout << std::endl;
00126 std::cout << "Fragment metadata: " << std::endl;
00127 AsciiFragment::Metadata const* md =
00128 frag.metadata<AsciiFragment::Metadata>();
00129 std::cout << "Chars in line: ";
00130 auto mdChars = md->charsInLine;
00131 std::cout.write(reinterpret_cast<const char*>(&mdChars), sizeof(uint32_t) / sizeof(char));
00132 std::cout << std::endl;
00133 std::cout << std::endl;
00134 }
00135
00136 std::ofstream output("out.bin", std::ios::out | std::ios::app | std::ios::binary);
00137 for (uint32_t i_adc = 0; i_adc < bb.total_line_characters(); ++i_adc)
00138 {
00139 output.write((char*)(bb.dataBegin() + i_adc), sizeof(char));
00140 }
00141 output.close();
00142 std::cout << std::endl;
00143 std::cout << std::endl;
00144 }
00145 std::cout << std::endl;
00146 }
00147
00148 DEFINE_ART_MODULE(demo::ASCIIDump)