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 std::vector<std::string> fragment_type_labels{"ASCII", "Container"};
00073
00074 for (auto label : fragment_type_labels)
00075 {
00076 art::Handle<artdaq::Fragments> fragments_with_label;
00077
00078 evt.getByLabel(raw_data_label_, label, fragments_with_label);
00079 if (!fragments_with_label.isValid()) continue;
00080
00081
00082
00083
00084
00085 if (label == "Container")
00086 {
00087 for (auto cont : *fragments_with_label)
00088 {
00089 artdaq::ContainerFragment contf(cont);
00090 for (size_t ii = 0; ii < contf.block_count(); ++ii)
00091 {
00092 size_t fragSize = contf.fragSize(ii);
00093 artdaq::Fragment thisfrag;
00094 thisfrag.resizeBytes(fragSize);
00095
00096
00097 memcpy(thisfrag.headerAddress(), contf.at(ii), fragSize);
00098
00099
00100 fragments.push_back(thisfrag);
00101 }
00102 }
00103 }
00104 else
00105 {
00106 for (auto frag : *fragments_with_label)
00107 {
00108 fragments.emplace_back(frag);
00109 }
00110 }
00111 }
00112
00113 std::cout << "######################################################################" << std::endl;
00114 std::cout << std::endl;
00115 std::cout << "Run " << evt.run() << ", subrun " << evt.subRun()
00116 << ", event " << eventNumber << " has " << fragments.size()
00117 << " ASCII fragment(s)" << std::endl;
00118
00119 for (const auto& frag : fragments)
00120 {
00121 AsciiFragment bb(frag);
00122
00123 std::cout << std::endl;
00124 std::cout << "Ascii fragment " << frag.fragmentID() << " is version " << frag.version() << std::endl;
00125 std::cout << "Ascii fragment " << frag.fragmentID() << " has "
00126 << bb.total_line_characters() << " characters in the line." << std::endl;
00127 std::cout << std::endl;
00128
00129 if (frag.hasMetadata())
00130 {
00131 std::cout << std::endl;
00132 std::cout << "Fragment metadata: " << std::endl;
00133 AsciiFragment::Metadata const* md =
00134 frag.metadata<AsciiFragment::Metadata>();
00135 std::cout << "Chars in line: ";
00136 auto mdChars = md->charsInLine;
00137 std::cout.write(reinterpret_cast<const char*>(&mdChars), sizeof(uint32_t) / sizeof(char));
00138 std::cout << std::endl;
00139 std::cout << std::endl;
00140 }
00141
00142 std::ofstream output("out.bin", std::ios::out | std::ios::app | std::ios::binary);
00143 for (uint32_t i_adc = 0; i_adc < bb.total_line_characters(); ++i_adc)
00144 {
00145 output.write((char*)(bb.dataBegin() + i_adc), sizeof(char));
00146 }
00147 output.close();
00148 std::cout << std::endl;
00149 std::cout << std::endl;
00150 }
00151 std::cout << std::endl;
00152 }
00153
00154 DEFINE_ART_MODULE(demo::ASCIIDump)