From 587d1c9f3f6640233f695f6bb6e09e3db41d2f37 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 19 Dec 2025 12:54:32 +0100 Subject: [PATCH 1/2] DPL Analysis: use label+origin as an input binding for tables --- Framework/Core/include/Framework/ASoA.h | 6 ++++++ Framework/Core/include/Framework/AnalysisHelpers.h | 8 ++++---- Framework/Core/include/Framework/AnalysisManagers.h | 2 +- Framework/Core/include/Framework/AnalysisTask.h | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 43079a4634e97..25be7b4565b9f 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -375,6 +375,12 @@ consteval const char* signature() return o2::aod::Hash::str; } +template +constexpr std::string binding() +{ + return std::string{label()} + "/" + origin_str(); +} + /// hash identification concepts template concept is_aod_hash = requires(T t) { t.hash; t.str; }; diff --git a/Framework/Core/include/Framework/AnalysisHelpers.h b/Framework/Core/include/Framework/AnalysisHelpers.h index 3666fe1299489..9a4e4a2a9c9b6 100644 --- a/Framework/Core/include/Framework/AnalysisHelpers.h +++ b/Framework/Core/include/Framework/AnalysisHelpers.h @@ -185,7 +185,7 @@ template constexpr auto tableRef2Schema() { return o2::framework::ConfigParamSpec{ - std::string{"input-schema:"} + o2::aod::label(), + std::string{"input-schema:"} + o2::aod::binding(), framework::VariantType::String, framework::serializeSchema(o2::aod::MetadataTrait>::metadata::getSchema()), {"\"\""}}; @@ -258,9 +258,9 @@ inline constexpr auto getIndexMapping() ([&idx]() mutable { constexpr auto pos = o2::aod::MetadataTrait>::metadata::template getIndexPosToKey(); if constexpr (pos == -1) { - idx.emplace_back(o2::aod::label(), C::columnLabel(), IndexKind::IdxSelf, pos); + idx.emplace_back(o2::aod::binding(), C::columnLabel(), IndexKind::IdxSelf, pos); } else { - idx.emplace_back(o2::aod::label(), C::columnLabel(), getIndexKind(), pos); + idx.emplace_back(o2::aod::binding(), C::columnLabel(), getIndexKind(), pos); } }.template operator()>(), ...); @@ -368,7 +368,7 @@ constexpr auto tableRef2InputSpec() } return framework::InputSpec{ - o2::aod::label(), + o2::aod::binding(), o2::aod::origin(), o2::aod::description(o2::aod::signature()), R.version, diff --git a/Framework/Core/include/Framework/AnalysisManagers.h b/Framework/Core/include/Framework/AnalysisManagers.h index fbb499940b9b9..fc9fdc747b87f 100644 --- a/Framework/Core/include/Framework/AnalysisManagers.h +++ b/Framework/Core/include/Framework/AnalysisManagers.h @@ -38,7 +38,7 @@ template refs> static inline auto extractOriginals(ProcessingContext& pc) { return [&](std::index_sequence) -> std::vector> { - return {pc.inputs().get(o2::aod::label())->asArrowTable()...}; + return {pc.inputs().get(o2::aod::binding())->asArrowTable()...}; }(std::make_index_sequence()); } } // namespace diff --git a/Framework/Core/include/Framework/AnalysisTask.h b/Framework/Core/include/Framework/AnalysisTask.h index 53f6bc0f862d6..f573cdc280b6a 100644 --- a/Framework/Core/include/Framework/AnalysisTask.h +++ b/Framework/Core/include/Framework/AnalysisTask.h @@ -214,7 +214,7 @@ struct AnalysisDataProcessorBuilder { template static auto extractTableFromRecord(InputRecord& record) { - auto table = record.get(o2::aod::label())->asArrowTable(); + auto table = record.get(o2::aod::binding())->asArrowTable(); if (table->num_rows() == 0) { table = makeEmptyTable(); } From 718f38efcfea46355f3dd6c03dca851508633895 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 19 Dec 2025 13:02:17 +0100 Subject: [PATCH 2/2] fixup! DPL Analysis: use label+origin as an input binding for tables --- .../Core/include/Framework/AnalysisHelpers.h | 8 +-- Framework/Core/test/test_AnalysisTask.cxx | 58 +++++++++---------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Framework/Core/include/Framework/AnalysisHelpers.h b/Framework/Core/include/Framework/AnalysisHelpers.h index 9a4e4a2a9c9b6..8d586da4646ad 100644 --- a/Framework/Core/include/Framework/AnalysisHelpers.h +++ b/Framework/Core/include/Framework/AnalysisHelpers.h @@ -380,7 +380,7 @@ template constexpr auto tableRef2OutputSpec() { return framework::OutputSpec{ - framework::OutputLabel{o2::aod::label()}, + framework::OutputLabel{o2::aod::binding()}, o2::aod::origin(), o2::aod::description(o2::aod::signature()), R.version}; @@ -399,7 +399,7 @@ template constexpr auto tableRef2OutputRef() { return framework::OutputRef{ - o2::aod::label(), + o2::aod::binding(), R.version}; } } // namespace o2::soa @@ -503,12 +503,12 @@ struct OutputForTable { static OutputSpec const spec() { - return OutputSpec{OutputLabel{aod::label()}, o2::aod::origin(), o2::aod::description(o2::aod::signature()), table_t::ref.version}; + return OutputSpec{OutputLabel{aod::binding()}, o2::aod::origin(), o2::aod::description(o2::aod::signature()), table_t::ref.version}; } static OutputRef ref() { - return OutputRef{aod::label(), table_t::ref.version}; + return OutputRef{aod::binding(), table_t::ref.version}; } }; diff --git a/Framework/Core/test/test_AnalysisTask.cxx b/Framework/Core/test/test_AnalysisTask.cxx index f5d8c4c43bc38..e9d12e4d9681a 100644 --- a/Framework/Core/test/test_AnalysisTask.cxx +++ b/Framework/Core/test/test_AnalysisTask.cxx @@ -195,7 +195,7 @@ struct MTask { PresliceUnsortedOptional perMcColopt = aod::mccollisionlabel::mcCollisionId; } foo; void process(aod::McCollision const&, soa::SmallGroups> const&) {} -}; +};\ TEST_CASE("AdaptorCompilation") { @@ -205,55 +205,55 @@ TEST_CASE("AdaptorCompilation") auto task1ng = adaptAnalysisTask(*cfgc, TaskName{"test1"}); REQUIRE(task1ng.inputs.size() == 2); REQUIRE(task1ng.outputs.size() == 1); - REQUIRE(task1ng.inputs[1].binding == std::string("TracksExtension")); - REQUIRE(task1ng.inputs[0].binding == std::string("Tracks")); - REQUIRE(task1ng.outputs[0].binding.value == std::string("FooBars")); + REQUIRE(task1ng.inputs[1].binding == std::string("TracksExtension/DYN")); + REQUIRE(task1ng.inputs[0].binding == std::string("Tracks/AOD")); + REQUIRE(task1ng.outputs[0].binding.value == std::string("FooBars/AOD")); auto task1ngc = adaptAnalysisTask(*cfgc); REQUIRE(task1ngc.inputs.size() == 5); - REQUIRE(task1ngc.inputs[0].binding == "Foos"); - REQUIRE(task1ngc.inputs[1].binding == "Roots"); - REQUIRE(task1ngc.inputs[2].binding == "B1s"); - REQUIRE(task1ngc.inputs[3].binding == "B2s"); - REQUIRE(task1ngc.inputs[4].binding == "B3s"); + REQUIRE(task1ngc.inputs[0].binding == "Foos/AOD"); + REQUIRE(task1ngc.inputs[1].binding == "Roots/AOD"); + REQUIRE(task1ngc.inputs[2].binding == "B1s/AOD"); + REQUIRE(task1ngc.inputs[3].binding == "B2s/AOD"); + REQUIRE(task1ngc.inputs[4].binding == "B3s/AOD"); auto task2 = adaptAnalysisTask(*cfgc, TaskName{"test2"}); REQUIRE(task2.inputs.size() == 10); - REQUIRE(task2.inputs[2].binding == "TracksExtension"); - REQUIRE(task2.inputs[1].binding == "Tracks"); - REQUIRE(task2.inputs[4].binding == "TracksExtra_002Extension"); - REQUIRE(task2.inputs[3].binding == "TracksExtra"); - REQUIRE(task2.inputs[6].binding == "TracksCovExtension"); - REQUIRE(task2.inputs[5].binding == "TracksCov"); - REQUIRE(task2.inputs[7].binding == "AmbiguousTracks"); - REQUIRE(task2.inputs[8].binding == "Calos"); - REQUIRE(task2.inputs[9].binding == "CaloTriggers"); - REQUIRE(task2.inputs[0].binding == "Collisions_001"); + REQUIRE(task2.inputs[2].binding == "TracksExtension/DYN"); + REQUIRE(task2.inputs[1].binding == "Tracks/AOD"); + REQUIRE(task2.inputs[4].binding == "TracksExtra_002Extension/DYN"); + REQUIRE(task2.inputs[3].binding == "TracksExtra/AOD"); + REQUIRE(task2.inputs[6].binding == "TracksCovExtension/DYN"); + REQUIRE(task2.inputs[5].binding == "TracksCov/AOD"); + REQUIRE(task2.inputs[7].binding == "AmbiguousTracks/AOD"); + REQUIRE(task2.inputs[8].binding == "Calos/AOD"); + REQUIRE(task2.inputs[9].binding == "CaloTriggers/AOD"); + REQUIRE(task2.inputs[0].binding == "Collisions_001/AOD"); auto task3 = adaptAnalysisTask(*cfgc, TaskName{"test3"}); REQUIRE(task3.inputs.size() == 3); - REQUIRE(task3.inputs[0].binding == "Collisions_001"); - REQUIRE(task3.inputs[1].binding == "Tracks"); - REQUIRE(task3.inputs[2].binding == "TracksExtension"); + REQUIRE(task3.inputs[0].binding == "Collisions_001/AOD"); + REQUIRE(task3.inputs[1].binding == "Tracks/AOD"); + REQUIRE(task3.inputs[2].binding == "TracksExtension/DYN"); auto task4 = adaptAnalysisTask(*cfgc, TaskName{"test4"}); REQUIRE(task4.inputs.size() == 2); - REQUIRE(task4.inputs[0].binding == "Tracks"); - REQUIRE(task4.inputs[1].binding == "TracksExtension"); + REQUIRE(task4.inputs[0].binding == "Tracks/AOD"); + REQUIRE(task4.inputs[1].binding == "TracksExtension/DYN"); auto task5 = adaptAnalysisTask(*cfgc, TaskName{"test5"}); REQUIRE(task5.inputs.size() == 1); - REQUIRE(task5.inputs[0].binding == "FooBars"); + REQUIRE(task5.inputs[0].binding == "FooBars/AOD"); auto task6ng = adaptAnalysisTask(*cfgc, TaskName{"test6"}); REQUIRE(task6ng.inputs.size() == 1); - REQUIRE(task6ng.inputs[0].binding == "FooBars"); + REQUIRE(task6ng.inputs[0].binding == "FooBars/AOD"); auto task7ng = adaptAnalysisTask(*cfgc, TaskName{"test7"}); REQUIRE(task7ng.inputs.size() == 3); - REQUIRE(task7ng.inputs[0].binding == "Foos"); - REQUIRE(task7ng.inputs[1].binding == "Bars"); - REQUIRE(task7ng.inputs[2].binding == "XYZ"); + REQUIRE(task7ng.inputs[0].binding == "Foos/AOD"); + REQUIRE(task7ng.inputs[1].binding == "Bars/AOD"); + REQUIRE(task7ng.inputs[2].binding == "XYZ/AOD"); auto task8ng = adaptAnalysisTask(*cfgc, TaskName{"test8"}); REQUIRE(task8ng.inputs.size() == 3);