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"
11 using fhicl::ParameterSet;
14 : CommandableFragmentGenerator(ps)
17 ps.get<std::vector<ParameterSet>>(
"generator_config_list");
18 for (
const auto& pset : psetList)
20 if (!makeChildGenerator_(pset))
22 throw cet::exception(
"CompositeDriver")
23 <<
"Unable to create child generator for PSet= \""
24 << pset.to_string() <<
"\"";
28 std::string compositeMetricName;
29 for (
auto& generator : generator_list_)
31 if (compositeMetricName.length() > 0) { compositeMetricName.append(
", "); }
32 compositeMetricName.append(generator->metricsReportingInstanceName());
41 size_t listSize = generator_list_.size();
47 generator_list_.resize(listSize);
52 <<
"Unknown exception when destructing the generator at index "
60 for (
auto&& idx : generator_active_list_)
64 for (
auto& generator : generator_list_)
66 generator->StartCmd(run_number(), timeout(), timestamp());
72 std::vector<std::unique_ptr<CommandableFragmentGenerator>>::reverse_iterator riter;
73 for (riter = generator_list_.rbegin(); riter != generator_list_.rend(); ++riter)
75 (*riter)->StopCmd(timeout(), timestamp());
92 std::vector<std::unique_ptr<CommandableFragmentGenerator>>::reverse_iterator riter;
93 for (riter = generator_list_.rbegin(); riter != generator_list_.rend(); ++riter)
95 (*riter)->PauseCmd(timeout(), timestamp());
101 for (
auto&& idx : generator_active_list_)
105 for (
auto& generator : generator_list_)
107 generator->ResumeCmd(timeout(), timestamp());
111 std::vector<artdaq::Fragment::fragment_id_t> artdaq::CompositeDriver::fragmentIDs()
113 std::vector<artdaq::Fragment::fragment_id_t> workList;
114 for (
auto& idx : generator_list_)
116 std::vector<artdaq::Fragment::fragment_id_t> tempList =
118 workList.insert(workList.end(), tempList.begin(), tempList.end());
123 bool artdaq::CompositeDriver::getNext_(artdaq::FragmentPtrs& frags)
125 bool anyGeneratorIsActive =
false;
126 for (
size_t idx = 0; idx < generator_list_.size(); ++idx)
128 if (generator_active_list_[idx])
130 bool status = generator_list_[idx]->getNext(frags);
139 if (!status && generator_list_[idx]->exception())
141 std::string reportString =
142 generator_list_[idx]->ReportCmd(
"latest_exception");
143 if (std::string::npos !=
144 boost::algorithm::to_lower_copy(reportString).find(
"exception"))
146 throw cet::exception(
"CompositeDriver_generator")
147 <<
"The FragmentGenerator for "
148 << generator_list_[idx]->metricsReportingInstanceName()
149 <<
" threw an exception: " << reportString;
152 throw cet::exception(
"CompositeDriver_generator")
153 <<
"The FragmentGenerator for "
154 << generator_list_[idx]->metricsReportingInstanceName()
155 <<
" 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 auto daq_pset = pset.get<fhicl::ParameterSet>(
"daq", pset);
168 auto fr_pset = daq_pset.get<fhicl::ParameterSet>(
"fragment_receiver", daq_pset);
171 auto frag_gen_name = fr_pset.get<std::string>(
"generator",
"");
172 if (frag_gen_name.length() == 0)
175 <<
"No fragment generator (parameter name = \"generator\") was "
176 <<
"specified in the fragment_receiver ParameterSet. The "
177 <<
"DAQ initialization PSet was \"" << daq_pset.to_string() <<
"\".";
181 std::unique_ptr<artdaq::CommandableFragmentGenerator> tmp_gen_ptr;
186 catch (art::Exception& excpt)
189 <<
"Exception creating a FragmentGenerator of type \""
190 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
191 <<
"\", exception = " << excpt;
194 catch (cet::exception& excpt)
197 <<
"Exception creating a FragmentGenerator of type \""
198 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
199 <<
"\", exception = " << excpt;
205 <<
"Unknown exception creating a FragmentGenerator of type \""
206 << frag_gen_name <<
"\" with parameter set \"" << fr_pset.to_string()
211 std::unique_ptr<CommandableFragmentGenerator> generator_ptr;
212 generator_ptr.reset(
nullptr);
215 auto tmp_cmdablegen_bareptr = tmp_gen_ptr.release();
216 if (tmp_cmdablegen_bareptr !=
nullptr)
218 generator_ptr.reset(tmp_cmdablegen_bareptr);
226 <<
"Error: The requested fragment generator type (" << frag_gen_name
227 <<
") is not a CommandableFragmentGenerator, and only "
228 <<
"CommandableFragmentGenerators are currently supported.";
232 generator_list_.push_back(std::move(generator_ptr));
233 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...
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.