1 #include "otsdaq-core/DataProcessorPlugins/ARTDAQProducer.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
4 #include "artdaq/Application/Commandable.hh"
5 #include "otsdaq-core/Macros/ProcessorPluginMacros.h"
6 #include "fhiclcpp/make_ParameterSet.h"
7 #include "otsdaq-core/DataManager/DataManagerSingleton.h"
8 #include "otsdaq-core/DataManager/DataManager.h"
18 #define ARTDAQ_FCL_PATH std::string(getenv("USER_DATA")) + "/"+ "ARTDAQConfigurations/"
19 #define ARTDAQ_FILE_PREAMBLE "boardReader"
22 ARTDAQProducer::ARTDAQProducer (std::string supervisorApplicationUID, std::string bufferUID, std::string processorUID,
const ConfigurationTree& theXDAQContextConfigTree,
const std::string& configurationPath)
27 ,
Configurable (theXDAQContextConfigTree, configurationPath)
29 __MOUT__ <<
"ARTDAQ PRODUCER CONSTRUCTOR!!!" << std::endl;
33 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
34 std::string uid = theXDAQContextConfigTree.getNode(configurationPath).getValue();
36 __MOUT__ <<
"uid: " << uid << std::endl;
37 for(
unsigned int i=0;i<uid.size();++i)
38 if((uid[i] >=
'a' && uid[i] <=
'z') ||
39 (uid[i] >=
'A' && uid[i] <=
'Z') ||
40 (uid[i] >=
'0' && uid[i] <=
'9'))
44 __MOUT__ << std::endl;
45 __MOUT__ << std::endl;
46 __MOUT__ <<
"filename: " << filename << std::endl;
48 std::string fileFclString;
50 std::ifstream in(filename, std::ios::in | std::ios::binary);
54 in.seekg(0, std::ios::end);
55 fileFclString.resize(in.tellg());
56 in.seekg(0, std::ios::beg);
57 in.read(&fileFclString[0], fileFclString.size());
68 size_t fcli = fileFclString.find(
"fragment_receiver: {") +
69 +strlen(
"fragment_receiver: {");
70 if(fcli == std::string::npos)
72 __SS__ <<
"Could not find 'fragment_receiver: {' in Board Reader fcl string!" << std::endl;
73 __MOUT__ <<
"\n" << ss.str();
74 throw std::runtime_error(ss.str());
78 __MOUT__ <<
"configurationPath " << configurationPath << std::endl;
80 std::string consumerID, bufferID, appID;
81 unsigned int backSteps;
82 size_t backi = -1, backj;
84 for(
unsigned int i=0; i<backSteps; i++)
89 backi = configurationPath.rfind(
'/',backi-1);
95 consumerID = configurationPath.substr(backi+1,backj-backi-1);
97 bufferID = configurationPath.substr(backi+1,backj-backi-1);
99 appID = configurationPath.substr(backi+1,backj-backi-1);
103 fileFclString = fileFclString.substr(0,fcli) +
"\n\t\t" +
104 "SupervisorApplicationUID: \"" + appID +
"\"\n\t\t" +
105 "BufferUID: \"" + bufferID +
"\"\n\t\t" +
106 "ProcessorUID: \"" + consumerID +
"\"\n" +
107 fileFclString.substr(fcli);
109 __MOUT__ << fileFclString << std::endl;
111 fhicl::make_ParameterSet(fileFclString, fhiclConfiguration_);
125 ARTDAQProducer::~ARTDAQProducer(
void)
128 __MOUT__ <<
"DONE DELETING!" << std::endl;
132 void ARTDAQProducer::initLocalGroup(
int rank)
134 name_ =
"BoardReader_" + DataProducer::processorUID_;
138 #define ARTDAQ_FCL_PATH std::string(getenv("USER_DATA")) + "/"+ "ARTDAQConfigurations/"
139 #define ARTDAQ_FILE_PREAMBLE "boardReader"
142 void ARTDAQProducer::configure(
int rank)
144 std::cout << __COUT_HDR_FL__ <<
"\tConfigure" << std::endl;
147 external_request_status_ =
true;
153 artdaq::Commandable tmpCommandable;
154 fragment_receiver_ptr_.reset(
nullptr);
155 std::cout << __COUT_HDR_FL__ <<
"\tNew core" << std::endl;
156 fragment_receiver_ptr_.reset(
new artdaq::BoardReaderCore(tmpCommandable, rank, name_));
158 uint64_t timeout = 45;
160 uint64_t timestamp = 184467440737095516;
161 std::cout << __COUT_HDR_FL__ <<
"\tInitialize: " << std::endl;
162 external_request_status_ = fragment_receiver_ptr_->initialize(fhiclConfiguration_, timeout, timestamp);
163 std::cout << __COUT_HDR_FL__ <<
"\tDone Initialize" << std::endl;
164 if (! external_request_status_)
166 report_string_ =
"Error initializing ";
167 report_string_.append(name_ +
" ");
168 report_string_.append(
"with ParameterSet = \"" + fhiclConfiguration_.to_string() +
"\".");
170 std::cout << __COUT_HDR_FL__ <<
"\tDone Configure" << std::endl;
174 void ARTDAQProducer::halt(
void)
176 std::cout << __COUT_HDR_FL__ <<
"\tHalt" << std::endl;
178 uint64_t timeout = 45;
181 external_request_status_ = fragment_receiver_ptr_->shutdown(timeout);
182 if (! external_request_status_)
184 report_string_ =
"Error shutting down ";
185 report_string_.append(name_ +
".");
190 void ARTDAQProducer::pauseProcessingData(
void)
192 std::cout << __COUT_HDR_FL__ <<
"\tPause" << std::endl;
194 uint64_t timeout = 45;
195 uint64_t timestamp = 184467440737095516;
197 external_request_status_ = fragment_receiver_ptr_->pause(timeout, timestamp);
198 if (! external_request_status_)
200 report_string_ =
"Error pausing ";
201 report_string_.append(name_ +
".");
204 if (fragment_processing_future_.valid())
206 int number_of_fragments_sent = fragment_processing_future_.get();
207 mf::LogDebug(name_+
"App::do_pause(uint64_t, uint64_t)")
208 <<
"Number of fragments sent = " << number_of_fragments_sent
214 void ARTDAQProducer::resumeProcessingData(
void)
216 std::cout << __COUT_HDR_FL__ <<
"\tResume" << std::endl;
218 uint64_t timeout = 45;
219 uint64_t timestamp = 184467440737095516;
221 external_request_status_ = fragment_receiver_ptr_->resume(timeout, timestamp);
222 if (! external_request_status_)
224 report_string_ =
"Error resuming ";
225 report_string_.append(name_ +
".");
228 fragment_processing_future_ = std::async(std::launch::async, &artdaq::BoardReaderCore::process_fragments, fragment_receiver_ptr_.get());
233 void ARTDAQProducer::startProcessingData(std::string runNumber)
235 std::cout << __COUT_HDR_FL__ <<
"\tStart" << std::endl;
237 art::RunID runId((art::RunNumber_t)boost::lexical_cast<art::RunNumber_t>(runNumber));
240 uint64_t timeout = 45;
241 uint64_t timestamp = 184467440737095516;
244 std::cout << __COUT_HDR_FL__ <<
"\tStart run: " << runId << std::endl;
245 external_request_status_ = fragment_receiver_ptr_->start(runId, timeout, timestamp);
246 std::cout << __COUT_HDR_FL__ <<
"\tStart already crashed "<< std::endl;
247 if (! external_request_status_)
249 report_string_ =
"Error starting ";
250 report_string_.append(name_ +
" ");
251 report_string_.append(
"for run number ");
252 report_string_.append(boost::lexical_cast<std::string>(runId.run()));
253 report_string_.append(
", timeout ");
254 report_string_.append(boost::lexical_cast<std::string>(timeout));
255 report_string_.append(
", timestamp ");
256 report_string_.append(boost::lexical_cast<std::string>(timestamp));
257 report_string_.append(
".");
260 std::cout << __COUT_HDR_FL__ <<
"STARTING BOARD READER THREAD" << std::endl;
261 fragment_processing_future_ = std::async(std::launch::async, &artdaq::BoardReaderCore::process_fragments, fragment_receiver_ptr_.get());
266 void ARTDAQProducer::stopProcessingData(
void)
268 std::cout << __COUT_HDR_FL__ <<
"\tStop" << std::endl;
270 uint64_t timeout = 45;
271 uint64_t timestamp = 184467440737095516;
273 external_request_status_ = fragment_receiver_ptr_->stop(timeout, timestamp);
274 if (! external_request_status_)
276 report_string_ =
"Error stopping ";
277 report_string_.append(name_ +
".");
281 if (fragment_processing_future_.valid())
283 int number_of_fragments_sent = fragment_processing_future_.get();
284 mf::LogDebug(name_ +
"App::do_stop(uint64_t, uint64_t)")
285 <<
"Number of fragments sent = " << number_of_fragments_sent