1 #include "artdaq/Application/CompositeDriver.hh"
3 #include "artdaq/Application/GeneratorMacros.hh"
4 #include "artdaq/Application/makeCommandableFragmentGenerator.hh"
5 #include "canvas/Utilities/Exception.h"
6 #include "cetlib/exception.h"
7 #include <boost/algorithm/string.hpp>
9 using fhicl::ParameterSet;
14 std::vector<ParameterSet> psetList =
15 ps.get<std::vector<ParameterSet>>(
"generator_config_list");
16 for (
auto pset : psetList)
18 if (! makeChildGenerator_(pset))
20 throw cet::exception(
"CompositeDriver")
21 <<
"Unable to create child generator for PSet= \""
22 << pset.to_string() <<
"\"";
26 std::string compositeMetricName;
27 for (
auto& generator : generator_list_)
29 if (compositeMetricName.length() > 0) { compositeMetricName.append(
", "); }
30 compositeMetricName.append(generator->metricsReportingInstanceName());
39 size_t listSize = generator_list_.size();
45 generator_list_.resize(listSize);
49 TLOG_ERROR(
"CompositeDriver")
50 <<
"Unknown exception when destructing the generator at index "
51 << (listSize + 1) << TLOG_ENDL;
58 for (
size_t idx = 0; idx < generator_active_list_.size(); ++idx)
60 generator_active_list_[idx] =
true;
62 for (
auto& generator : generator_list_)
64 generator->StartCmd(run_number(), timeout(), timestamp());
70 std::vector<std::unique_ptr<CommandableFragmentGenerator>>::reverse_iterator riter;
71 for (riter = generator_list_.rbegin(); riter != generator_list_.rend(); ++riter)
73 (*riter)->StopCmd(timeout(), timestamp());
90 std::vector<std::unique_ptr<CommandableFragmentGenerator>>::reverse_iterator riter;
91 for (riter = generator_list_.rbegin(); riter != generator_list_.rend(); ++riter)
93 (*riter)->PauseCmd(timeout(), timestamp());
99 for (
size_t idx = 0; idx < generator_active_list_.size(); ++idx)
101 generator_active_list_[idx] =
true;
103 for (
auto& generator : generator_list_)
105 generator->ResumeCmd(timeout(), timestamp());
109 std::vector<artdaq::Fragment::fragment_id_t> artdaq::CompositeDriver::fragmentIDs()
111 std::vector<artdaq::Fragment::fragment_id_t> workList;
112 for (
size_t idx = 0; idx < generator_list_.size(); ++idx)
114 std::vector<artdaq::Fragment::fragment_id_t> tempList =
115 generator_list_[idx]->fragmentIDs();
116 workList.insert(workList.end(), tempList.begin(), tempList.end());
121 bool artdaq::CompositeDriver::getNext_(artdaq::FragmentPtrs& frags)
123 bool anyGeneratorIsActive =
false;
124 for (
size_t idx = 0; idx < generator_list_.size(); ++idx)
126 if (generator_active_list_[idx])
128 bool status = generator_list_[idx]->getNext(frags);
137 if (! status && generator_list_[idx]->exception())
139 std::string reportString =
140 generator_list_[idx]->ReportCmd(
"latest_exception");
141 if (std::string::npos !=
142 boost::algorithm::to_lower_copy(reportString).find(
"exception"))
144 throw cet::exception(
"CompositeDriver_generator")
145 <<
"The FragmentGenerator for "
146 << generator_list_[idx]->metricsReportingInstanceName()
147 <<
" threw an exception: " << reportString;
151 throw cet::exception(
"CompositeDriver_generator")
152 <<
"The FragmentGenerator for "
153 << generator_list_[idx]->metricsReportingInstanceName()
154 <<
" threw an exception.";
157 generator_active_list_[idx] = status;
158 if (status) { anyGeneratorIsActive =
true; }
161 return anyGeneratorIsActive;
164 bool artdaq::CompositeDriver::makeChildGenerator_(fhicl::ParameterSet
const& pset)
167 fhicl::ParameterSet daq_pset;
170 daq_pset = pset.get<fhicl::ParameterSet>(
"daq");
174 TLOG_ERROR(
"CompositeDriver::makeChildGenerator_")
175 <<
"Unable to find the DAQ parameters in the initialization "
176 <<
"ParameterSet: \"" + pset.to_string() +
"\"." << TLOG_ENDL;
179 fhicl::ParameterSet fr_pset;
182 fr_pset = daq_pset.get<fhicl::ParameterSet>(
"fragment_receiver");
186 TLOG_ERROR(
"CompositeDriver::makeChildGenerator_")
187 <<
"Unable to find the fragment_receiver parameters in the DAQ "
188 <<
"initialization ParameterSet: \"" + daq_pset.to_string() +
"\"." << TLOG_ENDL;
193 std::string frag_gen_name = fr_pset.get<std::string>(
"generator",
"");
194 if (frag_gen_name.length() == 0)
196 TLOG_ERROR(
"CompositeDriver::makeChildGenerator_")
197 <<
"No fragment generator (parameter name = \"generator\") was "
198 <<
"specified in the fragment_receiver ParameterSet. The "
199 <<
"DAQ initialization PSet was \"" << daq_pset.to_string() <<
"\"." << TLOG_ENDL;
203 std::unique_ptr<artdaq::CommandableFragmentGenerator> tmp_gen_ptr;
208 catch (art::Exception& excpt)
210 TLOG_ERROR(
"CompositeDriver::makeChildGenerator_")
211 <<
"Exception creating a FragmentGenerator of type \""
212 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
213 <<
"\", exception = " << excpt << TLOG_ENDL;
216 catch (cet::exception& excpt)
218 TLOG_ERROR(
"CompositeDriver::makeChildGenerator_")
219 <<
"Exception creating a FragmentGenerator of type \""
220 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
221 <<
"\", exception = " << excpt << TLOG_ENDL;
226 TLOG_ERROR(
"CompositeDriver::makeChildGenerator_")
227 <<
"Unknown exception creating a FragmentGenerator of type \""
228 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
229 <<
"\"." << TLOG_ENDL;
233 std::unique_ptr<CommandableFragmentGenerator> generator_ptr;
234 generator_ptr.reset(
nullptr);
237 CommandableFragmentGenerator* tmp_cmdablegen_bareptr =
238 dynamic_cast<CommandableFragmentGenerator*
>(tmp_gen_ptr.get());
239 if (tmp_cmdablegen_bareptr)
241 tmp_gen_ptr.release();
242 generator_ptr.reset(tmp_cmdablegen_bareptr);
248 TLOG_ERROR(
"CompositeDriver::makeChildGenerator_")
249 <<
"Error: The requested fragment generator type (" << frag_gen_name
250 <<
") is not a CommandableFragmentGenerator, and only "
251 <<
"CommandableFragmentGenerators are currently supported." << TLOG_ENDL;
255 generator_list_.push_back(std::move(generator_ptr));
256 generator_active_list_.push_back(
true);
void start() override
Start all configured CommandableFragmentGenerators.
virtual ~CompositeDriver() noexcept
Destructor. Calls the destructors for each configured CommandableFragmentGenerator.
CompositeDriver handles a set of lower-level generators.
void pause() override
Pause all configured CommandableFragmentGenerators.
std::unique_ptr< CommandableFragmentGenerator > makeCommandableFragmentGenerator(std::string const &generator_plugin_spec, fhicl::ParameterSet const &ps)
Load a CommandableFragmentGenerator plugin.
virtual std::string metricsReportingInstanceName() const
Get the name used when reporting metrics.
void stop() override
Call stop methods for all configured CommandableFragmentGenerators. Currently handled by stopNoMutex...
CommandableFragmentGenerator is a FragmentGenerator-derived abstract class that defines the interface...
CompositeDriver(fhicl::ParameterSet const &ps)
CompositeDriver Constructor.
void resume() override
Resume all configured CommandableFragmentGenerators.
void stopNoMutex() override
Call non-locked stop methods for all configured CommandableFragmentGenerators.