Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 45 additions & 12 deletions Framework/Core/include/Framework/AnalysisHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -28,14 +27,58 @@
#include <string>
namespace o2::soa
{
template <TableRef R>
constexpr auto tableRef2ConfigParamSpec()
{
return o2::framework::ConfigParamSpec{
std::string{"input:"} + o2::aod::label<R>(),
framework::VariantType::String,
aod::sourceSpec<R>(),
{"\"\""}};
}

namespace
{
template <soa::with_sources T>
inline constexpr auto getSources()
{
return []<size_t N, std::array<soa::TableRef, N> refs>() {
return []<size_t... Is>(std::index_sequence<Is...>) {
return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
}(std::make_index_sequence<N>());
}.template operator()<T::sources.size(), T::sources>();
}

template <soa::with_sources T>
constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
{
std::vector<framework::ConfigParamSpec> inputMetadata;
auto inputSources = getSources<T>();
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 <typename T>
requires(!soa::with_sources<T>)
constexpr auto getInputMetadata() -> std::vector<framework::ConfigParamSpec>
{
return {};
}
} // namespace

template <TableRef R>
constexpr auto tableRef2InputSpec()
{
return framework::InputSpec{
o2::aod::label<R>(),
o2::aod::origin<R>(),
o2::aod::description(o2::aod::signature<R>()),
R.version};
R.version,
framework::Lifetime::Timeframe,
getInputMetadata<typename o2::aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata>()};
}

template <TableRef R>
Expand Down Expand Up @@ -64,16 +107,6 @@ constexpr auto tableRef2OutputRef()
o2::aod::label<R>(),
R.version};
}

template <TableRef R>
constexpr auto tableRef2ConfigParamSpec()
{
return o2::framework::ConfigParamSpec{
std::string{"input:"} + o2::aod::label<R>(),
framework::VariantType::String,
aod::sourceSpec<R>(),
{"\"\""}};
}
} // namespace o2::soa

namespace o2::framework
Expand Down
51 changes: 3 additions & 48 deletions Framework/Core/include/Framework/AnalysisTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,46 +65,6 @@ concept is_enumeration = is_enumeration_v<std::decay_t<T>>;
// the contents of an AnalysisTask...
namespace {
struct AnalysisDataProcessorBuilder {
template <typename T>
static ConfigParamSpec getSpec()
{
if constexpr (soa::has_metadata<aod::MetadataTrait<T>>) {
return ConfigParamSpec{std::string{"input:"} + aod::MetadataTrait<T>::metadata::tableLabel(), VariantType::String, aod::MetadataTrait<T>::metadata::sourceSpec(), {"\"\""}};
} else {
using O1 = framework::pack_element_t<0, typename T::originals>;
return ConfigParamSpec{std::string{"input:"} + aod::MetadataTrait<T>::metadata::tableLabel(), VariantType::String, aod::MetadataTrait<O1>::metadata::sourceSpec(), {"\"\""}};
}
}

template <soa::TableRef R>
static ConfigParamSpec getSpec()
{
return soa::tableRef2ConfigParamSpec<R>();
}

template <soa::with_sources T>
static inline auto getSources()
{
return []<size_t N, std::array<soa::TableRef, N> refs>() {
return []<size_t... Is>(std::index_sequence<Is...>) {
return std::vector{soa::tableRef2ConfigParamSpec<refs[Is]>()...};
}(std::make_index_sequence<N>());
}.template operator()<T::sources.size(), T::sources>();
}

template <soa::with_sources T>

static auto getInputMetadata()
{
std::vector<ConfigParamSpec> inputMetadata;
auto inputSources = getSources<T>();
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 <typename G, typename... Args>
static void addGroupingCandidates(std::vector<StringPair>& bk, std::vector<StringPair>& bku)
{
Expand All @@ -130,14 +90,9 @@ struct AnalysisDataProcessorBuilder {
template <soa::TableRef R>
static void addOriginalRef(const char* name, bool value, std::vector<InputSpec>& inputs)
{
using metadata = typename aod::MetadataTrait<o2::aod::Hash<R.desc_hash>>::metadata;
std::vector<ConfigParamSpec> inputMetadata;
inputMetadata.emplace_back(ConfigParamSpec{std::string{"control:"} + name, VariantType::Bool, value, {"\"\""}});
if constexpr (soa::with_sources<metadata>) {
auto inputSources = getInputMetadata<metadata>();
inputMetadata.insert(inputMetadata.end(), inputSources.begin(), inputSources.end());
}
DataSpecUtils::updateInputList(inputs, InputSpec{o2::aod::label<R>(), o2::aod::origin<R>(), aod::description(o2::aod::signature<R>()), R.version, Lifetime::Timeframe, inputMetadata});
auto spec = soa::tableRef2InputSpec<R>();
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
Expand Down
18 changes: 9 additions & 9 deletions Framework/Core/src/WorkflowHelpers.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down