@@ -282,9 +282,11 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
282282 bool hasProjectors = false ;
283283 bool hasIndexRecords = false ;
284284 bool hasCCDBURLs = false ;
285+ bool hasSliceSource = false ;
285286 bool wasAOD = false ;
286- // all three options are exclusive
287+ // all options are exclusive
287288 for (auto const & p : input.metadata ) {
289+ // wasAOD can be true or false for all of the options
288290 if (p.name .starts_with (" aod-origin-replaced" )) {
289291 wasAOD = true ;
290292 }
@@ -300,6 +302,10 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
300302 hasCCDBURLs = true ;
301303 break ;
302304 }
305+ if (p.name .starts_with (" slice-source" )) {
306+ hasSliceSource = true ;
307+ break ;
308+ }
303309 }
304310 switch (input.lifetime ) {
305311 case Lifetime::Timer: {
@@ -346,6 +352,8 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
346352 DataSpecUtils::updateInputList (dec.requestedIDXs , InputSpec{input});
347353 } else if (hasCCDBURLs) {
348354 DataSpecUtils::updateInputList (dec.requestedTIMs , InputSpec{input});
355+ } else if (hasSliceSource) {
356+ DataSpecUtils::updateInputList (dec.requestedSLCs , InputSpec{input});
349357 } else if (DataSpecUtils::partialMatch (input, AODOrigins) || wasAOD) {
350358 DataSpecUtils::updateInputList (dec.requestedAODs , InputSpec{input});
351359 }
@@ -358,8 +366,11 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
358366 bool hasIndexRecords = false ;
359367 bool hasCCDBURLs = false ;
360368 bool wasAOD = false ;
361- // all three options are exclusive
369+ // all options are exclusive
370+ // provided slice outputs are ignored, they can only come from the slicer device
371+ // that will be re-added in adjust topology
362372 for (auto const & p : output.metadata ) {
373+ // wasAOD can be true or false for all of the options
363374 if (p.name .starts_with (" aod-origin-replaced" )) {
364375 wasAOD = true ;
365376 }
@@ -439,6 +450,13 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
439450 std::ranges::sort (providedCCDBs, outputSpecLessThan);
440451 AnalysisSupportHelpers::addMissingOutputsToReader (providedCCDBs, requestedCCDBs, ccdbBackend);
441452
453+ // slicers are grouped by the devices providing the sliced tables
454+ std::ranges::sort (dec.requestedSLCs , inputSpecLessThan);
455+ std::vector<DataProcessorSpec const *> slicedTablesProviders;
456+ std::ranges::transform (workflow, std::back_inserter (slicedTablesProviders), [](DataProcessorSpec const & spec) { return &spec; });
457+ slicedTablesProviders.insert (slicedTablesProviders.end (), {&aodSpawner, &indexBuilder, &aodReader});
458+ auto aodSlicers = AnalysisSupportHelpers::makeSlicers (dec.requestedSLCs , slicedTablesProviders, dec.slicerGroups );
459+
442460 std::vector<DataProcessorSpec> extraSpecs;
443461
444462 if (transientStore.outputs .empty () == false ) {
@@ -456,6 +474,9 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
456474 extraSpecs.push_back (indexBuilder);
457475 }
458476
477+ // here the slicers are just added, unlike in adjustTopology
478+ std::ranges::transform (aodSlicers, std::back_inserter (extraSpecs), [](auto && pair){ return pair.second ; });
479+
459480 // add the Analysys CCDB backend which reads CCDB objects using a provided table
460481 DeploymentMode deploymentMode = DefaultsHelpers::deploymentMode ();
461482 if (deploymentMode != DeploymentMode::OnlineDDS && deploymentMode != DeploymentMode::OnlineECS) {
0 commit comments