@@ -390,24 +390,19 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
390390 break ;
391391 }
392392 if (DataSpecUtils::partialMatch (input, header::DataOrigin{" AOD" })) {
393- requestedAODs. emplace_back ( input);
393+ DataSpecUtils::updateInputList (requestedAODs, InputSpec{ input} );
394394 }
395395 if (DataSpecUtils::partialMatch (input, header::DataOrigin{" DYN" })) {
396- if (std::find_if (requestedDYNs.begin (), requestedDYNs.end (), [&](InputSpec const & spec) { return input.binding == spec.binding ; }) == requestedDYNs.end ()) {
397- requestedDYNs.emplace_back (input);
398- }
396+ DataSpecUtils::updateInputList (requestedDYNs, InputSpec{input});
399397 }
400398 if (DataSpecUtils::partialMatch (input, header::DataOrigin{" IDX" })) {
401- if (std::find_if (requestedIDXs.begin (), requestedIDXs.end (), [&](InputSpec const & spec) { return input.binding == spec.binding ; }) == requestedIDXs.end ()) {
402- requestedIDXs.emplace_back (input);
403- }
399+ DataSpecUtils::updateInputList (requestedIDXs, InputSpec{input});
404400 }
405401 }
406402
407403 std::stable_sort (timer.outputs .begin (), timer.outputs .end (), [](OutputSpec const & a, OutputSpec const & b) { return *DataSpecUtils::getOptionalSubSpec (a) < *DataSpecUtils::getOptionalSubSpec (b); });
408404
409- for (size_t oi = 0 ; oi < processor.outputs .size (); ++oi) {
410- auto & output = processor.outputs [oi];
405+ for (auto & output : processor.outputs ) {
411406 if (DataSpecUtils::partialMatch (output, header::DataOrigin{" AOD" })) {
412407 providedAODs.emplace_back (output);
413408 } else if (DataSpecUtils::partialMatch (output, header::DataOrigin{" DYN" })) {
@@ -426,20 +421,23 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
426421 }
427422 }
428423 }
429- auto sortingEquals = [](InputSpec const & a, InputSpec const & b) { return DataSpecUtils::describe (a) == DataSpecUtils::describe (b); };
430- std::sort (requestedDYNs.begin (), requestedDYNs.end (), sortingEquals);
431- auto last = std::unique (requestedDYNs.begin (), requestedDYNs.end ());
432- requestedDYNs.erase (last, requestedDYNs.end ());
433424
434- std::sort (requestedIDXs.begin (), requestedIDXs.end (), sortingEquals);
435- last = std::unique (requestedIDXs.begin (), requestedIDXs.end ());
436- requestedIDXs.erase (last, requestedIDXs.end ());
425+ auto inputSpecLessThan = [](InputSpec const & lhs, InputSpec const & rhs) { return DataSpecUtils::describe (lhs) < DataSpecUtils::describe (rhs); };
426+ auto outputSpecLessThan = [](OutputSpec const & lhs, OutputSpec const & rhs) { return DataSpecUtils::describe (lhs) < DataSpecUtils::describe (rhs); };
427+ std::sort (requestedDYNs.begin (), requestedDYNs.end (), inputSpecLessThan);
428+ std::sort (providedDYNs.begin (), providedDYNs.end (), outputSpecLessThan);
429+ std::vector<InputSpec> spawnerInputs;
430+ for (auto & input : requestedDYNs) {
431+ if (std::none_of (providedDYNs.begin (), providedDYNs.end (), [&input](auto const & x) { return DataSpecUtils::match (input, x); })) {
432+ spawnerInputs.emplace_back (input);
433+ }
434+ }
437435
438436 DataProcessorSpec aodSpawner{
439437 " internal-dpl-aod-spawner" ,
440438 {},
441439 {},
442- readers::AODReaderHelpers::aodSpawnerCallback (requestedDYNs ),
440+ readers::AODReaderHelpers::aodSpawnerCallback (spawnerInputs ),
443441 {}};
444442
445443 DataProcessorSpec indexBuilder{
@@ -450,7 +448,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
450448 {}};
451449
452450 addMissingOutputsToBuilder (requestedIDXs, requestedAODs, requestedDYNs, indexBuilder);
453- addMissingOutputsToSpawner (providedDYNs, requestedDYNs , requestedAODs, aodSpawner);
451+ addMissingOutputsToSpawner ({}, spawnerInputs , requestedAODs, aodSpawner);
454452
455453 addMissingOutputsToReader (providedAODs, requestedAODs, aodReader);
456454 addMissingOutputsToReader (providedCCDBs, requestedCCDBs, ccdbBackend);
@@ -605,7 +603,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
605603 // ATTENTION: if there are dangling outputs the getGlobalAODSink
606604 // has to be created in any case!
607605 std::vector<InputSpec> outputsInputsAOD;
608- auto isAOD = [](InputSpec const & spec) { return DataSpecUtils::partialMatch (spec, header::DataOrigin (" AOD" )); };
606+ auto isAOD = [](InputSpec const & spec) { return ( DataSpecUtils::partialMatch (spec, header::DataOrigin (" AOD" )) || DataSpecUtils::partialMatch (spec, header::DataOrigin ( " DYN " ) )); };
609607 for (auto ii = 0u ; ii < outputsInputs.size (); ii++) {
610608 if (isAOD (outputsInputs[ii])) {
611609 auto ds = dod->getDataOutputDescriptors (outputsInputs[ii]);
0 commit comments