From 89d008a9795a7d37fc1fb45cb88ad760ec7ba974 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 11 Apr 2025 09:15:32 +0200 Subject: [PATCH 1/3] fix handling of sources --- .../Core/include/Framework/AnalysisHelpers.h | 56 +++++++++++++++---- .../Core/include/Framework/AnalysisTask.h | 51 +---------------- 2 files changed, 47 insertions(+), 60 deletions(-) diff --git a/Framework/Core/include/Framework/AnalysisHelpers.h b/Framework/Core/include/Framework/AnalysisHelpers.h index 985f80cd548bc..d9a2e7791a8ab 100644 --- a/Framework/Core/include/Framework/AnalysisHelpers.h +++ b/Framework/Core/include/Framework/AnalysisHelpers.h @@ -13,7 +13,6 @@ #include "Framework/ASoA.h" #include "Framework/DataAllocator.h" -#include "Framework/ExpressionHelpers.h" #include "Framework/IndexBuilderHelpers.h" #include "Framework/InputSpec.h" #include "Framework/Output.h" @@ -28,6 +27,47 @@ #include namespace o2::soa { +template +constexpr auto tableRef2ConfigParamSpec() +{ + return o2::framework::ConfigParamSpec{ + std::string{"input:"} + o2::aod::label(), + framework::VariantType::String, + aod::sourceSpec(), + {"\"\""}}; +} + +namespace { +template +inline constexpr auto getSources() +{ + return [] refs>() { + return [](std::index_sequence) { + return std::vector{soa::tableRef2ConfigParamSpec()...}; + }(std::make_index_sequence()); + }.template operator()(); +} + +template +constexpr auto getInputMetadata() -> std::vector +{ + std::vector inputMetadata; + auto inputSources = getSources(); + std::sort(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name < b.name; }); + auto last = std::unique(inputSources.begin(), inputSources.end(), [](framework::ConfigParamSpec const& a, framework::ConfigParamSpec const& b) { return a.name == b.name; }); + inputSources.erase(last, inputSources.end()); + inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end()); + return inputMetadata; +} + +template + requires(!soa::with_sources) +constexpr auto getInputMetadata() -> std::vector +{ + return {}; +} +} + template constexpr auto tableRef2InputSpec() { @@ -35,7 +75,9 @@ constexpr auto tableRef2InputSpec() o2::aod::label(), o2::aod::origin(), o2::aod::description(o2::aod::signature()), - R.version}; + R.version, + framework::Lifetime::Timeframe, + getInputMetadata>::metadata>()}; } template @@ -64,16 +106,6 @@ constexpr auto tableRef2OutputRef() o2::aod::label(), R.version}; } - -template -constexpr auto tableRef2ConfigParamSpec() -{ - return o2::framework::ConfigParamSpec{ - std::string{"input:"} + o2::aod::label(), - framework::VariantType::String, - aod::sourceSpec(), - {"\"\""}}; -} } // namespace o2::soa namespace o2::framework diff --git a/Framework/Core/include/Framework/AnalysisTask.h b/Framework/Core/include/Framework/AnalysisTask.h index bd1a1cfd88954..c7f3da1948c62 100644 --- a/Framework/Core/include/Framework/AnalysisTask.h +++ b/Framework/Core/include/Framework/AnalysisTask.h @@ -65,46 +65,6 @@ concept is_enumeration = is_enumeration_v>; // the contents of an AnalysisTask... namespace { struct AnalysisDataProcessorBuilder { - template - static ConfigParamSpec getSpec() - { - if constexpr (soa::has_metadata>) { - return ConfigParamSpec{std::string{"input:"} + aod::MetadataTrait::metadata::tableLabel(), VariantType::String, aod::MetadataTrait::metadata::sourceSpec(), {"\"\""}}; - } else { - using O1 = framework::pack_element_t<0, typename T::originals>; - return ConfigParamSpec{std::string{"input:"} + aod::MetadataTrait::metadata::tableLabel(), VariantType::String, aod::MetadataTrait::metadata::sourceSpec(), {"\"\""}}; - } - } - - template - static ConfigParamSpec getSpec() - { - return soa::tableRef2ConfigParamSpec(); - } - - template - static inline auto getSources() - { - return [] refs>() { - return [](std::index_sequence) { - return std::vector{soa::tableRef2ConfigParamSpec()...}; - }(std::make_index_sequence()); - }.template operator()(); - } - - template - - static auto getInputMetadata() - { - std::vector inputMetadata; - auto inputSources = getSources(); - std::sort(inputSources.begin(), inputSources.end(), [](ConfigParamSpec const& a, ConfigParamSpec const& b) { return a.name < b.name; }); - auto last = std::unique(inputSources.begin(), inputSources.end(), [](ConfigParamSpec const& a, ConfigParamSpec const& b) { return a.name == b.name; }); - inputSources.erase(last, inputSources.end()); - inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end()); - return inputMetadata; - } - template static void addGroupingCandidates(std::vector& bk, std::vector& bku) { @@ -130,14 +90,9 @@ struct AnalysisDataProcessorBuilder { template static void addOriginalRef(const char* name, bool value, std::vector& inputs) { - using metadata = typename aod::MetadataTrait>::metadata; - std::vector inputMetadata; - inputMetadata.emplace_back(ConfigParamSpec{std::string{"control:"} + name, VariantType::Bool, value, {"\"\""}}); - if constexpr (soa::with_sources) { - auto inputSources = getInputMetadata(); - inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end()); - } - DataSpecUtils::updateInputList(inputs, InputSpec{o2::aod::label(), o2::aod::origin(), aod::description(o2::aod::signature()), R.version, Lifetime::Timeframe, inputMetadata}); + auto spec = soa::tableRef2InputSpec(); + spec.metadata.emplace_back(ConfigParamSpec{std::string{"control:"} + name, VariantType::Bool, value, {"\"\""}}); + DataSpecUtils::updateInputList(inputs, std::move(spec)); } /// helpers to append expression information for a single argument From 1b5e18e86123918585541324b9164e643848461b Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 11 Apr 2025 09:15:52 +0200 Subject: [PATCH 2/3] reorder builder and spawner --- Framework/Core/src/WorkflowHelpers.cxx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Framework/Core/src/WorkflowHelpers.cxx b/Framework/Core/src/WorkflowHelpers.cxx index b18b559fe99fb..553abfeb6ecdc 100644 --- a/Framework/Core/src/WorkflowHelpers.cxx +++ b/Framework/Core/src/WorkflowHelpers.cxx @@ -385,6 +385,15 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext auto outputSpecLessThan = [](OutputSpec const& lhs, OutputSpec const& rhs) { return DataSpecUtils::describe(lhs) < DataSpecUtils::describe(rhs); }; std::sort(ac.requestedDYNs.begin(), ac.requestedDYNs.end(), inputSpecLessThan); std::sort(ac.providedDYNs.begin(), ac.providedDYNs.end(), outputSpecLessThan); + + DataProcessorSpec indexBuilder{ + "internal-dpl-aod-index-builder", + {}, + {}, + readers::AODReaderHelpers::indexBuilderCallback(ac.requestedIDXs), + {}}; + AnalysisSupportHelpers::addMissingOutputsToBuilder(ac.requestedIDXs, ac.requestedAODs, ac.requestedDYNs, indexBuilder); + for (auto& input : ac.requestedDYNs) { if (std::none_of(ac.providedDYNs.begin(), ac.providedDYNs.end(), [&input](auto const& x) { return DataSpecUtils::match(input, x); })) { ac.spawnerInputs.emplace_back(input); @@ -397,15 +406,6 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext {}, readers::AODReaderHelpers::aodSpawnerCallback(ac.spawnerInputs), {}}; - - DataProcessorSpec indexBuilder{ - "internal-dpl-aod-index-builder", - {}, - {}, - readers::AODReaderHelpers::indexBuilderCallback(ac.requestedIDXs), - {}}; - - AnalysisSupportHelpers::addMissingOutputsToBuilder(ac.requestedIDXs, ac.requestedAODs, ac.requestedDYNs, indexBuilder); AnalysisSupportHelpers::addMissingOutputsToSpawner({}, ac.spawnerInputs, ac.requestedAODs, aodSpawner); AnalysisSupportHelpers::addMissingOutputsToReader(ac.providedAODs, ac.requestedAODs, aodReader); From 11ceeb0d5da20c66667dc7a48af5e3fd329e2d40 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 11 Apr 2025 07:20:50 +0000 Subject: [PATCH 3/3] Please consider the following formatting changes --- Framework/Core/include/Framework/AnalysisHelpers.h | 13 +++++++------ Framework/Core/src/WorkflowHelpers.cxx | 10 +++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Framework/Core/include/Framework/AnalysisHelpers.h b/Framework/Core/include/Framework/AnalysisHelpers.h index d9a2e7791a8ab..55d2490dff1bc 100644 --- a/Framework/Core/include/Framework/AnalysisHelpers.h +++ b/Framework/Core/include/Framework/AnalysisHelpers.h @@ -31,13 +31,14 @@ template constexpr auto tableRef2ConfigParamSpec() { return o2::framework::ConfigParamSpec{ - std::string{"input:"} + o2::aod::label(), - framework::VariantType::String, - aod::sourceSpec(), - {"\"\""}}; + std::string{"input:"} + o2::aod::label(), + framework::VariantType::String, + aod::sourceSpec(), + {"\"\""}}; } -namespace { +namespace +{ template inline constexpr auto getSources() { @@ -66,7 +67,7 @@ constexpr auto getInputMetadata() -> std::vector { return {}; } -} +} // namespace template constexpr auto tableRef2InputSpec() diff --git a/Framework/Core/src/WorkflowHelpers.cxx b/Framework/Core/src/WorkflowHelpers.cxx index 553abfeb6ecdc..652e863f98394 100644 --- a/Framework/Core/src/WorkflowHelpers.cxx +++ b/Framework/Core/src/WorkflowHelpers.cxx @@ -387,11 +387,11 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext std::sort(ac.providedDYNs.begin(), ac.providedDYNs.end(), outputSpecLessThan); DataProcessorSpec indexBuilder{ - "internal-dpl-aod-index-builder", - {}, - {}, - readers::AODReaderHelpers::indexBuilderCallback(ac.requestedIDXs), - {}}; + "internal-dpl-aod-index-builder", + {}, + {}, + readers::AODReaderHelpers::indexBuilderCallback(ac.requestedIDXs), + {}}; AnalysisSupportHelpers::addMissingOutputsToBuilder(ac.requestedIDXs, ac.requestedAODs, ac.requestedDYNs, indexBuilder); for (auto& input : ac.requestedDYNs) {