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";
75 if ( vm.count(
"help" ) )
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]";