1 #include "canvas/Utilities/Exception.h"
2 #include "art/Framework/Art/artapp.h"
4 #define TRACE_NAME (app_name + "_DataReceiverCore").c_str() // include these 2 first -
5 #include "artdaq/DAQdata/Globals.hh"
6 #include "artdaq-core/Core/SimpleMemoryReader.hh"
7 #include "artdaq-core/Utilities/ExceptionHandler.hh"
9 #include "artdaq/Application/DataReceiverCore.hh"
10 #include "artdaq/TransferPlugins/TransferInterface.hh"
15 : stop_requested_(false)
16 , pause_requested_(false)
17 , run_is_paused_(false)
19 TLOG(TLVL_DEBUG) <<
"Constructor" ;
25 TLOG(TLVL_DEBUG) <<
"Destructor" ;
31 verbose_ = data_pset.get<
bool>(
"verbose",
true);
34 TLOG(TLVL_INFO) <<
"Initializing Data Receiver";
36 if (metric_pset.is_empty())
38 TLOG(TLVL_INFO) <<
"No metric plugins appear to be defined" ;
42 metricMan_.initialize(metric_pset, app_name);
46 ExceptionHandler(ExceptionHandlerRethrow::no,
47 "Error loading metrics in DataReceiverCore::initialize()");
50 fhicl::ParameterSet art_pset = pset;
51 if(art_pset.has_key(
"art"))
53 art_pset = art_pset.get<fhicl::ParameterSet>(
"art");
57 art_pset.erase(
"daq");
60 fhicl::ParameterSet data_tmp = data_pset;
61 if (data_pset.has_key(
"expected_events_per_bunch"))
63 data_tmp.put<
int>(
"expected_fragments_per_event", data_pset.get<
int>(
"expected_events_per_bunch"));
66 if (data_pset.has_key(
"rank"))
68 if (my_rank >= 0 && data_pset.get<
int>(
"rank") != my_rank) {
69 TLOG(TLVL_WARNING) <<
"Rank specified at startup is different than rank specified at configure! Using rank received at configure!";
71 my_rank = data_pset.get<
int>(
"rank");
75 TLOG(TLVL_ERROR) <<
"Rank not specified at startup or in configuration! Aborting";
88 logMessage_(
"Starting run " + boost::lexical_cast<std::string>(
id.run()));
89 stop_requested_.store(
false);
90 pause_requested_.store(
false);
91 run_is_paused_.store(
false);
92 metricMan_.do_start();
93 event_store_ptr_->startRun(
id.run());
94 receiver_ptr_->start_threads();
96 logMessage_(
"Completed the Start transition for run " + boost::lexical_cast<std::string>(event_store_ptr_->runID()));
102 logMessage_(
"Stopping run " + boost::lexical_cast<std::string>(event_store_ptr_->runID()) +
103 ", subrun " + boost::lexical_cast<std::string>(event_store_ptr_->subrunID()));
106 receiver_ptr_->stop_threads();
112 stop_requested_.store(
true);
114 if (!run_is_paused_.load())
116 TLOG(TLVL_DEBUG) <<
"Ending subrun " << event_store_ptr_->subrunID();
117 endSucceeded =
false;
119 endSucceeded = event_store_ptr_->endSubrun();
120 while (!endSucceeded && attemptsToEnd < 3)
123 TLOG(TLVL_DEBUG) <<
"Retrying EventStore::endSubrun()" ;
124 endSucceeded = event_store_ptr_->endSubrun();
129 <<
"EventStore::endSubrun in stop method failed after three tries." ;
131 TLOG(TLVL_DEBUG) <<
"Done Ending subrun " << event_store_ptr_->subrunID();
134 TLOG(TLVL_DEBUG) <<
"Ending run " << event_store_ptr_->runID();
135 endSucceeded =
false;
137 endSucceeded = event_store_ptr_->endRun();
138 while (!endSucceeded && attemptsToEnd < 3)
141 TLOG(TLVL_DEBUG) <<
"Retrying EventStore::endRun()" ;
142 endSucceeded = event_store_ptr_->endRun();
147 <<
"EventStore::endRun in stop method failed after three tries." ;
149 TLOG(TLVL_DEBUG) <<
"Done Ending run " << event_store_ptr_->runID();
151 endSucceeded =
false;
153 TLOG(TLVL_DEBUG) <<
"stop: Calling EventStore::endOfData" ;
154 endSucceeded = event_store_ptr_->endOfData();
155 while (!endSucceeded && attemptsToEnd < 3)
158 TLOG(TLVL_DEBUG) <<
"Retrying EventStore::endOfData()" ;
159 endSucceeded = event_store_ptr_->endOfData();
162 run_is_paused_.store(
false);
163 logMessage_(
"Completed the Stop transition for run " + boost::lexical_cast<std::string>(event_store_ptr_->runID()));
169 logMessage_(
"Pausing run " + boost::lexical_cast<std::string>(event_store_ptr_->runID()) +
170 ", subrun " + boost::lexical_cast<std::string>(event_store_ptr_->subrunID()));
171 pause_requested_.store(
true);
173 bool endSucceeded =
false;
174 int attemptsToEnd = 1;
175 endSucceeded = event_store_ptr_->endSubrun();
176 while (!endSucceeded && attemptsToEnd < 3)
179 TLOG(TLVL_DEBUG) <<
"Retrying EventStore::endSubrun()" ;
180 endSucceeded = event_store_ptr_->endSubrun();
185 <<
"EventStore::endSubrun in pause method failed after three tries." ;
188 run_is_paused_.store(
true);
189 logMessage_(
"Completed the Pause transition for run " + boost::lexical_cast<std::string>(event_store_ptr_->runID()));
195 logMessage_(
"Resuming run " + boost::lexical_cast<std::string>(event_store_ptr_->runID()));
196 pause_requested_.store(
false);
197 metricMan_.do_start();
198 event_store_ptr_->startSubrun();
199 run_is_paused_.store(
false);
200 logMessage_(
"Completed the Resume transition for run " + boost::lexical_cast<std::string>(event_store_ptr_->runID()));
206 logMessage_(
"Starting Shutdown transition");
213 TLOG(TLVL_DEBUG) <<
"shutdown: Shutting down DataReceiverManager" ;
214 receiver_ptr_.reset(
nullptr);
216 bool endSucceeded =
false;
217 int attemptsToEnd = 1;
218 TLOG(TLVL_DEBUG) <<
"shutdown: Calling EventStore::endOfData" ;
219 endSucceeded = event_store_ptr_->endOfData();
220 while (!endSucceeded && attemptsToEnd < 3)
223 TLOG(TLVL_DEBUG) <<
"Retrying EventStore::endOfData()" ;
224 endSucceeded = event_store_ptr_->endOfData();
227 TLOG(TLVL_DEBUG) <<
"shutdown: Shutting down SharedMemoryEventManager" ;
228 event_store_ptr_.reset();
230 TLOG(TLVL_DEBUG) <<
"shutdown: Shutting down MetricManager" ;
231 metricMan_.shutdown();
233 TLOG(TLVL_DEBUG) <<
"shutdown: Complete" ;
234 logMessage_(
"Completed Shutdown transition");
240 TLOG(TLVL_DEBUG) <<
"soft_initialize method called with DAQ "
241 <<
"ParameterSet = \"" << pset.to_string()
248 TLOG(TLVL_DEBUG) <<
"reinitialize method called with DAQ "
249 <<
"ParameterSet = \"" << pset.to_string()
251 event_store_ptr_ =
nullptr;
252 return initialize(pset);
257 if (event_store_ptr_)
259 event_store_ptr_->rolloverSubrun(boundary);
267 if (which ==
"incomplete_event_count")
269 if (event_store_ptr_ !=
nullptr)
271 return boost::lexical_cast<std::string>(event_store_ptr_->GetIncompleteEventCount());
278 if (which ==
"event_count")
280 if (receiver_ptr_ !=
nullptr)
281 return boost::lexical_cast<std::string>(receiver_ptr_->GetReceivedFragmentCount()->count());
291 std::string tmpString;
292 if (event_store_ptr_ !=
nullptr) tmpString.append(app_name +
" run number = " + boost::lexical_cast<std::string>(event_store_ptr_->runID()) +
".\n");
293 tmpString.append(
"Command \"" + which +
"\" is not currently supported.");
301 TLOG(TLVL_INFO) << text ;
305 TLOG(TLVL_DEBUG) << text ;
MetricManager metricMan_
MetricManager concrete instance (for Globals.hh::metricMan)
DataReceiverCore()
DataReceiverCore Constructor.
bool soft_initialize(fhicl::ParameterSet const &pset)
Soft-Initializes the DataReceiverCore. No-Op.
The SharedMemoryEventManager is a SharedMemoryManger which tracks events as they are built...
virtual ~DataReceiverCore()
bool resume()
Resumes the DataReceiverCore.
bool shutdown()
Shuts Down the DataReceiverCore.
bool start(art::RunID id)
Start the DataReceiverCore.
void logMessage_(std::string const &text)
Log a message, setting severity based on verbosity flag.
bool stop()
Stops the DataReceiverCore.
std::string report(std::string const &which) const
Send a report on a given run-time quantity.
bool pause()
Pauses the DataReceiverCore.
Receives Fragment objects from one or more DataSenderManager instances using TransferInterface plugin...
bool rollover_subrun(uint64_t eventNum)
Rollover the subrun after the given event.
bool initializeDataReceiver(fhicl::ParameterSet const &pset, fhicl::ParameterSet const &data_pset, fhicl::ParameterSet const &metric_pset)
Initialize the DataReceiverCore (should be called from initialize() overrides.
bool reinitialize(fhicl::ParameterSet const &pset)
Reinitializes the DataReceiverCore.