From a294857eedad548ed0890ff2d8d4d08f8deadb20 Mon Sep 17 00:00:00 2001 From: Marco Giacalone Date: Mon, 12 Oct 2026 10:13:28 +0200 Subject: [PATCH] Skip combined device creation for empty spec list in DigitizerWorkflow With --combine-devices, specCombiner() is called unconditionally for digitizerSpecs and for writerSpecs, but when a collection is empty the result is a combined device with no sub-tasks: DPL sees a device with no inputs, injects a Lifetime::Enumeration input (WorkflowHelpers.cxx) and can elect it as the CCDB/DISTSUBTIMEFRAME source. No digits are produced, and since the enumeration is unbounded there is no EOS either, meaning that the workflow hangs forever instead of failing. This is reached with --onlyDet FT0,CTP, where the FT0 digitizer and the CTP digitizer are pushed to specs directly and only the FT0 digit writer goes to writerSpecs, leaving digitizerSpecs empty. In anchored MC that is the detector group of any run taken without both FV0 and EMCAL, such as run 537401, where the problem was found. --- .../DigitizerWorkflow/src/SimpleDigitizerWorkflow.cxx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Steer/DigitizerWorkflow/src/SimpleDigitizerWorkflow.cxx b/Steer/DigitizerWorkflow/src/SimpleDigitizerWorkflow.cxx index b38fd9e1d0134..e8ae6d6affb3d 100644 --- a/Steer/DigitizerWorkflow/src/SimpleDigitizerWorkflow.cxx +++ b/Steer/DigitizerWorkflow/src/SimpleDigitizerWorkflow.cxx @@ -850,8 +850,15 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) } } else { std::vector remaining; - specs.push_back(specCombiner("Digitizations", digitizerSpecs, remaining)); - specs.push_back(specCombiner("Writers", writerSpecs, remaining)); + // Skip combined device creation for an empty collection as specCombiner would + // return a device with no sub-tasks. This problem was discovered with run 537401 where both FT0,CTP detectors + // bypass digitizerSpecs and FV0 and EMC are not included in the run. + if (!digitizerSpecs.empty()) { + specs.push_back(specCombiner("Digitizations", digitizerSpecs, remaining)); + } + if (!writerSpecs.empty()) { + specs.push_back(specCombiner("Writers", writerSpecs, remaining)); + } for (auto& s : remaining) { specs.push_back(s); }