tomwer 1.4.1__py3-none-any.whl → 1.4.3__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,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import functools
4
+ import logging
4
5
 
5
6
  from ewoksorange.bindings import OWEwoksWidgetWithTaskStack
6
7
  from ewoksorange.bindings.owwidgets import invalid_data
@@ -10,6 +11,8 @@ from processview.core.superviseprocess import SuperviseProcess
10
11
 
11
12
  from orangecontrib.tomwer.widgets.utils import WidgetLongProcessing
12
13
 
14
+ _logger = logging.getLogger(__name__)
15
+
13
16
 
14
17
  class _SuperviseMixIn(SuperviseProcess):
15
18
  def __init__(self, process_id=None):
@@ -18,6 +21,10 @@ class _SuperviseMixIn(SuperviseProcess):
18
21
 
19
22
  def setCaption(self, caption):
20
23
  self.name = caption
24
+ try:
25
+ ProcessManager().process_renamed(process=self)
26
+ except Exception as e:
27
+ _logger.warning(f"Fail to update process name. Error is {e}")
21
28
 
22
29
  def notify_skip(self, scan, details=None):
23
30
  ProcessManager().notify_dataset_state(
@@ -78,6 +78,7 @@ class ImageKeyUpgraderOW(
78
78
 
79
79
  def get_task_inputs(self):
80
80
  task_inputs = super().get_task_inputs()
81
+ task_inputs["serialize_output_data"] = False
81
82
  try:
82
83
  scan = task_inputs["data"]
83
84
  except Exception:
@@ -86,14 +87,14 @@ class ImageKeyUpgraderOW(
86
87
  self.notify_pending(scan=scan)
87
88
  return task_inputs
88
89
 
89
- def _execute_ewoks_task(self, propagate):
90
+ def _execute_ewoks_task(self, propagate, log_missing_inputs=False):
90
91
  task_arguments = self._get_task_arguments()
91
92
  scan = task_arguments.get("inputs", {}).get("data", None)
92
93
  if scan is not None:
93
94
  self.notify_pending(scan=scan)
94
- super()._execute_ewoks_task( # pylint: disable=E1123
95
- propagate=propagate, log_missing_inputs=False
96
- )
95
+ super()._execute_ewoks_task( # pylint: disable=E1123
96
+ propagate=propagate, log_missing_inputs=log_missing_inputs
97
+ )
97
98
 
98
99
  def _notify_state(self):
99
100
  try:
@@ -144,8 +144,6 @@ class DarkRefAndCopyOW(SuperviseOW, WidgetLongProcessing):
144
144
  except Exception:
145
145
  _logger.warning("fail to load reconstruction settings")
146
146
 
147
- self.setCaption(self.windowTitle())
148
-
149
147
  def __new__(cls, *args, **kwargs):
150
148
  # ensure backward compatibility with 'static_input'
151
149
  static_input = kwargs.get("stored_settings", {}).get("static_input", None)
@@ -56,7 +56,7 @@ def _absolute_pos_to_relative_with_warning(absolute_pos: float, det_width: int |
56
56
  return absolute_pos_to_relative(absolute_pos=absolute_pos, det_width=det_width)
57
57
 
58
58
 
59
- def adapt_tomwer_scan_to_nabu(scan: TomwerScanBase):
59
+ def adapt_tomwer_scan_to_nabu(scan: TomwerScanBase, do_flatfield: bool):
60
60
  """simple util to convert tomwer scan to a nabu DataAnalizer and
61
61
  updating infos regarding flat and dark if needed
62
62
  """
@@ -65,7 +65,7 @@ def adapt_tomwer_scan_to_nabu(scan: TomwerScanBase):
65
65
  try:
66
66
  update_dataset_info_flats_darks(
67
67
  dataset_infos,
68
- flatfield_mode=None,
68
+ flatfield_mode=do_flatfield,
69
69
  )
70
70
  except ValueError as exception:
71
71
  # nabu raise an error if no darks / flats set. But this can make sense at this stage if the NXtomo has no
@@ -429,11 +429,13 @@ class AxisTask(
429
429
  else:
430
430
  has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
431
431
  has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
432
-
432
+ do_flatfield = has_darks and has_flats
433
433
  res = estimate_cor(
434
434
  method=mode.value,
435
- dataset_info=adapt_tomwer_scan_to_nabu(scan=scan),
436
- do_flatfield=has_darks and has_flats,
435
+ dataset_info=adapt_tomwer_scan_to_nabu(
436
+ scan=scan, do_flatfield=do_flatfield
437
+ ),
438
+ do_flatfield=do_flatfield,
437
439
  cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
438
440
  )
439
441
  # convert back to relative
@@ -445,13 +445,47 @@ def interpret_tomwer_configuration(config: dict, scan: TomwerScanBase | None) ->
445
445
  return nabu_config
446
446
 
447
447
  if "tomwer_slices" in config and scan is not None:
448
+ reconstruction_axis = NabuPlane.from_value(
449
+ config.get("reconstruction", {}).get("slice_plane", "XY")
450
+ )
448
451
  slices = list(
449
452
  NabuSliceMode.getSlices(
450
453
  config["tomwer_slices"],
451
454
  scan=scan,
452
- axis=config.get("reconstruction", {}).get("slice_plane", "XY"),
455
+ axis=reconstruction_axis,
456
+ )
457
+ )
458
+
459
+ def filter_slice(slice_index: int, axis: NabuPlane):
460
+ """remove slices that 'cannot' be reconstructed (out of bounds)"""
461
+ if axis is NabuPlane.XY:
462
+ index_max = scan.dim_2
463
+ elif axis in (NabuPlane.XZ, NabuPlane.YZ):
464
+ index_max = scan.dim_1
465
+ else:
466
+ raise ValueError
467
+
468
+ if index_max is None:
469
+ return True
470
+
471
+ index_max = index_max - 1
472
+
473
+ 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
+ )
477
+ return False
478
+ return True
479
+
480
+ slices = list(
481
+ filter(
482
+ lambda slice_index: filter_slice(
483
+ int(slice_index), axis=reconstruction_axis
484
+ ),
485
+ slices,
453
486
  )
454
487
  )
488
+
455
489
  else:
456
490
  slices = []
457
491
 
@@ -464,17 +498,6 @@ def interpret_tomwer_configuration(config: dict, scan: TomwerScanBase | None) ->
464
498
  else:
465
499
  pag_dbs = (None,)
466
500
 
467
- # remove slices that 'cannot' be reconstructed (out of bounds)
468
- def filter_slice(slice_index: int):
469
- if scan.dim_2 is not None and slice_index > scan.dim_2:
470
- _logger.error(
471
- f"slice index {slice_index} requested. But slice index must be in 0-{scan.dim_2} - ignore this request"
472
- )
473
- return False
474
- return True
475
-
476
- slices = list(filter(lambda slice_index: filter_slice(int(slice_index)), slices))
477
-
478
501
  # by default add the slice 'None' which is the slice for the volume
479
502
  slices.append(None)
480
503
  nabu_config = get_nabu_config(config=config)
@@ -1,29 +1,24 @@
1
1
  # coding: utf-8
2
2
  from __future__ import annotations
3
3
 
4
- import gc
5
4
  import logging
6
5
  import os
7
6
  import pickle
8
- import shutil
9
- import tempfile
10
7
 
11
8
  from orangecanvas.scheme.readwrite import literal_dumps
12
9
  from processview.core.manager import DatasetState, ProcessManager
13
10
  from silx.gui import qt
14
- from silx.gui.utils.testutils import TestCaseQt
15
11
 
16
12
  from orangecontrib.tomwer.widgets.reconstruction.SinoNormOW import (
17
- SinoNormOW as _NormIOW,
13
+ SinoNormOW as _SinoNormOW,
18
14
  )
19
- from tomwer.core import settings
20
- from tomwer.core.utils.lbsram import mock_low_memory
21
15
  from tomwer.core.utils.scanutils import MockNXtomo
16
+ from tomwer.tests.conftest import qtapp # noqa F401
22
17
 
23
18
  logger = logging.getLogger(__name__)
24
19
 
25
20
 
26
- class NormIOW(_NormIOW):
21
+ class SinoNormOW(_SinoNormOW):
27
22
  def __init__(self, parent=None):
28
23
  self._scans_finished = []
29
24
  super().__init__(parent)
@@ -49,142 +44,114 @@ class NormIOW(_NormIOW):
49
44
  super().close()
50
45
 
51
46
 
52
- class TestProcessing(TestCaseQt):
53
- DIM = 100
54
-
55
- def setUp(self):
56
- super().setUp()
57
- self._source_dir = tempfile.mkdtemp()
58
-
59
- def create_scan(folder_name):
60
- _dir = os.path.join(self._source_dir, folder_name)
61
- return MockNXtomo(
62
- scan_path=_dir,
63
- n_ini_proj=20,
64
- n_proj=20,
65
- n_alignement_proj=2,
66
- create_final_flat=False,
67
- create_ini_dark=True,
68
- create_ini_flat=True,
69
- n_refs=1,
70
- dim=self.DIM,
71
- ).scan
72
-
73
- # create scans
74
- self.scan_1 = create_scan("scan_1")
75
- self.scan_2 = create_scan("scan_2")
76
- self.scan_3 = create_scan("scan_3")
77
- self._process_manager = ProcessManager()
78
-
79
- self.widget = NormIOW()
80
- self.widget.show()
81
-
82
- def tearDown(self):
83
- mock_low_memory(False)
84
- settings.mock_lsbram(False)
85
- self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
86
- self.widget.close()
87
- self.widget = None
88
- self.qapp.processEvents()
89
- shutil.rmtree(self._source_dir)
90
- gc.collect()
91
-
92
- def test_serializing(self):
93
- pickle.dumps(self.widget.getConfiguration())
94
-
95
- def test_literal_dumps(self):
96
- self.widget._updateSettings()
97
- literal_dumps(self.widget._ewoks_default_inputs)
98
-
99
- def testUnlocked(self):
100
- """Test result when used with some interaction"""
101
- self.widget.setLocked(False)
102
-
103
- def process_scalar_manually():
104
- self.widget.setCurrentMethod("division")
105
- self.widget.setCurrentSource("manual ROI")
106
-
107
- self.qapp.processEvents()
108
- self.widget.setROI(start_x=0, end_x=10, start_y=0, end_y=10)
109
- self.qapp.processEvents()
110
- self.widget.compute()
111
- self.widget.wait_processing(5000)
112
- self.qapp.processEvents()
113
-
114
- self.widget.process(self.scan_1)
115
- process_scalar_manually()
116
- self.assertEqual(
117
- self._process_manager.get_dataset_state(
118
- dataset_id=self.scan_1.get_identifier(),
119
- process=self.widget,
120
- ),
121
- DatasetState.WAIT_USER_VALIDATION,
47
+ FRAME_DIM = 100
48
+
49
+
50
+ def create_scan(folder_name):
51
+ return MockNXtomo(
52
+ scan_path=folder_name,
53
+ n_ini_proj=20,
54
+ n_proj=20,
55
+ n_alignement_proj=2,
56
+ create_final_flat=False,
57
+ create_ini_dark=True,
58
+ create_ini_flat=True,
59
+ n_refs=1,
60
+ dim=FRAME_DIM,
61
+ ).scan
62
+
63
+
64
+ def test_SinoNormOW(
65
+ qtapp, # noqa F811
66
+ tmp_path,
67
+ ):
68
+ source_dir = tmp_path / "source"
69
+ source_dir.mkdir()
70
+
71
+ # create scans
72
+ scan_1 = create_scan(os.path.join(source_dir, "scan_1"))
73
+ scan_2 = create_scan(os.path.join(source_dir, "scan_2"))
74
+ scan_3 = create_scan(os.path.join(source_dir, "scan_3"))
75
+ process_manager = ProcessManager()
76
+
77
+ widget = SinoNormOW()
78
+ widget.show()
79
+
80
+ # test serialization
81
+ pickle.dumps(widget.getConfiguration())
82
+
83
+ # test literal dumps
84
+ widget._updateSettings()
85
+ literal_dumps(widget._ewoks_default_inputs)
86
+
87
+ # test behavior when the widget is unlocked
88
+ """Test result when used with some interaction"""
89
+ widget.setLocked(False)
90
+
91
+ def process_scalar_manually():
92
+ widget.setCurrentMethod("division")
93
+ widget.setCurrentSource("manual ROI")
94
+
95
+ qt.QApplication.processEvents()
96
+ widget.setROI(start_x=0, end_x=10, start_y=0, end_y=10)
97
+ qt.QApplication.processEvents()
98
+ widget.compute()
99
+ widget.wait_processing(5000)
100
+ qt.QApplication.processEvents()
101
+
102
+ widget.process(scan_1)
103
+ process_scalar_manually()
104
+ assert (
105
+ process_manager.get_dataset_state(
106
+ dataset_id=scan_1.get_identifier(),
107
+ process=widget,
122
108
  )
123
-
124
- self.widget.process(self.scan_2)
125
- process_scalar_manually()
126
- self.assertEqual(len(self.widget.scans_finished), 0)
127
- self.assertEqual(
128
- self._process_manager.get_dataset_state(
129
- dataset_id=self.scan_1.get_identifier(),
130
- process=self.widget,
131
- ),
132
- DatasetState.SKIPPED,
109
+ == DatasetState.WAIT_USER_VALIDATION
110
+ )
111
+
112
+ widget.process(scan_2)
113
+ process_scalar_manually()
114
+ assert len(widget.scans_finished) == 0
115
+ assert (
116
+ process_manager.get_dataset_state(
117
+ dataset_id=scan_1.get_identifier(),
118
+ process=widget,
133
119
  )
134
- self.assertEqual(
135
- self._process_manager.get_dataset_state(
136
- dataset_id=self.scan_2.get_identifier(),
137
- process=self.widget,
138
- ),
139
- DatasetState.WAIT_USER_VALIDATION,
120
+ == DatasetState.SKIPPED
121
+ )
122
+ assert (
123
+ process_manager.get_dataset_state(
124
+ dataset_id=scan_2.get_identifier(),
125
+ process=widget,
140
126
  )
141
-
142
- self.widget.process(self.scan_3)
143
- process_scalar_manually()
144
- self.widget.validateCurrentScan()
145
- self.assertEqual(
146
- self._process_manager.get_dataset_state(
147
- dataset_id=self.scan_3.get_identifier(),
148
- process=self.widget,
149
- ),
150
- DatasetState.SUCCEED,
127
+ == DatasetState.WAIT_USER_VALIDATION
128
+ )
129
+
130
+ widget.process(scan_3)
131
+ process_scalar_manually()
132
+ widget.validateCurrentScan()
133
+ assert (
134
+ process_manager.get_dataset_state(
135
+ dataset_id=scan_3.get_identifier(),
136
+ process=widget,
137
+ )
138
+ == DatasetState.SUCCEED
139
+ )
140
+
141
+ # test behavior when the widget is locked
142
+
143
+ widget.setLocked(True)
144
+ for scan in (scan_1, scan_2, scan_3):
145
+ widget.process(scan)
146
+ widget.wait_processing(5000)
147
+ qt.QApplication.processEvents()
148
+
149
+ for scan in (scan_1, scan_2, scan_3):
150
+ # test status is SUCCEED
151
+ assert (
152
+ process_manager.get_dataset_state(
153
+ dataset_id=scan.get_identifier(),
154
+ process=widget,
155
+ )
156
+ == DatasetState.SUCCEED
151
157
  )
152
-
153
- def testTestLbsram(self):
154
- """Test scan are all validated if 'low memory on lbsram' scenario is
155
- activated"""
156
- mock_low_memory(True)
157
- settings.mock_lsbram(True)
158
- for scan in (self.scan_1, self.scan_2, self.scan_3):
159
- self.widget.process(scan)
160
- self.widget.wait_processing(5000)
161
- self.qapp.processEvents()
162
-
163
- for scan in (self.scan_1, self.scan_2, self.scan_3):
164
- with self.subTest(scan=str(scan)):
165
- self.assertEqual(
166
- self._process_manager.get_dataset_state(
167
- dataset_id=scan.get_identifier(),
168
- process=self.widget,
169
- ),
170
- DatasetState.SKIPPED,
171
- )
172
-
173
- def testLocked(self):
174
- """Test scan are all validated if the widget is lock"""
175
- self.widget.setLocked(True)
176
- for scan in (self.scan_1, self.scan_2, self.scan_3):
177
- self.widget.process(scan)
178
- self.widget.wait_processing(5000)
179
- self.qapp.processEvents()
180
-
181
- for scan in (self.scan_1, self.scan_2, self.scan_3):
182
- # test status is SUCCEED
183
- with self.subTest(scan=str(scan)):
184
- self.assertEqual(
185
- self._process_manager.get_dataset_state(
186
- dataset_id=scan.get_identifier(),
187
- process=self.widget,
188
- ),
189
- DatasetState.SUCCEED,
190
- )
tomwer/version.py CHANGED
@@ -77,7 +77,7 @@ RELEASE_LEVEL_VALUE = {
77
77
 
78
78
  MAJOR = 1
79
79
  MINOR = 4
80
- MICRO = 1
80
+ MICRO = 3
81
81
  RELEV = "final" # <16
82
82
  SERIAL = 0 # <16
83
83
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tomwer
3
- Version: 1.4.1
3
+ Version: 1.4.3
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
@@ -28,7 +28,7 @@ Requires-Dist: silx[full]>=2.0
28
28
  Requires-Dist: tomoscan>=2.1.0a18
29
29
  Requires-Dist: nxtomo>=1.3.0dev4
30
30
  Requires-Dist: nxtomomill>=1.1.0a0
31
- Requires-Dist: processview>=1.4.3
31
+ Requires-Dist: processview>=1.5.0
32
32
  Requires-Dist: ewoks>=0.1.1
33
33
  Requires-Dist: sluurp>=0.4.1
34
34
  Requires-Dist: packaging
@@ -1,7 +1,7 @@
1
1
  orangecontrib/tomwer/__init__.py,sha256=B4DXy1gY_wXmNYa2aOfapmJb2mEuCAjoaNEGnpBs70g,148
2
2
  orangecontrib/tomwer/state_summary.py,sha256=5_dPzweL3r0ye4ZfJo6IV2ThJI8fQhWoO2ySdJJajj8,1711
3
3
  orangecontrib/tomwer/orange/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- orangecontrib/tomwer/orange/managedprocess.py,sha256=P6A_-rPR6lVJ4thACKJTwgvkPMHpiZK7zRhA-9rLLVU,3281
4
+ orangecontrib/tomwer/orange/managedprocess.py,sha256=0OMlOYnNq5hC-t6CWtDaERQ9k0bNMGaLzVT9fDyM1LE,3512
5
5
  orangecontrib/tomwer/orange/settings.py,sha256=osaHvnyE1NJwAWHQoKHtageey1giRQCdBmpTY_zeWoA,720
6
6
  orangecontrib/tomwer/tests/TestAcquisition.py,sha256=57fI2tTnI7viysekP8aFQx2gggD9o0Quu6l0eW7zdyE,7782
7
7
  orangecontrib/tomwer/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -110,7 +110,7 @@ orangecontrib/tomwer/widgets/debugtools/icons/inspector.svg,sha256=GPx4Xoo8dZGr0
110
110
  orangecontrib/tomwer/widgets/debugtools/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
111
  orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py,sha256=fJuVlzd5mBRWOwKxRltlZqBV44HisF6O51aT0BPBwzM,5327
112
112
  orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py,sha256=qTI6B3cA-THpW3I7GJsP808vMCGX2XoQ-LzUqBeyvtY,3506
113
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py,sha256=dH-6SfYZXZiDvqHIggUzAE_iWT___sn1u9o1iycGnUk,3568
113
+ orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py,sha256=X9IXgm65Nq1TeDnYYIuyo8KlYfda2LQ38MtX_9rLQj8,3672
114
114
  orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py,sha256=PPSP8kqnkmHeeY4RW9IjH9n848W5MkCEQp4Emw8D17U,3744
115
115
  orangecontrib/tomwer/widgets/edit/__init__.py,sha256=Vi59fYTOMhrLXwQ3OkMIonmHx4rG_UUnutZPiax_rGY,1555
116
116
  orangecontrib/tomwer/widgets/edit/icons/image_key_editor.png,sha256=Fl6PEgzY9Gjs6Sh_vMWHCXVtNJ_wiQ5e9g58rZI64ng,878
@@ -150,7 +150,7 @@ orangecontrib/tomwer/widgets/other/icons/hub.svg,sha256=9EYoBKY-P-cO17nM48OPA9VD
150
150
  orangecontrib/tomwer/widgets/other/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  orangecontrib/tomwer/widgets/reconstruction/AxisOW.py,sha256=Qz6r34NdNgBvn-UwbIhPQDDCgtlXa_rSLnCEIuI_mrQ,20067
152
152
  orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py,sha256=E9hTJH_WfMsbOpKsGworVkqc16kWIRL1ajZbpnT_IAI,7614
153
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py,sha256=Xd0HwZLMHSCBQ0nqr0q69n9z5p2-ziEXjyOxY4lRU4Q,9741
153
+ orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py,sha256=flRgeOXimjzKEtL6h-0hwaa04G-BqMydv0Ju5r0Reao,9696
154
154
  orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py,sha256=NjMC0BEmPhDZ795Q-yyL81-hluAyGE8MRiq8xMdqAqY,6233
155
155
  orangecontrib/tomwer/widgets/reconstruction/NabuOW.py,sha256=UvCNwpAtQ1AdCl5kUw13QsKxesIDV8SIjIW9cWCXIMc,9946
156
156
  orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py,sha256=j-jDhgv6jvNOBz9X4vwGA-4UYbQ5I2FWSv6X2Eczrfg,17077
@@ -220,7 +220,7 @@ orangecontrib/tomwer/widgets/visualization/tests/__init__.py,sha256=47DEQpj8HBSa
220
220
  tomwer/__init__.py,sha256=GeLSeY4__z-HQZu1y4ptZ5Y1OeXFvG8kuEwWXhkeaMA,360
221
221
  tomwer/__main__.py,sha256=7tCADiS4u7k1PCxFhlRAcYSIOpxQTGUTx8sCEQ-hi1E,8707
222
222
  tomwer/utils.py,sha256=7h7dEgKAEUmQ43jkULvC1B9Adl55nkCty-SEKUKCl4U,7008
223
- tomwer/version.py,sha256=HqQAJgfU5vpvx0RHpY6UlCs10HU0x9QpXer8ENGvoZQ,4386
223
+ tomwer/version.py,sha256=a1loEqEj9NVb3IVtlWL8YHxJkt3I_gA4e_oclG0NANo,4386
224
224
  tomwer/app/__init__.py,sha256=RYMB2YhbQaoMXC8W-oOyfZ_Y1vmHD7L13YkKeAMuShM,85
225
225
  tomwer/app/axis.py,sha256=OhDgMj_gS-45PnjKBTyOCOkmZ1Iy-Tb6Dj66mzQg0sU,5827
226
226
  tomwer/app/canvas.py,sha256=sM368nniUwbQXLA-oNCg1iNwMMol_ZGTKbiw8WsC4yw,1539
@@ -321,7 +321,7 @@ tomwer/core/process/reconstruction/params_cache.py,sha256=GTchgCH1Db7fuYsSGxSF6w
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
323
323
  tomwer/core/process/reconstruction/axis/anglemode.py,sha256=4IFrqYSeWEMs14GZHipr1u9Njm2fLhF7qJHq9_kWfeY,537
324
- tomwer/core/process/reconstruction/axis/axis.py,sha256=FFotNuhm4tyDQSAyoGFAvn1KFuI7-2jVZhRG1DrSpXs,16965
324
+ tomwer/core/process/reconstruction/axis/axis.py,sha256=RjK_LX9rowqAx7J3VOE37wFmviH5qUSRBWyMv7CBo3A,17097
325
325
  tomwer/core/process/reconstruction/axis/mode.py,sha256=Bp3Kz5fK9lIZdDvGlc3AAFoDo6d4fqezV37cX9lPiBI,9541
326
326
  tomwer/core/process/reconstruction/axis/params.py,sha256=yabw4l2TDyssc0xwXS_WQ7n3hEoDtAJtl_chDr_BAhw,28276
327
327
  tomwer/core/process/reconstruction/axis/projectiontype.py,sha256=U8ZZA2o3tONpUkzWLL-MXTahtJGJMQofpJOVkuDNc8Q,184
@@ -336,7 +336,7 @@ tomwer/core/process/reconstruction/nabu/castvolume.py,sha256=4VEVnJxWfG8_Ku2uhUS
336
336
  tomwer/core/process/reconstruction/nabu/helical.py,sha256=gauUkoPiShvnvMQrCQXv28g0yLe-GceML5kYMSXmNIg,1997
337
337
  tomwer/core/process/reconstruction/nabu/nabucommon.py,sha256=s1KxEzHQJ09JEWP3_EvKFe51k1boi_a8YRlbs3TppdE,23338
338
338
  tomwer/core/process/reconstruction/nabu/nabuscores.py,sha256=e5tRG1QtmVAdXb8KHMTMtBXA3KQXqKKcqipY2HzMURg,25275
339
- tomwer/core/process/reconstruction/nabu/nabuslices.py,sha256=sUpU1f6_qWbuKVUDNattFVvFE88By29f3CtTCtuKT-k,31517
339
+ tomwer/core/process/reconstruction/nabu/nabuslices.py,sha256=WAmNlfyRWL0zhEE8jMjMg7WyzPM4BcBA6bWpaH8O53A,32101
340
340
  tomwer/core/process/reconstruction/nabu/nabuvolume.py,sha256=Fn0tkPDTDJQaMEJA4LzpPp0ZtG4MIu9YN82-jesxRKo,20052
341
341
  tomwer/core/process/reconstruction/nabu/plane.py,sha256=366gWprWw8Rlob8jsMn753CqgudruvvVauU0ihH2lU4,400
342
342
  tomwer/core/process/reconstruction/nabu/settings.py,sha256=3AJpxVQbJziw4v6F26Ppz8Q9vc9ZNepTWygqpCAbIEM,955
@@ -885,7 +885,7 @@ tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py,sha2
885
885
  tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py,sha256=4urO8fmzwNUyaThujIOX7X37g-_DEtTerpirgMz_47o,1612
886
886
  tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py,sha256=qCiY4Gm_z6OsoLjVDLpHv4W1zCYNiBDT5QSCvLPzrOc,4925
887
887
  tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py,sha256=BJcjGemqzqwjqBVVCMLB_ASDWGtAyQUO6cl4m2N9m2E,407
888
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py,sha256=L-wYwihJP5ZBzA-2jECIV8XPLM5hAguGpM_qDByA9Jc,6007
888
+ tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py,sha256=909ajdn_p0MHZ7N6rLGu_E9hlrEwGYxTkJft4RLDbjU,4101
889
889
  tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py,sha256=ofao24KYcPCWoxR771MtfKv4EY3TjFLFgRtJtEgKYrI,621
890
890
  tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py,sha256=0g0eCp6RDQlRSZe0me4LvGxTA66ChRtwQjCAWMmsvj8,2298
891
891
  tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py,sha256=_yhT_ih0VIBsm2OdLObuZgjpLf38ILXvzn7pOTtxdl8,3780
@@ -903,9 +903,9 @@ tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewer
903
903
  tomwer/tests/test_ewoks/test_conversion.py,sha256=a8cEWbErXiFCAkaapi0jeEoRKYxcFQCoa-Jr_u77_OM,3656
904
904
  tomwer/tests/test_ewoks/test_single_node_execution.py,sha256=YBUHfiAnkciv_kjj7biC5fOs7c7ofNImM_azGMn4LZM,2813
905
905
  tomwer/tests/test_ewoks/test_workflows.py,sha256=Eq80eexf5NVL7SzvwctLOaUeuQ8V3vDiFiHgbJA4Yb8,4871
906
- tomwer-1.4.1.dist-info/LICENSE,sha256=62p1wL0n9WMTu8x2YDv0odYgTqeSvTd9mQ0v6Mq7lzE,1876
907
- tomwer-1.4.1.dist-info/METADATA,sha256=DrZfU31k8F-lEUAK-izfE6fr6M5DfOVHG4ecrw0OjW8,13377
908
- tomwer-1.4.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
909
- tomwer-1.4.1.dist-info/entry_points.txt,sha256=py3ZUWvGnWGc5c7Yhw_uBTm8Fmew0BDw3aQZnWMBNZI,500
910
- tomwer-1.4.1.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
911
- tomwer-1.4.1.dist-info/RECORD,,
906
+ tomwer-1.4.3.dist-info/LICENSE,sha256=62p1wL0n9WMTu8x2YDv0odYgTqeSvTd9mQ0v6Mq7lzE,1876
907
+ tomwer-1.4.3.dist-info/METADATA,sha256=Ld2sbq0AQqYvZRs3bw6o5BjDIzkFYxLOMzOXiANnUiY,13377
908
+ tomwer-1.4.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
909
+ tomwer-1.4.3.dist-info/entry_points.txt,sha256=py3ZUWvGnWGc5c7Yhw_uBTm8Fmew0BDw3aQZnWMBNZI,500
910
+ tomwer-1.4.3.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
911
+ tomwer-1.4.3.dist-info/RECORD,,
File without changes