@@ -420,10 +420,10 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
420420 // AODs are being injected on-the-fly, add error-handler reader
421421 aodReader.algorithm = AlgorithmSpec{
422422 adaptStateful (
423- [outputs = aodReader. outputs ](DeviceSpec const &) {
423+ [](DeviceSpec const & spec ) {
424424 LOGP (warn, " Workflow with injected AODs has unsatisfied inputs:" );
425- for (auto const & output : outputs) {
426- LOGP (warn, " {}" , DataSpecUtils::describe (output));
425+ for (auto const & output : spec. outputs ) {
426+ LOGP (warn, " {}" , DataSpecUtils::describe (output. matcher ));
427427 }
428428 LOGP (fatal, " Stopping." );
429429 // to ensure the output type for adaptStateful
@@ -531,43 +531,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
531531 workflow.insert (workflow.end (), extraSpecs.begin (), extraSpecs.end ());
532532 extraSpecs.clear ();
533533
534- // / Analyze all ouputs
535- auto [outputsInputsTmp, isDanglingTmp] = analyzeOutputs (workflow);
536- dec.isDangling = isDanglingTmp;
537- dec.outputsInputs = outputsInputsTmp;
538-
539- // create DataOutputDescriptor
540- std::shared_ptr<DataOutputDirector> dod = AnalysisSupportHelpers::getDataOutputDirector (ctx);
541-
542- // select outputs of type AOD which need to be saved
543- // ATTENTION: if there are dangling outputs the getGlobalAODSink
544- // has to be created in any case!
545- for (auto ii = 0u ; ii < dec.outputsInputs .size (); ii++) {
546- if (DataSpecUtils::partialMatch (dec.outputsInputs [ii], extendedAODOrigins)) {
547- auto ds = dod->getDataOutputDescriptors (dec.outputsInputs [ii]);
548- if (ds.size () > 0 || dec.isDangling [ii]) {
549- dec.outputsInputsAOD .emplace_back (dec.outputsInputs [ii]);
550- }
551- }
552- }
553-
554- // file sink for any AOD output
555- if (dec.outputsInputsAOD .size () > 0 ) {
556- // add TFNumber and TFFilename as input to the writer
557- dec.outputsInputsAOD .emplace_back (InputSpec{" tfn" , " TFN" , " TFNumber" });
558- dec.outputsInputsAOD .emplace_back (InputSpec{" tff" , " TFF" , " TFFilename" });
559- auto fileSink = AnalysisSupportHelpers::getGlobalAODSink (ctx);
560- extraSpecs.push_back (fileSink);
561-
562- auto it = std::ranges::find_if (dec.outputsInputs , [](InputSpec& spec) -> bool {
563- return DataSpecUtils::partialMatch (spec, o2::header::DataOrigin (" TFN" ));
564- });
565- size_t ii = std::distance (dec.outputsInputs .begin (), it);
566- dec.isDangling [ii] = false ;
567- }
568-
569- workflow.insert (workflow.end (), extraSpecs.begin (), extraSpecs.end ());
570- extraSpecs.clear ();
534+ injectAODWriter (workflow, ctx);
571535
572536 // Select dangling outputs which are not of type AOD
573537 std::vector<InputSpec> redirectedOutputsInputs;
@@ -704,6 +668,41 @@ void WorkflowHelpers::adjustTopology(WorkflowSpec& workflow, ConfigContext const
704668 }
705669}
706670
671+ void WorkflowHelpers::injectAODWriter (WorkflowSpec& workflow, ConfigContext const & ctx)
672+ {
673+ auto & dec = ctx.services ().get <DanglingEdgesContext>();
674+ // / Analyze all ouputs
675+ std::tie (dec.outputsInputs , dec.isDangling ) = analyzeOutputs (workflow);
676+
677+ // create DataOutputDescriptor
678+ std::shared_ptr<DataOutputDirector> dod = AnalysisSupportHelpers::getDataOutputDirector (ctx);
679+
680+ // select outputs of type AOD which need to be saved
681+ dec.outputsInputsAOD .clear ();
682+ for (auto ii = 0u ; ii < dec.outputsInputs .size (); ii++) {
683+ if (DataSpecUtils::partialMatch (dec.outputsInputs [ii], extendedAODOrigins)) {
684+ auto ds = dod->getDataOutputDescriptors (dec.outputsInputs [ii]);
685+ if (ds.size () > 0 || dec.isDangling [ii]) {
686+ dec.outputsInputsAOD .emplace_back (dec.outputsInputs [ii]);
687+ }
688+ }
689+ }
690+
691+ // file sink for any AOD output
692+ if (dec.outputsInputsAOD .size () > 0 ) {
693+ // add TFNumber and TFFilename as input to the writer
694+ DataSpecUtils::updateInputList (dec.outputsInputsAOD , InputSpec{" tfn" , " TFN" , " TFNumber" });
695+ DataSpecUtils::updateInputList (dec.outputsInputsAOD , InputSpec{" tff" , " TFF" , " TFFilename" });
696+ auto fileSink = AnalysisSupportHelpers::getGlobalAODSink (ctx);
697+ workflow.push_back (fileSink);
698+
699+ auto it = std::find_if (dec.outputsInputs .begin (), dec.outputsInputs .end (), [](InputSpec const & spec) -> bool {
700+ return DataSpecUtils::partialMatch (spec, o2::header::DataOrigin (" TFN" ));
701+ });
702+ dec.isDangling [std::distance (dec.outputsInputs .begin (), it)] = false ;
703+ }
704+ }
705+
707706void WorkflowHelpers::constructGraph (const WorkflowSpec& workflow,
708707 std::vector<DeviceConnectionEdge>& logicalEdges,
709708 std::vector<OutputSpec>& outputs,
0 commit comments