File indexing completed on 2025-12-16 10:36:43
0001
0002
0003
0004
0005 #pragma once
0006
0007 #include <JANA/JFactorySet.h>
0008 #include <JANA/JFactoryGenerator.h>
0009 #include <vector>
0010
0011 namespace jana::components {
0012
0013 template<class FactoryT>
0014 class JOmniFactoryGeneratorT : public JFactoryGenerator {
0015 public:
0016 using FactoryConfigType = typename FactoryT::ConfigType;
0017
0018 struct TypedWiring {
0019 std::string tag = "";
0020 JEventLevel level = JEventLevel::PhysicsEvent;
0021 std::vector<std::string> input_names = {};
0022 std::vector<JEventLevel> input_levels = {};
0023 std::vector<std::vector<std::string>> variadic_input_names = {};
0024 std::vector<JEventLevel> variadic_input_levels = {};
0025 std::vector<std::string> output_names = {};
0026 std::vector<std::vector<std::string>> variadic_output_names = {};
0027 FactoryConfigType configs = {};
0028 };
0029
0030 public:
0031
0032 explicit JOmniFactoryGeneratorT() = default;
0033
0034 explicit JOmniFactoryGeneratorT(std::string tag,
0035 std::vector<std::string> input_names,
0036 std::vector<std::string> output_names,
0037 FactoryConfigType configs) {
0038 m_typed_wirings.push_back({.tag=tag,
0039 .input_names=input_names,
0040 .output_names=output_names,
0041 .configs=configs
0042 });
0043 };
0044
0045 explicit JOmniFactoryGeneratorT(std::string tag,
0046 std::vector<std::string> input_names,
0047 std::vector<std::string> output_names) {
0048 m_typed_wirings.push_back({.tag=tag,
0049 .input_names=input_names,
0050 .output_names=output_names
0051 });
0052
0053 }
0054
0055 explicit JOmniFactoryGeneratorT(TypedWiring&& wiring) {
0056 m_typed_wirings.push_back(std::move(wiring));
0057 }
0058
0059
0060 void AddWiring(std::string tag,
0061 std::vector<std::string> input_names,
0062 std::vector<std::string> output_names,
0063 FactoryConfigType configs={}) {
0064
0065 m_typed_wirings.push_back({.tag=tag,
0066 .input_names=input_names,
0067 .output_names=output_names,
0068 .configs=configs
0069 });
0070 }
0071
0072
0073 void AddWiring(TypedWiring wiring) {
0074 m_typed_wirings.push_back(wiring);
0075 }
0076
0077 void GenerateFactories(JFactorySet *factory_set) override {
0078
0079 if (m_typed_wirings.size() == 0) {
0080 FactoryT *factory = new FactoryT;
0081 factory->SetPluginName(this->GetPluginName());
0082 factory->SetTypeName(JTypeInfo::demangle<FactoryT>());
0083 factory->Wire(GetApplication());
0084 factory_set->Add(factory);
0085 }
0086
0087 for (auto& wiring : m_typed_wirings) {
0088
0089 auto prefix = (GetPluginName().empty()) ? wiring.tag : this->GetPluginName() + ":" + wiring.tag;
0090 GetApplication()->SetDefaultParameter(prefix + ":InputTags", wiring.input_names, "Input collection names");
0091 GetApplication()->SetDefaultParameter(prefix + ":OutputTags", wiring.output_names, "Output collection names");
0092
0093 FactoryT *factory = new FactoryT;
0094 factory->SetPluginName(this->GetPluginName());
0095 factory->SetTypeName(JTypeInfo::demangle<FactoryT>());
0096 factory->SetPrefix(prefix);
0097
0098
0099 factory->SetLevel(wiring.level);
0100 factory->WireInputs(wiring.level, wiring.input_levels, wiring.input_names, wiring.variadic_input_levels, wiring.variadic_input_names);
0101 factory->WireOutputs(wiring.level, wiring.output_names, wiring.variadic_output_names, false);
0102 factory->config() = wiring.configs;
0103
0104
0105 factory->Wire(GetApplication());
0106
0107
0108 factory_set->Add(factory);
0109 }
0110 }
0111
0112 private:
0113 std::vector<TypedWiring> m_typed_wirings;
0114 };
0115
0116 }
0117 using jana::components::JOmniFactoryGeneratorT;