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