Skip to content

Commit c6b9dd9

Browse files
committed
Reestablish compatibility with EICrecon's JOmniFactory
1 parent 802891f commit c6b9dd9

File tree

3 files changed

+87
-7
lines changed

3 files changed

+87
-7
lines changed

src/libraries/JANA/Components/JHasInputs.h

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@ struct JHasInputs {
2020

2121
std::vector<InputBase*> m_inputs;
2222
std::vector<VariadicInputBase*> m_variadic_inputs;
23+
std::vector<std::pair<InputBase*, VariadicInputBase*>> m_ordered_inputs;
2324

2425
void RegisterInput(InputBase* input) {
2526
m_inputs.push_back(input);
27+
m_ordered_inputs.push_back({input, nullptr});
2628
}
2729

2830
void RegisterInput(VariadicInputBase* input) {
2931
m_variadic_inputs.push_back(input);
32+
m_ordered_inputs.push_back({nullptr, input});
3033
}
3134

3235
struct InputOptions {
@@ -465,6 +468,11 @@ struct JHasInputs {
465468
const std::vector<JEventLevel>& variadic_input_levels,
466469
const std::vector<std::vector<std::string>>& variadic_input_databundle_names) {
467470

471+
if (m_variadic_inputs.size() == 1 && variadic_input_databundle_names.size() == 0) {
472+
WireInputsCompatibility(component_level, single_input_levels, single_input_databundle_names);
473+
return;
474+
}
475+
468476
// Validate that we have the correct number of input databundle names
469477
if (single_input_databundle_names.size() != m_inputs.size()) {
470478
throw JException("Wrong number of (nonvariadic) input databundle names! Expected %d, found %d", m_inputs.size(), single_input_databundle_names.size());
@@ -499,6 +507,45 @@ struct JHasInputs {
499507
}
500508
}
501509

510+
void WireInputsCompatibility(JEventLevel component_level,
511+
const std::vector<JEventLevel>& single_input_levels,
512+
const std::vector<std::string>& single_input_databundle_names) {
513+
514+
// Figure out how many collection names belong to the variadic input
515+
int variadic_databundle_count = single_input_databundle_names.size() - m_inputs.size();
516+
int databundle_name_index = 0;
517+
int databundle_level_index = 0;
518+
519+
for (auto& [single_input, variadic_input] : m_ordered_inputs) {
520+
if (single_input != nullptr) {
521+
single_input->SetDatabundleName(single_input_databundle_names.at(databundle_name_index));
522+
if (single_input_levels.empty()) {
523+
single_input->SetLevel(component_level);
524+
}
525+
else {
526+
single_input->SetLevel(single_input_levels.at(databundle_level_index));
527+
}
528+
databundle_name_index += 1;
529+
databundle_level_index += 1;
530+
}
531+
else {
532+
std::vector<std::string> variadic_databundle_names;
533+
for (int i=0; i<variadic_databundle_count; ++i) {
534+
variadic_databundle_names.push_back(single_input_databundle_names.at(databundle_name_index+i));
535+
}
536+
variadic_input->SetRequestedDatabundleNames(variadic_databundle_names);
537+
if (single_input_levels.empty()) {
538+
variadic_input->SetLevel(component_level);
539+
}
540+
else {
541+
variadic_input->SetLevel(single_input_levels.at(databundle_level_index)); // Last one wins!
542+
}
543+
databundle_name_index += variadic_databundle_count;
544+
databundle_level_index += 1;
545+
}
546+
}
547+
}
548+
502549
void SummarizeInputs(JComponentSummary::Component& summary) const {
503550
for (const auto* input : m_inputs) {
504551
summary.AddInput(new JComponentSummary::Collection("", input->GetDatabundleName(), input->GetTypeName(), input->GetLevel()));

src/libraries/JANA/Components/JHasOutputs.h

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct JHasOutputs {
6161
protected:
6262

6363
void CreateHelperFactory(JMultifactory& fac) override {
64-
fac.DeclareOutput<T>(this->collection_names[0]);
64+
fac.DeclareOutput<T>(this->collection_names[0], !is_not_owner);
6565
}
6666

6767
void SetCollection(JMultifactory& fac) override {
@@ -188,14 +188,45 @@ struct JHasOutputs {
188188
size_t single_output_index = 0;
189189
size_t variadic_output_index = 0;
190190

191+
size_t variadic_output_count = 0;
191192
for (auto* output : m_outputs) {
192-
output->collection_names.clear();
193-
output->level = component_level;
194193
if (output->is_variadic) {
195-
output->collection_names = variadic_output_databundle_names.at(variadic_output_index++);
194+
variadic_output_count += 1;
196195
}
197-
else {
198-
output->collection_names.push_back(single_output_databundle_names.at(single_output_index++));
196+
}
197+
if (variadic_output_count == 1 && variadic_output_databundle_names.size() == 0) {
198+
// Obtain variadic databundle names from excess single-output databundle names
199+
int variadic_databundle_count = single_output_databundle_names.size() - m_outputs.size() + 1;
200+
int current_databundle_index = 0;
201+
202+
for (auto* output : m_outputs) {
203+
output->collection_names.clear();
204+
output->level = component_level;
205+
if (output->is_variadic) {
206+
std::vector<std::string> variadic_names;
207+
for (int i=0; i<variadic_databundle_count; ++i) {
208+
variadic_names.push_back(single_output_databundle_names.at(current_databundle_index+i));
209+
}
210+
output->collection_names = variadic_names;
211+
current_databundle_index += variadic_databundle_count;
212+
}
213+
else {
214+
output->collection_names.push_back(single_output_databundle_names.at(current_databundle_index));
215+
current_databundle_index += 1;
216+
}
217+
}
218+
}
219+
else {
220+
// Do the obvious, sensible thing instead
221+
for (auto* output : m_outputs) {
222+
output->collection_names.clear();
223+
output->level = component_level;
224+
if (output->is_variadic) {
225+
output->collection_names = variadic_output_databundle_names.at(variadic_output_index++);
226+
}
227+
else {
228+
output->collection_names.push_back(single_output_databundle_names.at(single_output_index++));
229+
}
199230
}
200231
}
201232
}

src/programs/unit_tests/Components/JOmniFactoryTests.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@ struct MyFac : public JOmniFactory<MyFac> {
3838
}
3939

4040
podio_hits_out()->setSubsetCollection();
41+
variadic_podio_hits_out().at(0)->setSubsetCollection();
42+
4143
for (auto hit : *podio_hits_in) {
4244
podio_hits_out()->push_back(hit);
4345
variadic_podio_hits_out().at(0)->push_back(hit);
4446
}
4547

46-
variadic_podio_hits_out().at(1)->push_back(ExampleHit(22, 1.1, 1.1, 1.1, 10, 0));
48+
variadic_podio_hits_out().at(1)->push_back(MutableExampleHit(22, 1.1, 1.1, 1.1, 10, 0));
4749
}
4850
};
4951

0 commit comments

Comments
 (0)