@@ -532,43 +532,7 @@ void WorkflowHelpers::injectServiceDevices(WorkflowSpec& workflow, ConfigContext
532532 workflow.insert (workflow.end (), extraSpecs.begin (), extraSpecs.end ());
533533 extraSpecs.clear ();
534534
535- // / Analyze all ouputs
536- auto [outputsInputsTmp, isDanglingTmp] = analyzeOutputs (workflow);
537- dec.isDangling = isDanglingTmp;
538- dec.outputsInputs = outputsInputsTmp;
539-
540- // create DataOutputDescriptor
541- std::shared_ptr<DataOutputDirector> dod = AnalysisSupportHelpers::getDataOutputDirector (ctx);
542-
543- // select outputs of type AOD which need to be saved
544- // ATTENTION: if there are dangling outputs the getGlobalAODSink
545- // has to be created in any case!
546- for (auto ii = 0u ; ii < dec.outputsInputs .size (); ii++) {
547- if (DataSpecUtils::partialMatch (dec.outputsInputs [ii], extendedAODOrigins)) {
548- auto ds = dod->getDataOutputDescriptors (dec.outputsInputs [ii]);
549- if (ds.size () > 0 || dec.isDangling [ii]) {
550- dec.outputsInputsAOD .emplace_back (dec.outputsInputs [ii]);
551- }
552- }
553- }
554-
555- // file sink for any AOD output
556- if (dec.outputsInputsAOD .size () > 0 ) {
557- // add TFNumber and TFFilename as input to the writer
558- dec.outputsInputsAOD .emplace_back (InputSpec{" tfn" , " TFN" , " TFNumber" });
559- dec.outputsInputsAOD .emplace_back (InputSpec{" tff" , " TFF" , " TFFilename" });
560- auto fileSink = AnalysisSupportHelpers::getGlobalAODSink (ctx);
561- extraSpecs.push_back (fileSink);
562-
563- auto it = std::find_if (dec.outputsInputs .begin (), dec.outputsInputs .end (), [](InputSpec& spec) -> bool {
564- return DataSpecUtils::partialMatch (spec, o2::header::DataOrigin (" TFN" ));
565- });
566- size_t ii = std::distance (dec.outputsInputs .begin (), it);
567- dec.isDangling [ii] = false ;
568- }
569-
570- workflow.insert (workflow.end (), extraSpecs.begin (), extraSpecs.end ());
571- extraSpecs.clear ();
535+ injectAODWriter (workflow, ctx);
572536
573537 // Select dangling outputs which are not of type AOD
574538 std::vector<InputSpec> redirectedOutputsInputs;
@@ -712,6 +676,41 @@ void WorkflowHelpers::adjustTopology(WorkflowSpec& workflow, ConfigContext const
712676 }
713677}
714678
679+ void WorkflowHelpers::injectAODWriter (WorkflowSpec& workflow, ConfigContext const & ctx)
680+ {
681+ auto & dec = ctx.services ().get <DanglingEdgesContext>();
682+ // / Analyze all ouputs
683+ std::tie (dec.outputsInputs , dec.isDangling ) = analyzeOutputs (workflow);
684+
685+ // create DataOutputDescriptor
686+ std::shared_ptr<DataOutputDirector> dod = AnalysisSupportHelpers::getDataOutputDirector (ctx);
687+
688+ // select outputs of type AOD which need to be saved
689+ dec.outputsInputsAOD .clear ();
690+ for (auto ii = 0u ; ii < dec.outputsInputs .size (); ii++) {
691+ if (DataSpecUtils::partialMatch (dec.outputsInputs [ii], extendedAODOrigins)) {
692+ auto ds = dod->getDataOutputDescriptors (dec.outputsInputs [ii]);
693+ if (ds.size () > 0 || dec.isDangling [ii]) {
694+ dec.outputsInputsAOD .emplace_back (dec.outputsInputs [ii]);
695+ }
696+ }
697+ }
698+
699+ // file sink for any AOD output
700+ if (dec.outputsInputsAOD .size () > 0 ) {
701+ // add TFNumber and TFFilename as input to the writer
702+ DataSpecUtils::updateInputList (dec.outputsInputsAOD , InputSpec{" tfn" , " TFN" , " TFNumber" });
703+ DataSpecUtils::updateInputList (dec.outputsInputsAOD , InputSpec{" tff" , " TFF" , " TFFilename" });
704+ auto fileSink = AnalysisSupportHelpers::getGlobalAODSink (ctx);
705+ workflow.push_back (fileSink);
706+
707+ auto it = std::find_if (dec.outputsInputs .begin (), dec.outputsInputs .end (), [](InputSpec const & spec) -> bool {
708+ return DataSpecUtils::partialMatch (spec, o2::header::DataOrigin (" TFN" ));
709+ });
710+ dec.isDangling [std::distance (dec.outputsInputs .begin (), it)] = false ;
711+ }
712+ }
713+
715714void WorkflowHelpers::constructGraph (const WorkflowSpec& workflow,
716715 std::vector<DeviceConnectionEdge>& logicalEdges,
717716 std::vector<OutputSpec>& outputs,
0 commit comments