Skip to content

Commit 3e68711

Browse files
committed
Request slice infos for grouped process arguments
For grouping process functions add the slice-info input for each argument related to the grouping table by an index with the control option of the process function and follow the origin replacement of the sliced table.
1 parent e01d97d commit 3e68711

2 files changed

Lines changed: 68 additions & 18 deletions

File tree

‎Framework/Core/include/Framework/AnalysisTask.h‎

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,38 @@ struct AnalysisDataProcessorBuilder {
137137
}.template operator()<A::originals.size(), std::decay_t<A>::originals>(std::make_index_sequence<std::decay_t<A>::originals.size()>());
138138
}
139139

140+
/// helpers to append InputSpect for a single argument with grouping
141+
template <soa::is_iterator G, soa::is_table A>
142+
requires(soa::relatedByIndex<std::decay_t<G>, std::decay_t<A>>())
143+
static void addSlicingInput(const char* name, bool value, std::vector<InputSpec>& inputs, header::DataOrigin&& newOrigin = header::DataOrigin{"AOD"})
144+
{
145+
auto key = std::string{"fIndex"} + o2::framework::cutString(soa::getLabelFromType<std::decay_t<G>>());
146+
Entry entry{soa::getLabelFromTypeForKey<std::decay_t<A>>(key), soa::getMatcherFromTypeForKey<std::decay_t<A>>(key), key, value};
147+
// replace the origin of the sliced table first, so that both the slicer source and the slice info carry the new origin
148+
bool originReplaced = (entry.matcher.origin == header::DataOrigin{"AOD"}) && (newOrigin != header::DataOrigin{"AOD"});
149+
if (originReplaced) {
150+
entry.matcher = replaceOrigin(entry.matcher, newOrigin);
151+
}
152+
auto spec = inputForEntry(entry, !o2::soa::is_smallgroups<std::decay_t<A>>);
153+
spec.metadata.emplace_back(ConfigParamSpec{std::string{"control:"} + name, VariantType::Bool, value, {"\"\""}});
154+
if (originReplaced) {
155+
spec.metadata.emplace_back(ConfigParamSpec{"aod-origin-replaced", VariantType::Bool, true, {"\"\""}});
156+
}
157+
158+
DataSpecUtils::updateInputList(inputs, std::move(spec));
159+
}
160+
161+
template <soa::is_iterator G, soa::is_table A>
162+
requires(!soa::relatedByIndex<std::decay_t<G>, std::decay_t<A>>())
163+
static void addSlicingInput(const char*, bool, std::vector<InputSpec>&, header::DataOrigin&&)
164+
{
165+
}
166+
167+
template <soa::is_table G, soa::is_table A>
168+
static void addSlicingInput(const char*, bool, std::vector<InputSpec>&, header::DataOrigin&&)
169+
{
170+
}
171+
140172
/// helper to append the inputs and expression information for normalized arguments
141173
template <soa::is_table... As>
142174
static void addInputsAndExpressions(uint32_t hash, const char* name, bool value, std::vector<InputSpec>& inputs, std::vector<ExpressionInfo>& eInfos, std::vector<InputInfo>& iInfos, header::DataOrigin&& newOrigin = header::DataOrigin{"AOD"})
@@ -151,6 +183,17 @@ struct AnalysisDataProcessorBuilder {
151183
...);
152184
}
153185

186+
/// helper to append the slicing inputs
187+
template <soa::is_iterator G, soa::is_table... As>
188+
static void addSlicingInputs(const char* name, bool value, std::vector<InputSpec>& inputs, header::DataOrigin&& newOrigin = header::DataOrigin{"AOD"})
189+
{
190+
([&name,&value,&inputs,newOrigin]() mutable {
191+
using T = std::decay_t<As>;
192+
addSlicingInput<G, T>(name, value, inputs, std::move(newOrigin));
193+
}(),
194+
...);
195+
}
196+
154197
/// helper to parse the process arguments
155198
template <typename T>
156199
inline static bool requestInputsFromArgs(T&, std::string const&, std::vector<InputSpec>&, std::vector<ExpressionInfo>&, std::vector<InputInfo>&, header::DataOrigin)
@@ -189,7 +232,11 @@ struct AnalysisDataProcessorBuilder {
189232
requires(std::is_lvalue_reference_v<A> && (std::is_lvalue_reference_v<Args> && ...))
190233
{
191234
constexpr auto hash = o2::framework::TypeIdHelpers::uniqueId<void (C::*)(A, Args...)>();
192-
addInputsAndExpressions<typename std::decay_t<A>::parent_t, Args...>(hash, name, value, inputs, eInfos, iInfos, std::move(newOrigin));
235+
// here we also add slicing inputs with the same constrol config param spec as normal inputs, so it can be removed in adjust topology
236+
// step if the process function is disabled
237+
auto newOriginCopy = newOrigin;
238+
addSlicingInputs<A, Args...>(name, value, inputs, std::move(newOrigin));
239+
addInputsAndExpressions<typename std::decay_t<A>::parent_t, Args...>(hash, name, value, inputs, eInfos, iInfos, std::move(newOriginCopy));
193240
}
194241

195242
/// 3. generic case

‎Framework/Core/test/test_AnalysisTask.cxx‎

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -218,23 +218,26 @@ TEST_CASE("AdaptorCompilation")
218218
REQUIRE(task1ngc.inputs[4].binding == "B3s");
219219

220220
auto task2 = adaptAnalysisTask<BTask>(*cfgc, TaskName{"test2"});
221-
REQUIRE(task2.inputs.size() == 10);
222-
REQUIRE(task2.inputs[2].binding == "TracksExtension");
223-
REQUIRE(task2.inputs[1].binding == "Tracks");
224-
REQUIRE(task2.inputs[4].binding == "TracksExtra_002Extension");
225-
REQUIRE(task2.inputs[3].binding == "TracksExtra");
226-
REQUIRE(task2.inputs[6].binding == "TracksCovExtension");
227-
REQUIRE(task2.inputs[5].binding == "TracksCov");
228-
REQUIRE(task2.inputs[7].binding == "AmbiguousTracks");
229-
REQUIRE(task2.inputs[8].binding == "Calos");
230-
REQUIRE(task2.inputs[9].binding == "CaloTriggers");
231-
REQUIRE(task2.inputs[0].binding == "Collisions_001");
221+
REQUIRE(task2.inputs.size() == 11); // 10 base + 1 slice
222+
REQUIRE(task2.inputs[0].binding == "Tracks_Slice");
223+
REQUIRE(task2.inputs[1].binding == "Collisions_001");
224+
REQUIRE(task2.inputs[2].binding == "Tracks");
225+
REQUIRE(task2.inputs[3].binding == "TracksExtension");
226+
REQUIRE(task2.inputs[4].binding == "TracksExtra");
227+
REQUIRE(task2.inputs[5].binding == "TracksExtra_002Extension");
228+
REQUIRE(task2.inputs[6].binding == "TracksCov");
229+
REQUIRE(task2.inputs[7].binding == "TracksCovExtension");
230+
REQUIRE(task2.inputs[8].binding == "AmbiguousTracks");
231+
REQUIRE(task2.inputs[9].binding == "Calos");
232+
REQUIRE(task2.inputs[10].binding == "CaloTriggers");
233+
232234

233235
auto task3 = adaptAnalysisTask<CTask>(*cfgc, TaskName{"test3"});
234-
REQUIRE(task3.inputs.size() == 3);
235-
REQUIRE(task3.inputs[0].binding == "Collisions_001");
236-
REQUIRE(task3.inputs[1].binding == "Tracks");
237-
REQUIRE(task3.inputs[2].binding == "TracksExtension");
236+
REQUIRE(task3.inputs.size() == 4); // 3 base + 1 slice
237+
REQUIRE(task3.inputs[0].binding == "Tracks_Slice");
238+
REQUIRE(task3.inputs[1].binding == "Collisions_001");
239+
REQUIRE(task3.inputs[2].binding == "Tracks");
240+
REQUIRE(task3.inputs[3].binding == "TracksExtension");
238241

239242
auto task4 = adaptAnalysisTask<DTask>(*cfgc, TaskName{"test4"});
240243
REQUIRE(task4.inputs.size() == 2);
@@ -269,10 +272,10 @@ TEST_CASE("AdaptorCompilation")
269272
REQUIRE(task11.inputs.size() == 1);
270273

271274
auto task12 = adaptAnalysisTask<LTask>(*cfgc, TaskName{"test12"});
272-
REQUIRE(task12.inputs.size() == 3);
275+
REQUIRE(task12.inputs.size() == 4); // 3 base + 1 actual slice
273276

274277
auto task13 = adaptAnalysisTask<MTask>(*cfgc, TaskName{"test13"});
275-
REQUIRE(task13.inputs.size() == 3);
278+
REQUIRE(task13.inputs.size() == 4); // 3 base + 1 actual slice
276279
}
277280

278281
TEST_CASE("TestPartitionIteration")

0 commit comments

Comments
 (0)