tomwer 1.5.0rc3__py3-none-any.whl → 1.5.1__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.
@@ -31,7 +31,7 @@
31
31
  <thumbnail />
32
32
  <node_properties>
33
33
  <properties node_id="0" format="literal">{'_muted': False, 'controlAreaVisible': False, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x04n\x00\x00\x01\xfe\x00\x00\x05\xc1\x00\x00\x03-\x00\x00\x04n\x00\x00\x02#\x00\x00\x05\xc1\x00\x00\x03-\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x04n\x00\x00\x02#\x00\x00\x05\xc1\x00\x00\x03-', '__version__': 1}</properties>
34
- <properties node_id="1" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_params': {'preproc': {'flatfield': 1, 'double_flatfield_enabled': 0, 'dff_sigma': 0.0, 'ccd_filter_enabled': 0, 'ccd_filter_threshold': 0.04, 'take_logarithm': True, 'log_min_clip': 1e-06, 'log_max_clip': 10.0, 'sino_rings_correction': 'None', 'sino_rings_options': 'sigma=1.0 ; levels=10 ; padding=False', 'tilt_correction': '', 'autotilt_options': '', 'normalize_srcurrent': 1}, 'reconstruction': {'method': 'FBP', 'slice_plane': 'XY', 'angles_file': '', 'axis_correction_file': '', 'angle_offset': 0.0, 'fbp_filter_type': 'ramlak', 'padding_type': 'edges', 'iterations': 200, 'optim_algorithm': 'chambolle-pock', 'weight_tv': 0.01, 'preconditioning_filter': 1, 'positivity_constraint': 1, 'rotation_axis_position': '', 'translation_movements_file': '', 'clip_outer_circle': 1, 'centered_axis': 1, 'start_x': 0, 'end_x': -1, 'start_y': 0, 'end_y': -1, 'start_z': 0, 'end_z': -1, 'enable_halftomo': 0}, 'dataset': {'binning': 1, 'binning_z': 1, 'projections_subsampling': 1}, 'tomwer_slices': 'middle', 'output': {'file_format': 'vol', 'location': '', 'output_dir_mode': 'same folder as scan'}, 'phase': {'method': 'Paganin', 'delta_beta': '180', 'padding_type': 'edge', 'unsharp_coeff': 3.0, 'unsharp_sigma': 0.8, 'ctf_geometry': ' z1_v=None; z1_h=None; detec_pixel_size=None; magnification=True', 'beam_shape': 'parallel', 'ctf_advanced_params': ' length_scale=1e-05; lim1=1e-05; lim2=0.2; normalize_by_mean=True', 'ctf_translations_file': ''}, 'configuration_level': 'optional', 'mode_locked': True, 'cluster_config': None}}, 'controlAreaVisible': True, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x02\xaa\x00\x00\x00\xb4\x00\x00\x083\x00\x00\x04\x12\x00\x00\x02\xaa\x00\x00\x00\xb4\x00\x00\x083\x00\x00\x04\x12\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x02\xaa\x00\x00\x00\xb4\x00\x00\x083\x00\x00\x04\x12', '__version__': 1}</properties>
34
+ <properties node_id="1" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_params': {'preproc': {'flatfield': 1, 'double_flatfield': 0, 'dff_sigma': 0.0, 'ccd_filter_enabled': 0, 'ccd_filter_threshold': 0.04, 'take_logarithm': True, 'log_min_clip': 1e-06, 'log_max_clip': 10.0, 'sino_rings_correction': 'None', 'sino_rings_options': 'sigma=1.0 ; levels=10 ; padding=False', 'tilt_correction': '', 'autotilt_options': '', 'normalize_srcurrent': 1}, 'reconstruction': {'method': 'FBP', 'slice_plane': 'XY', 'angles_file': '', 'axis_correction_file': '', 'angle_offset': 0.0, 'fbp_filter_type': 'ramlak', 'padding_type': 'edges', 'iterations': 200, 'optim_algorithm': 'chambolle-pock', 'weight_tv': 0.01, 'preconditioning_filter': 1, 'positivity_constraint': 1, 'rotation_axis_position': '', 'translation_movements_file': '', 'clip_outer_circle': 1, 'centered_axis': 1, 'start_x': 0, 'end_x': -1, 'start_y': 0, 'end_y': -1, 'start_z': 0, 'end_z': -1, 'enable_halftomo': 0}, 'dataset': {'binning': 1, 'binning_z': 1, 'projections_subsampling': 1}, 'tomwer_slices': 'middle', 'output': {'file_format': 'vol', 'location': '', 'output_dir_mode': 'same folder as scan'}, 'phase': {'method': 'Paganin', 'delta_beta': '180', 'padding_type': 'edge', 'unsharp_coeff': 3.0, 'unsharp_sigma': 0.8, 'ctf_geometry': ' z1_v=None; z1_h=None; detec_pixel_size=None; magnification=True', 'beam_shape': 'parallel', 'ctf_advanced_params': ' length_scale=1e-05; lim1=1e-05; lim2=0.2; normalize_by_mean=True', 'ctf_translations_file': ''}, 'configuration_level': 'optional', 'mode_locked': True, 'cluster_config': None}}, 'controlAreaVisible': True, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x02\xaa\x00\x00\x00\xb4\x00\x00\x083\x00\x00\x04\x12\x00\x00\x02\xaa\x00\x00\x00\xb4\x00\x00\x083\x00\x00\x04\x12\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x02\xaa\x00\x00\x00\xb4\x00\x00\x083\x00\x00\x04\x12', '__version__': 1}</properties>
35
35
  <properties node_id="2" format="pickle">gASVPgEAAAAAAAB9lCiMDl92aWV3ZXJfY29uZmlnlH2UKIwEbW9kZZSMI3RvbXdlci5ndWkudmlz
36
36
  dWFsaXphdGlvbi5kYXRhdmlld2VylIwMX0Rpc3BsYXlNb2RllJOUjAZzbGljZXOUhZRSlIwJc2xp
37
37
  Y2Vfb3B0lGgEjApfU2xpY2VNb2RllJOUjAZsYXRlc3SUhZRSlIwJcmFkaW9fb3B0lGgEjApfUmFk
@@ -33,7 +33,7 @@
33
33
  <properties node_id="1" format="literal">{'_ewoks_default_inputs': {'data': None, 'dark_ref_params': {'DOWHEN': 'before', 'DARKCAL': 'Average', 'DARKOVE': 1, 'DARKRMV': 0, 'DKFILE': 'darkend[0-9]{3,4}', 'REFSCAL': 'Median', 'REFSOVE': 1, 'REFSRMV': 0, 'RFFILE': 'ref*.*[0-9]{3,4}_[0-9]{3,4}'}}, 'controlAreaVisible': True, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x00H\x00\x00\x00\x1b\x00\x00\x03\xef\x00\x00\x02\x1f\x00\x00\x00H\x00\x00\x00@\x00\x00\x03\xef\x00\x00\x02\x1f\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00H\x00\x00\x00@\x00\x00\x03\xef\x00\x00\x02\x1f', '__version__': 1}</properties>
34
34
  <properties node_id="2" format="literal">{'_scanIDs': [], 'controlAreaVisible': True, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x02\x80\x00\x00\x01C\x00\x00\x04\xff\x00\x00\x03G\x00\x00\x02\x80\x00\x00\x01h\x00\x00\x04\xff\x00\x00\x03G\x00\x00\x00\x00\x00\x00\x00\x00\x07\x80\x00\x00\x02\x80\x00\x00\x01h\x00\x00\x04\xff\x00\x00\x03G', '__version__': 1}</properties>
35
35
  <properties node_id="3" format="literal">{'_muted': False, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
36
- <properties node_id="4" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_params': {'preproc': {'flatfield': 1, 'double_flatfield_enabled': 0, 'dff_sigma': 0.0, 'ccd_filter_enabled': 0, 'ccd_filter_threshold': 0.04, 'take_logarithm': True, 'log_min_clip': 1e-06, 'log_max_clip': 10.0, 'sino_rings_correction': 'None', 'sino_rings_options': 'sigma=1.0 ; levels=10', 'tilt_correction': '', 'autotilt_options': ''}, 'reconstruction': {'method': 'FBP', 'angles_file': '', 'axis_correction_file': '', 'angle_offset': 0.0, 'fbp_filter_type': 'ramlak', 'padding_type': 'edges', 'iterations': 200, 'optim_algorithm': 'chambolle-pock', 'weight_tv': 0.01, 'preconditioning_filter': 1, 'positivity_constraint': 1, 'rotation_axis_position': '', 'translation_movements_file': '', 'clip_outer_circle': 1, 'start_x': 0, 'end_x': -1, 'start_y': 0, 'end_y': -1, 'start_z': 0, 'end_z': -1, 'enable_halftomo': 0}, 'dataset': {'binning': 1, 'binning_z': 1, 'projections_subsampling': 1}, 'tomwer_slices': 'middle', 'output': {'file_format': 'vol', 'location': ''}, 'phase': {'method': 'Paganin', 'delta_beta': '500', 'padding_type': 'edge', 'unsharp_coeff': 3.0, 'unsharp_sigma': 0.65}, 'configuration_level': 'optional', 'mode_locked': False, 'cluster_config': None}}, 'controlAreaVisible': True, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x00H\x00\x00\x00@\x00\x00\x05\xd1\x00\x00\x03\x9e\x00\x00\x00H\x00\x00\x00@\x00\x00\x05\xd1\x00\x00\x03\x9e\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00H\x00\x00\x00@\x00\x00\x05\xd1\x00\x00\x03\x9e', '__version__': 1}</properties>
36
+ <properties node_id="4" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_params': {'preproc': {'flatfield': 1, 'double_flatfield': 0, 'dff_sigma': 0.0, 'ccd_filter_enabled': 0, 'ccd_filter_threshold': 0.04, 'take_logarithm': True, 'log_min_clip': 1e-06, 'log_max_clip': 10.0, 'sino_rings_correction': 'None', 'sino_rings_options': 'sigma=1.0 ; levels=10', 'tilt_correction': '', 'autotilt_options': ''}, 'reconstruction': {'method': 'FBP', 'angles_file': '', 'axis_correction_file': '', 'angle_offset': 0.0, 'fbp_filter_type': 'ramlak', 'padding_type': 'edges', 'iterations': 200, 'optim_algorithm': 'chambolle-pock', 'weight_tv': 0.01, 'preconditioning_filter': 1, 'positivity_constraint': 1, 'rotation_axis_position': '', 'translation_movements_file': '', 'clip_outer_circle': 1, 'start_x': 0, 'end_x': -1, 'start_y': 0, 'end_y': -1, 'start_z': 0, 'end_z': -1, 'enable_halftomo': 0}, 'dataset': {'binning': 1, 'binning_z': 1, 'projections_subsampling': 1}, 'tomwer_slices': 'middle', 'output': {'file_format': 'vol', 'location': ''}, 'phase': {'method': 'Paganin', 'delta_beta': '500', 'padding_type': 'edge', 'unsharp_coeff': 3.0, 'unsharp_sigma': 0.65}, 'configuration_level': 'optional', 'mode_locked': False, 'cluster_config': None}}, 'controlAreaVisible': True, 'savedWidgetGeometry': b'\x01\xd9\xd0\xcb\x00\x03\x00\x00\x00\x00\x00H\x00\x00\x00@\x00\x00\x05\xd1\x00\x00\x03\x9e\x00\x00\x00H\x00\x00\x00@\x00\x00\x05\xd1\x00\x00\x03\x9e\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00H\x00\x00\x00@\x00\x00\x05\xd1\x00\x00\x03\x9e', '__version__': 1}</properties>
37
37
  <properties node_id="5" format="pickle">gASVWQEAAAAAAAB9lCiMDl92aWV3ZXJfY29uZmlnlH2UKIwEbW9kZZSMCGJ1aWx0aW5zlIwHZ2V0
38
38
  YXR0cpSTlIwjdG9td2VyLmd1aS52aXN1YWxpemF0aW9uLmRhdGF2aWV3ZXKUjAxfRGlzcGxheU1v
39
39
  ZGWUk5SMBlNMSUNFU5SGlFKUjAlzbGljZV9vcHSUaAZoB4wKX1NsaWNlTW9kZZSTlIwGTEFURVNU
@@ -5,6 +5,7 @@ import functools
5
5
  import logging
6
6
  import os
7
7
  import gc
8
+ from collections.abc import Callable
8
9
  from tomwer.io.utils import format_stderr_stdout
9
10
  from silx.utils.deprecation import deprecated, deprecated_warning
10
11
  from silx.io.utils import open as open_hdf5
@@ -85,6 +86,7 @@ def run_slices_reconstruction(
85
86
  advancement=None,
86
87
  process_id: int | None = None,
87
88
  instantiate_classes_only: bool = False,
89
+ invalid_slice_callback: Callable[[str], None] | None = None,
88
90
  ) -> tuple:
89
91
  """
90
92
  call nabu for a reconstruction on scan with the given configuration
@@ -142,7 +144,9 @@ def run_slices_reconstruction(
142
144
  scan.nabu_recons_params = sc_config
143
145
 
144
146
  # handle special cases like several db...
145
- nabu_configurations = interpret_tomwer_configuration(config, scan=scan)
147
+ nabu_configurations = interpret_tomwer_configuration(
148
+ config, scan=scan, invalid_slice_callback=invalid_slice_callback
149
+ )
146
150
  output_urls = []
147
151
  stderrs = []
148
152
  stdouts = []
@@ -227,6 +231,7 @@ class NabuSlicesTask(
227
231
  optional_input_names=(
228
232
  "dry_run",
229
233
  "serialize_output_data",
234
+ "invalid_slice_callback",
230
235
  ),
231
236
  output_names=("data", "nabu_params", "future_tomo_obj"),
232
237
  ):
@@ -288,6 +293,9 @@ class NabuSlicesTask(
288
293
  dry_run=self._dry_run,
289
294
  process_id=self.process_id,
290
295
  instantiate_classes_only=True,
296
+ invalid_slice_callback=self.get_input_value(
297
+ "invalid_slice_callback", None
298
+ ),
291
299
  )
292
300
  except Exception as e:
293
301
  mess = f"Fail to instantiate slice reconstructor for {str(scan)}. Reason is {e}."
@@ -425,7 +433,11 @@ class NabuSlicesTask(
425
433
  self._current_processing.cancel()
426
434
 
427
435
 
428
- def interpret_tomwer_configuration(config: dict, scan: TomwerScanBase | None) -> tuple:
436
+ def interpret_tomwer_configuration(
437
+ config: dict,
438
+ scan: TomwerScanBase | None,
439
+ invalid_slice_callback: Callable[[str], None] | None = None,
440
+ ) -> tuple:
429
441
  """
430
442
  tomwer can 'mock' the nabu reconstruction to request more feature.
431
443
  Typical use case is that we can ask for reconstruction of several
@@ -471,9 +483,10 @@ def interpret_tomwer_configuration(config: dict, scan: TomwerScanBase | None) ->
471
483
  index_max = index_max - 1
472
484
 
473
485
  if slice_index > index_max:
474
- _logger.error(
475
- f"slice index {slice_index} requested. But slice index must be in 0-{index_max} - ignore this request"
476
- )
486
+ error_message = f"{scan.get_identifier().short_description()}\n\nCannot reconstruct slice {slice_index} along plane {axis.value}. Must be in [0-{index_max}]"
487
+ _logger.error(error_message)
488
+ if invalid_slice_callback is not None:
489
+ invalid_slice_callback(error_message)
477
490
  return False
478
491
  return True
479
492
 
@@ -628,6 +628,10 @@ class SAAxisTask(
628
628
 
629
629
  saaxis_results_url = SAAxisTask.get_results_url(scan=scan)
630
630
 
631
+ if not os.path.exists(saaxis_results_url.file_path()):
632
+ _logger.error("no result saved")
633
+ return
634
+
631
635
  # save it to the file
632
636
  with HDF5File(saaxis_results_url.file_path(), mode="a") as h5f:
633
637
  nx_process = h5f.require_group(saaxis_results_url.data_path())
@@ -3,9 +3,7 @@ from __future__ import annotations
3
3
 
4
4
 
5
5
  import os
6
- import shutil
7
- import tempfile
8
- import unittest
6
+ import pytest
9
7
 
10
8
  import numpy
11
9
 
@@ -18,74 +16,66 @@ from tomwer.core.process.reconstruction.scores.scores import (
18
16
  from tomwer.core.utils.scanutils import MockNXtomo
19
17
 
20
18
 
21
- class TestScoreFunctions(unittest.TestCase):
22
- """Test all the score functions"""
19
+ def test_img_contrast_std_score():
20
+ """simple test of the API to call compute_score_contrast_std"""
21
+ data = numpy.random.random(100 * 100).reshape(100, 100)
22
+ compute_score_contrast_std(data)
23
23
 
24
- def test_img_contrast_std_score(self):
25
- """simple test of the API to call compute_score_contrast_std"""
26
- data = numpy.random.random(100 * 100).reshape(100, 100)
27
- compute_score_contrast_std(data)
28
24
 
29
- def test_method_to_function(self):
30
- """Test the dictionary used to for linking the score method to the
31
- callback function"""
32
- data = numpy.random.random(100 * 100).reshape(100, 100)
33
- for method_name, fct in _METHOD_TO_FCT.items():
34
- with self.subTest(method_name=method_name, fct=fct):
35
- res = fct(data)
36
- self.assertFalse(res is None)
37
- self.assertTrue(isinstance(res, float))
25
+ @pytest.mark.parametrize("fct", _METHOD_TO_FCT.values())
26
+ def test_method_to_function(fct):
27
+ """Test the dictionary used to for linking the score method to the
28
+ callback function"""
29
+ data = numpy.random.random(100 * 100).reshape(100, 100)
30
+ res = fct(data)
31
+ assert res is not None
32
+ assert isinstance(res, float)
38
33
 
39
34
 
40
- class TestSAAxisProcess(unittest.TestCase):
35
+ def testSAAxisProcess(tmp_path):
41
36
  """Test the SAAxisProcess class"""
37
+ scan_path = tmp_path / "mock_nxtomo"
38
+ scan_path.mkdir()
39
+ # set up
40
+ dim = 10
41
+ mock = MockNXtomo(
42
+ scan_path=scan_path, n_proj=10, n_ini_proj=10, scan_range=180, dim=dim
43
+ )
44
+ mock.add_alignment_radio(index=10, angle=90)
45
+ mock.add_alignment_radio(index=10, angle=0)
46
+ scan = mock.scan
42
47
 
43
- def setUp(self) -> None:
44
- self.tempdir = tempfile.mkdtemp()
45
- dim = 10
46
- mock = MockNXtomo(
47
- scan_path=self.tempdir, n_proj=10, n_ini_proj=10, scan_range=180, dim=dim
48
- )
49
- mock.add_alignment_radio(index=10, angle=90)
50
- mock.add_alignment_radio(index=10, angle=0)
51
- self.scan = mock.scan
48
+ default_saaxis_params = SAAxisParams()
49
+ default_saaxis_params.output_dir = os.path.join(scan_path, "output_dir")
50
+ default_saaxis_params.slice_indexes = {"slice": 4}
51
+ default_saaxis_params.nabu_config = {}
52
+ default_saaxis_params.dry_run = True
53
+ default_saaxis_params.file_format = "hdf5"
52
54
 
53
- self._default_saaxis_params = SAAxisParams()
54
- self._default_saaxis_params.output_dir = os.path.join(
55
- self.tempdir, "output_dir"
56
- )
57
- self._default_saaxis_params.slice_indexes = {"slice": 4}
58
- self._default_saaxis_params.nabu_config = {}
59
- self._default_saaxis_params.dry_run = True
60
- self._default_saaxis_params.file_format = "hdf5"
55
+ # test processing
56
+ process = SAAxisTask(
57
+ inputs={
58
+ "data": scan,
59
+ "sa_axis_params": default_saaxis_params.to_dict(),
60
+ "serialize_output_data": False,
61
+ }
62
+ )
61
63
 
62
- def tearDown(self) -> None:
63
- shutil.rmtree(self.tempdir)
64
-
65
- def test(self):
66
- process = SAAxisTask(
67
- inputs={
68
- "data": self.scan,
69
- "sa_axis_params": self._default_saaxis_params.to_dict(),
70
- "serialize_output_data": False,
71
- }
72
- )
73
-
74
- self._default_saaxis_params.estimated_cor = 11
75
- self._default_saaxis_params.research_width = 2
76
- process = SAAxisTask(
77
- inputs={
78
- "data": self.scan,
79
- "sa_axis_params": self._default_saaxis_params.to_dict(),
80
- "serialize_output_data": False,
81
- },
82
- )
83
- process.run()
84
- process = SAAxisTask(
85
- inputs={
86
- "data": self.scan,
87
- "sa_axis_params": self._default_saaxis_params.to_dict(),
88
- "serialize_output_data": False,
89
- },
90
- )
91
- process.run()
64
+ default_saaxis_params.estimated_cor = 11
65
+ default_saaxis_params.research_width = 2
66
+ process = SAAxisTask(
67
+ inputs={
68
+ "data": scan,
69
+ "sa_axis_params": default_saaxis_params.to_dict(),
70
+ "serialize_output_data": False,
71
+ },
72
+ )
73
+ process.run()
74
+ process = SAAxisTask(
75
+ inputs={
76
+ "data": scan,
77
+ "sa_axis_params": default_saaxis_params.to_dict(),
78
+ "serialize_output_data": False,
79
+ },
80
+ )
81
+ process.run()
@@ -221,7 +221,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
221
221
  self._signalConfChanged("flatfield")
222
222
 
223
223
  def _dffChanged(self, *args, **kwargs):
224
- self._signalConfChanged("double_flatfield_enabled")
224
+ self._signalConfChanged("double_flatfield")
225
225
 
226
226
  def _dffSigmaChanged(self, *args, **kwargs):
227
227
  self._signalConfChanged("dff_sigma")
@@ -337,7 +337,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
337
337
  tilt_correction, autotilt_opts = self._tiltCorrection.getTiltCorrection()
338
338
  return {
339
339
  "flatfield": int(self.isFlatFieldActivate()),
340
- "double_flatfield_enabled": int(self.isDoubleFlatFieldActivate()),
340
+ "double_flatfield": int(self.isDoubleFlatFieldActivate()),
341
341
  "dff_sigma": self.getDFFSigma(),
342
342
  "ccd_filter_enabled": int(self.isCCDFilterActivate()),
343
343
  "ccd_filter_threshold": self.getCCDThreshold(),
@@ -365,7 +365,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
365
365
  if ff is not None:
366
366
  self._flatFieldCB.setChecked(bool(ff))
367
367
 
368
- dff = conf.get("double_flatfield_enabled", None)
368
+ dff = conf.get("double_flatfield", None)
369
369
  if dff is not None:
370
370
  self._dffCB.setChecked(bool(dff))
371
371
 
@@ -323,7 +323,7 @@ class NabuWindow(qt.QMainWindow):
323
323
  self._mainWidget.nabuSettingsWidget._configuration._preProcessingWidget._sinoRingsOpts.resetConfiguration()
324
324
  default_config["tomwer_slices"] = "middle"
325
325
  default_config["preproc"]["ccd_filter_enabled"] = False
326
- default_config["preproc"]["double_flatfield_enabled"] = False
326
+ default_config["preproc"]["double_flatfield"] = False
327
327
  default_config["preproc"]["flatfield"] = True
328
328
  default_config["preproc"]["take_logarithm"] = True
329
329
  self.setConfiguration(default_config)
@@ -87,7 +87,7 @@ class NabuWidgetWithToolbar(qt.QMainWindow):
87
87
  self._nabuSettings._configuration._preProcessingWidget._sinoRingsOpts.resetConfiguration()
88
88
  default_config["tomwer_slices"] = "middle"
89
89
  default_config["preproc"]["ccd_filter_enabled"] = False
90
- default_config["preproc"]["double_flatfield_enabled"] = False
90
+ default_config["preproc"]["double_flatfield"] = False
91
91
  default_config["preproc"]["flatfield"] = True
92
92
  default_config["preproc"]["take_logarithm"] = True
93
93
  self._nabuSettings.setConfiguration(default_config)
@@ -90,7 +90,7 @@ class TestNabuPreProcConfig(TestCaseQt):
90
90
  """Test that the get configuration is working"""
91
91
  ini_conf = {
92
92
  "flatfield": 1,
93
- "double_flatfield_enabled": 0,
93
+ "double_flatfield": 0,
94
94
  "dff_sigma": 0.0,
95
95
  "ccd_filter_enabled": 0,
96
96
  "ccd_filter_threshold": 0.04,
@@ -110,7 +110,7 @@ class TestNabuPreProcConfig(TestCaseQt):
110
110
  """Test that the set configuration is working"""
111
111
  conf = {
112
112
  "flatfield": 0,
113
- "double_flatfield_enabled": 1,
113
+ "double_flatfield": 1,
114
114
  "dff_sigma": 2.0,
115
115
  "ccd_filter_enabled": 1,
116
116
  "ccd_filter_threshold": 0.98,
@@ -111,7 +111,7 @@ class TapeMeasureToolButton(PlotToolButton):
111
111
  self._lastRoiCreated.setVisible(self.isChecked())
112
112
  if self.isChecked():
113
113
  self._roiManager.start(
114
- self.TapeMeasureROI,
114
+ TapeMeasureROI,
115
115
  self,
116
116
  )
117
117
  self.__interactiveModeStarted(self._roiManager)
Binary file
@@ -17,6 +17,9 @@ class ProcessingThread(qt.QThread):
17
17
  sigComputationStarted = qt.Signal()
18
18
  """Signal emitted when a computation is started"""
19
19
 
20
+ sigError = qt.Signal(str)
21
+ """Error found during processing. Parameter is the error raised"""
22
+
20
23
 
21
24
  class FIFO(SuperviseProcess):
22
25
  """Processing Queue with a First In, First Out behavior"""
@@ -29,17 +32,22 @@ class FIFO(SuperviseProcess):
29
32
 
30
33
  def __init__(self, process_id=None):
31
34
  SuperviseProcess.__init__(self, process_id=process_id)
35
+ self._errors: list[qt.QErrorMessage] = []
32
36
  self._deque = deque()
33
37
  self._computationThread = self._create_processing_thread(process_id=process_id)
34
38
  assert isinstance(self._computationThread, ProcessingThread)
35
- self._computationThread.sigComputationStarted.connect(
36
- self._start_threaded_computation
37
- )
39
+
38
40
  """scan process by the thread"""
39
41
  self._data_currently_computed = None
40
42
  """Scan computed currently"""
41
43
  self._processing = False
42
44
 
45
+ # connect signal / slot
46
+ self._computationThread.sigComputationStarted.connect(
47
+ self._start_threaded_computation
48
+ )
49
+ self._computationThread.sigError.connect(self._displayError)
50
+
43
51
  @property
44
52
  def data_currently_computed(self) -> TomwerObject | None:
45
53
  return self._data_currently_computed
@@ -146,6 +154,14 @@ class FIFO(SuperviseProcess):
146
154
  self._processing = False
147
155
  self._data_currently_computed = None
148
156
 
157
+ def _displayError(self, error_msg: str):
158
+ err = qt.QMessageBox()
159
+ err.setText(error_msg)
160
+ err.setIcon(qt.QMessageBox.Warning)
161
+ self._errors.append(err)
162
+ err.setModal(False)
163
+ err.show()
164
+
149
165
  # expose deque API
150
166
  def append(self, value):
151
167
  self._deque.append(value)
@@ -6,6 +6,7 @@ import logging
6
6
 
7
7
  from processview.core.manager import DatasetState, ProcessManager
8
8
  from processview.core.superviseprocess import SuperviseProcess
9
+
9
10
  from silx.gui import qt
10
11
  from silx.gui.utils import blockSignals
11
12
 
@@ -138,6 +139,7 @@ class _SliceProcessingThread(ProcessingThread, SuperviseProcess):
138
139
  "nabu_params": self._configuration,
139
140
  "dry_run": self._dry_run,
140
141
  "serialize_output_data": False,
142
+ "invalid_slice_callback": self.showErrorSliceInvalid,
141
143
  },
142
144
  )
143
145
  self._task.run()
@@ -148,6 +150,9 @@ class _SliceProcessingThread(ProcessingThread, SuperviseProcess):
148
150
  self._task.cancel()
149
151
  self.quit()
150
152
 
153
+ def showErrorSliceInvalid(self, error_message):
154
+ self.sigError.emit(error_message)
155
+
151
156
 
152
157
  class _VolumeProcessingThread(_SliceProcessingThread):
153
158
  """
tomwer/version.py CHANGED
@@ -77,9 +77,9 @@ RELEASE_LEVEL_VALUE = {
77
77
 
78
78
  MAJOR = 1
79
79
  MINOR = 5
80
- MICRO = 0
81
- RELEV = "rc" # <16
82
- SERIAL = 3 # <16
80
+ MICRO = 1
81
+ RELEV = "final" # <16
82
+ SERIAL = 0 # <16
83
83
 
84
84
  date = __date__
85
85
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tomwer
3
- Version: 1.5.0rc3
3
+ Version: 1.5.1
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
@@ -21,8 +21,8 @@ orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows,sha256=
21
21
  orangecontrib/tomwer/tutorials/using_saaxis_to_find_cor.ows,sha256=TUZNkXEsQyj7Qra1GEb4IhGFDWv3uJzqXbp3P04jwbs,5192
22
22
  orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows,sha256=yKa6pvd4UB6XDDlj_o7T8Md6bI8aQJXMCUnxyecdXbc,7568
23
23
  orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows,sha256=eSxYxrZ-0WKsmDqXivsHxND7SR2dSwdgG6Wcjbr06Ew,1727
24
- orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows,sha256=lmn7C0LQIzJpxVJjHajyPKfJZZSHSNBG2x8uxnv6Zg8,29566
25
- orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows,sha256=kFGXGxc3eW7iG5TcAxaOwEwh1cvsKZEO3T_cA3mrd1k,22602
24
+ orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows,sha256=sdo7YmzVUSBf61hsMUg7zOiGtDa21eitCx08fYY93LI,29558
25
+ orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows,sha256=eufyC3wPbnzpUIQyno4mTrGXGtRayRFQbo0OAyYCds8,22594
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
@@ -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=IOZpFmn_ZYCZdQ7uWHxTD8i-UUzpUH1YscQBAfHyqpY,4383
222
+ tomwer/version.py,sha256=K5a0x_MIZk2c2KnjS9jTsWtptvB-LYnkQQEw0IH9mdc,4386
223
223
  tomwer/app/__init__.py,sha256=h1FKED7Tw5f99yikygt7ruXsdrxQhcJxO7kagLGxhJg,84
224
224
  tomwer/app/axis.py,sha256=1TZU27QPhq6Sa5-1kRMr4VDv2Qntg4ZHTQOjwucXf4I,5842
225
225
  tomwer/app/canvas.py,sha256=y8rYOiwmv6ug7JcjgkOzEiGQnNXjKWNNmKofT0n8TFg,1538
@@ -336,7 +336,7 @@ tomwer/core/process/reconstruction/nabu/castvolume.py,sha256=yTdVMGjG8gnByNi7D1X
336
336
  tomwer/core/process/reconstruction/nabu/helical.py,sha256=twqUNAatBAAK2K0cTmqcWb4py_nHif6Vsr3ms6Pqbag,2051
337
337
  tomwer/core/process/reconstruction/nabu/nabucommon.py,sha256=GGhM3jl2OVbI2mr4-bMlMOyON2Ss0dEOU_v9SmixhTo,24532
338
338
  tomwer/core/process/reconstruction/nabu/nabuscores.py,sha256=fjOtWxPOoVHq5E1mkbpfVglWNq5HfP1VAzhaLu1jd1M,25291
339
- tomwer/core/process/reconstruction/nabu/nabuslices.py,sha256=CybiZOf0qATMeLkYyC_UuYVfReJku_-2BS0BQbq7xxs,32084
339
+ tomwer/core/process/reconstruction/nabu/nabuslices.py,sha256=9w_DPooYn8l9rSGZJhYFmWlPO0L-DkuEKvKmb-Q9Sao,32648
340
340
  tomwer/core/process/reconstruction/nabu/nabuvolume.py,sha256=Fn0tkPDTDJQaMEJA4LzpPp0ZtG4MIu9YN82-jesxRKo,20052
341
341
  tomwer/core/process/reconstruction/nabu/plane.py,sha256=1SFNJgl1_cDYVW6gq7zjw2jpvRjiEmzzEQEBCxUseGM,380
342
342
  tomwer/core/process/reconstruction/nabu/settings.py,sha256=3AJpxVQbJziw4v6F26Ppz8Q9vc9ZNepTWygqpCAbIEM,955
@@ -350,7 +350,7 @@ tomwer/core/process/reconstruction/normalization/normalization.py,sha256=8rW9D6e
350
350
  tomwer/core/process/reconstruction/normalization/params.py,sha256=BqZPnaAeCi0CVkNxVKcS188oCb2y6RUxY-c5pLdOIDk,3374
351
351
  tomwer/core/process/reconstruction/saaxis/__init__.py,sha256=ZEOu0nZWlMyBoX_A64yeEjVflE5x4iWSpYLTgs45g0o,137
352
352
  tomwer/core/process/reconstruction/saaxis/params.py,sha256=tCV5QLu7jqLwmoRnUGCNxXgdXZ_WRRuuIxbmXG18mH0,4171
353
- tomwer/core/process/reconstruction/saaxis/saaxis.py,sha256=FDzM-N_kHvCbTe7rvt6tMYuC6slCG45t5ptadLcpfd8,30154
353
+ tomwer/core/process/reconstruction/saaxis/saaxis.py,sha256=g3p8_cI1KTasAc4183pXKa22jwml-CfAbhwF8dvZLlo,30282
354
354
  tomwer/core/process/reconstruction/sadeltabeta/__init__.py,sha256=WDYJxfqPnz5IeLPCX5W8UEO8-Z-NSH79gkqp2DZn1bM,162
355
355
  tomwer/core/process/reconstruction/sadeltabeta/params.py,sha256=ziAlTtQLy4EItIprFxDOm2Td1emHpSpnQb58niF1tI0,2691
356
356
  tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py,sha256=bAO0dYSnMdgbBHlcU-roRC7sGqLIpi_rlC7cMXFInLI,29075
@@ -364,7 +364,7 @@ tomwer/core/process/reconstruction/tests/test_darkref.py,sha256=KkdZ4epw9fYOPT3e
364
364
  tomwer/core/process/reconstruction/tests/test_darkref_copy.py,sha256=Cl8qLAMZxLHDJp2oMDusr6q2WfALIg6mpbvuGyJJY7M,6090
365
365
  tomwer/core/process/reconstruction/tests/test_params_cache.py,sha256=mNqWbOLr4mo06mwF3KhFpQPRvGgFxsCTPhLlK-fF2Ro,1238
366
366
  tomwer/core/process/reconstruction/tests/test_paramsbase.py,sha256=n9x9BZV4I9uF7DM5QjCelfxaAzWQ6vx9N9BsjysW6RU,1505
367
- tomwer/core/process/reconstruction/tests/test_saaxis.py,sha256=yaxm2Iob6jhSxMdiHP-B093HOoKb6rfBoqPVxOsGMgU,2972
367
+ tomwer/core/process/reconstruction/tests/test_saaxis.py,sha256=iuDJW3Wr5vbS19UZO49a7ohcJBX5vhQytzvOEPUusIQ,2362
368
368
  tomwer/core/process/reconstruction/tests/test_sadeltabeta.py,sha256=24JRMIocNYLMdX_xFgOCUUo_VA61BPzz3HTaRTzDFhE,1232
369
369
  tomwer/core/process/reconstruction/tests/test_utils.py,sha256=o_w8Bkk3T0btLCAan2UPq9U45y9vfh8ihyaHnZ7fEb0,1006
370
370
  tomwer/core/process/reconstruction/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -539,7 +539,7 @@ tomwer/gui/edit/tests/test_dkrf_patch.py,sha256=L0fO2nqqK74EOIZTPQKjO03qsAiXbqjj
539
539
  tomwer/gui/edit/tests/test_image_key_editor.py,sha256=6sIGM_DjU_KjspnVKB2UDhWh_BLDhYP8rS6U1fAZXkk,4647
540
540
  tomwer/gui/edit/tests/test_nx_editor.py,sha256=y4_-g1-8rj0NkhAZ9HeebH-CIcUrvrH3q-s2RnBRQMo,17501
541
541
  tomwer/gui/reconstruction/__init__.py,sha256=Ozf9bYay5hVhe1clExeM_MLhcAuu624i5BP1xonWlB0,95
542
- tomwer/gui/reconstruction/sacommon.py,sha256=8-xaFjmtvxzJSWRLl985IcaCYVXQ_Kq-Rp91nYoW0Pc,5990
542
+ tomwer/gui/reconstruction/sacommon.py,sha256=1ZT51WRkajkWsyaJmnH1Fi2QxHzyEa8Pqf7DAyF47lQ,5982
543
543
  tomwer/gui/reconstruction/axis/AxisMainWindow.py,sha256=7w2LhdQ1pa8vU9U-XTA3ohGQfYKk5ETZ79s_xl4Zxx8,9641
544
544
  tomwer/gui/reconstruction/axis/AxisOptionsWidget.py,sha256=M47xflZ68KkTDg8tksFt8n7ZFVIr8tJxstlPyG4Odq0,12168
545
545
  tomwer/gui/reconstruction/axis/AxisSettingsWidget.py,sha256=7GpHteE2j9RUo-jUQoJdXJ-GnIi9VnY13Lveq3mvd1M,28120
@@ -561,7 +561,7 @@ tomwer/gui/reconstruction/nabu/check.py,sha256=5DYLlVCyXm3ax5VgogX79n1Oyl3O_JUvZ
561
561
  tomwer/gui/reconstruction/nabu/helical.py,sha256=TAVPcuZdgtZSz37ESqi_yuLhYuNnGde_0drvjTntahs,3708
562
562
  tomwer/gui/reconstruction/nabu/nabuflow.py,sha256=mnFFd9z7IC9FFZ3xcOr-6g2hvY0R7PtnFI-AMgWqHhI,14977
563
563
  tomwer/gui/reconstruction/nabu/platform.py,sha256=eSPs2yUfBSHsqZ8bYY_BJ7zuRXc5sxXA4lRxlQaFBz0,3859
564
- tomwer/gui/reconstruction/nabu/slices.py,sha256=fnWfbF2O7f5D4WOVcx4L1pu9WVRN_4A_122b8R-R_48,24291
564
+ tomwer/gui/reconstruction/nabu/slices.py,sha256=fDvYrDDvwYmXFmjEKU4zv3NdkUciPYM4rqteSb9pQD8,24283
565
565
  tomwer/gui/reconstruction/nabu/slurm.py,sha256=yfJD8KgX45Be5CUi6bn2CdocrQemJPxDYBBqoLoXqn0,1268
566
566
  tomwer/gui/reconstruction/nabu/volume.py,sha256=OGstMDOd7DHY0PVUJdPRxOtSH7SaJyy7VNWU1F6ci6g,17826
567
567
  tomwer/gui/reconstruction/nabu/nabuconfig/__init__.py,sha256=WgEFXIrUDhX0vpBNlKiymHEY9p1DMdk4QZkvnXIC8yk,77
@@ -570,7 +570,7 @@ tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py,sha256=_2eDt-Y5LaJ5J0Q2wm0sIFQu
570
570
  tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py,sha256=5tCkwvgCv_Rdt7yP4ZUrq9ZGKE7Yy9Ht-n7XvCGIoTw,9048
571
571
  tomwer/gui/reconstruction/nabu/nabuconfig/output.py,sha256=0SShYqvFj-motxTw20e3I1Z0WiierSqgOsN15qwe-TY,11907
572
572
  tomwer/gui/reconstruction/nabu/nabuconfig/phase.py,sha256=t4rVi6DCwRkrfGv_9hD1SWMwu9CMpzxjAwyH_YmC3Gw,16238
573
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py,sha256=3FME_SNO-cvek-hzuhh87cesuH3cdfqBI8w-fgwBO4U,32556
573
+ tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py,sha256=utJgcburzX_WNdXItAKuENd97oLIs4QzFmLrNUF0n3c,32532
574
574
  tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py,sha256=W0EXvvEgtlOtxgg7CjsSj2aTjfpRwYfQ_I1fDX0cPxE,42571
575
575
  tomwer/gui/reconstruction/nabu/test/test_cast_volume.py,sha256=Gtz_LduqKQNiVuVYrvtoPkE-DgG9QotS1mK-siSl8HU,3451
576
576
  tomwer/gui/reconstruction/nabu/test/test_check.py,sha256=KXg1Gg4FVjQ9GkBOgb0ZJh6_c3JMeJTtyX5UVY6vdms,2318
@@ -592,7 +592,7 @@ tomwer/gui/reconstruction/scores/control.py,sha256=SVWMruB--sa_LSM1oZhjoFM5ci1oQ
592
592
  tomwer/gui/reconstruction/scores/scoreplot.py,sha256=_mHvuc8EoSgEFiQkDJM9p21CLkgLe3c3d-bvPfQ0mFc,31166
593
593
  tomwer/gui/reconstruction/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
594
594
  tomwer/gui/reconstruction/tests/test_axis.py,sha256=h0u_tTnQp57rg4oFtwjGSYNw5IujoxydOpnvNd98INA,7498
595
- tomwer/gui/reconstruction/tests/test_nabu.py,sha256=MRSxOYRbiZQ4P3jvSj_YMQofK5y_IgHNIb6TmuLFqAc,13644
595
+ tomwer/gui/reconstruction/tests/test_nabu.py,sha256=JI3GFzUXR_SsDMQfj2joVv6ToEqS-QdMyB12y14OvdI,13628
596
596
  tomwer/gui/reconstruction/tests/test_saaxis.py,sha256=dQjhULF913WMevo0ePIy6JQbnrP6zGVnde9XLRLBtFM,6792
597
597
  tomwer/gui/reconstruction/tests/test_sadeltabeta.py,sha256=96tE_gxIcmp0qDXQmIwSEkYl3Js7dT2CyUH1doyjGc0,4491
598
598
  tomwer/gui/samplemoved/__init__.py,sha256=jNA03mYWfP3_S1MRet6ijYe5DNCTK3Br7-5yrW3oEG4,8240
@@ -635,7 +635,7 @@ tomwer/gui/tests/test_axis_gui.py,sha256=7Sz7LKTADuRCxaPYFGes22-0AItYwfrcd6kgk4X
635
635
  tomwer/gui/tests/test_qfolder_dialog.py,sha256=hwN7uEDUYoGsHeJgjTvgMLV21umt_LTIemDsUTU2UvA,352
636
636
  tomwer/gui/utils/RangeWidget.py,sha256=HERjGePh_LxkJEELt2ZVOL_D8G_0xmaP4OotZlASPEo,1327
637
637
  tomwer/gui/utils/__init__.py,sha256=zRGvzYC0R676iDAjHIERQJlV4YgTcsXc3G34f6cUCK8,66
638
- tomwer/gui/utils/buttons.py,sha256=SAkd82M7jLYeSnUZ1E5IyIqQKfSKc18UcEEFFXzodjA,7366
638
+ tomwer/gui/utils/buttons.py,sha256=czf14thj6yC9oqrSga77pBDFUtizuAlsIG39GSfpIss,7361
639
639
  tomwer/gui/utils/completer.py,sha256=XQGVSiUdLa1MfgXPDY5qfcTxtjVerxmVKXmWDb-kQ-I,3606
640
640
  tomwer/gui/utils/flow.py,sha256=DO9QhS_0dOxMArowqDGU5yZ_a36CsvwQUoFPwuxjxkE,10646
641
641
  tomwer/gui/utils/gpu.py,sha256=R2sRA77zyxdy5bVYGNltQpKS_9wuaj9eIn6rglsWGWg,2223
@@ -704,6 +704,7 @@ tomwer/resources/gui/icons/background.png,sha256=o4479aVkI5oI6LyiHVbRnFtnfwXP-wS
704
704
  tomwer/resources/gui/icons/background.svg,sha256=ydyBCNZy_uQK7ro1L-e03qJyACmOb1GoB9OuFwlcIzg,10778
705
705
  tomwer/resources/gui/icons/basic_user.png,sha256=9bHI9dU-6SVbVGxokRZTq4XyK8lNDwTd1HU2tSseM4w,4694
706
706
  tomwer/resources/gui/icons/basic_user.svg,sha256=KOk8j33FLmie4cGpD4wJN9UYIKQfXOyK9_5_id6Iaa4,9246
707
+ tomwer/resources/gui/icons/borders.png,sha256=E8rkw2TiZSgBzSiuLz6DdFw6cyKOI7K5bIAcIz85J5k,1541
707
708
  tomwer/resources/gui/icons/cfg_file_active.png,sha256=XA80Ltn7y9I5MlQHTrjKi-WO5RpI2_z-zrIgHUG0GO8,2150
708
709
  tomwer/resources/gui/icons/cfg_file_active.svg,sha256=ExCvTt8QZ99q3B9WqfsMTqfylv_hjvvZjSB615GWkro,7344
709
710
  tomwer/resources/gui/icons/cfg_file_inactive.png,sha256=9ezxJCR6jIQhFbJ8kOGSQ_klpwjp-rKiU135ddvtywo,1979
@@ -833,14 +834,14 @@ tomwer/synctools/rsyncmanager.py,sha256=4SvN0Bk_D_WavBWFvF64Vxmll5kXeOrhmgOI4k0g
833
834
  tomwer/synctools/saaxis.py,sha256=hvsJ3g189fA3FWZUdUFrqPLDRh5T-V7ptWY2YhJJ13I,669
834
835
  tomwer/synctools/sadeltabeta.py,sha256=WCrBx-2lBlQUuoZlbR_HQaBAH8owsghh2j1TQXiBMIw,694
835
836
  tomwer/synctools/stacks/__init__.py,sha256=wWN09X2qRXzBSekl5nkpEx1WDAcU2LQLxO9NpmW3bDU,165
836
- tomwer/synctools/stacks/processingstack.py,sha256=egB5kg5DesKkfzGhfcM9_ffozPFwBYupdPiebSQMQXU,5472
837
+ tomwer/synctools/stacks/processingstack.py,sha256=3FE7Z_dHvPS6k3HoYr1WJSkdOk4mM_R8OgFylw2tTc4,5959
837
838
  tomwer/synctools/stacks/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
838
839
  tomwer/synctools/stacks/control/datalistener.py,sha256=XN40esWfSQPgsy9HHrjvd3imSg7gcTzZ2OJgAFEtbEs,3785
839
840
  tomwer/synctools/stacks/reconstruction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
840
841
  tomwer/synctools/stacks/reconstruction/axis.py,sha256=yq36BFGUGq0dtrDYE581nA2kMomMex6Nl7JSF2EVa_U,6088
841
842
  tomwer/synctools/stacks/reconstruction/castvolume.py,sha256=hyLW_M6uR81nUAk1ZvyyYMd3gvIcWfqKF7RSdUgVzmQ,6795
842
843
  tomwer/synctools/stacks/reconstruction/dkrefcopy.py,sha256=bemmlZajyoT7hAvGeEfhEXuxIN1IwhgEwnYSe1htXKA,6171
843
- tomwer/synctools/stacks/reconstruction/nabu.py,sha256=sSrxcUdn3B6u4gKtevlw5Vc5wI9Qf-mzCbOowT2W0zM,6495
844
+ tomwer/synctools/stacks/reconstruction/nabu.py,sha256=fr86pc9XJahx3tel1lRoZU1GQZ64px3R11W4IMWhLAE,6661
844
845
  tomwer/synctools/stacks/reconstruction/normalization.py,sha256=WSlx-aad8OhKI-2wZDe2pKzu9ht-446Yrwo0Z0cUaE0,4044
845
846
  tomwer/synctools/stacks/reconstruction/saaxis.py,sha256=6HHfNfT4n6podzB_X88AjC7simiFAHpoi520nt3OexY,5808
846
847
  tomwer/synctools/stacks/reconstruction/sadeltabeta.py,sha256=Oo0mczxv3-DxedpOybyMSUZAlcf65W8ZiCeTvPMHEas,5796
@@ -906,9 +907,9 @@ tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewer
906
907
  tomwer/tests/test_ewoks/test_conversion.py,sha256=a8cEWbErXiFCAkaapi0jeEoRKYxcFQCoa-Jr_u77_OM,3656
907
908
  tomwer/tests/test_ewoks/test_single_node_execution.py,sha256=YBUHfiAnkciv_kjj7biC5fOs7c7ofNImM_azGMn4LZM,2813
908
909
  tomwer/tests/test_ewoks/test_workflows.py,sha256=Eq80eexf5NVL7SzvwctLOaUeuQ8V3vDiFiHgbJA4Yb8,4871
909
- tomwer-1.5.0rc3.dist-info/licenses/LICENSE,sha256=62p1wL0n9WMTu8x2YDv0odYgTqeSvTd9mQ0v6Mq7lzE,1876
910
- tomwer-1.5.0rc3.dist-info/METADATA,sha256=Kd1h0AEyK9dV1mG7iP5DfNXBkabmhYXMM9b6QJyHcik,13459
911
- tomwer-1.5.0rc3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
912
- tomwer-1.5.0rc3.dist-info/entry_points.txt,sha256=py3ZUWvGnWGc5c7Yhw_uBTm8Fmew0BDw3aQZnWMBNZI,500
913
- tomwer-1.5.0rc3.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
914
- tomwer-1.5.0rc3.dist-info/RECORD,,
910
+ tomwer-1.5.1.dist-info/licenses/LICENSE,sha256=62p1wL0n9WMTu8x2YDv0odYgTqeSvTd9mQ0v6Mq7lzE,1876
911
+ tomwer-1.5.1.dist-info/METADATA,sha256=hQC84pwhh-IbdRxuVIaVjU_GixxKgGbcVX4dywQxhwU,13456
912
+ tomwer-1.5.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
913
+ tomwer-1.5.1.dist-info/entry_points.txt,sha256=py3ZUWvGnWGc5c7Yhw_uBTm8Fmew0BDw3aQZnWMBNZI,500
914
+ tomwer-1.5.1.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
915
+ tomwer-1.5.1.dist-info/RECORD,,