1 #define TRACE_NAME "CompositeDriver"
3 #include "artdaq/Generators/CompositeDriver.hh"
5 #include <boost/algorithm/string.hpp>
6 #include "artdaq/Generators/GeneratorMacros.hh"
7 #include "artdaq/Generators/makeCommandableFragmentGenerator.hh"
8 #include "canvas/Utilities/Exception.h"
9 #include "cetlib_except/exception.h"
15 ps.get<std::vector<fhicl::ParameterSet>>(
"generator_config_list");
16 for (
const 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);
50 <<
"Unknown exception when destructing the generator at index "
58 for (
auto&& idx : generator_active_list_)
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 (
auto&& idx : generator_active_list_)
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 (
auto& idx : generator_list_)
114 std::vector<artdaq::Fragment::fragment_id_t> tempList =
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;
150 throw cet::exception(
"CompositeDriver_generator")
151 <<
"The FragmentGenerator for "
152 << generator_list_[idx]->metricsReportingInstanceName()
153 <<
" threw an exception.";
155 generator_active_list_[idx] = status;
156 if (status) { anyGeneratorIsActive =
true; }
159 return anyGeneratorIsActive;
162 bool artdaq::CompositeDriver::makeChildGenerator_(fhicl::ParameterSet
const& pset)
165 auto daq_pset = pset.get<fhicl::ParameterSet>(
"daq", pset);
166 auto fr_pset = daq_pset.get<fhicl::ParameterSet>(
"fragment_receiver", daq_pset);
169 auto frag_gen_name = fr_pset.get<std::string>(
"generator",
"");
170 if (frag_gen_name.length() == 0)
173 <<
"No fragment generator (parameter name = \"generator\") was "
174 <<
"specified in the fragment_receiver ParameterSet. The "
175 <<
"DAQ initialization PSet was \"" << daq_pset.to_string() <<
"\".";
179 std::unique_ptr<artdaq::CommandableFragmentGenerator> tmp_gen_ptr;
184 catch (art::Exception& excpt)
187 <<
"Exception creating a FragmentGenerator of type \""
188 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
189 <<
"\", exception = " << excpt;
192 catch (cet::exception& excpt)
195 <<
"Exception creating a FragmentGenerator of type \""
196 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
197 <<
"\", exception = " << excpt;
203 <<
"Unknown exception creating a FragmentGenerator of type \""
204 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
209 std::unique_ptr<CommandableFragmentGenerator> generator_ptr;
210 generator_ptr.reset(
nullptr);
213 auto tmp_cmdablegen_bareptr = tmp_gen_ptr.release();
214 if (tmp_cmdablegen_bareptr !=
nullptr)
216 generator_ptr.reset(tmp_cmdablegen_bareptr);
224 <<
"Error: The requested fragment generator type (" << frag_gen_name
225 <<
") is not a CommandableFragmentGenerator, and only "
226 <<
"CommandableFragmentGenerators are currently supported.";
230 generator_list_.push_back(std::move(generator_ptr));
231 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.