tomwer 1.4.7__py3-none-any.whl → 1.4.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,30 +1,54 @@
1
- from __future__ import annotations
1
+ # coding: utf-8
2
+ # /*##########################################################################
3
+ #
4
+ # Copyright (c) 2016-2017 European Synchrotron Radiation Facility
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+ #
24
+ # ###########################################################################*/
25
+
26
+ __authors__ = ["H. Payno"]
27
+ __license__ = "MIT"
28
+ __date__ = "14/10/2021"
29
+
2
30
 
3
31
  import time
4
32
 
5
33
  from orangewidget import gui
6
-
7
- # from orangewidget.widget import Input, Output, OWBaseWidget
8
- from orangecontrib.tomwer.orange.managedprocess import TomwerWithStackStack
9
- from ewokscore.missing_data import MISSING_DATA
10
- from ewoksorange.gui.orange_imports import Input
11
-
34
+ from orangewidget.settings import Setting
35
+ from orangewidget.widget import Input, Output, OWBaseWidget
12
36
  from processview.core.manager import DatasetState, ProcessManager
13
37
  from processview.core.superviseprocess import SuperviseProcess
14
38
  from silx.gui import qt
15
39
  from silx.gui.utils.concurrent import submitToQtMainThread
16
40
 
17
41
  from tomwer.core.futureobject import FutureTomwerObject
42
+ from tomwer.core.scan.scanbase import TomwerScanBase
43
+ from tomwer.core.volume.volumebase import TomwerVolumeBase
18
44
  from tomwer.gui.cluster.supervisor import (
19
45
  FutureTomwerScanObserverWidget as _FutureTomwerScanObserverWidget,
20
46
  )
21
- from tomwer.core.process.cluster.supervisor import FutureSupervisorTask
47
+ from tomwer.core.process.drac.processeddataset import DracReconstructedVolumeDataset
48
+ from tomwer.core.volume.volumefactory import VolumeFactory
22
49
 
23
50
 
24
- class FutureSupervisorOW(
25
- TomwerWithStackStack,
26
- ewokstaskclass=FutureSupervisorTask,
27
- ):
51
+ class FutureSupervisorOW(OWBaseWidget, openclass=True):
28
52
  """
29
53
  Orange widget to define a slurm cluster as input of other
30
54
  widgets (based on nabu for now)
@@ -51,9 +75,10 @@ class FutureSupervisorOW(
51
75
  want_control_area = False
52
76
  resizing_enabled = True
53
77
 
78
+ _ewoks_default_inputs = Setting(dict())
79
+
54
80
  class Inputs:
55
- # redefine the input to allow multiple and default
56
- future_tomo_obj = Input(
81
+ future_in = Input(
57
82
  name="future_tomo_obj",
58
83
  type=FutureTomwerObject,
59
84
  doc="data with some remote processing",
@@ -61,6 +86,15 @@ class FutureSupervisorOW(
61
86
  default=True,
62
87
  )
63
88
 
89
+ class Outputs:
90
+ data = Output(name="data", type=TomwerScanBase)
91
+ volume = Output(name="volume", type=TomwerVolumeBase)
92
+ data_portal_processed_datasets = Output(
93
+ name="data_portal_processed_datasets",
94
+ type=tuple,
95
+ doc="data portal processed data to be saved",
96
+ )
97
+
64
98
  def __init__(self, parent=None):
65
99
  super().__init__(parent)
66
100
  # gui
@@ -92,29 +126,36 @@ class FutureSupervisorOW(
92
126
  raise TypeError(
93
127
  f"future_tomo_obj is expected to be an instance of {FutureTomwerObject} and not {type(future_tomo_obj)}"
94
128
  )
95
- self._widget.removeFutureTomoObj(future_tomo_obj=future_tomo_obj)
96
- self.execute_ewoks_task()
97
-
98
- def handleNewSignals(self) -> None:
99
- """Invoked by the workflow signal propagation manager after all
100
- signals handlers have been called.
101
-
102
- note: this widget can receive two signals: 'dataset' and 'colormap'. The 'colormap' is handled by
103
- orange directly while the 'dataset' signal is handled by the ewoks task.
104
- This function will be only triggered when the 'dataset' signal is send
105
- """
106
- # update GUI from received future_tomo_obj
107
- # warning: this code will work because the task has only one input.
108
- # so we can pass it directly to the widget.
109
- # this won't be the case the task can have several input.
110
- future_tomo_obj = self.get_task_input_value("future_tomo_obj", MISSING_DATA)
111
- if future_tomo_obj is not MISSING_DATA:
112
- self._widget.addFutureTomoObj(future_tomo_obj=future_tomo_obj)
129
+ self._futureHasBeenConverted(future_tomo_obj, future_tomo_obj.tomo_obj)
113
130
 
114
- @Inputs.future_tomo_obj
131
+ @Inputs.future_in
115
132
  def add(self, future_tomo_obj, signal_id=None):
116
- # required because today ewoksorange is not handling multiple inputs
117
- self.set_dynamic_input("future_tomo_obj", future_tomo_obj)
133
+ if future_tomo_obj is not None:
134
+ self._widget.addFutureTomoObj(future_tomo_obj=future_tomo_obj)
135
+
136
+ def _futureHasBeenConverted(self, future_tomo_obj, tomo_obj):
137
+ # clean client to free resources
138
+ self._widget.removeFutureTomoObj(future_tomo_obj=future_tomo_obj)
139
+ if tomo_obj is not None:
140
+ if isinstance(tomo_obj, TomwerScanBase):
141
+ self.Outputs.data.send(tomo_obj)
142
+
143
+ def build_drac_dataset(vol_id):
144
+ volume = VolumeFactory.create_tomo_object_from_identifier(vol_id)
145
+ return DracReconstructedVolumeDataset(
146
+ tomo_obj=volume,
147
+ source_scan=tomo_obj,
148
+ )
149
+
150
+ self.Outputs.data_portal_processed_datasets = tuple(
151
+ [
152
+ build_drac_dataset(vol_id=vol_id)
153
+ for vol_id in tomo_obj.latest_vol_reconstructions
154
+ ]
155
+ )
156
+
157
+ elif isinstance(tomo_obj, TomwerVolumeBase):
158
+ self.Outputs.volume.send(tomo_obj)
118
159
 
119
160
 
120
161
  class FutureTomwerObjectObserverWidget(
@@ -13,6 +13,9 @@ from tomwer.core.cluster.cluster import SlurmClusterConfiguration
13
13
  from tomwer.core.futureobject import FutureTomwerObject
14
14
  from tomwer.core.scan.scanbase import TomwerScanBase
15
15
  from tomwer.core.volume.volumebase import TomwerVolumeBase
16
+ from tomwer.core.process.drac.processeddataset import (
17
+ DracReconstructedVolumeDataset,
18
+ )
16
19
  from tomwer.gui.reconstruction.nabu.castvolume import CastVolumeWidget
17
20
  from tomwer.gui.utils.qt_utils import block_signals
18
21
 
@@ -101,6 +104,11 @@ class CastNabuVolumeOW(WidgetLongProcessing, SuperviseOW):
101
104
  type=FutureTomwerObject,
102
105
  doc="future object (process remotely)",
103
106
  )
107
+ data_portal_processed_datasets = Output(
108
+ name="data_portal_processed_datasets",
109
+ type=tuple,
110
+ doc="data portal processed data to be saved",
111
+ )
104
112
 
105
113
  def __init__(self, parent=None):
106
114
  """ """
@@ -193,11 +201,28 @@ class CastNabuVolumeOW(WidgetLongProcessing, SuperviseOW):
193
201
  if future_tomo_obj is not None:
194
202
  self.Outputs.future_tomo_obj.send(future_tomo_obj)
195
203
  if obj is not None:
204
+ scan = None
196
205
  if isinstance(obj, TomwerScanBase):
206
+ # case the input object was a scan (expected)
197
207
  self.Outputs.data.send(obj)
208
+ scan = obj
198
209
  elif isinstance(obj, TomwerVolumeBase):
210
+ # case the input object was a volume
199
211
  self.Outputs.volume.send(obj)
200
212
  # for now we store a cast_volume to the object but this is not very well design.
201
213
  # I guess this will be removed once we move to ewoks or we need to redesign the stack approach
202
214
  if obj.cast_volume is not None:
215
+ assert isinstance(obj.cast_volume, TomwerVolumeBase)
203
216
  self.Outputs.cast_volume.send(obj.cast_volume)
217
+
218
+ if scan is not None:
219
+ # case the input object was a scan and we have succeeded to cast the volume
220
+ # then we can publish to the data portal
221
+ icatReconstructedDataset = DracReconstructedVolumeDataset(
222
+ tomo_obj=obj.cast_volume,
223
+ source_scan=scan,
224
+ )
225
+
226
+ self.Outputs.data_portal_processed_datasets.send(
227
+ (icatReconstructedDataset,)
228
+ )
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from importlib.metadata import version as get_version
3
4
  import tomoscan.version
4
5
 
5
6
  import ewokscore
@@ -7,6 +8,7 @@ import ewoksorange
7
8
  import tomwer.version
8
9
  import sluurp
9
10
 
11
+
10
12
  try:
11
13
  import nxtomomill.version
12
14
  except ImportError:
@@ -40,8 +42,15 @@ def get_tomotools_stack_versions() -> dict[str, str]:
40
42
  if has_nxtomomill:
41
43
  stack["nxtomomill"] = nxtomomill.version.version
42
44
  stack["tomoscan"] = tomoscan.version.version
43
- stack["ewokscore"] = ewokscore.__version__
44
- stack["ewoksorange"] = ewoksorange.__version__
45
+ try:
46
+ stack["ewokscore"] = ewokscore.__version__
47
+ except AttributeError:
48
+ stack["ewokscore"] = get_version("ewokscore")
49
+
50
+ try:
51
+ stack["ewoksorange"] = ewoksorange.__version__
52
+ except AttributeError:
53
+ stack["ewoksorange"] = get_version("ewoksorange")
45
54
  stack["sluurp"] = sluurp.__version__
46
55
 
47
56
  return stack
@@ -257,7 +257,7 @@ def send_signal_to_local_rpc_servers(signal, port: int, extended_find: bool = Tr
257
257
  proc.send_signal(signal)
258
258
  found = True
259
259
  return
260
- except (psutil.PermissionError, psutil.AccessDenied):
260
+ except (PermissionError, psutil.AccessDenied):
261
261
  pass
262
262
  if not extended_find:
263
263
  return
@@ -272,5 +272,5 @@ def send_signal_to_local_rpc_servers(signal, port: int, extended_find: bool = Tr
272
272
  f"process pid: {proc.pid} - {proc.name()} seems to be one occupying port {port}"
273
273
  )
274
274
  return
275
- except (psutil.PermissionError, psutil.AccessDenied):
275
+ except (PermissionError, psutil.AccessDenied):
276
276
  pass
@@ -10,6 +10,9 @@ from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
10
10
  from tomwer.core.process.reconstruction.output import (
11
11
  PROCESS_FOLDER_RECONSTRUCTED_VOLUMES,
12
12
  )
13
+ from tomwer.core.process.reconstruction.output import (
14
+ PROCESS_FOLDER_CAST_VOLUME,
15
+ )
13
16
 
14
17
 
15
18
  __all__ = ["DracReconstructedVolumeDataset"]
@@ -145,3 +148,14 @@ class DracReconstructedVolumeDataset(DracDatasetBase):
145
148
  axis_folder,
146
149
  f"{basename}_capture_{axis.value}_{str(slice_index).zfill(6)}",
147
150
  )
151
+
152
+
153
+ class DracCastReconstructedVolume(DracReconstructedVolumeDataset):
154
+ """
155
+ Class to associate casted - reconstructed volume(s) to an drac (processed) dataset
156
+ """
157
+
158
+ @property
159
+ def dataset_name(self) -> str:
160
+ """name to give to the drac (processed) dataset."""
161
+ return PROCESS_FOLDER_CAST_VOLUME
@@ -28,11 +28,17 @@ from tomwer.core.utils.slurm import get_slurm_script_name
28
28
  from tomwer.core.utils.volumeutils import volume_identifier_to_volume
29
29
  from tomwer.core.volume.volumebase import TomwerVolumeBase
30
30
  from tomwer.core.volume.volumefactory import VolumeFactory
31
+ from tomwer.core.process.drac.processeddataset import (
32
+ DracReconstructedVolumeDataset,
33
+ )
31
34
 
32
35
  _logger = logging.getLogger(__name__)
33
36
 
37
+ CAST_VOLUME_WORKING_SUB_DIRECTORY = "cast_volume"
34
38
 
35
- DEFAULT_OUTPUT_DIR = "{volume_data_parent_folder}/cast_volume"
39
+ DEFAULT_OUTPUT_DIR = (
40
+ "{volume_data_parent_folder}" f"/{CAST_VOLUME_WORKING_SUB_DIRECTORY}"
41
+ )
36
42
 
37
43
 
38
44
  class CastVolumeTask(
@@ -46,6 +52,7 @@ class CastVolumeTask(
46
52
  output_names=(
47
53
  "volume",
48
54
  "future_tomo_obj",
55
+ "data_portal_processed_datasets",
49
56
  ),
50
57
  ):
51
58
  def __init__(
@@ -176,6 +183,7 @@ class CastVolumeTask(
176
183
  scan.cast_volume = output_volume.get_identifier()
177
184
  else:
178
185
  input_volume.cast_volume = output_volume.get_identifier()
186
+ self.outputs.data_portal_processed_datasets = tuple()
179
187
  # run volume cast remotely
180
188
  else:
181
189
 
@@ -186,7 +194,7 @@ class CastVolumeTask(
186
194
  )
187
195
  if overwrite:
188
196
  command += " --overwrite"
189
- command += f" --output_type={str(output_data_type)}"
197
+ command += f" --output-data-type={str(output_data_type)}"
190
198
  if data_min is not None:
191
199
  command += f" --data_min={data_min}"
192
200
  if data_max is not None:
@@ -230,6 +238,14 @@ class CastVolumeTask(
230
238
  )
231
239
  self.outputs.volume = output_volume
232
240
 
241
+ if scan is not None:
242
+ drac_reconstructed_dataset = DracReconstructedVolumeDataset(
243
+ tomo_obj=output_volume,
244
+ source_scan=scan,
245
+ )
246
+ self.outputs.data_portal_processed_datasets = (
247
+ drac_reconstructed_dataset,
248
+ )
233
249
  # for now at the task level we consider this is succeed if it has been submitted
234
250
  ProcessManager().notify_dataset_state(
235
251
  dataset=scan or input_volume,
@@ -16,6 +16,8 @@ PROCESS_FOLDER_RECONSTRUCTED_VOLUMES = "reconstructed_volumes"
16
16
 
17
17
  PROCESS_FOLDER_RECONSTRUCTED_SLICES = "reconstructed_slices"
18
18
 
19
+ PROCESS_FOLDER_CAST_VOLUME = "cast_volume"
20
+
19
21
 
20
22
  class NabuOutputFileFormat(_Enum):
21
23
  TIFF = "tiff"
@@ -0,0 +1,64 @@
1
+ # coding: utf-8
2
+ from __future__ import annotations
3
+
4
+ import shutil
5
+ import tempfile
6
+ import unittest
7
+
8
+ from tomoscan.io import HDF5File, get_swmr_mode
9
+
10
+ from tomwer.core.process.task import Task
11
+ from tomwer.core.utils.scanutils import MockNXtomo
12
+
13
+
14
+ class TestProcessRegistration(unittest.TestCase):
15
+ """
16
+ Make sure utils link to the process registration are
17
+ correctly working
18
+ """
19
+
20
+ class DummyProcess(Task):
21
+ @staticmethod
22
+ def program_name():
23
+ """Name of the program used for this processing"""
24
+ return "dummy program"
25
+
26
+ @staticmethod
27
+ def program_version():
28
+ """version of the program used for this processing"""
29
+ return "0.0.0"
30
+
31
+ @staticmethod
32
+ def definition():
33
+ """definition of the process"""
34
+ return "no definition"
35
+
36
+ def setUp(self):
37
+ self.tmp_dir = tempfile.mkdtemp()
38
+ self.scan = MockNXtomo(scan_path=self.tmp_dir, n_proj=2).scan
39
+
40
+ def tearDown(self):
41
+ shutil.rmtree(self.tmp_dir)
42
+
43
+ def testGetProcessNodes(self):
44
+ """insure it return the last dark process based on the processing index"""
45
+
46
+ for i in range(20):
47
+ Task._register_process(
48
+ self.scan.process_file,
49
+ process=self.DummyProcess,
50
+ entry=self.scan.entry,
51
+ configuration=None,
52
+ results={"output": i},
53
+ process_index=i,
54
+ )
55
+
56
+ with HDF5File(self.scan.process_file, "r", swmr=get_swmr_mode()) as h5f:
57
+ nodes = Task._get_process_nodes(
58
+ root_node=h5f[self.scan.entry], process=self.DummyProcess
59
+ )
60
+ self.assertEqual(len(nodes), 20)
61
+ self.assertTrue("/entry/tomwer_process_16" in nodes)
62
+ self.assertEqual(nodes["/entry/tomwer_process_16"], 16)
63
+ self.assertTrue("/entry/tomwer_process_1" in nodes)
64
+ self.assertEqual(nodes["/entry/tomwer_process_1"], 1)
tomwer/core/settings.py CHANGED
@@ -90,7 +90,7 @@ class SlurmSettingsMode(_Enum):
90
90
  class SlurmSettings:
91
91
  # Default slurm cluster configuration
92
92
 
93
- N_CORES_PER_TASK = 4
93
+ N_CORES_PER_TASK = 16
94
94
  """Number of CPU per worker"""
95
95
 
96
96
  N_TASKS = 1
@@ -130,13 +130,13 @@ class DefaultSlurmSettingsCastVolume(SlurmSettings):
130
130
  default proposed configuration for casting a volume remotely
131
131
  """
132
132
 
133
- N_GPUS_PER_WORKER = 0
133
+ N_JOBS = 1
134
134
 
135
- N_CORES_PER_TASK = 8
135
+ N_GPUS_PER_WORKER = 0
136
136
 
137
137
  MEMORY_PER_WORKER = 128 # memory in GB
138
138
 
139
- PARTITION = "nice-long"
139
+ PARTITION = "nice"
140
140
 
141
141
 
142
142
  class DefaultSlurmSettingsSliceReconstruction(SlurmSettings):
@@ -144,19 +144,15 @@ class DefaultSlurmSettingsSliceReconstruction(SlurmSettings):
144
144
  default proposed configuration for reconstructing a single slice remotely
145
145
  """
146
146
 
147
- MEMORY_PER_WORKER = 256 # memory in GB
148
-
149
- PARTITION = None
147
+ N_JOBS = 1
150
148
 
149
+ N_GPUS_PER_WORKER = 1
151
150
 
152
- class DefaultSlurmSettingsVolumeReconstruction(SlurmSettings):
153
- """
154
- default proposed configuration for reconstructing a full volume remotely
155
- """
151
+ MEMORY_PER_WORKER = 220 # memory in GB
156
152
 
157
- MEMORY_PER_WORKER = 256 # memory in GB
158
153
 
159
- PARTITION = None
154
+ class DefaultSlurmSettingsVolumeReconstruction(DefaultSlurmSettingsSliceReconstruction):
155
+ pass
160
156
 
161
157
 
162
158
  class DefaultSlurmSettingsStitching(SlurmSettings):
@@ -164,8 +160,10 @@ class DefaultSlurmSettingsStitching(SlurmSettings):
164
160
  default proposed configuration for stitching
165
161
  """
166
162
 
167
- N_JOBS = 15
163
+ N_CORES_PER_TASK = 8
168
164
 
169
- PARTITION = "nice-long"
165
+ N_JOBS = 16
170
166
 
171
167
  N_GPUS_PER_WORKER = 0
168
+
169
+ PARTITION = "nice"
@@ -0,0 +1,42 @@
1
+ """
2
+ Contains task to clear reduced dark and flat frames
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ from tomoscan.scanbase import TomoScanBase as TomoscanScanBase
8
+
9
+ from processview.core.manager import DatasetState, ProcessManager
10
+ from processview.core.superviseprocess import SuperviseProcess
11
+
12
+ from tomwer.tasks.task import Task
13
+ from tomwer.core.scan.scanbase import TomwerScanBase
14
+ from tomwer.core.scan.scanfactory import ScanFactory
15
+ from tomwer.core.utils.scanutils import data_identifier_to_scan
16
+ from tomwer.core.reconstruction.darkflat import params as dkrf_reconsparams
17
+ from tomwer.utils import docstring
18
+
19
+
20
+ class ClearReducedDarkAndFlat(
21
+ Task,
22
+ SuperviseProcess,
23
+ input_names=("data",),
24
+ output_names=("data",),
25
+ ):
26
+ """
27
+ Task to clear reduced darks and flats. Both on disk and on the object cache.
28
+ th goal of this task is to make sure the scan is cleared of any reduced frames to reprocess it later.
29
+ """
30
+
31
+ def run(self):
32
+ scan = self.inputs.data
33
+ if not isinstance(scan, TomoscanScanBase):
34
+ raise TypeError(
35
+ f"scan should be an instance of {TomoscanScanBase}. Got {type(scan)}"
36
+ )
37
+ scan.set_reduced_flats(None)
38
+ scan.reduced_flats_infos = None
39
+ scan.set_reduced_darks(None)
40
+ scan.reduced_darks_infos = None
41
+
42
+ self.outputs.data = scan
tomwer/version.py CHANGED
@@ -77,7 +77,7 @@ RELEASE_LEVEL_VALUE = {
77
77
 
78
78
  MAJOR = 1
79
79
  MINOR = 4
80
- MICRO = 7
80
+ MICRO = 9
81
81
  RELEV = "final" # <16
82
82
  SERIAL = 0 # <16
83
83
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tomwer
3
- Version: 1.4.7
3
+ Version: 1.4.9
4
4
  Summary: "tomography workflow tools"
5
5
  Home-page: https://gitlab.esrf.fr/tomotools/tomwer
6
6
  Author: Henri Payno, Pierre Paleo, Pierre-Olivier Autran, Jérôme Lesaint, Alessandro Mirone
@@ -26,7 +26,7 @@ orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows,sha256=kFGXGxc3eW7i
26
26
  orangecontrib/tomwer/tutorials/id16b/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  orangecontrib/tomwer/widgets/__init__.py,sha256=dX_TpkBh3mVsrj3EeGglEESsnZAEVq7V0Nb9bnBrb-8,1214
28
28
  orangecontrib/tomwer/widgets/utils.py,sha256=yq1wZfpfY3iVAhwMRBls57q02lhljO89WRKN7MxMMNg,983
29
- orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py,sha256=uvtstSQ3rRB_T0f734zPEZEelUQRe9btkjP7PJfj8zk,8176
29
+ orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py,sha256=iFbgx5SeztXfxomL488rnR2MQJIS1OGSOTmsEKuEMa4,9865
30
30
  orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py,sha256=L_fX3EFyyx71Fg-FI8ab34ZPSUzrwKGJLcS2FnYCY_c,2565
31
31
  orangecontrib/tomwer/widgets/cluster/__init__.py,sha256=vOOJnIIaLWAj8tnxD9MRzWDyYgk-cyuBsN7QQ5FrIoQ,385
32
32
  orangecontrib/tomwer/widgets/cluster/icons/slurm.png,sha256=C-YBLwXCnh0oo4nvEt80WxX_jKYGUAFpWMUSlzt6ke0,1995
@@ -148,7 +148,7 @@ orangecontrib/tomwer/widgets/other/icons/hub.png,sha256=wnKSaxw2WnBkSQjI86aLZfdm
148
148
  orangecontrib/tomwer/widgets/other/icons/hub.svg,sha256=9EYoBKY-P-cO17nM48OPA9VDZSCbyGtrMRc80BGHflk,3735
149
149
  orangecontrib/tomwer/widgets/other/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
150
  orangecontrib/tomwer/widgets/reconstruction/AxisOW.py,sha256=Qz6r34NdNgBvn-UwbIhPQDDCgtlXa_rSLnCEIuI_mrQ,20067
151
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py,sha256=E9hTJH_WfMsbOpKsGworVkqc16kWIRL1ajZbpnT_IAI,7614
151
+ orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py,sha256=sqpWF769TJ07ApEMqdz0BUWiXoKnZ8k2Fg1yfBaqdIc,8668
152
152
  orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py,sha256=flRgeOXimjzKEtL6h-0hwaa04G-BqMydv0Ju5r0Reao,9696
153
153
  orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py,sha256=NjMC0BEmPhDZ795Q-yyL81-hluAyGE8MRiq8xMdqAqY,6233
154
154
  orangecontrib/tomwer/widgets/reconstruction/NabuOW.py,sha256=UvCNwpAtQ1AdCl5kUw13QsKxesIDV8SIjIW9cWCXIMc,9946
@@ -219,7 +219,7 @@ orangecontrib/tomwer/widgets/visualization/tests/__init__.py,sha256=47DEQpj8HBSa
219
219
  tomwer/__init__.py,sha256=cMIyH-uRxpa9WVnAuWjiBD7k9TK57WO21RzP_S-Mb8I,460
220
220
  tomwer/__main__.py,sha256=7tCADiS4u7k1PCxFhlRAcYSIOpxQTGUTx8sCEQ-hi1E,8707
221
221
  tomwer/utils.py,sha256=7h7dEgKAEUmQ43jkULvC1B9Adl55nkCty-SEKUKCl4U,7008
222
- tomwer/version.py,sha256=kSCzrMOEuSMZFSQbR90fj1YYaNmCYltkc0D3FMs6UT0,4386
222
+ tomwer/version.py,sha256=2tlKJNuy_7mdqerRMwrXUS210Pm2p0BxM-HwT3_tfsU,4386
223
223
  tomwer/app/__init__.py,sha256=h1FKED7Tw5f99yikygt7ruXsdrxQhcJxO7kagLGxhJg,84
224
224
  tomwer/app/axis.py,sha256=lB-IZx1o6KTWLIelITvYCIu2flFTB9NhuIfD2MhUZZA,5826
225
225
  tomwer/app/canvas.py,sha256=y8rYOiwmv6ug7JcjgkOzEiGQnNXjKWNNmKofT0n8TFg,1538
@@ -249,14 +249,14 @@ tomwer/app/canvas_launcher/config.py,sha256=sLlsp7iy1s2IyxqvSohGbaOpPUP6syuj5P-8
249
249
  tomwer/app/canvas_launcher/environ.py,sha256=ljQyPL_u9ai1CWmmq8uGHbn437CZWyX4uJtrDIyabGk,2453
250
250
  tomwer/app/canvas_launcher/mainwindow.py,sha256=KZzbY3AuHITdaS8K4jG2QomD5DEgQqHRYcIe9hymC9g,22283
251
251
  tomwer/app/canvas_launcher/splash.py,sha256=cpUuZVKwlQbeAWfAqjpjP4q1v1MmkfxU6WWllLSVZo8,508
252
- tomwer/app/canvas_launcher/utils.py,sha256=4zWaao2EW5OcKomAw38YUIUgOLfkUPGdPCqLsfD1NMI,1031
252
+ tomwer/app/canvas_launcher/utils.py,sha256=WfsCHAhiiv4-TUNodgyKJenVvmFWnxsy5OBwTBK2jKE,1279
253
253
  tomwer/app/canvas_launcher/widgetsscheme.py,sha256=9Or1KMmSxIs_dJmJGV0Xhjg9HH4m8aPGbtiEuK2i6q0,2744
254
254
  tomwer/app/stitching/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
255
255
  tomwer/app/stitching/common.py,sha256=TCXNnAz2MSJrrogB5iWptktxq-g5ED2FUt_jMnDXpnQ,14723
256
256
  tomwer/core/__init__.py,sha256=-EtD8J-a7WVnCgYS7WHkisYn61iM2PpHWcXwE5BetJ8,71
257
257
  tomwer/core/futureobject.py,sha256=8Sd9gOrdhYc0PvzPeZPBNOmaHuwB5epG6RJyABRsCmQ,5113
258
258
  tomwer/core/resourcemanager.py,sha256=VLNnVodMa-HOMZhN2qpUR_L6phJ8IHPUEPYMxuW6VHg,1067
259
- tomwer/core/settings.py,sha256=57qD44LU_3eB50rD7RHdg5nBweiHerzWbXHcBUna6gY,4089
259
+ tomwer/core/settings.py,sha256=xMlOdWeNJxNsi0_qfMXZI8lrzjeRRDftGtT3lFpjFL8,3992
260
260
  tomwer/core/signal.py,sha256=I5TUcyeBZzrEh1SFGs-ylJSL1aBs41ZFb3IJo3O_55c,6115
261
261
  tomwer/core/tomwer_object.py,sha256=rIaD1QlN3Q0cR5h9Sap1Whn4lawu5z9zZ1KspdhYbg0,2023
262
262
  tomwer/core/cluster/__init__.py,sha256=w58VJZaGwC-8hwHLADeJrW9-rs-PrVz6few3AqpScqQ,116
@@ -286,7 +286,7 @@ tomwer/core/process/control/tomoobjseries.py,sha256=_fiVup4ugH5BAC6HwkIziA0QweEu
286
286
  tomwer/core/process/control/volumeselector.py,sha256=0uv1Q8k5Ms1h_iU-ldhb-Y35xsy1kHwQrbUQguV5M_A,370
287
287
  tomwer/core/process/control/datalistener/__init__.py,sha256=gSEeJEDX8E-8HzY7tmPc32QKfqSZHG4Ad06IxDrzOWo,52
288
288
  tomwer/core/process/control/datalistener/datalistener.py,sha256=kNDTIeMhJ6n019b2XWoGoB8zDCv-zpVxE7YDzZR9KBM,9606
289
- tomwer/core/process/control/datalistener/rpcserver.py,sha256=LS_4Uwuj7T9ADLSE8sr6i5KacaTVxQI_VxqPpz5dsUU,9569
289
+ tomwer/core/process/control/datalistener/rpcserver.py,sha256=JkEmWB1kRzjaXPqzEu-tWN87SlK3uuk3gN7la42wSF0,9555
290
290
  tomwer/core/process/control/datawatcher/__init__.py,sha256=F9d_bGOr5iAPEfnKaf5XOEwQSR1wZp_wkzcDYNSuin4,50
291
291
  tomwer/core/process/control/datawatcher/datawatcher.py,sha256=UmOEW9vA3jJ93R1QcVRisknB_S2j0Nfsc7477VjwThE,15265
292
292
  tomwer/core/process/control/datawatcher/datawatcherobserver.py,sha256=q7ZB9WMWSyeEUtuU9SKuvJ80eBlFzLUC31NlLIYfWfk,24197
@@ -303,7 +303,7 @@ tomwer/core/process/drac/binning.py,sha256=uWIyAzQMhUjh5d74DUnbDgjRv4zMZtdbi6U0W
303
303
  tomwer/core/process/drac/dracbase.py,sha256=_EYcZscvNpLpSc6cuy6nmNKYWo2C8u6Ke_oXrLjOBiM,5639
304
304
  tomwer/core/process/drac/gallery.py,sha256=bQosh4xbTWj8Vn_vqepyJ1QMfLcVGxh7uPJ0ysLtx5o,4790
305
305
  tomwer/core/process/drac/output.py,sha256=ySwvMigBVvtQqrkG67jq384uevVKeOX-Vd8E2urs_Lg,235
306
- tomwer/core/process/drac/processeddataset.py,sha256=yWFfb7-CeYwLm1g8hYt7zVRgV_XNHXzfONxYPW8me0A,5425
306
+ tomwer/core/process/drac/processeddataset.py,sha256=pp4uW249k7qFb1q1yZCtU1fbjoD9Y9onL5w3mOcxrWU,5839
307
307
  tomwer/core/process/drac/publish.py,sha256=S6UZ39Mv0I9A5bKQig5zohFenRPonu-oxK6DEUeAvD4,3845
308
308
  tomwer/core/process/drac/rawdataset.py,sha256=mB4sNTM1rx46n5whjIlY4xq1gz4_rbaS7yAS3QE2iT0,5175
309
309
  tomwer/core/process/drac/tests/test_gallery.py,sha256=WZaK42Y5S8sNrzgTToqctYvle8Xc1YBs3u6moei9ZMc,2319
@@ -316,7 +316,7 @@ tomwer/core/process/edit/nxtomoeditor.py,sha256=HUYInTVIUbqVtFXQKMCOpQ-tvgFz5w3U
316
316
  tomwer/core/process/edit/tests/test_darkflatpatch.py,sha256=0QOjUgiYkjuWDZvI5pkuiViK4HUJA5E2sXF5LXtf_vY,9366
317
317
  tomwer/core/process/edit/tests/test_imagekey_editor.py,sha256=ft-xDMRk6CRs7DehNEnh1uJ9gLKJ-SxZAb0GmsLek0w,2345
318
318
  tomwer/core/process/reconstruction/__init__.py,sha256=G_vePtIyh1WlXtcmOyQI3nRsP-F0bsaDSdLWHC0bVzo,159
319
- tomwer/core/process/reconstruction/output.py,sha256=_8kF_qhkXMW8f_u7xAi0u0KZLsD4GEiM6uaT7ZAco6g,4074
319
+ tomwer/core/process/reconstruction/output.py,sha256=LMVH71rybFR1j-DTCo48k5M3feKuLBq9jE4n01qJAec,4118
320
320
  tomwer/core/process/reconstruction/params_cache.py,sha256=GTchgCH1Db7fuYsSGxSF6wCTeV5grlYQh5ab198nmOk,1527
321
321
  tomwer/core/process/reconstruction/paramsbase.py,sha256=6PjFcO0yYs_apgv2MImGSDLsBgQ7UeK2TSBLz28HYgc,6344
322
322
  tomwer/core/process/reconstruction/axis/__init__.py,sha256=VSQkN6M6JvM_c55OiboNyJUW8Zs1wkkQgv1JYmzvIr8,80
@@ -332,7 +332,7 @@ tomwer/core/process/reconstruction/darkref/darkrefscopy.py,sha256=D0i__aTsEvfJg_
332
332
  tomwer/core/process/reconstruction/darkref/params.py,sha256=vrDN8bZu28E4zLuHJzNvIIyyZq-4yhX9k9itXYCJ2iM,8756
333
333
  tomwer/core/process/reconstruction/darkref/settings.py,sha256=35jliuOIjMKTOJjgn4uiotcDEr6RskpLHfRWWLm76dc,188
334
334
  tomwer/core/process/reconstruction/nabu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
- tomwer/core/process/reconstruction/nabu/castvolume.py,sha256=4VEVnJxWfG8_Ku2uhUSQAgGfvP_08mXswmC3bHU7E4M,9317
335
+ tomwer/core/process/reconstruction/nabu/castvolume.py,sha256=-tz0Kmf-3oJbWxPkFEZnvXTeF7dkiQKPaZ9qgcgD7MU,9950
336
336
  tomwer/core/process/reconstruction/nabu/helical.py,sha256=gauUkoPiShvnvMQrCQXv28g0yLe-GceML5kYMSXmNIg,1997
337
337
  tomwer/core/process/reconstruction/nabu/nabucommon.py,sha256=6jOdKpUW5MbRkf53evu4-ZBkQaNWMfl799-f0zQ9-1Q,24554
338
338
  tomwer/core/process/reconstruction/nabu/nabuscores.py,sha256=e5tRG1QtmVAdXb8KHMTMtBXA3KQXqKKcqipY2HzMURg,25275
@@ -416,6 +416,7 @@ tomwer/core/scan/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
416
416
  tomwer/core/scan/tests/test_edf.py,sha256=JI7wH5emdjlYl08OhmjIO_8mui7rHa-aRCUwmkCRyys,830
417
417
  tomwer/core/scan/tests/test_future_scan.py,sha256=tsF9p57dCOmW0fPyl6BP2lLSo0rRYRF6hSF-kryLMDM,848
418
418
  tomwer/core/scan/tests/test_nxtomoscan.py,sha256=w2mNuCsfWMl1b9jP_-vkTDkCD_z9oM02yx42f6-DzY8,4751
419
+ tomwer/core/scan/tests/test_process_registration.py,sha256=g4Toef92SjxCBUE82MTbjonFJpc3PQqfpF6FSCarN5U,1988
419
420
  tomwer/core/scan/tests/test_scan.py,sha256=mHFPi2Tc7Z2_5rWvAp3YmObVSTB5yi-sTkHm1iOJlDo,12228
420
421
  tomwer/core/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
421
422
  tomwer/core/tests/test_scanutils.py,sha256=xWwd1nycVDWmFaIaL2gQ_xxrUMhVCARaNHI2SxT9NOI,844
@@ -847,6 +848,7 @@ tomwer/synctools/tests/test_darkRefs.py,sha256=1OgWaV-hgDmi4rkh0hxjCW_codBAnxNhp
847
848
  tomwer/synctools/tests/test_foldertransfer.py,sha256=ZFIJWSjgYAWw3ktzamid5DJZNnMkAV6Pj72dKG69cJc,12024
848
849
  tomwer/synctools/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
849
850
  tomwer/synctools/utils/scanstages.py,sha256=vIUKVDSfM2UwPjjmZTiIN1tNg4antnGcSPv1aYapJCY,7830
851
+ tomwer/tasks/reconstruction/cleardarkflat.py,sha256=_V_x7W8vp1_AqqtQ9xk2VRgwlivn4IPTLEpWySjSZRE,1353
850
852
  tomwer/tests/__init__.py,sha256=dPPaIvpzHssjwxsMzYJM_gxQ2e0cnRyQHXxi9ux6ZOY,19
851
853
  tomwer/tests/conftest.py,sha256=0XlKfOrVtPg8VmyQn4BoK_mzcliFUtacDGLlZ5wD_PM,1912
852
854
  tomwer/tests/datasets.py,sha256=QXQ3jSwgWzfq4CaELOSrk9kHg5GmrP7kGHsdOlNSEIE,336
@@ -903,9 +905,9 @@ tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewer
903
905
  tomwer/tests/test_ewoks/test_conversion.py,sha256=a8cEWbErXiFCAkaapi0jeEoRKYxcFQCoa-Jr_u77_OM,3656
904
906
  tomwer/tests/test_ewoks/test_single_node_execution.py,sha256=YBUHfiAnkciv_kjj7biC5fOs7c7ofNImM_azGMn4LZM,2813
905
907
  tomwer/tests/test_ewoks/test_workflows.py,sha256=Eq80eexf5NVL7SzvwctLOaUeuQ8V3vDiFiHgbJA4Yb8,4871
906
- tomwer-1.4.7.dist-info/LICENSE,sha256=62p1wL0n9WMTu8x2YDv0odYgTqeSvTd9mQ0v6Mq7lzE,1876
907
- tomwer-1.4.7.dist-info/METADATA,sha256=cTWcuTnfLh2DnmMNzen6jZRoBgRDp3VRqOv9U08BI80,13415
908
- tomwer-1.4.7.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
909
- tomwer-1.4.7.dist-info/entry_points.txt,sha256=py3ZUWvGnWGc5c7Yhw_uBTm8Fmew0BDw3aQZnWMBNZI,500
910
- tomwer-1.4.7.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
911
- tomwer-1.4.7.dist-info/RECORD,,
908
+ tomwer-1.4.9.dist-info/LICENSE,sha256=62p1wL0n9WMTu8x2YDv0odYgTqeSvTd9mQ0v6Mq7lzE,1876
909
+ tomwer-1.4.9.dist-info/METADATA,sha256=NPzI78ud1GOKO6eFvOqUWdAr3uUtZ7h0VdJdWAVFy3c,13415
910
+ tomwer-1.4.9.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
911
+ tomwer-1.4.9.dist-info/entry_points.txt,sha256=py3ZUWvGnWGc5c7Yhw_uBTm8Fmew0BDw3aQZnWMBNZI,500
912
+ tomwer-1.4.9.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
913
+ tomwer-1.4.9.dist-info/RECORD,,
File without changes