1 #define TRACE_NAME "CompositeDriver"
3 #include "artdaq/Generators/CommandableFragmentGenerator.hh"
4 #include "artdaq/Generators/GeneratorMacros.hh"
5 #include "artdaq/Generators/makeCommandableFragmentGenerator.hh"
6 #include "canvas/Utilities/Exception.h"
7 #include "cetlib_except/exception.h"
9 #include <boost/algorithm/string.hpp>
18 class CompositeDriver :
public CommandableFragmentGenerator
41 void start() override;
56 void pause() override;
69 std::vector<artdaq::Fragment::fragment_id_t> fragmentIDs() override;
71 bool getNext_(artdaq::FragmentPtrs& frags) override;
73 bool makeChildGenerator_(fhicl::ParameterSet const&);
76 std::vector<
bool> generator_active_list_;
83 ps.get<std::vector<fhicl::ParameterSet>>(
"generator_config_list");
84 for (
const auto& pset : psetList)
86 if (!makeChildGenerator_(pset))
88 throw cet::exception(
"CompositeDriver")
89 <<
"Unable to create child generator for PSet= \""
90 << pset.to_string() <<
"\"";
94 std::string compositeMetricName;
95 for (
auto& generator : generator_list_)
97 if (compositeMetricName.length() > 0) { compositeMetricName.append(
", "); }
98 compositeMetricName.append(generator->metricsReportingInstanceName());
107 size_t listSize = generator_list_.size();
113 generator_list_.resize(listSize);
118 <<
"Unknown exception when destructing the generator at index "
126 for (
auto&& idx : generator_active_list_)
130 for (
auto& generator : generator_list_)
138 std::vector<std::unique_ptr<CommandableFragmentGenerator>>::reverse_iterator riter;
139 for (riter = generator_list_.rbegin(); riter != generator_list_.rend(); ++riter)
158 std::vector<std::unique_ptr<CommandableFragmentGenerator>>::reverse_iterator riter;
159 for (riter = generator_list_.rbegin(); riter != generator_list_.rend(); ++riter)
167 for (
auto&& idx : generator_active_list_)
171 for (
auto& generator : generator_list_)
177 std::vector<artdaq::Fragment::fragment_id_t> artdaq::CompositeDriver::fragmentIDs()
179 std::vector<artdaq::Fragment::fragment_id_t> workList;
180 for (
auto& idx : generator_list_)
182 std::vector<artdaq::Fragment::fragment_id_t> tempList =
184 workList.insert(workList.end(), tempList.begin(), tempList.end());
189 bool artdaq::CompositeDriver::getNext_(artdaq::FragmentPtrs& frags)
191 bool anyGeneratorIsActive =
false;
192 for (
size_t idx = 0; idx < generator_list_.size(); ++idx)
194 if (generator_active_list_[idx])
196 bool status = generator_list_[idx]->getNext(frags);
205 if (!status && generator_list_[idx]->
exception())
207 std::string reportString =
208 generator_list_[idx]->ReportCmd(
"latest_exception");
209 if (std::string::npos !=
210 boost::algorithm::to_lower_copy(reportString).find(
"exception"))
212 throw cet::exception(
"CompositeDriver_generator")
213 <<
"The FragmentGenerator for "
214 << generator_list_[idx]->metricsReportingInstanceName()
215 <<
" threw an exception: " << reportString;
218 throw cet::exception(
"CompositeDriver_generator")
219 <<
"The FragmentGenerator for "
220 << generator_list_[idx]->metricsReportingInstanceName()
221 <<
" threw an exception.";
223 generator_active_list_[idx] = status;
224 if (status) { anyGeneratorIsActive =
true; }
227 return anyGeneratorIsActive;
230 bool artdaq::CompositeDriver::makeChildGenerator_(fhicl::ParameterSet
const& pset)
233 auto daq_pset = pset.get<fhicl::ParameterSet>(
"daq", pset);
234 auto fr_pset = daq_pset.get<fhicl::ParameterSet>(
"fragment_receiver", daq_pset);
237 auto frag_gen_name = fr_pset.get<std::string>(
"generator",
"");
238 if (frag_gen_name.length() == 0)
241 <<
"No fragment generator (parameter name = \"generator\") was "
242 <<
"specified in the fragment_receiver ParameterSet. The "
243 <<
"DAQ initialization PSet was \"" << daq_pset.to_string() <<
"\".";
247 std::unique_ptr<artdaq::CommandableFragmentGenerator> tmp_gen_ptr;
252 catch (art::Exception& excpt)
255 <<
"Exception creating a FragmentGenerator of type \""
256 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
257 <<
"\", exception = " << excpt;
260 catch (cet::exception& excpt)
263 <<
"Exception creating a FragmentGenerator of type \""
264 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
265 <<
"\", exception = " << excpt;
271 <<
"Unknown exception creating a FragmentGenerator of type \""
272 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
277 std::unique_ptr<CommandableFragmentGenerator> generator_ptr;
278 generator_ptr.reset(
nullptr);
281 auto tmp_cmdablegen_bareptr = tmp_gen_ptr.release();
282 if (tmp_cmdablegen_bareptr !=
nullptr)
284 generator_ptr.reset(tmp_cmdablegen_bareptr);
292 <<
"Error: The requested fragment generator type (" << frag_gen_name
293 <<
") is not a CommandableFragmentGenerator, and only "
294 <<
"CommandableFragmentGenerators are currently supported.";
298 generator_list_.push_back(std::move(generator_ptr));
299 generator_active_list_.push_back(
true);
void start() override
Start all configured CommandableFragmentGenerators.
CommandableFragmentGenerator(const fhicl::ParameterSet &ps)
CommandableFragmentGenerator Constructor.
bool exception() const
Get the current value of the exception flag.
virtual ~CompositeDriver() noexcept
Destructor. Calls the destructors for each configured CommandableFragmentGenerator.
uint64_t timeout() const
Timeout of last command.
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.
uint64_t timestamp() const
Timestamp of last command.
void stopNoMutex() override
Call non-locked stop methods for all configured CommandableFragmentGenerators.
int run_number() const
Get the current Run number.