13#include <JANA/JEvent.h>
14#include <JANA/JMultifactory.h>
15#include <spdlog/spdlog.h>
16#include <spdlog/version.h>
17#if SPDLOG_VERSION >= 11400 && (!defined(SPDLOG_NO_TLS) || !SPDLOG_NO_TLS)
18#include <spdlog/mdc.h>
29template <
typename AlgoT,
typename ConfigT = EmptyConfig>
44 template <
typename T,
bool IsOptional = false>
class Input :
public InputBase {
46 std::vector<const T*> m_data;
50 owner->RegisterInput(
this);
52 this->
type_name = JTypeInfo::demangle<T>();
55 const std::vector<const T*>&
operator()() {
return m_data; }
60 void GetCollection(
const JEvent& event) {
65 throw JException(
"JOmniFactory: Failed to get collection %s: %s",
78 owner->RegisterInput(
this);
80 this->
type_name = JTypeInfo::demangle<PodioT>();
88 void GetCollection(
const JEvent& event) {
93 throw JException(
"JOmniFactory: Failed to get collection %s: %s",
102 std::vector<const typename PodioTypeMap<PodioT>::collection_t*> m_data;
106 owner->RegisterInput(
this);
108 this->
type_name = JTypeInfo::demangle<PodioT>();
112 const std::vector<const typename PodioTypeMap<PodioT>::collection_t*>
operator()() {
119 void GetCollection(
const JEvent& event) {
151 std::vector<T*> m_data;
155 owner->RegisterOutput(
this);
157 this->
type_name = JTypeInfo::demangle<T>();
173 void Reset()
override { m_data.clear(); }
178 std::unique_ptr<typename PodioTypeMap<PodioT>::collection_t> m_data;
182 owner->RegisterOutput(
this);
184 this->
type_name = JTypeInfo::demangle<PodioT>();
187 std::unique_ptr<typename PodioTypeMap<PodioT>::collection_t>&
operator()() {
return m_data; }
197 if (m_data ==
nullptr) {
198 throw JException(
"JOmniFactory: SetCollection failed due to missing output collection '%s'",
202 fac.SetCollection<PodioT>(this->
collection_names[0], std::move(this->m_data));
205 void Reset()
override {
212 std::vector<std::unique_ptr<typename PodioTypeMap<PodioT>::collection_t>> m_data;
217 owner->RegisterOutput(
this);
219 this->
type_name = JTypeInfo::demangle<PodioT>();
223 std::vector<std::unique_ptr<typename PodioTypeMap<PodioT>::collection_t>>&
operator()() {
237 if (m_data.size() != this->collection_names.size()) {
238 throw JException(
"JOmniFactory: VariadicPodioOutput SetCollection failed: Declared %d "
239 "collections, but provided %d.",
245 fac.SetCollection<PodioT>(coll_name, std::move(this->m_data[i++]));
249 void Reset()
override {
267 virtual void Configure(std::map<std::string, std::string> fields) = 0;
276 owner->RegisterParameter(
this);
290 void Configure(std::map<std::string, std::string> fields)
override {
291 auto it = fields.find(this->
m_name);
292 if (
it != fields.end()) {
294 JParameterManager::Parse(
value_str, *m_data);
305 owner->RegisterParameter(
this);
319 void Configure(std::map<std::string, std::string> fields)
override {
320 auto it = fields.find(this->
m_name);
321 if (
it != fields.end()) {
323 if constexpr (10000 * JVersion::major + 100 * JVersion::minor + 1 * JVersion::patch <
325 m_data = JParameterManager::Parse<T>(
value_str);
327 JParameterManager::Parse(value_str, m_data);
351 std::shared_ptr<ServiceT> m_data;
374 template <
typename ServiceT,
typename ResourceT,
typename LambdaT>
381 owner->RegisterResource(
this);
389 void ChangeRun(
const JEvent& event) {
390 auto run_nr =
event.GetRunNumber();
410 std::string m_plugin_name;
413 std::string m_prefix;
416 std::shared_ptr<spdlog::logger> m_logger;
433 "JOmniFactory '%s': Wrong number of %s collection names: %d expected, %d found.",
440 throw JException(
"JOmniFactory '%s': Not enough %s collection names: %d needed, %d found.",
441 m_prefix.c_str(), (
is_input ?
"input" :
"output"),
447 throw JException(
"JOmniFactory '%s': Wrong number of %s collection names: %d found total, "
448 "but %d can't be distributed among %d variadic inputs evenly.",
464 "Input collection names");
466 "Output collection names");
511 output->CreateHelperFactory(*
this);
521 parameter->Configure(*(
app->GetJParameterManager()), m_prefix);
526 static_cast<AlgoT*
>(
this)->Configure();
529 void BeginRun(
const std::shared_ptr<const JEvent>& event)
override {
533 static_cast<AlgoT*
>(
this)->
ChangeRun(event->GetRunNumber());
540 void Process(
const std::shared_ptr<const JEvent>& event)
override {
543 input->GetCollection(*event);
548#if SPDLOG_VERSION >= 11400 && (!defined(SPDLOG_NO_TLS) || !SPDLOG_NO_TLS)
549 spdlog::mdc::put(
"e", std::to_string(event->GetEventNumber()));
551 static_cast<AlgoT*
>(
this)->
Process(event->GetRunNumber(),
event->GetEventNumber());
553 output->SetCollection(*
this);
555 }
catch (std::exception&
e) {
573 std::shared_ptr<spdlog::logger>&
logger() {
return m_logger; }
Definition JOmniFactory.h:150
std::vector< T * > & operator()()
Definition JOmniFactory.h:160
Output(JOmniFactory *owner, std::string default_tag_name="")
Definition JOmniFactory.h:154
Definition JOmniFactory.h:270
const T & operator()()
Definition JOmniFactory.h:282
ParameterRef(JOmniFactory *owner, std::string name, T &slot, std::string description="")
Definition JOmniFactory.h:275
Definition JOmniFactory.h:299
const T & operator()()
Definition JOmniFactory.h:311
Parameter(JOmniFactory *owner, std::string name, T default_value, std::string description)
Definition JOmniFactory.h:304
Definition JOmniFactory.h:176
PodioOutput(JOmniFactory *owner, std::string default_collection_name="")
Definition JOmniFactory.h:181
std::unique_ptr< typename PodioTypeMap< PodioT >::collection_t > & operator()()
Definition JOmniFactory.h:187
Definition JOmniFactory.h:375
Resource(JOmniFactory *owner, LambdaT lambda)
Definition JOmniFactory.h:380
const ResourceT & operator()()
Definition JOmniFactory.h:384
Definition JOmniFactory.h:349
ServiceT & operator()()
Definition JOmniFactory.h:356
Service(JOmniFactory *owner)
Definition JOmniFactory.h:354
Definition JOmniFactory.h:210
std::vector< std::unique_ptr< typename PodioTypeMap< PodioT >::collection_t > > & operator()()
Definition JOmniFactory.h:223
VariadicPodioOutput(JOmniFactory *owner, std::vector< std::string > default_collection_names={})
Definition JOmniFactory.h:215
Definition JOmniFactory.h:30
std::vector< ParameterBase * > m_parameters
Definition JOmniFactory.h:401
void RegisterInput(InputBase *input)
Definition JOmniFactory.h:134
std::string GetPluginName()
Definition JOmniFactory.h:568
JApplication * GetApplication()
Definition JOmniFactory.h:564
void RegisterResource(ResourceBase *resource)
Definition JOmniFactory.h:396
ConfigT & config()
Retrieve reference to embedded config object.
Definition JOmniFactory.h:576
void ConfigureAllParameters(std::map< std::string, std::string > fields)
Definition JOmniFactory.h:335
std::vector< ResourceBase * > m_resources
Definition JOmniFactory.h:403
std::shared_ptr< spdlog::logger > & logger()
Retrieve reference to already-configured logger.
Definition JOmniFactory.h:573
std::vector< InputBase * > m_inputs
Definition JOmniFactory.h:399
void SetApplication(JApplication *app)
Definition JOmniFactory.h:562
virtual void ChangeRun(int32_t) override
Definition JOmniFactory.h:536
void SetPluginName(std::string plugin_name)
Definition JOmniFactory.h:566
void Init() override
Definition JOmniFactory.h:518
void RegisterOutput(OutputBase *output)
Definition JOmniFactory.h:257
std::string GetPrefix()
Definition JOmniFactory.h:570
std::vector< OutputBase * > m_outputs
Definition JOmniFactory.h:400
std::vector< ServiceBase * > m_services
Definition JOmniFactory.h:402
void RegisterParameter(ParameterBase *parameter)
Definition JOmniFactory.h:333
void PreInit(std::string tag, std::vector< std::string > default_input_collection_names, std::vector< std::string > default_output_collection_names)
Definition JOmniFactory.h:456
void RegisterService(ServiceBase *service)
Definition JOmniFactory.h:364
virtual void Process(int32_t, uint64_t)
Definition JOmniFactory.h:538
void Process(const std::shared_ptr< const JEvent > &event) override
Definition JOmniFactory.h:540
void BeginRun(const std::shared_ptr< const JEvent > &event) override
Definition JOmniFactory.h:529
std::size_t FindVariadicCollectionCount(std::size_t total_input_count, std::size_t variadic_input_count, std::size_t total_collection_count, bool is_input)
Definition JOmniFactory.h:422
Definition Log_service.h:15
Definition JOmniFactory.h:27
Definition JOmniFactory.h:140
virtual void SetCollection(JOmniFactory &fac)=0
std::string type_name
Definition JOmniFactory.h:141
virtual void CreateHelperFactory(JOmniFactory &fac)=0
bool is_variadic
Definition JOmniFactory.h:143
std::vector< std::string > collection_names
Definition JOmniFactory.h:142
Definition JOmniFactory.h:263
std::string m_description
Definition JOmniFactory.h:265
std::string m_name
Definition JOmniFactory.h:264
virtual void Configure(JParameterManager &parman, const std::string &prefix)=0
virtual void Configure(std::map< std::string, std::string > fields)=0
Definition JOmniFactory.h:370
virtual void ChangeRun(const JEvent &event)=0
Definition JOmniFactory.h:345
virtual void Init(JApplication *app)=0
typename T::collection_type collection_t
Definition datamodel_glue.h:24