1 #include "otsdaq/ARTDAQReaderCore/ARTDAQReaderProcessorBase.h"
2 #include "artdaq/Application/Commandable.hh"
3 #include "fhiclcpp/make_ParameterSet.h"
4 #include "otsdaq/DataManager/DataManager.h"
5 #include "otsdaq/DataManager/DataManagerSingleton.h"
6 #include "otsdaq/Macros/CoutMacros.h"
8 #include "otsdaq/MessageFacility/MessageFacility.h"
17 #define ARTDAQ_FCL_PATH std::string(__ENV__("USER_DATA")) + "/" + "ARTDAQConfigurations/"
18 #define ARTDAQ_FILE_PREAMBLE "boardReader"
21 ARTDAQReaderProcessorBase::ARTDAQReaderProcessorBase(
22 std::string supervisorApplicationUID,
23 std::string bufferUID,
24 std::string processorUID,
26 const std::string& configurationPath)
31 :
Configurable(theXDAQContextConfigTree, configurationPath)
32 , name_(
"BoardReader_" + processorUID)
34 INIT_MF((
"BoardReader_" + processorUID).c_str());
36 __CFG_COUT__ <<
"Constructing..." << __E__;
41 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
42 std::string uid = theXDAQContextConfigTree.getNode(configurationPath).getValue();
44 __CFG_COUT__ <<
"uid: " << uid << __E__;
45 for(
unsigned int i = 0; i < uid.size(); ++i)
46 if((uid[i] >=
'a' && uid[i] <=
'z') || (uid[i] >=
'A' && uid[i] <=
'Z') ||
47 (uid[i] >=
'0' && uid[i] <=
'9'))
51 __CFG_COUT__ << __E__;
52 __CFG_COUT__ << __E__;
53 __CFG_COUT__ <<
"filename: " << filename << __E__;
55 std::string fileFclString;
57 std::ifstream in(filename, std::ios::in | std::ios::binary);
61 in.seekg(0, std::ios::end);
62 fileFclString.resize(in.tellg());
63 in.seekg(0, std::ios::beg);
64 in.read(&fileFclString[0], fileFclString.size());
76 fileFclString.find(
"fragment_receiver: {") + +strlen(
"fragment_receiver: {");
77 if(fcli == std::string::npos)
79 __SS__ <<
"Could not find 'fragment_receiver: {' in Board Reader fcl string!"
81 __CFG_COUT__ <<
"\n" << ss.str();
86 __CFG_COUT__ <<
"configurationPath " << configurationPath << __E__;
88 std::string consumerID, bufferID, appID;
89 unsigned int backSteps;
90 size_t backi = -1, backj;
92 for(
unsigned int i = 0; i < backSteps; i++)
97 backi = configurationPath.rfind(
'/', backi - 1);
104 consumerID = configurationPath.substr(backi + 1, backj - backi - 1);
106 bufferID = configurationPath.substr(backi + 1, backj - backi - 1);
108 appID = configurationPath.substr(backi + 1, backj - backi - 1);
112 fileFclString = fileFclString.substr(0, fcli) +
"\n\t\t" +
113 "SupervisorApplicationUID: \"" + appID +
"\"\n\t\t" +
114 "BufferUID: \"" + bufferID +
"\"\n\t\t" +
"ProcessorUID: \"" +
115 consumerID +
"\"\n" + fileFclString.substr(fcli);
117 __CFG_COUT__ << fileFclString << __E__;
121 fhicl::make_ParameterSet(fileFclString, fhiclConfiguration_);
123 catch(
const cet::coded_exception<fhicl::error, &fhicl::detail::translate>& e)
125 __CFG_SS__ <<
"Error was caught while configuring: " << e.what() << __E__;
128 catch(
const cet::exception& e)
130 __CFG_SS__ <<
"Error was caught while configuring: " << e.explain_self() << __E__;
135 __CFG_SS__ <<
"Unknown error was caught while configuring." << __E__;
152 ARTDAQReaderProcessorBase::~ARTDAQReaderProcessorBase(
void)
155 __CFG_COUT__ <<
"DONE DELETING!" << __E__;
159 void ARTDAQReaderProcessorBase::initLocalGroup(
int rank) { configure(rank); }
161 #define ARTDAQ_FCL_PATH std::string(__ENV__("USER_DATA")) + "/" + "ARTDAQConfigurations/"
162 #define ARTDAQ_FILE_PREAMBLE "boardReader"
165 void ARTDAQReaderProcessorBase::configure(
int rank)
167 __CFG_COUT__ <<
"Configuring..." << __E__;
173 fragment_receiver_ptr_.reset(
nullptr);
174 __CFG_COUT__ <<
"New core" << __E__;
177 fragment_receiver_ptr_.reset(
new artdaq::BoardReaderApp());
181 uint64_t timeout = 45;
182 uint64_t timestamp = 184467440737095516;
183 __CFG_COUT__ <<
"Initializing '" << name_ <<
"'"
186 if(!fragment_receiver_ptr_->initialize(fhiclConfiguration_, timeout, timestamp))
188 __CFG_SS__ <<
"Error initializing '" << name_ <<
"' with ParameterSet = \n"
189 << fhiclConfiguration_.to_string() << __E__;
190 ss <<
"Here is the Board Reader report: \n"
191 << fragment_receiver_ptr_->report(
"" ) << __E__;
194 __CFG_COUT__ <<
"Done Initializing." << __E__;
198 __CFG_COUT__ <<
"Configured." << __E__;
202 void ARTDAQReaderProcessorBase::halt(
void)
204 __CFG_COUT__ <<
"Halting..." << __E__;
208 uint64_t timeout = 45;
210 if(!fragment_receiver_ptr_->shutdown(timeout))
212 __CFG_SS__ <<
"Error shutting down '" << name_ <<
".'" << __E__;
216 __CFG_COUT__ <<
"Halted." << __E__;
220 void ARTDAQReaderProcessorBase::pause(
void)
222 __CFG_COUT__ <<
"Pausing..." << __E__;
226 uint64_t timeout = 45;
227 uint64_t timestamp = 184467440737095516;
229 if(!fragment_receiver_ptr_->pause(timeout, timestamp))
231 __CFG_SS__ <<
"Error pausing '" << name_ <<
".'" << __E__;
235 __CFG_COUT__ <<
"Paused." << __E__;
239 void ARTDAQReaderProcessorBase::resume(
void)
241 __CFG_COUT__ <<
"Resuming..." << __E__;
245 uint64_t timeout = 45;
246 uint64_t timestamp = 184467440737095516;
248 if(!fragment_receiver_ptr_->resume(timeout, timestamp))
250 __CFG_SS__ <<
"Error resuming '" << name_ <<
".'" << __E__;
254 __CFG_COUT__ <<
"Resumed." << __E__;
258 void ARTDAQReaderProcessorBase::start(
const std::string& runNumber)
260 __CFG_COUT__ <<
"Starting..." << __E__;
262 art::RunID runId((art::RunNumber_t)boost::lexical_cast<art::RunNumber_t>(runNumber));
266 uint64_t timeout = 45;
267 uint64_t timestamp = 184467440737095516;
269 __CFG_COUT__ <<
"Start run: " << runId << __E__;
270 if(!fragment_receiver_ptr_->start(runId, timeout, timestamp))
272 __CFG_SS__ <<
"Error starting '" << name_ <<
"' for run number '" << runId <<
",'"
277 __CFG_COUT__ <<
"Started." << __E__;
281 void ARTDAQReaderProcessorBase::stop(
void)
283 __CFG_COUT__ <<
"Stop" << __E__;
287 uint64_t timeout = 45;
288 uint64_t timestamp = 184467440737095516;
290 auto sts = fragment_receiver_ptr_->status();
293 __CFG_COUT__ <<
"Already stopped - never started!" << __E__;
297 if(!fragment_receiver_ptr_->stop(timeout, timestamp))
299 __CFG_SS__ <<
"Error stopping '" << name_ <<
".'" << __E__;
303 __CFG_COUT__ <<
"Stopped." << __E__;