1 #include "otsdaq-core/DataProcessorPlugins/ARTDAQProducer.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutMacros.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 __COUT__ <<
"ARTDAQ PRODUCER CONSTRUCTOR!!!" << std::endl;
33 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
34 std::string uid = theXDAQContextConfigTree.getNode(configurationPath).getValue();
36 __COUT__ <<
"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 __COUT__ << std::endl;
45 __COUT__ << std::endl;
46 __COUT__ <<
"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 __COUT__ <<
"\n" << ss.str();
74 throw std::runtime_error(ss.str());
78 __COUT__ <<
"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 __COUT__ << fileFclString << std::endl;
111 fhicl::make_ParameterSet(fileFclString, fhiclConfiguration_);
125 ARTDAQProducer::~ARTDAQProducer(
void)
128 __COUT__ <<
"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 fragment_receiver_ptr_.reset(
nullptr);
154 std::cout << __COUT_HDR_FL__ <<
"\tNew core" << std::endl;
157 fragment_receiver_ptr_.reset(
new artdaq::BoardReaderApp());
159 uint64_t timeout = 45;
161 uint64_t timestamp = 184467440737095516;
162 std::cout << __COUT_HDR_FL__ <<
"\tInitialize: " << std::endl;
163 external_request_status_ = fragment_receiver_ptr_->initialize(fhiclConfiguration_, timeout, timestamp);
164 std::cout << __COUT_HDR_FL__ <<
"\tDone Initialize" << std::endl;
165 if (! external_request_status_)
167 report_string_ =
"Error initializing ";
168 report_string_.append(name_ +
" ");
169 report_string_.append(
"with ParameterSet = \"" + fhiclConfiguration_.to_string() +
"\".");
171 std::cout << __COUT_HDR_FL__ <<
"\tDone Configure" << std::endl;
175 void ARTDAQProducer::halt(
void)
177 std::cout << __COUT_HDR_FL__ <<
"\tHalt" << std::endl;
179 uint64_t timeout = 45;
182 external_request_status_ = fragment_receiver_ptr_->shutdown(timeout);
183 if (! external_request_status_)
185 report_string_ =
"Error shutting down ";
186 report_string_.append(name_ +
".");
191 void ARTDAQProducer::pauseProcessingData(
void)
193 std::cout << __COUT_HDR_FL__ <<
"\tPause" << std::endl;
195 uint64_t timeout = 45;
196 uint64_t timestamp = 184467440737095516;
198 external_request_status_ = fragment_receiver_ptr_->pause(timeout, timestamp);
199 if (! external_request_status_)
201 report_string_ =
"Error pausing ";
202 report_string_.append(name_ +
".");
207 void ARTDAQProducer::resumeProcessingData(
void)
209 std::cout << __COUT_HDR_FL__ <<
"\tResume" << std::endl;
211 uint64_t timeout = 45;
212 uint64_t timestamp = 184467440737095516;
214 external_request_status_ = fragment_receiver_ptr_->resume(timeout, timestamp);
215 if (! external_request_status_)
217 report_string_ =
"Error resuming ";
218 report_string_.append(name_ +
".");
223 void ARTDAQProducer::startProcessingData(std::string runNumber)
225 std::cout << __COUT_HDR_FL__ <<
"\tStart" << std::endl;
227 art::RunID runId((art::RunNumber_t)boost::lexical_cast<art::RunNumber_t>(runNumber));
230 uint64_t timeout = 45;
231 uint64_t timestamp = 184467440737095516;
234 std::cout << __COUT_HDR_FL__ <<
"\tStart run: " << runId << std::endl;
235 external_request_status_ = fragment_receiver_ptr_->start(runId, timeout, timestamp);
236 std::cout << __COUT_HDR_FL__ <<
"\tStart already crashed "<< std::endl;
237 if (! external_request_status_)
239 report_string_ =
"Error starting ";
240 report_string_.append(name_ +
" ");
241 report_string_.append(
"for run number ");
242 report_string_.append(boost::lexical_cast<std::string>(runId.run()));
243 report_string_.append(
", timeout ");
244 report_string_.append(boost::lexical_cast<std::string>(timeout));
245 report_string_.append(
", timestamp ");
246 report_string_.append(boost::lexical_cast<std::string>(timestamp));
247 report_string_.append(
".");
253 void ARTDAQProducer::stopProcessingData(
void)
255 std::cout << __COUT_HDR_FL__ <<
"\tStop" << std::endl;
257 uint64_t timeout = 45;
258 uint64_t timestamp = 184467440737095516;
260 external_request_status_ = fragment_receiver_ptr_->stop(timeout, timestamp);
261 if (! external_request_status_)
263 report_string_ =
"Error stopping ";
264 report_string_.append(name_ +
".");