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(std::string ,
23 std::string processorUID,
25 const std::string& configurationPath)
30 :
Configurable(theXDAQContextConfigTree, configurationPath), name_(
"BoardReader_" + processorUID)
34 __CFG_COUT__ <<
"Constructing..." << __E__;
39 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
40 std::string uid = theXDAQContextConfigTree.getNode(configurationPath).getValue();
42 __CFG_COUT__ <<
"uid: " << uid << __E__;
43 for(
unsigned int i = 0; i < uid.size(); ++i)
44 if((uid[i] >=
'a' && uid[i] <=
'z') || (uid[i] >=
'A' && uid[i] <=
'Z') || (uid[i] >=
'0' && uid[i] <=
'9'))
48 __CFG_COUT__ << __E__;
49 __CFG_COUT__ << __E__;
50 __CFG_COUT__ <<
"filename: " << filename << __E__;
52 std::string fileFclString;
54 std::ifstream in(filename, std::ios::in | std::ios::binary);
58 in.seekg(0, std::ios::end);
59 fileFclString.resize(in.tellg());
60 in.seekg(0, std::ios::beg);
61 in.read(&fileFclString[0], fileFclString.size());
72 size_t fcli = fileFclString.find(
"fragment_receiver: {") + +strlen(
"fragment_receiver: {");
73 if(fcli == std::string::npos)
75 __SS__ <<
"Could not find 'fragment_receiver: {' in Board Reader fcl string!" << __E__;
76 __CFG_COUT__ <<
"\n" << ss.str();
81 __CFG_COUT__ <<
"configurationPath " << configurationPath << __E__;
83 std::string consumerID, bufferID, appID;
84 unsigned int backSteps;
85 size_t backi = -1, backj;
87 for(
unsigned int i = 0; i < backSteps; i++)
92 backi = configurationPath.rfind(
'/', backi - 1);
99 consumerID = configurationPath.substr(backi + 1, backj - backi - 1);
101 bufferID = configurationPath.substr(backi + 1, backj - backi - 1);
103 appID = configurationPath.substr(backi + 1, backj - backi - 1);
107 fileFclString = fileFclString.substr(0, fcli) +
"\n\t\t" +
"SupervisorApplicationUID: \"" + appID +
"\"\n\t\t" +
"BufferUID: \"" + bufferID +
"\"\n\t\t" +
108 "ProcessorUID: \"" + consumerID +
"\"\n" + fileFclString.substr(fcli);
110 __CFG_COUT__ << fileFclString << __E__;
114 fhicl::make_ParameterSet(fileFclString, fhiclConfiguration_);
116 catch(
const cet::coded_exception<fhicl::error, &fhicl::detail::translate>& e)
118 __CFG_SS__ <<
"Error was caught while configuring: " << e.what() << __E__;
121 catch(
const cet::exception& e)
123 __CFG_SS__ <<
"Error was caught while configuring: " << e.explain_self() << __E__;
128 __CFG_SS__ <<
"Unknown error was caught while configuring." << __E__;
145 ARTDAQReaderProcessorBase::~ARTDAQReaderProcessorBase(
void)
148 __CFG_COUT__ <<
"DONE DELETING!" << __E__;
152 void ARTDAQReaderProcessorBase::initLocalGroup(
int rank) { configure(rank); }
154 #define ARTDAQ_FCL_PATH std::string(__ENV__("USER_DATA")) + "/" + "ARTDAQConfigurations/"
155 #define ARTDAQ_FILE_PREAMBLE "boardReader"
158 void ARTDAQReaderProcessorBase::configure(
int rank)
160 __CFG_COUT__ <<
"Configuring..." << __E__;
166 fragment_receiver_ptr_.reset(
nullptr);
167 __CFG_COUT__ <<
"New core" << __E__;
170 fragment_receiver_ptr_.reset(
new artdaq::BoardReaderApp());
174 uint64_t timeout = 45;
175 uint64_t timestamp = 184467440737095516;
176 __CFG_COUT__ <<
"Initializing '" << name_ <<
"'" << __E__;
178 if(!fragment_receiver_ptr_->initialize(fhiclConfiguration_, timeout, timestamp))
180 __CFG_SS__ <<
"Error initializing '" << name_ <<
"' with ParameterSet = \n" << fhiclConfiguration_.to_string() << __E__;
181 ss <<
"Here is the Board Reader report: \n" << fragment_receiver_ptr_->report(
"" ) << __E__;
184 __CFG_COUT__ <<
"Done Initializing." << __E__;
188 __CFG_COUT__ <<
"Configured." << __E__;
192 void ARTDAQReaderProcessorBase::halt(
void)
194 __CFG_COUT__ <<
"Halting..." << __E__;
198 uint64_t timeout = 45;
200 if(!fragment_receiver_ptr_->shutdown(timeout))
202 __CFG_SS__ <<
"Error shutting down '" << name_ <<
".'" << __E__;
206 __CFG_COUT__ <<
"Halted." << __E__;
210 void ARTDAQReaderProcessorBase::pause(
void)
212 __CFG_COUT__ <<
"Pausing..." << __E__;
216 uint64_t timeout = 45;
217 uint64_t timestamp = 184467440737095516;
219 if(!fragment_receiver_ptr_->pause(timeout, timestamp))
221 __CFG_SS__ <<
"Error pausing '" << name_ <<
".'" << __E__;
225 __CFG_COUT__ <<
"Paused." << __E__;
229 void ARTDAQReaderProcessorBase::resume(
void)
231 __CFG_COUT__ <<
"Resuming..." << __E__;
235 uint64_t timeout = 45;
236 uint64_t timestamp = 184467440737095516;
238 if(!fragment_receiver_ptr_->resume(timeout, timestamp))
240 __CFG_SS__ <<
"Error resuming '" << name_ <<
".'" << __E__;
244 __CFG_COUT__ <<
"Resumed." << __E__;
248 void ARTDAQReaderProcessorBase::start(
const std::string& runNumber)
250 __CFG_COUT__ <<
"Starting..." << __E__;
252 art::RunID runId((art::RunNumber_t)boost::lexical_cast<art::RunNumber_t>(runNumber));
256 uint64_t timeout = 45;
257 uint64_t timestamp = 184467440737095516;
259 __CFG_COUT__ <<
"Start run: " << runId << __E__;
260 if(!fragment_receiver_ptr_->start(runId, timeout, timestamp))
262 __CFG_SS__ <<
"Error starting '" << name_ <<
"' for run number '" << runId <<
",'" << __E__;
266 __CFG_COUT__ <<
"Started." << __E__;
270 void ARTDAQReaderProcessorBase::stop(
void)
272 __CFG_COUT__ <<
"Stop" << __E__;
276 uint64_t timeout = 45;
277 uint64_t timestamp = 184467440737095516;
279 auto sts = fragment_receiver_ptr_->status();
282 __CFG_COUT__ <<
"Already stopped - never started!" << __E__;
286 if(!fragment_receiver_ptr_->stop(timeout, timestamp))
288 __CFG_SS__ <<
"Error stopping '" << name_ <<
".'" << __E__;
292 __CFG_COUT__ <<
"Stopped." << __E__;