1 #include "otsdaq-core/DataProcessorPlugins/ARTDAQConsumer.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 ARTDAQConsumer::ARTDAQConsumer (std::string supervisorApplicationUID, std::string bufferUID, std::string processorUID,
const ConfigurationTree& theXDAQContextConfigTree,
const std::string& configurationPath)
24 ,
DataConsumer (supervisorApplicationUID, bufferUID, processorUID, LowConsumerPriority)
25 ,
Configurable (theXDAQContextConfigTree, configurationPath)
27 __COUT__ <<
"ARTDAQ CONSUMER CONSTRUCTOR!!!" << std::endl;
31 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
32 std::string uid = theXDAQContextConfigTree.getNode(configurationPath).getValue();
34 __COUT__ <<
"uid: " << uid << std::endl;
35 for(
unsigned int i=0;i<uid.size();++i)
36 if((uid[i] >=
'a' && uid[i] <=
'z') ||
37 (uid[i] >=
'A' && uid[i] <=
'Z') ||
38 (uid[i] >=
'0' && uid[i] <=
'9'))
42 __COUT__ << std::endl;
43 __COUT__ << std::endl;
44 __COUT__ <<
"filename: " << filename << std::endl;
46 std::string fileFclString;
48 std::ifstream in(filename, std::ios::in | std::ios::binary);
52 in.seekg(0, std::ios::end);
53 fileFclString.resize(in.tellg());
54 in.seekg(0, std::ios::beg);
55 in.read(&fileFclString[0], fileFclString.size());
66 size_t fcli = fileFclString.find(
"fragment_receiver: {") +
67 +strlen(
"fragment_receiver: {");
68 if(fcli == std::string::npos)
70 __SS__ <<
"Could not find 'fragment_receiver: {' in Board Reader fcl string!" << std::endl;
71 __COUT__ <<
"\n" << ss.str();
72 throw std::runtime_error(ss.str());
76 __COUT__ <<
"configurationPath " << configurationPath << std::endl;
78 std::string consumerID, bufferID, appID;
79 unsigned int backSteps;
80 size_t backi = -1, backj;
82 for(
unsigned int i=0; i<backSteps; i++)
87 backi = configurationPath.rfind(
'/',backi-1);
93 consumerID = configurationPath.substr(backi+1,backj-backi-1);
95 bufferID = configurationPath.substr(backi+1,backj-backi-1);
97 appID = configurationPath.substr(backi+1,backj-backi-1);
101 fileFclString = fileFclString.substr(0,fcli) +
"\n\t\t" +
102 "SupervisorApplicationUID: \"" + appID +
"\"\n\t\t" +
103 "BufferUID: \"" + bufferID +
"\"\n\t\t" +
104 "ProcessorUID: \"" + consumerID +
"\"\n" +
105 fileFclString.substr(fcli);
107 __COUT__ << fileFclString << std::endl;
109 fhicl::make_ParameterSet(fileFclString, fhiclConfiguration_);
123 ARTDAQConsumer::~ARTDAQConsumer(
void)
126 __COUT__ <<
"DONE DELETING!" << std::endl;
130 void ARTDAQConsumer::initLocalGroup(
int rank)
132 name_ =
"BoardReader_" + DataConsumer::processorUID_;
136 #define ARTDAQ_FCL_PATH std::string(getenv("USER_DATA")) + "/"+ "ARTDAQConfigurations/"
137 #define ARTDAQ_FILE_PREAMBLE "boardReader"
140 void ARTDAQConsumer::configure(
int rank)
142 std::cout << __COUT_HDR_FL__ <<
"\tConfigure" << std::endl;
145 external_request_status_ =
true;
151 fragment_receiver_ptr_.reset(
nullptr);
152 std::cout << __COUT_HDR_FL__ <<
"\tNew core" << std::endl;
155 fragment_receiver_ptr_.reset(
new artdaq::BoardReaderApp());
157 uint64_t timeout = 45;
159 uint64_t timestamp = 184467440737095516;
160 std::cout << __COUT_HDR_FL__ <<
"\tInitialize: " << std::endl;
161 external_request_status_ = fragment_receiver_ptr_->initialize(fhiclConfiguration_, timeout, timestamp);
162 std::cout << __COUT_HDR_FL__ <<
"\tDone Initialize" << std::endl;
163 if (! external_request_status_)
165 report_string_ =
"Error initializing ";
166 report_string_.append(name_ +
" ");
167 report_string_.append(
"with ParameterSet = \"" + fhiclConfiguration_.to_string() +
"\".");
169 std::cout << __COUT_HDR_FL__ <<
"\tDone Configure" << std::endl;
173 void ARTDAQConsumer::halt(
void)
175 std::cout << __COUT_HDR_FL__ <<
"\tHalt" << std::endl;
177 uint64_t timeout = 45;
180 external_request_status_ = fragment_receiver_ptr_->shutdown(timeout);
181 if (! external_request_status_)
183 report_string_ =
"Error shutting down ";
184 report_string_.append(name_ +
".");
189 void ARTDAQConsumer::pauseProcessingData(
void)
191 std::cout << __COUT_HDR_FL__ <<
"\tPause" << std::endl;
193 uint64_t timeout = 45;
194 uint64_t timestamp = 184467440737095516;
196 external_request_status_ = fragment_receiver_ptr_->pause(timeout, timestamp);
197 if (! external_request_status_)
199 report_string_ =
"Error pausing ";
200 report_string_.append(name_ +
".");
205 void ARTDAQConsumer::resumeProcessingData(
void)
207 std::cout << __COUT_HDR_FL__ <<
"\tResume" << std::endl;
209 uint64_t timeout = 45;
210 uint64_t timestamp = 184467440737095516;
212 external_request_status_ = fragment_receiver_ptr_->resume(timeout, timestamp);
213 if (! external_request_status_)
215 report_string_ =
"Error resuming ";
216 report_string_.append(name_ +
".");
221 void ARTDAQConsumer::startProcessingData(std::string runNumber)
223 std::cout << __COUT_HDR_FL__ <<
"\tStart" << std::endl;
225 art::RunID runId((art::RunNumber_t)boost::lexical_cast<art::RunNumber_t>(runNumber));
228 uint64_t timeout = 45;
229 uint64_t timestamp = 184467440737095516;
232 std::cout << __COUT_HDR_FL__ <<
"\tStart run: " << runId << std::endl;
233 external_request_status_ = fragment_receiver_ptr_->start(runId, timeout, timestamp);
234 std::cout << __COUT_HDR_FL__ <<
"\tStart already crashed "<< std::endl;
235 if (! external_request_status_)
237 report_string_ =
"Error starting ";
238 report_string_.append(name_ +
" ");
239 report_string_.append(
"for run number ");
240 report_string_.append(boost::lexical_cast<std::string>(runId.run()));
241 report_string_.append(
", timeout ");
242 report_string_.append(boost::lexical_cast<std::string>(timeout));
243 report_string_.append(
", timestamp ");
244 report_string_.append(boost::lexical_cast<std::string>(timestamp));
245 report_string_.append(
".");
248 std::cout << __COUT_HDR_FL__ <<
"STARTING BOARD READER THREAD" << std::endl;
252 void ARTDAQConsumer::stopProcessingData(
void)
254 std::cout << __COUT_HDR_FL__ <<
"\tStop" << std::endl;
256 uint64_t timeout = 45;
257 uint64_t timestamp = 184467440737095516;
259 external_request_status_ = fragment_receiver_ptr_->stop(timeout, timestamp);
260 if (! external_request_status_)
262 report_string_ =
"Error stopping ";
263 report_string_.append(name_ +
".");