tomwer 1.4.0__py3-none-any.whl → 1.4.0rc0__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.
Files changed (53) hide show
  1. orangecontrib/tomwer/tutorials/test_cor.ows +3 -3
  2. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +14 -6
  3. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +2 -4
  4. tomwer/app/axis.py +3 -0
  5. tomwer/app/multipag.py +3 -11
  6. tomwer/core/process/reconstruction/axis/axis.py +736 -27
  7. tomwer/core/process/reconstruction/axis/mode.py +24 -86
  8. tomwer/core/process/reconstruction/axis/params.py +138 -127
  9. tomwer/core/process/reconstruction/nabu/nabuscores.py +22 -19
  10. tomwer/core/process/reconstruction/nabu/nabuslices.py +1 -5
  11. tomwer/core/process/reconstruction/saaxis/saaxis.py +4 -4
  12. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +4 -4
  13. tomwer/core/process/reconstruction/tests/test_axis.py +1 -1
  14. tomwer/core/process/reconstruction/tests/test_utils.py +4 -4
  15. tomwer/core/process/reconstruction/utils/cor.py +4 -8
  16. tomwer/core/process/tests/test_axis.py +231 -0
  17. tomwer/core/process/tests/test_nabu.py +3 -1
  18. tomwer/core/scan/nxtomoscan.py +0 -2
  19. tomwer/core/scan/scanbase.py +4 -4
  20. tomwer/core/scan/tests/test_process_registration.py +18 -0
  21. tomwer/gui/reconstruction/axis/AxisMainWindow.py +9 -20
  22. tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +79 -239
  23. tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +17 -38
  24. tomwer/gui/reconstruction/axis/AxisWidget.py +8 -16
  25. tomwer/gui/reconstruction/axis/CalculationWidget.py +200 -44
  26. tomwer/gui/reconstruction/axis/ControlWidget.py +2 -10
  27. tomwer/gui/reconstruction/axis/InputWidget.py +155 -11
  28. tomwer/gui/reconstruction/saaxis/corrangeselector.py +10 -19
  29. tomwer/gui/reconstruction/scores/scoreplot.py +2 -5
  30. tomwer/gui/reconstruction/tests/test_nabu.py +0 -8
  31. tomwer/gui/stitching/config/axisparams.py +0 -2
  32. tomwer/gui/stitching/z_stitching/fineestimation.py +1 -1
  33. tomwer/gui/tests/test_axis_gui.py +15 -31
  34. tomwer/synctools/stacks/reconstruction/axis.py +23 -5
  35. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +1 -1
  36. tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
  37. tomwer/synctools/stacks/reconstruction/normalization.py +1 -1
  38. tomwer/synctools/stacks/reconstruction/saaxis.py +1 -1
  39. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +1 -1
  40. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +16 -0
  41. tomwer/tests/test_ewoks/test_single_node_execution.py +1 -1
  42. tomwer/tests/test_ewoks/test_workflows.py +1 -1
  43. tomwer/version.py +1 -1
  44. {tomwer-1.4.0.dist-info → tomwer-1.4.0rc0.dist-info}/METADATA +3 -3
  45. {tomwer-1.4.0.dist-info → tomwer-1.4.0rc0.dist-info}/RECORD +49 -52
  46. tomwer/core/process/reconstruction/axis/side.py +0 -8
  47. tomwer/gui/fonts.py +0 -5
  48. tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +0 -394
  49. tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +0 -118
  50. {tomwer-1.4.0.dist-info → tomwer-1.4.0rc0.dist-info}/LICENSE +0 -0
  51. {tomwer-1.4.0.dist-info → tomwer-1.4.0rc0.dist-info}/WHEEL +0 -0
  52. {tomwer-1.4.0.dist-info → tomwer-1.4.0rc0.dist-info}/entry_points.txt +0 -0
  53. {tomwer-1.4.0.dist-info → tomwer-1.4.0rc0.dist-info}/top_level.txt +0 -0
@@ -16,10 +16,6 @@ from silx.gui.plot import items
16
16
  from silx.utils.enum import Enum as _Enum
17
17
  from tomoscan.esrf.scan.utils import get_data
18
18
 
19
- from tomwer.core.process.reconstruction.utils.cor import (
20
- absolute_pos_to_relative,
21
- relative_pos_to_absolute,
22
- )
23
19
  from tomwer.core.process.reconstruction.saaxis.saaxis import ReconstructionMode
24
20
  from tomwer.core.scan.scanbase import TomwerScanBase
25
21
  from tomwer.gui import icons
@@ -27,7 +23,6 @@ from tomwer.gui.reconstruction.saaxis.sliceselector import SliceSelector
27
23
  from tomwer.gui.utils.lineselector import QSliceSelectorDialog
28
24
  from tomwer.gui.utils.slider import LogSlider
29
25
  from tomwer.gui.visualization.sinogramviewer import SinogramViewer as _SinogramViewer
30
- from tomwer.gui.fonts import FONT_MEDIUM, FONT_IMPORTANT
31
26
 
32
27
  _logger = logging.getLogger(__name__)
33
28
 
@@ -498,9 +493,7 @@ class _EstimatedCorWidget(qt.QGroupBox):
498
493
  return 0.0
499
494
  elif mode in ("abs", "absolute"):
500
495
  if self._frameWidth is not None:
501
- return relative_pos_to_absolute(
502
- relative_pos=0.0, det_width=self._frameWidth
503
- )
496
+ return (self._frameWidth - 1) / 2.0
504
497
  else:
505
498
  return self._MIDDLE_COR_TXT
506
499
  else:
@@ -526,9 +519,7 @@ class _EstimatedCorWidget(qt.QGroupBox):
526
519
  old = self.blockSignals(True)
527
520
  old_mcor = self._manualCORAbs.blockSignals(True)
528
521
  self._manualCORAbs.setValue(
529
- relative_pos_to_absolute(
530
- relative_pos=self._manualCORRel.value(), det_width=self._frameWidth
531
- )
522
+ self._manualCORRel.value() + (self._frameWidth - 1) / 2.0
532
523
  )
533
524
  self._manualCORAbs.blockSignals(old_mcor)
534
525
  self.blockSignals(old)
@@ -538,10 +529,7 @@ class _EstimatedCorWidget(qt.QGroupBox):
538
529
  old = self.blockSignals(True)
539
530
  old_mcor = self._manualCORRel.blockSignals(True)
540
531
  self._manualCORRel.setValue(
541
- absolute_pos_to_relative(
542
- absolute_pos=self._manualCORAbs.value(),
543
- det_width=self._frameWidth,
544
- )
532
+ self._manualCORAbs.value() - (self._frameWidth - 1) / 2.0
545
533
  )
546
534
  self._manualCORRel.blockSignals(old_mcor)
547
535
  self.blockSignals(old)
@@ -594,12 +582,15 @@ class SAAxisOptions(qt.QWidget):
594
582
  sigConfigurationChanged = qt.Signal()
595
583
  """signal emitted when the configuration change"""
596
584
 
585
+ _FONT_IMPORTANT = qt.QFont("Arial", 12)
586
+ _FONT_MEDIUM = qt.QFont("Arial", 10)
587
+
597
588
  def __init__(self, parent=None):
598
589
  qt.QWidget.__init__(self, parent)
599
590
  self.setLayout(qt.QVBoxLayout())
600
591
  # reconstruction mode
601
592
  self._reconstructionMode = _ReconstructionModeGB(parent=self)
602
- self._reconstructionMode.setFont(FONT_MEDIUM)
593
+ self._reconstructionMode.setFont(self._FONT_MEDIUM)
603
594
  self.layout().addWidget(self._reconstructionMode)
604
595
 
605
596
  # estimated cor
@@ -607,12 +598,12 @@ class SAAxisOptions(qt.QWidget):
607
598
  self,
608
599
  title="Estimated cor position (x axis)",
609
600
  )
610
- self._estimatedCorWidget.setFont(FONT_IMPORTANT)
601
+ self._estimatedCorWidget.setFont(self._FONT_IMPORTANT)
611
602
  self.layout().addWidget(self._estimatedCorWidget)
612
603
 
613
604
  # detection accuracy
614
605
  self._detectionAccuracy = _DetectionAccuracyGB(parent=self)
615
- self._detectionAccuracy.setFont(FONT_MEDIUM)
606
+ self._detectionAccuracy.setFont(self._FONT_MEDIUM)
616
607
  self.layout().addWidget(self._detectionAccuracy)
617
608
 
618
609
  # number of reconstructions eq volume size
@@ -622,7 +613,7 @@ class SAAxisOptions(qt.QWidget):
622
613
  self._nReconsSB = qt.QSpinBox(self._nReconsWidget)
623
614
  self._nReconsSB.setRange(0, 2000)
624
615
  self._nReconsSB.setValue(30)
625
- self._nReconsWidget.setFont(FONT_IMPORTANT)
616
+ self._nReconsWidget.setFont(self._FONT_IMPORTANT)
626
617
  self._nReconsWidget.layout().addRow("Number of reconstruction", self._nReconsSB)
627
618
  self.layout().addWidget(self._nReconsWidget)
628
619
 
@@ -14,7 +14,6 @@ from matplotlib import image as _matplotlib_image
14
14
  from silx.gui import qt
15
15
  from silx.gui.plot import PlotWidget
16
16
 
17
- from tomwer.core.process.reconstruction.utils.cor import relative_pos_to_absolute
18
17
  from tomwer.core.process.reconstruction.scores.params import ScoreMethod
19
18
  from tomwer.gui import icons, settings
20
19
  from tomwer.gui.reconstruction.saaxis.dimensionwidget import DimensionWidget
@@ -308,9 +307,7 @@ class CorSelection(VariableSelection):
308
307
  if relative_value is None or self._img_width is None:
309
308
  self._absoluteVarValueLE.clear()
310
309
  else:
311
- absolute_value = relative_pos_to_absolute(
312
- relative_pos=relative_value, det_width=self._img_width
313
- )
310
+ absolute_value = relative_value + (self._img_width - 1) / 2.0
314
311
  self._absoluteVarValueLE.setText(f"{absolute_value:.3f}")
315
312
 
316
313
  def getWindowTitle(self):
@@ -425,7 +422,7 @@ class _VariableValueLabels(qt.QWidget):
425
422
  # paint oblique text
426
423
  with PainterRotationCM(
427
424
  painter=painter,
428
- x=var_px_pos + (self._slider_ticks_margin / 2.0),
425
+ x=var_px_pos + self._slider_ticks_margin / 2.0,
429
426
  y=0,
430
427
  angle=self.rotation_angle_degree,
431
428
  ) as l_painter:
@@ -19,11 +19,8 @@ from tomwer.gui.reconstruction.nabu.nabuconfig.reconstruction import (
19
19
  )
20
20
  from tomwer.gui.reconstruction.nabu.nabuflow import NabuFlowControl
21
21
  from tomwer.gui.reconstruction.nabu.volume import NabuVolumeTabWidget
22
- from tomwer.gui.reconstruction.axis.EstimatedCORWidget import EstimatedCORWidget
23
22
  from tomwer.tests.utils import skip_gui_test
24
23
  from tomwer.core.process.output import ProcessDataOutputDirMode
25
- from tomwer.tests.conftest import qtapp # noqa F401
26
- from tomwer.synctools.axis import QAxisRP
27
24
 
28
25
 
29
26
  class ProcessClass:
@@ -359,8 +356,3 @@ class TestNabuVolumeWidget(TestCaseQt):
359
356
  }
360
357
  )
361
358
  self.assertEqual(self.nabuWidget.getConfiguration(), conf)
362
-
363
-
364
- def test_EstimatedCorWidget(qtapp): # noqa F811
365
- """test of EstimatedCorWidget"""
366
- EstimatedCORWidget(parent=None, axis_params=QAxisRP())
@@ -119,8 +119,6 @@ class StitcherAxisParams(qt.QWidget):
119
119
  for option in options:
120
120
  clean_option = option.rstrip(" ").lstrip(" ")
121
121
  opt_name, opt_value = clean_option.split("=")
122
- if opt_value == "":
123
- continue
124
122
  if opt_name == stitching_config.KEY_IMG_REG_METHOD:
125
123
  self.setShiftSearchMethod(opt_value)
126
124
  elif opt_name == stitching_config.KEY_WINDOW_SIZE:
@@ -73,7 +73,7 @@ class Axis_N_Params(qt.QGroupBox):
73
73
 
74
74
  class AutoRefineWidget(qt.QWidget):
75
75
  """
76
- widget grouping information not specific to objects (output file, stitching strategy...)
76
+ widget grouping information not specific to objects (output file, stithcing strategy...)
77
77
  """
78
78
 
79
79
  def __init__(self, parent=None):
@@ -1,5 +1,4 @@
1
1
  import pytest
2
- import numpy
3
2
 
4
3
  from tomwer.gui.reconstruction.axis.AxisSettingsWidget import AxisSettingsTabWidget
5
4
  from tomwer.synctools.axis import QAxisRP
@@ -11,33 +10,18 @@ from tomwer.tests.conftest import qtapp # noqa F401
11
10
  def test_get_nabu_cor_opts(qtapp): # noqa F811
12
11
  axis_params = QAxisRP()
13
12
  widget = AxisSettingsTabWidget(recons_params=axis_params)
14
- assert axis_params.get_nabu_cor_options_as_dict() == {
15
- "side": "right",
16
- "radio_angles": (0.0, numpy.pi),
17
- "slice_idx": "middle",
18
- }
19
- widget._optionsWidget._corOpts.setText("low_pass=2.0")
20
- widget._optionsWidget._corOpts.editingFinished.emit()
21
- assert axis_params.get_nabu_cor_options_as_dict() == {
22
- "side": "right",
23
- "radio_angles": (0.0, numpy.pi),
24
- "slice_idx": "middle",
25
- "low_pass": 2.0,
26
- }
27
- widget._optionsWidget._corOpts.setText("low_pass=2 ; high_pass=10")
28
- widget._optionsWidget._corOpts.editingFinished.emit()
29
- assert axis_params.get_nabu_cor_options_as_dict() == {
30
- "side": "right",
31
- "radio_angles": (0.0, numpy.pi),
32
- "slice_idx": "middle",
33
- "low_pass": 2.0,
34
- "high_pass": 10.0,
35
- }
36
- widget._calculationWidget.setEstimatedCorValue("left")
37
- assert axis_params.get_nabu_cor_options_as_dict() == {
38
- "side": "left",
39
- "radio_angles": (0.0, numpy.pi),
40
- "slice_idx": "middle",
41
- "low_pass": 2.0,
42
- "high_pass": 10.0,
43
- }
13
+ assert axis_params.get_nabu_cor_options_as_str() == "side='right'"
14
+ widget._calculationWidget._corOpts.setText("low_pass=2")
15
+ widget._calculationWidget._corOpts.editingFinished.emit()
16
+ assert axis_params.get_nabu_cor_options_as_str() == "side='right' ; low_pass=2"
17
+ widget._calculationWidget._corOpts.setText("low_pass=2 ; high_pass=10")
18
+ widget._calculationWidget._corOpts.editingFinished.emit()
19
+ assert axis_params.get_nabu_cor_options_as_str() == (
20
+ "side='right' ; low_pass=2 ; high_pass=10"
21
+ )
22
+ widget._calculationWidget._sideCB.setCurrentText("left")
23
+ widget._calculationWidget._corOpts.editingFinished.emit()
24
+ assert (
25
+ axis_params.get_nabu_cor_options_as_str()
26
+ == "side='left' ; low_pass=2 ; high_pass=10"
27
+ )
@@ -23,7 +23,7 @@ _logger = logging.getLogger(__name__)
23
23
 
24
24
 
25
25
  class AxisProcessStack(FIFO, qt.QObject):
26
- """Implementation of the `.AxisTask` but having a stack for treating
26
+ """Implementation of the `.AxisProcess` but having a stack for treating
27
27
  scans and making computation in threads"""
28
28
 
29
29
  def __init__(self, axis_params, process_id=None):
@@ -55,7 +55,7 @@ class AxisProcessStack(FIFO, qt.QObject):
55
55
  if callback is not None:
56
56
  callback()
57
57
  self.scan_ready(scan=data)
58
- elif mode is (AxisMode.manual,):
58
+ elif not self._axis_params.use_sinogram and mode in (AxisMode.manual,):
59
59
  # if cor is not set then set it to 0 (can be the case if no)
60
60
  # interaction has been dne
61
61
  cor = self._axis_params.relative_cor_value
@@ -84,6 +84,14 @@ class AxisProcessStack(FIFO, qt.QObject):
84
84
  # we will keep the actual one (should have been defined previously)
85
85
  self._end_computation(data=data, future_tomo_obj=None, callback=callback)
86
86
 
87
+ elif (
88
+ not self._axis_params.use_sinogram
89
+ and mode not in AxisTask._CALCULATIONS_METHODS
90
+ ):
91
+ _logger.warning(f"no method defined to compute {mode}")
92
+ if callback is not None:
93
+ callback()
94
+ self._process_next()
87
95
  else:
88
96
  _logger.processStarted(
89
97
  f"Start cor calculation on {data} ({self._axis_params.get_simple_str()})"
@@ -105,7 +113,7 @@ class AxisProcessStack(FIFO, qt.QObject):
105
113
  """
106
114
  assert isinstance(data, TomwerScanBase)
107
115
  assert self._axis_params is not None
108
- # copy result computed on scan on the AxisTask reconsparams
116
+ # copy result computed on scan on the AxisProcess reconsparams
109
117
  self._axis_params.set_relative_value(
110
118
  data.axis_params.relative_cor_value
111
119
  ) # noqa
@@ -159,13 +167,23 @@ class _ProcessingThread(ProcessingThread, SuperviseProcess):
159
167
  },
160
168
  process_id=self.process_id,
161
169
  )
170
+ axis = self.apply_patch(axis=axis)
162
171
  try:
163
172
  axis.run()
164
173
  except NoAxisUrl as e:
165
174
  self.center_of_rotation = None
166
- _logger.error(f"CoR calculation failed. Issue with input ({e})")
175
+ _logger.error(str(e))
167
176
  except Exception as e:
168
- _logger.error(f"CoR calculation failed ({e})", stack_info=True)
177
+ _logger.error(str(e))
169
178
  self.center_of_rotation = None
170
179
  else:
171
180
  self.center_of_rotation = self._scan.axis_params.relative_cor_value
181
+
182
+ def patch_calc_method(self, mode, function):
183
+ self.__patch[mode] = function
184
+
185
+ def apply_patch(self, axis):
186
+ for mode, patch_fct in self.__patch.items():
187
+ if mode in AxisMode:
188
+ axis._CALCULATIONS_METHODS[mode] = patch_fct
189
+ return axis
@@ -23,7 +23,7 @@ _logger = logging.getLogger(__name__)
23
23
 
24
24
 
25
25
  class DarkRefCopyProcessStack(FIFO, qt.QObject):
26
- """Implementation of the `.AxisTask` but having a stack for treating
26
+ """Implementation of the `.AxisProcess` but having a stack for treating
27
27
  scans and making computation in threads"""
28
28
 
29
29
  sigRefSetted = qt.Signal(str)
@@ -21,7 +21,7 @@ _logger = logging.getLogger(__name__)
21
21
 
22
22
 
23
23
  class NabuSliceProcessStack(FIFO, qt.QObject):
24
- """Implementation of the `.AxisTask` but having a stack for treating
24
+ """Implementation of the `.AxisProcess` but having a stack for treating
25
25
  scans and making computation in threads"""
26
26
 
27
27
  def __init__(self, parent=None, process_id=None):
@@ -78,7 +78,7 @@ class NabuSliceProcessStack(FIFO, qt.QObject):
78
78
 
79
79
 
80
80
  class NabuVolumeProcessStack(NabuSliceProcessStack):
81
- """Implementation of the `.AxisTask` but having a stack for treating
81
+ """Implementation of the `.AxisProcess` but having a stack for treating
82
82
  scans and making computation in threads"""
83
83
 
84
84
  def _create_processing_thread(self, process_id=None) -> qt.QThread:
@@ -20,7 +20,7 @@ _logger = logging.getLogger(__name__)
20
20
 
21
21
 
22
22
  class INormalizationProcessStack(FIFO, qt.QObject):
23
- """Implementation of the `.AxisTask` but having a stack for treating
23
+ """Implementation of the `.AxisProcess` but having a stack for treating
24
24
  scans and making computation in threads"""
25
25
 
26
26
  def __init__(self, process_id=None):
@@ -22,7 +22,7 @@ _logger = logging.getLogger(__name__)
22
22
 
23
23
 
24
24
  class SAAxisProcessStack(FIFO, qt.QObject):
25
- """Implementation of the `.AxisTask` but having a stack for treating
25
+ """Implementation of the `.AxisProcess` but having a stack for treating
26
26
  scans and making computation in threads"""
27
27
 
28
28
  def __init__(self, saaxis_params, process_id=None):
@@ -24,7 +24,7 @@ _logger = logging.getLogger(__name__)
24
24
 
25
25
 
26
26
  class SADeltaBetaProcessStack(FIFO, qt.QObject):
27
- """Implementation of the `.AxisTask` but having a stack for treating
27
+ """Implementation of the `.AxisProcess` but having a stack for treating
28
28
  scans and making computation in threads"""
29
29
 
30
30
  def __init__(self, sa_delta_beta_params, process_id=None):
@@ -179,6 +179,22 @@ class TestAxisStack(TestCaseQt):
179
179
  self.assertEqual(self._scan2.axis_params, None)
180
180
  self.assertEqual(self._scan3.axis_params, None)
181
181
 
182
+ def testUnlockStack(self):
183
+ """Check that all axis position will be computed properly if we set a
184
+ stack of scan"""
185
+ self._mainWindow.recons_params.set_relative_value(1.0)
186
+ for scan in (self._scan1, self._scan2, self._scan3):
187
+ self._mainWindow.process(scan)
188
+
189
+ for i in range(5):
190
+ self.qapp.processEvents()
191
+ time.sleep(0.2)
192
+ self.qapp.processEvents()
193
+
194
+ self.assertNotEqual(self._scan1.axis_params, None)
195
+ self.assertNotEqual(self._scan2.axis_params, None)
196
+ self.assertNotEqual(self._scan3.axis_params, None)
197
+
182
198
  def testLockStack(self):
183
199
  """Check that axis position will be simply copy if we are in a lock
184
200
  stack"""
@@ -37,7 +37,7 @@ pytest.mark.skipif(condition=not has_nabu, reason="nabu not installed")
37
37
 
38
38
  classes_to_test = {
39
39
  "darkref": "tomwer.core.process.reconstruction.darkref.darkrefs.DarkRefs",
40
- "axis": "tomwer.core.process.reconstruction.axis.axis.AxisTask",
40
+ "axis": "tomwer.core.process.reconstruction.axis.axis.AxisProcess",
41
41
  "nabu slices": "tomwer.core.process.reconstruction.nabu.nabuslices.NabuSlices",
42
42
  }
43
43
 
@@ -55,7 +55,7 @@ def test_simple_workflow_nabu():
55
55
  {
56
56
  "id": "axis",
57
57
  "task_type": "class",
58
- "task_identifier": "tomwer.core.process.reconstruction.axis.axis.AxisTask",
58
+ "task_identifier": "tomwer.core.process.reconstruction.axis.axis.AxisProcess",
59
59
  "default_inputs": [
60
60
  {
61
61
  "name": "axis_params",
tomwer/version.py CHANGED
@@ -78,7 +78,7 @@ RELEASE_LEVEL_VALUE = {
78
78
  MAJOR = 1
79
79
  MINOR = 4
80
80
  MICRO = 0
81
- RELEV = "final" # <16
81
+ RELEV = "rc" # <16
82
82
  SERIAL = 0 # <16
83
83
 
84
84
  date = __date__
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tomwer
3
- Version: 1.4.0
3
+ Version: 1.4.0rc0
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,9 +28,9 @@ 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.3
32
32
  Requires-Dist: ewoks>=0.1.1
33
- Requires-Dist: sluurp>=0.4.1
33
+ Requires-Dist: sluurp>=0.4.0
34
34
  Requires-Dist: packaging
35
35
  Requires-Dist: flufl-lock
36
36
  Requires-Dist: pyunitsystem>=2.0.0a