14 #include "art/Framework/Art/artapp.h"
15 #include "artdaq-core/Core/SimpleMemoryReader.hh"
16 #include "artdaq-core/Data/Fragment.hh"
17 #include "artdaq-core/Utilities/SimpleLookupPolicy.hh"
18 #include "artdaq/Application/CommandableFragmentGenerator.hh"
19 #include "artdaq/Application/makeCommandableFragmentGenerator.hh"
20 #include "artdaq/DAQrate/EventStore.hh"
21 #include "cetlib/container_algorithms.h"
22 #include "cetlib/filepath_maker.h"
23 #include "fhiclcpp/ParameterSet.h"
24 #include "fhiclcpp/make_ParameterSet.h"
26 #include <boost/program_options.hpp>
34 using namespace fhicl;
35 namespace bpo = boost::program_options;
37 int main(
int argc,
char* argv[])
try
43 std::cout <<
"****************************************" << std::endl;
44 std::cout <<
"*** \"demo_driver\" has been deprecated (15-Dec-2016)." << std::endl;
45 std::cout <<
"*** Please use the \"artdaqDriver\" application that is available from" << std::endl
46 <<
"*** the artdaq software package instead of \"demo_driver\"." << std::endl;
54 std::ostringstream descstr;
55 descstr << argv[0] <<
" <-c <config-file>> <other-options>";
57 bpo::options_description desc = descstr.str();
59 desc.add_options()(
"config,c", bpo::value<std::string>(),
"Configuration file.")(
"help,h",
60 "produce help message");
62 bpo::variables_map vm;
66 bpo::store(bpo::command_line_parser(argc, argv).options(desc).run(), vm);
69 catch (bpo::error
const& e)
71 std::cerr <<
"Exception from command line processing in " << argv[0] <<
": " << e.what() <<
"\n";
77 std::cout << desc << std::endl;
80 if (!vm.count(
"config"))
82 std::cerr <<
"Exception from command line processing in " << argv[0] <<
": no configuration file given.\n"
83 <<
"For usage and an options list, please do '" << argv[0] <<
" --help"
92 ParameterSet complete_pset;
94 if (getenv(
"FHICL_FILE_PATH") ==
nullptr)
96 std::cerr <<
"INFO: environment variable FHICL_FILE_PATH was not set. Using \".\"\n";
97 setenv(
"FHICL_FILE_PATH",
".", 0);
100 artdaq::SimpleLookupPolicy lookup_policy(
"FHICL_FILE_PATH");
102 make_ParameterSet(vm[
"config"].as<std::string>(), lookup_policy, complete_pset);
104 ParameterSet fragment_receiver_pset = complete_pset.get<ParameterSet>(
"fragment_receiver");
105 ParameterSet event_builder_pset = complete_pset.get<ParameterSet>(
"event_builder");
110 std::unique_ptr<artdaq::CommandableFragmentGenerator>
const gen(artdaq::makeCommandableFragmentGenerator(
111 fragment_receiver_pset.get<std::string>(
"generator"), fragment_receiver_pset));
117 bool const want_artapp = event_builder_pset.get<
bool>(
"use_art",
false);
119 std::ostringstream os;
120 if (!want_artapp) { os << event_builder_pset.get<
int>(
"events_expected_in_SimpleMemoryReader"); }
121 std::string oss = os.str();
123 const char* args[2]{
"SimpleMemoryReader",
const_cast<char*
>(oss.c_str())};
125 int es_argc(want_artapp ? argc : 2);
126 char** es_argv(want_artapp ? argv : const_cast<char**>(args));
128 artdaq::EventStore::ART_CMDLINE_FCN* es_fcn(want_artapp ? &artapp : &artdaq::SimpleMemoryReaderApp);
130 artdaq::EventStore store(event_builder_pset, event_builder_pset.get<
size_t>(
"expected_fragments_per_event"),
131 complete_pset.get<artdaq::EventStore::run_id_t>(
"run_number"), es_argc, es_argv,
134 int events_to_generate = complete_pset.get<
int>(
"events_to_generate", 0);
136 artdaq::Fragment::sequence_id_t previous_sequence_id = 0;
138 uint64_t timeout = 45;
139 uint64_t timestamp = std::numeric_limits<uint64_t>::max();
141 gen.get()->StartCmd(complete_pset.get<artdaq::EventStore::run_id_t>(
"run_number"), timeout, timestamp);
143 artdaq::FragmentPtrs frags;
145 while (events_to_generate >= 0 && gen->getNext(frags))
147 for (
auto& val : frags)
149 std::cout <<
"Fragment: Seq ID: " << val->sequenceID() <<
", Frag ID: " << val->fragmentID()
150 <<
", total size in bytes: " << val->size() *
sizeof(artdaq::RawDataType) << std::endl;
152 if (val->sequenceID() != previous_sequence_id)
155 previous_sequence_id = val->sequenceID();
157 if (events_to_generate != 0 && event_count > events_to_generate) gen.get()->StopCmd(timeout, timestamp);
159 store.insert(std::move(val));
163 if (events_to_generate != 0 && event_count >= events_to_generate) gen.get()->StopCmd(timeout, timestamp);
166 int readerReturnValue;
167 bool endSucceeded =
false;
168 int attemptsToEnd = 1;
169 endSucceeded = store.endOfData(readerReturnValue);
170 while (!endSucceeded && attemptsToEnd < 3)
173 endSucceeded = store.endOfData(readerReturnValue);
177 std::cerr <<
"Failed to shut down the reader and the event store "
178 <<
"because the endOfData marker could not be pushed "
179 <<
"onto the queue." << std::endl;
181 return readerReturnValue;
184 catch (std::string& x)
186 std::cerr <<
"Exception (type string) caught in driver: " << x <<
"\n";
190 catch (
char const* m)
192 std::cerr <<
"Exception (type char const*) caught in driver: " << std::endl;
193 if (m) { std::cerr << m; }
196 std::cerr <<
"[the value was a null pointer, so no message is available]";