57namespace analysis_task_parsers
67template <is_configurable O>
68bool appendOption(std::vector<ConfigParamSpec>& options, O& option)
73template <is_configurable_group O>
74bool appendOption(std::vector<ConfigParamSpec>& options, O& optionGroup)
76 if constexpr (
requires { optionGroup.prefix; }) {
77 homogeneous_apply_refs<true>([prefix = optionGroup.prefix]<
typename C>(C& option) {
78 if constexpr (requires { option.name; }) {
79 option.name.insert(0, 1,
'.');
80 option.name.insert(0, prefix);
86 homogeneous_apply_refs<true>([&options](
auto& option) {
return appendOption(options, option); }, optionGroup);
96template <is_configurable O>
97bool prepareOption(
InitContext& context, O& configurable)
100 configurable.value = context.
options().
get<
typename O::type>(configurable.name.c_str());
102 auto pt = context.
options().
get<boost::property_tree::ptree>(configurable.name.c_str());
103 configurable.value = RootConfigParamHelpers::as<typename O::type>(pt);
108template <is_configurable_group O>
109bool prepareOption(InitContext& context, O& configurableGroup)
111 homogeneous_apply_refs<true>([&context](
auto&& configurable) {
return prepareOption(context, configurable); }, configurableGroup);
122template <is_condition C>
123bool appendCondition(std::vector<InputSpec>& inputs, C& condition)
129template <is_condition_group C>
130bool appendCondition(std::vector<InputSpec>& inputs, C& conditionGroup)
132 homogeneous_apply_refs<true>([&inputs](
auto& condition) {
return appendCondition(inputs, condition); }, conditionGroup);
143template <is_spawns T>
144bool requestInputs(std::vector<InputSpec>& inputs, T
const& spawns)
146 auto base_specs = spawns.base_specs();
147 for (
auto base_spec : base_specs) {
154template <is_builds T>
155bool requestInputs(std::vector<InputSpec>& inputs, T
const& builds)
157 auto base_specs = builds.base_specs();
158 for (
auto base_spec : base_specs) {
159 base_spec.metadata.push_back(ConfigParamSpec{std::string{
"control:build"},
VariantType::Bool,
true, {
"\"\""}});
171template <is_condition C>
172bool newDataframeCondition(
InputRecord& record, C& condition)
174 condition.instance = (
typename C::type*)record.
get<
typename C::type*>(condition.path).get();
178template <is_condition_group C>
179bool newDataframeCondition(
InputRecord& record, C& conditionGroup)
181 homogeneous_apply_refs<true>([&record](
auto&& condition) {
return newDataframeCondition(record, condition); }, conditionGroup);
192template <is_produces T>
193bool appendOutput(std::vector<OutputSpec>& outputs, T&, uint32_t)
199template <is_produces_group T>
200bool appendOutput(std::vector<OutputSpec>& outputs, T& producesGroup, uint32_t hash)
202 homogeneous_apply_refs<true>([&outputs, hash](
auto& produces) {
return appendOutput(outputs, produces, hash); }, producesGroup);
206template <is_histogram_registry T>
207bool appendOutput(std::vector<OutputSpec>& outputs, T& hr, uint32_t hash)
210 outputs.emplace_back(hr.spec());
214template <is_outputobj T>
215bool appendOutput(std::vector<OutputSpec>& outputs, T& obj, uint32_t hash)
218 outputs.emplace_back(obj.spec());
222template <is_spawns T>
223bool appendOutput(std::vector<OutputSpec>& outputs, T& spawns, uint32_t)
225 outputs.emplace_back(spawns.spec());
229template <is_builds T>
230bool appendOutput(std::vector<OutputSpec>& outputs, T& builds, uint32_t)
232 outputs.emplace_back(builds.spec());
242template <is_histogram_registry T>
246 context.
outputs().
snapshot(hr.ref(deviceSpec.inputTimesliceId, deviceSpec.maxInputTimeslices), *(hr.getListOfHistograms()));
251template <is_outputobj T>
255 context.
outputs().
snapshot(obj.ref(deviceSpec.inputTimesliceId, deviceSpec.maxInputTimeslices), *obj);
265template <is_produces T>
272template <is_produces_group T>
275 homogeneous_apply_refs<true>([&context](
auto& produces) {
return prepareOutput(context, produces); }, producesGroup);
279template <is_spawns T>
284 if (originalTable->schema()->fields().empty() ==
true) {
285 using base_table_t =
typename T::base_table_t::table_t;
286 originalTable = makeEmptyTable<base_table_t>(o2::aod::label<metadata::extension_table_t::ref>());
290 spawns.table = std::make_shared<typename T::spawnable_t::table_t>(
soa::ArrowHelpers::joinTables({spawns.extension->asArrowTable(), originalTable}));
294template <is_builds T>
298 return builds.template build<typename T::buildable_t::indexing_t>(builds.pack(), extractOriginals<metadata::sources.size(), metadata::sources>(context));
307template <is_produces T>
310 produces.setLabel(o2::aod::label<T::persistent_table_t::ref>());
315template <is_produces_group T>
318 homogeneous_apply_refs<true>([&context](
auto& produces) {
return finalizeOutput(context, produces); }, producesGroup);
322template <is_spawns T>
325 context.outputs().adopt(spawns.output(), spawns.asArrowTable());
329template <is_builds T>
332 context.outputs().adopt(builds.output(), builds.asArrowTable());
343template <is_service T>
344bool addService(std::vector<ServiceSpec>& specs, T&)
347 auto p =
typename T::service_t{};
349 PluginManager::loadFromPlugin<ServiceSpec, ServicePlugin>(loadableServices, specs);
360template <is_service T>
361bool prepareService(
InitContext& context, T& service)
363 using S =
typename T::service_t;
364 if constexpr (
requires { &S::instance; }) {
365 service.service = &(S::instance());
380template <is_service T>
385 if constexpr (
requires { &T::service_t::endOfStream; }) {
386 service.service->endOfStream();
399template <expressions::is_filter T>
406template <is_partition T>
407bool updatePlaceholders(
InitContext& context, T& partition)
409 partition.updatePlaceholders(context);
419template <expressions::is_filter T>
420bool createExpressionTrees(std::vector<ExpressionInfo>& expressionInfos, T&
filter)
432template <is_partition T>
433bool newDataframePartition(T& partition)
435 partition.dataframeChanged =
true;
439template <
typename P,
typename... T>
447 ([&]() {
if constexpr (std::same_as<typename P::content_t, T>) {partition.bindTable(tables);} }(), ...);
450template <
typename P,
typename T>
455template <is_partition P,
typename T>
456void bindInternalIndicesPartition(P& partition, T* table)
458 if constexpr (o2::soa::is_binding_compatible_v<typename P::content_t, std::decay_t<T>>()) {
459 partition.bindInternalIndicesTo(table);
463template <
typename P,
typename... T>
471 partition.bindExternalIndices(tables...);
487template <is_slice_cache T>
490 if (cache.ptr ==
nullptr) {
497template <
typename C,
typename TG,
typename... Ts>
498 requires(!is_combinations_generator<C>)
505static void setGroupedCombination(C& comb, TG& grouping, std::tuple<Ts...>& associated)
507 if constexpr (std::same_as<typename C::g_t, TG>) {
508 comb.setTables(grouping, associated);
514 requires(!is_preslice<T>)
520template <is_preslice T>
521 requires std::same_as<typename T::policy_t, framework::PreslicePolicySorted>
522bool registerCache(T& preslice, std::vector<StringPair>& bsks, std::vector<StringPair>&)
524 if constexpr (T::optional) {
525 if (preslice.binding ==
"[MISSING]") {
529 auto locate = std::find_if(bsks.begin(), bsks.end(), [&](
auto const&
entry) { return (entry.first == preslice.bindingKey.first) && (entry.second == preslice.bindingKey.second); });
530 if (locate == bsks.end()) {
531 bsks.emplace_back(preslice.getBindingKey());
536template <is_preslice T>
537 requires std::same_as<typename T::policy_t, framework::PreslicePolicyGeneral>
538bool registerCache(T& preslice, std::vector<StringPair>&, std::vector<StringPair>& bsksU)
540 if constexpr (T::optional) {
541 if (preslice.binding ==
"[MISSING]") {
545 auto locate = std::find_if(bsksU.begin(), bsksU.end(), [&](
auto const&
entry) { return (entry.first == preslice.bindingKey.first) && (entry.second == preslice.bindingKey.second); });
546 if (locate == bsksU.end()) {
547 bsksU.emplace_back(preslice.getBindingKey());
559template <is_preslice T>
561 requires std::same_as<typename T::policy_t, framework::PreslicePolicySorted>
563 if constexpr (T::optional) {
564 if (preslice.binding ==
"[MISSING]") {
568 preslice.updateSliceInfo(cache.getCacheFor(preslice.getBindingKey()));
572template <is_preslice T>
574 requires std::same_as<typename T::policy_t, framework::PreslicePolicyGeneral>
576 if constexpr (T::optional) {
577 if (preslice.binding ==
"[MISSING]") {
581 preslice.updateSliceInfo(cache.getCacheUnsortedFor(preslice.getBindingKey()));
587static bool setProcessSwitch(std::pair<std::string, bool>, T&)
592template <is_process_configurable T>
593static bool setProcessSwitch(std::pair<std::string, bool> setting, T& pc)
595 if (pc.name == setting.first) {
596 pc.value = setting.second;