From c31478fcf8fd804a71463d2576ed4fd7cb736c88 Mon Sep 17 00:00:00 2001
From: payno <henri.payno@esrf.fr>
Date: Fri, 21 Feb 2025 12:11:29 +0100
Subject: [PATCH] FutureSupervisorTask: use 'TomwerOneThreadPerRun' instead of
 'TomwerWithStack'

---
 .../tomwer/orange/managedprocess.py           | 14 ++++++++++-
 .../widgets/cluster/FutureSupervisorOW.py     | 12 ++++++++--
 src/tomwer/tasks/cluster/supervisor.py        | 23 ++++++++++++++++++-
 3 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/src/orangecontrib/tomwer/orange/managedprocess.py b/src/orangecontrib/tomwer/orange/managedprocess.py
index 2d9d47a8d0..9ba7a99e86 100644
--- a/src/orangecontrib/tomwer/orange/managedprocess.py
+++ b/src/orangecontrib/tomwer/orange/managedprocess.py
@@ -3,7 +3,10 @@ from __future__ import annotations
 import functools
 import logging
 
-from ewoksorange.bindings import OWEwoksWidgetWithTaskStack
+from ewoksorange.bindings import (
+    OWEwoksWidgetWithTaskStack,
+    OWEwoksWidgetOneThreadPerRun,
+)
 from ewoksorange.bindings.owwidgets import invalid_data
 from orangewidget.widget import OWBaseWidget
 from processview.core.manager import DatasetState, ProcessManager
@@ -91,3 +94,12 @@ class TomwerWithStack(
                 channel.send(None)  # or channel.invalidate?
             else:
                 channel.send(var.value)
+
+
+class TomwerOneThreadPerRun(
+    OWEwoksWidgetOneThreadPerRun, _SuperviseMixIn, WidgetLongProcessing, openclass=True
+):
+
+    def setCaption(self, caption):
+        OWBaseWidget.setCaption(self, caption)
+        _SuperviseMixIn.setCaption(self, caption=caption)
diff --git a/src/orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py b/src/orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py
index 0b831341f1..2f51787d64 100644
--- a/src/orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py
+++ b/src/orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py
@@ -5,7 +5,7 @@ import time
 from orangewidget import gui
 
 # from orangewidget.widget import Input, Output, OWBaseWidget
-from orangecontrib.tomwer.orange.managedprocess import TomwerWithStack
+from orangecontrib.tomwer.orange.managedprocess import TomwerOneThreadPerRun
 from ewokscore.missing_data import MISSING_DATA
 from ewoksorange.gui.orange_imports import Input
 
@@ -22,7 +22,7 @@ from tomwer.tasks.cluster.supervisor import FutureSupervisorTask
 
 
 class FutureSupervisorOW(
-    TomwerWithStack,
+    TomwerOneThreadPerRun,
     ewokstaskclass=FutureSupervisorTask,
 ):
     """
@@ -51,6 +51,8 @@ class FutureSupervisorOW(
     want_control_area = False
     resizing_enabled = True
 
+    _ewoks_inputs_to_hide_from_orange = ("process_id",)
+
     class Inputs:
         # redefine the input to allow multiple and default
         future_tomo_obj = Input(
@@ -93,6 +95,12 @@ class FutureSupervisorOW(
         # required because today ewoksorange is not handling multiple inputs
         self.set_dynamic_input("future_tomo_obj", future_tomo_obj)
 
+    def _output_changed(self):
+        future_tomo_obj_to_remove = self.get_task_outputs().get("future_tomo_obj", None)
+        if future_tomo_obj_to_remove:
+            self._widget.removeFutureTomoObj(future_tomo_obj_to_remove.value)
+        return super()._output_changed()
+
 
 class FutureTomwerObjectObserverWidget(
     _FutureTomwerScanObserverWidget, SuperviseProcess
diff --git a/src/tomwer/tasks/cluster/supervisor.py b/src/tomwer/tasks/cluster/supervisor.py
index 18cac6e701..a965196af8 100644
--- a/src/tomwer/tasks/cluster/supervisor.py
+++ b/src/tomwer/tasks/cluster/supervisor.py
@@ -10,6 +10,8 @@ from tomwer.core.scan.scanbase import TomwerScanBase
 from tomwer.core.drac.processeddataset import DracReconstructedVolumeDataset
 from tomwer.core.volume.volumebase import TomwerVolumeBase
 from tomwer.core.volume.volumefactory import VolumeFactory
+from ewokscore import missing_data
+
 from processview.core.manager import DatasetState, ProcessManager
 
 
@@ -19,7 +21,13 @@ _logger = logging.getLogger()
 class FutureSupervisorTask(
     EwoksTask,
     input_names=("future_tomo_obj",),
-    output_names=("data", "volume", "data_portal_processed_datasets", "process_id"),
+    optional_input_names=("process_id",),
+    output_names=(
+        "data",
+        "volume",
+        "data_portal_processed_datasets",
+        "future_tomo_obj",
+    ),
 ):
     """
     Task used to wait for a 'FutureTomwerObject' and convert it to original instance of:
@@ -81,6 +89,7 @@ class FutureSupervisorTask(
             self.outputs.volume = tomo_obj
             self.outputs.data_portal_processed_datasets = ()
             self.outputs.data = None
+        self.outputs.future_tomo_obj = future_tomo_obj
 
         if process is not None:
             ProcessManager().notify_dataset_state(
@@ -88,3 +97,15 @@ class FutureSupervisorTask(
                 process=process,
                 state=DatasetState.SUCCEED,
             )
+
+    @property
+    def succeeded(self):
+        """Completed without exception and with output values"""
+        return not (
+            (
+                missing_data.is_missing_data(self.outputs.data)
+                or missing_data.is_missing_data(self.outputs.volume)
+            )
+        ) and not missing_data.is_missing_data(
+            self.outputs.data_portal_processed_datasets
+        )
-- 
GitLab