tomwer 1.3.12__py3-none-any.whl → 1.3.14__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.
@@ -152,6 +152,7 @@ class DarkRefAndCopyOW(SuperviseOW, WidgetLongProcessing):
152
152
  self.widget.recons_params.sigChanged.connect(self._updateSettingsVals)
153
153
  self.widget.sigModeAutoChanged.connect(self._updateSettingsVals)
154
154
  self.widget.sigCopyActivationChanged.connect(self._updateSettingsVals)
155
+ self.widget.sigClearCache.connect(self._processing_stack.clear_cache)
155
156
  self._processing_stack.sigComputationStarted.connect(self._startProcessing)
156
157
  self._processing_stack.sigComputationEnded.connect(self._endProcessing)
157
158
  self._processing_stack.sigRefSetted.connect(self.widget.setRefSetBy)
@@ -34,6 +34,7 @@ __date__ = "17/08/2021"
34
34
 
35
35
  import logging
36
36
  import os
37
+ import h5py
37
38
  import tempfile
38
39
  from typing import Union
39
40
 
@@ -198,10 +199,37 @@ class DarkRefsCopy(DarkRefsTask):
198
199
  update_mode="replace",
199
200
  )
200
201
 
202
+ def clear_cache(self):
203
+ """
204
+ remove the file used to cache the reduced darks / flats.
205
+ This can be used in the case it contain unrelevant data. Like frame with another shape...
206
+ """
207
+ cache_file = DarkRefsCopy.get_save_file(self._savedir)
208
+ if os.path.exists(cache_file):
209
+ os.remove(cache_file)
210
+
211
+ def _clear_cache_data_path(self, file_path: str, data_path: str):
212
+ if not os.path.exists(file_path):
213
+ return
214
+ with h5py.File(file_path, mode="a") as h5f:
215
+ if data_path in h5f:
216
+ del h5f[data_path]
217
+
201
218
  def set_darks_and_flats_from_scan(self, scan: TomwerScanBase) -> bool:
202
- if scan.reduced_flats in (None, {}):
219
+ has_flats = scan.reduced_flats not in (None, {})
220
+ has_darks = scan.reduced_darks not in (None, {})
221
+ if has_flats and has_darks:
222
+ # if the scan has darks and flats remove directly the cache file
223
+ # else in append mode HDF5 is not removing the dataset and
224
+ # the cache size will continue to increase
225
+ self.clear_cache()
226
+ if not has_flats:
203
227
  logger.warning(f"No flat found for {scan}. Unable to copy them")
204
228
  else:
229
+ self._clear_cache_data_path(
230
+ file_path=self._flats_url.file_path(),
231
+ data_path=self._flats_url.data_path(),
232
+ )
205
233
  dicttoh5(
206
234
  scan.reduced_flats,
207
235
  h5file=self._flats_url.file_path(),
@@ -209,9 +237,13 @@ class DarkRefsCopy(DarkRefsTask):
209
237
  mode="a",
210
238
  update_mode="replace",
211
239
  )
212
- if scan.reduced_darks in (None, {}):
240
+ if not has_darks:
213
241
  logger.warning(f"No dark found for {scan}. Unable to copy them")
214
242
  else:
243
+ self._clear_cache_data_path(
244
+ file_path=self._darks_url.file_path(),
245
+ data_path=self._darks_url.data_path(),
246
+ )
215
247
  dicttoh5(
216
248
  scan.reduced_darks,
217
249
  h5file=self._darks_url.file_path(),
@@ -247,10 +279,6 @@ class DarkRefsCopy(DarkRefsTask):
247
279
  overwrite=True,
248
280
  )
249
281
 
250
- def clean_save_files(self):
251
- if os.path.exists(self._save_file):
252
- os.remove(self._save_file)
253
-
254
282
  def run(self):
255
283
  """
256
284
  This is function triggered when a new scan / data is received.
@@ -156,7 +156,9 @@ class _SelectorWidget(qt.QMainWindow):
156
156
 
157
157
  def removeSelectedDatasets(self):
158
158
  sItem = self.dataList.selectedItems()
159
- selection = [_item.text().get_identifier().to_str() for _item in sItem]
159
+ selection = [
160
+ _item.data(qt.Qt.UserRole).get_identifier().to_str() for _item in sItem
161
+ ]
160
162
 
161
163
  with block_signals(self):
162
164
  # make sure sigUpdated is called only once.
@@ -574,28 +574,36 @@ class NXtomoEditor(qt.QWidget):
574
574
  ),
575
575
  solve_empty_dependency=True,
576
576
  )
577
- detector_transformation_path = "/".join(
578
- (
579
- nexus_paths.INSTRUMENT_PATH,
580
- nexus_paths.nx_instrument_paths.DETECTOR_PATH,
581
- nexus_paths.nx_detector_paths.NX_TRANSFORMATIONS,
582
- ),
583
- )
584
- if detector_transformation_path in entry:
585
- del entry[detector_transformation_path]
586
-
587
- detector_transformation_path = "/".join(
588
- (scan.entry, detector_transformation_path)
577
+ if nexus_paths.nx_detector_paths.NX_TRANSFORMATIONS is not None:
578
+ # old NXtomo are not handling NX_TRANSFORMATIONS
579
+ detector_transformation_path = "/".join(
580
+ (
581
+ nexus_paths.INSTRUMENT_PATH,
582
+ nexus_paths.nx_instrument_paths.DETECTOR_PATH,
583
+ nexus_paths.nx_detector_paths.NX_TRANSFORMATIONS,
584
+ ),
585
+ )
586
+ if detector_transformation_path in entry:
587
+ del entry[detector_transformation_path]
588
+
589
+ detector_transformation_path = "/".join(
590
+ (scan.entry, detector_transformation_path)
591
+ )
592
+ else:
593
+ _logger.debug(
594
+ "Old version of NXtomo found. No information about transformation will be saved"
595
+ )
596
+ detector_transformation_path = None
597
+
598
+ if detector_transformation_path is not None:
599
+ dicttonx(
600
+ nx_dict,
601
+ h5file=scan.master_file,
602
+ h5path=detector_transformation_path,
603
+ update_mode="replace",
604
+ mode="a",
589
605
  )
590
606
 
591
- dicttonx(
592
- nx_dict,
593
- h5file=scan.master_file,
594
- h5path=detector_transformation_path,
595
- update_mode="replace",
596
- mode="a",
597
- )
598
-
599
607
  # clear caches to make sure all modifications will be considered
600
608
  scan.clear_caches()
601
609
  scan.clear_frames_caches()
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import h5py
2
3
 
3
4
  import numpy
4
5
  import pytest
@@ -252,7 +253,7 @@ def test_nx_editor_lock(
252
253
  # 3.0 save the nxtomo
253
254
  widget.overwriteNXtomo()
254
255
 
255
- # 4.0 check save went twell
256
+ # 4.0 check save went well
256
257
  overwrite_nx_tomo = NXtomo().load(
257
258
  file_path=file_path,
258
259
  data_path=entry,
@@ -305,3 +306,59 @@ def test_nx_editor_lock(
305
306
  "instrument.detector.x_flipped": (False, False),
306
307
  "instrument.detector.y_flipped": (True, False),
307
308
  }
309
+
310
+
311
+ def test_nxtomo_editor_with_missing_paths(
312
+ tmp_path,
313
+ qtapp, # noqa F811
314
+ ):
315
+ """
316
+ test widget behavior in the case some nxtomo path don't exist
317
+ """
318
+
319
+ # create nx tomo with raw data
320
+ nx_tomo = NXtomo()
321
+ nx_tomo.instrument.detector.image_key_control = [ImageKey.PROJECTION.value] * 12
322
+ nx_tomo.instrument.detector.data = numpy.empty(shape=(12, 10, 10))
323
+ nx_tomo.sample.rotation_angle = numpy.linspace(0, 20, num=12)
324
+
325
+ file_path = os.path.join(tmp_path, "nxtomo.nx")
326
+ entry = "entry0000"
327
+ nx_tomo.save(
328
+ file_path=file_path,
329
+ data_path=entry,
330
+ )
331
+ # delete some path that can be missing in some case
332
+ with h5py.File(file_path, mode="a") as h5f:
333
+ assert "entry0000" in h5f
334
+ assert "entry0000/beam" not in h5f
335
+ assert "entry0000/instrument/beam" not in h5f
336
+ assert "entry0000/instrument/detector/distance" not in h5f
337
+ assert "entry0000/instrument/detector/x_pixel_size" not in h5f
338
+ assert "entry0000/instrument/detector/y_pixel_size" not in h5f
339
+ assert "entry0000/instrument/detector/transformations" not in h5f
340
+
341
+ scan = NXtomoScan(file_path, entry)
342
+
343
+ # create the widget and do the edition
344
+ widget = NXtomoEditor()
345
+
346
+ widget.setScan(scan=scan)
347
+
348
+ widget._distanceMetricEntry.setValue(0.05)
349
+ widget._energyEntry.setValue(50)
350
+ widget._xPixelSizeMetricEntry.setValue(0.02)
351
+ widget._yPixelSizeMetricEntry.setValue(0.03)
352
+
353
+ # overwrite the NXtomo
354
+ widget.overwriteNXtomo()
355
+
356
+ # check save went well
357
+ overwrite_nx_tomo = NXtomo().load(
358
+ file_path=file_path,
359
+ data_path=entry,
360
+ )
361
+ assert overwrite_nx_tomo.instrument.detector.x_pixel_size.value == 0.02
362
+ assert overwrite_nx_tomo.instrument.detector.y_pixel_size.value == 0.03
363
+ assert overwrite_nx_tomo.energy.value == 50
364
+ assert overwrite_nx_tomo.instrument.detector.distance.value == 0.05
@@ -31,6 +31,7 @@ __license__ = "MIT"
31
31
  __date__ = "14/10/2019"
32
32
 
33
33
 
34
+ import numpy
34
35
  import logging
35
36
  from typing import Optional
36
37
 
@@ -272,6 +273,7 @@ class _AxisWidget(qt.QMainWindow):
272
273
  self._axis_params.relative_cor_value,
273
274
  self._axis_params.absolute_cor_value,
274
275
  )
276
+ self._controlWidget._positionInfo.setAxis(self._axis_params)
275
277
 
276
278
  # connect signal / slots
277
279
  self._controlWidget.sigComputationRequest.connect(self.sigComputationRequested)
@@ -663,7 +665,12 @@ class _PositionInfoWidget(qt.QWidget):
663
665
  if self._relativePositionQLE.text().startswith((".", "?")):
664
666
  return
665
667
  else:
666
- self.sigRelativeValueSet.emit(float(self._relativePositionQLE.text()))
668
+ value = float(self._relativePositionQLE.text())
669
+ # make sure we only emit the signal if the value changed (and when the Qline has been edited).
670
+ if self._axis is not None and not numpy.isclose(
671
+ value, self._axis.relative_cor_value, atol=1e-3
672
+ ):
673
+ self.sigRelativeValueSet.emit(value)
667
674
 
668
675
  def _userUpdatedAbsolutePosition(self, *args, **kwargs):
669
676
  palette = self.palette()
@@ -675,24 +682,18 @@ class _PositionInfoWidget(qt.QWidget):
675
682
  if self._absolutePositionQLE.text().startswith((".", "?")):
676
683
  return
677
684
  else:
678
- self.sigAbsolueValueSet.emit(float(self._absolutePositionQLE.text()))
685
+ value = float(self._absolutePositionQLE.text())
686
+ # make sure we only emit the signal if the value changed (and when the Qline has been edited).
687
+ if self._axis is not None and not numpy.isclose(
688
+ value, self._axis.absolute_cor_value, atol=1e-3
689
+ ):
690
+ self.sigAbsolueValueSet.emit(value)
679
691
 
680
692
  def setAxis(self, axis):
681
693
  assert isinstance(axis, QAxisRP)
682
694
  if axis == self._axis:
683
695
  return
684
- if self._axis is not None:
685
- self._axis.sigChanged.disconnect(self._updatePosition)
686
696
  self._axis = axis
687
- self._axis.sigChanged.connect(self._updatePosition)
688
- self._updatePosition()
689
-
690
- def _updatePosition(self):
691
- if self._axis:
692
- self.setPosition(
693
- relative_cor=self._axis.relative_cor_value,
694
- abs_cor=self._axis.absolute_cor_value,
695
- )
696
697
 
697
698
  def getPosition(self):
698
699
  return float(self._relativePositionQLE.text())
@@ -54,6 +54,7 @@ class DarkRefAndCopyWidget(DarkRefWidget):
54
54
  """Signal emitted when the mode auto change"""
55
55
  sigCopyActivationChanged = qt.Signal()
56
56
  """Signal emitted when the copy is activated or deactivated"""
57
+ sigClearCache = qt.Signal()
57
58
 
58
59
  def __init__(self, save_dir: str, parent=None, reconsparams=None, process_id=None):
59
60
  DarkRefWidget.__init__(
@@ -79,6 +80,7 @@ class DarkRefAndCopyWidget(DarkRefWidget):
79
80
  self._refCopyWidget.sigCopyActivationChanged.connect(
80
81
  self._triggerCopyActivation
81
82
  )
83
+ self._refCopyWidget.sigClearCache.connect(self.sigClearCache)
82
84
 
83
85
  def setRefSetBy(self, scan_id: str):
84
86
  self._refCopyWidget._statusBar.showMessage(f"ref set from {scan_id}")
@@ -155,6 +157,8 @@ class RefCopyWidget(qt.QGroupBox):
155
157
  """Signal emitted when the mode auto change"""
156
158
  sigCopyActivationChanged = qt.Signal()
157
159
  """Signal emitted when the copy is activated or deactivated"""
160
+ sigClearCache = qt.Signal()
161
+ """Signal when the cache needs to be cleared"""
158
162
 
159
163
  _DEFAULT_DIRECTORY = "/lbsram/data/visitor"
160
164
  """Default directory used when the user need to set path to references"""
@@ -190,6 +194,12 @@ class RefCopyWidget(qt.QGroupBox):
190
194
  spacer = qt.QWidget(self)
191
195
  spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
192
196
  self.layout().addWidget(spacer)
197
+ self._removeCacheFile = qt.QPushButton("clear cache")
198
+ self._removeCacheFile.setToolTip(
199
+ "Remove the file used for cacheing reduce dark / flat."
200
+ )
201
+ self.layout().addWidget(self._removeCacheFile)
202
+
193
203
  self.layout().addWidget(self.__createStatusBarGUI())
194
204
 
195
205
  self.setModeAuto(True)
@@ -201,6 +211,7 @@ class RefCopyWidget(qt.QGroupBox):
201
211
  # connect signal / slot
202
212
  self.toggled.connect(self._triggerCopyActivated)
203
213
  self._qcbAutoMode.toggled.connect(self._triggerModeAutoChanged)
214
+ self._removeCacheFile.released.connect(self.sigClearCache)
204
215
 
205
216
  def _triggerCopyActivated(self, *args, **kwargs):
206
217
  self.sigCopyActivationChanged.emit()
@@ -30,6 +30,7 @@ import functools
30
30
  import logging
31
31
  import shutil
32
32
  import tempfile
33
+ import os
33
34
 
34
35
  from processview.core.manager import DatasetState, ProcessManager
35
36
  from processview.core.superviseprocess import SuperviseProcess
@@ -132,6 +133,15 @@ class DarkRefCopyProcessStack(FIFO, qt.QObject):
132
133
  def _create_processing_thread(self, process_id=None) -> qt.QThread:
133
134
  return _ProcessingThread(process_id=process_id, save_dir=self._save_dir)
134
135
 
136
+ def clear_cache(self):
137
+ """
138
+ remove the file used to cache the reduced darks / flats.
139
+ This can be used in the case it contain unrelevant data. Like frame with another shape...
140
+ """
141
+ cache_file = DarkRefsCopy.get_save_file(self._save_dir)
142
+ if os.path.exists(cache_file):
143
+ os.remove(cache_file)
144
+
135
145
 
136
146
  class _ProcessingThread(ProcessingThread, SuperviseProcess):
137
147
  """
tomwer/version.py CHANGED
@@ -77,7 +77,7 @@ RELEASE_LEVEL_VALUE = {
77
77
 
78
78
  MAJOR = 1
79
79
  MINOR = 3
80
- MICRO = 12
80
+ MICRO = 14
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.3.12
3
+ Version: 1.3.14
4
4
  Summary: "tomography workflow tools"
5
5
  Home-page: https://gitlab.esrf.fr/tomotools/tomwer
6
6
  Author: data analysis unit
@@ -18,7 +18,7 @@ Classifier: Operating System :: POSIX
18
18
  Classifier: Natural Language :: English
19
19
  Classifier: Topic :: Scientific/Engineering :: Physics
20
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
- Requires-Python: >=3.6
21
+ Requires-Python: >=3.8
22
22
  Description-Content-Type: text/markdown
23
23
  License-File: LICENSE
24
24
  Requires-Dist: numpy
@@ -1,4 +1,4 @@
1
- tomwer-1.3.12-py3.11-nspkg.pth,sha256=UYCZtLWueceGiAlmXKRJUZ0TWQEubpPoQ1pVnAAsME0,502
1
+ tomwer-1.3.14-py3.11-nspkg.pth,sha256=UYCZtLWueceGiAlmXKRJUZ0TWQEubpPoQ1pVnAAsME0,502
2
2
  orangecontrib/tomwer/__init__.py,sha256=B4DXy1gY_wXmNYa2aOfapmJb2mEuCAjoaNEGnpBs70g,148
3
3
  orangecontrib/tomwer/state_summary.py,sha256=5_dPzweL3r0ye4ZfJo6IV2ThJI8fQhWoO2ySdJJajj8,1711
4
4
  orangecontrib/tomwer/orange/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -151,7 +151,7 @@ orangecontrib/tomwer/widgets/other/icons/hub.png,sha256=wnKSaxw2WnBkSQjI86aLZfdm
151
151
  orangecontrib/tomwer/widgets/other/icons/hub.svg,sha256=9EYoBKY-P-cO17nM48OPA9VDZSCbyGtrMRc80BGHflk,3735
152
152
  orangecontrib/tomwer/widgets/reconstruction/AxisOW.py,sha256=ffbMYzHWALir19bZhpXjYIgMfJjyyaeov9Uxp5tNyGs,22342
153
153
  orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py,sha256=Ev-TrwZ-HxmdMfZMsz512vhCOgXpGImVsdNdlPSnQIM,9604
154
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py,sha256=DyjkZ3RDgUvEkK3yR8qCWQq9eaVus8I-64nvhrHN1ZQ,10988
154
+ orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py,sha256=nToQw3tj9Wm8s3wPsVBeMYh_F6FBtCsAKLsc2Dic4kk,11066
155
155
  orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py,sha256=aI8VcCK7m518xjjjvE8l3kpTQFEwjWF-hCKua4bBkJM,5967
156
156
  orangecontrib/tomwer/widgets/reconstruction/NabuOW.py,sha256=LzHxCuLrEQIVeGaYmcEO7rwxaT98mbXPdpMc6dCaAHE,12673
157
157
  orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py,sha256=B4iZdYHmbsim4qQD5UaMCg2lcJa3ZAim3_AZQC7bYIk,19195
@@ -220,7 +220,7 @@ orangecontrib/tomwer/widgets/visualization/icons/volumeviewer.svg,sha256=2uT9_px
220
220
  tomwer/__init__.py,sha256=82Jp1abyG4UWdGuT4nNU7LxaUV6xxkOte5pIz3w69Do,1745
221
221
  tomwer/__main__.py,sha256=jsDfWA2yl5am0dHQVkYwlKLxxqKNont6VDF-LusuawE,8575
222
222
  tomwer/utils.py,sha256=EgVwJ5CQVjoBvcKNwyVoXv_P4ciI11oxb8fNyy82Lck,8465
223
- tomwer/version.py,sha256=IDUyPUncjIHz-jVJ_hLVrrkFdMvxkotQuwEVTJGHUKo,4387
223
+ tomwer/version.py,sha256=x8jsewPb2ljshg5rFK4miHGjNsGSt3FPoRBsXH_cfI4,4387
224
224
  tomwer/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
225
  tomwer/app/axis.py,sha256=Ax0wlTp9u0Ll_3ax23QP5Ck16_M9Kop7wx0hAbXrXyM,6004
226
226
  tomwer/app/canvas.py,sha256=RbQqgE7DuNjv4nGG6BNfnSevQO5_lCl7N71hGcLoxwE,1561
@@ -318,7 +318,7 @@ tomwer/core/process/reconstruction/axis/params.py,sha256=y1RgFAk1wiJMeueSNJH5enU
318
318
  tomwer/core/process/reconstruction/axis/projectiontype.py,sha256=0w_NZ0N95iInHuEQCIxJIxt7K-YpCUo2fZ-_vhZ6D7Q,1543
319
319
  tomwer/core/process/reconstruction/darkref/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
320
320
  tomwer/core/process/reconstruction/darkref/darkrefs.py,sha256=gbRq1IJ-9fxD71684wajQj3D_M9G6chm7ahZsjxTmpM,20862
321
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py,sha256=6wEBs7yBZHeEADxDLZ-jYTxaeOBJCJacqfskkr1-ytE,13276
321
+ tomwer/core/process/reconstruction/darkref/darkrefscopy.py,sha256=Oe65TZUS0XZ-5IuuuFMFGuu4aGxKChREPvVa_Ti85EU,14451
322
322
  tomwer/core/process/reconstruction/darkref/params.py,sha256=Pnl8XJ4et-u169wzUdhB8_woBEXPXtrGPLZEbXSwZDQ,10080
323
323
  tomwer/core/process/reconstruction/darkref/settings.py,sha256=35jliuOIjMKTOJjgn4uiotcDEr6RskpLHfRWWLm76dc,188
324
324
  tomwer/core/process/reconstruction/nabu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -461,7 +461,7 @@ tomwer/gui/control/nxtomomill.py,sha256=DI7DsO98O8h9mFcJ_1y1Kb8nD6w09at8YvJZNHR_
461
461
  tomwer/gui/control/observations.py,sha256=oj2OqWYwiewgsZ5vNjzrMjB-YPopYyJmaBE5df09L7c,7735
462
462
  tomwer/gui/control/reducedarkflatselector.py,sha256=hW2D69B2THZn8lIOaUQJHJ6aGIn-tHjcynEfIn4DftA,20536
463
463
  tomwer/gui/control/scanselectorwidget.py,sha256=m3uxkoG4aNPPwamiI14l82PNS8tvIiOXmKhBJiwHgjU,2356
464
- tomwer/gui/control/selectorwidgetbase.py,sha256=avj6dkBJaryCQYF66vXbuYbaLAjTwmcdQ1L24DcUH6I,5571
464
+ tomwer/gui/control/selectorwidgetbase.py,sha256=faMzMHM4KDZ9L8irDnwSdGhwg2EjErbLPfXSNUqU9ko,5607
465
465
  tomwer/gui/control/singletomoobj.py,sha256=5R_Uwgp5wdDQudxG2vyyq4Nj1GjhqH0HCeo_cFS7WuI,6777
466
466
  tomwer/gui/control/tomoobjdisplaymode.py,sha256=u7JPqTD_stisI3ouckVr60yEqZuYWkpF_FI9rKhxPzo,159
467
467
  tomwer/gui/control/volumeselectorwidget.py,sha256=mpbofAawBpzdc46IEkucTuiFJRDP18gWGdZjf5wUaTg,2082
@@ -494,12 +494,12 @@ tomwer/gui/debugtools/objectinspector.py,sha256=Mva9iK4bIxHvs3CcuHboWa4kiUEMoBeu
494
494
  tomwer/gui/edit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
495
495
  tomwer/gui/edit/dkrfpatch.py,sha256=UCXfEq3wV1x3OzEdzIzi6YxRN6SaEIZb-Yudt2YwnUs,17533
496
496
  tomwer/gui/edit/imagekeyeditor.py,sha256=NjnPdKJif9bhfPXejJuRrj2TqTTMlOxlk4mb6mSBoHw,29728
497
- tomwer/gui/edit/nxtomoeditor.py,sha256=1mV5EIHTclg1YxDLMncbErNwC58jEOGxjxO7I1dRzyQ,28095
497
+ tomwer/gui/edit/nxtomoeditor.py,sha256=Bf2dVU73pV8oJXdS9Zms-L2e7KJTzfLdlwZeeKerPTk,28586
498
498
  tomwer/gui/edit/nxtomowarmer.py,sha256=Vmsg8oUSzHpIvJVqF6xZd0aYKzPi_DDoNrGOIQbqBwU,2349
499
499
  tomwer/gui/edit/test/__init__.py,sha256=OLK9ip_LryBfM_L40MReqjvJS3wdbWP_CpnBeD1NQTA,1368
500
500
  tomwer/gui/edit/test/test_dkrf_patch.py,sha256=578ZPdVGOHls236XQqId7QqRrpdN5h3Hh8BePTlV03g,8001
501
501
  tomwer/gui/edit/test/test_image_key_editor.py,sha256=hkeiB5plRR17YD499j6_yQatuIgKLa4F4NfjWVMzhY4,5965
502
- tomwer/gui/edit/test/test_nx_editor.py,sha256=iz6dcebE-IBOjdlzYIkDreRzpVJbkElEzTKvWqIJrkA,11285
502
+ tomwer/gui/edit/test/test_nx_editor.py,sha256=KMpptfEURWAKGwuPxRtrOpNYlbxSxu0Tulla2uLXVmw,13201
503
503
  tomwer/gui/icat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
504
504
  tomwer/gui/icat/createscreenshots.py,sha256=IeKBF-urVsEsjDH2gXpt3oG5Sx_OstC1mNJB7zFeWkk,3123
505
505
  tomwer/gui/icat/gallery.py,sha256=puBAkqlwgV1Orki_g2IVXjssCn_PCPjNGJtC0RIPpxI,8700
@@ -507,10 +507,10 @@ tomwer/gui/icat/publish.py,sha256=E1DwyABMZeIHDcy88YFtLpg2GpvN_AFHn4aAJbcK13c,62
507
507
  tomwer/gui/reconstruction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
508
508
  tomwer/gui/reconstruction/axis/CompareImages.py,sha256=mrlXPCgq71lzmA_XACqrjdzRTK1iYJQBMrJMaeKZAq8,12870
509
509
  tomwer/gui/reconstruction/axis/__init__.py,sha256=fUKWiRiG2o4Y-9RN-41VZMMM8L9Srl6QCn942VL5szY,94
510
- tomwer/gui/reconstruction/axis/axis.py,sha256=QLyrJzJrShjlnO3tLkcnv2oexzVkxw-SGgn3cYfmmEY,27260
510
+ tomwer/gui/reconstruction/axis/axis.py,sha256=AasGGK9wjnn9l6ryo9biptcDKxRTQG7KFHIHnMZd70o,27489
511
511
  tomwer/gui/reconstruction/axis/radioaxis.py,sha256=hTweuwS-X32ZlpkHvP5X910zJ8p4fiJMsn_oUVtfvXM,92755
512
512
  tomwer/gui/reconstruction/darkref/__init__.py,sha256=g9LASP8OJjxCPEHXO14hN0OLjLkeUve6etaPm1LIz4c,1373
513
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py,sha256=9pgynAKXb5KEfPwjaSprcycMgg7K7DjgXdVUlc5xsJA,11562
513
+ tomwer/gui/reconstruction/darkref/darkrefcopywidget.py,sha256=cfU2EJv_9LfCrKTHwnYwt2Kj4G6lMPbw0lbD-yjyT-Y,12053
514
514
  tomwer/gui/reconstruction/darkref/darkrefwidget.py,sha256=O33udHaezaanZD9L5D525KrB4FD77g_Spr7gAUxGEag,16468
515
515
  tomwer/gui/reconstruction/nabu/__init__.py,sha256=v2WxaBpu2zpGu7DEV96zaKAtHgRlcpORuAG2S0iF9O0,44
516
516
  tomwer/gui/reconstruction/nabu/castvolume.py,sha256=4lrfdBt_24p9_kb9qmytEtIfzPXFPzYVdV57wgMLVWQ,15003
@@ -758,7 +758,7 @@ tomwer/synctools/stacks/edit/imagekeyeditor.py,sha256=NNDQWMJEuE50zBk_2zJAWbf6hC
758
758
  tomwer/synctools/stacks/reconstruction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
759
759
  tomwer/synctools/stacks/reconstruction/axis.py,sha256=9Gqh0isvLYupypOq3P7XM_lU4Hcni4l3V2aUZsAVLrc,8876
760
760
  tomwer/synctools/stacks/reconstruction/castvolume.py,sha256=PaoMuTxcj4Ms6N2MFnrCzmaCCC3wEZItYAwQ8NApe_o,8282
761
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py,sha256=LlEtCh-nbftFo77s1QXnoISDQKQOBR-4AKfurgUj7zI,7040
761
+ tomwer/synctools/stacks/reconstruction/dkrefcopy.py,sha256=cHkvyOtbaqtaftnCyIhDF3oXRM-lXMWqBf-CVTqF198,7402
762
762
  tomwer/synctools/stacks/reconstruction/nabu.py,sha256=dDqw74kobhkawquJIwLDQH--PN6LbbthlqZ9MQUBJi4,7816
763
763
  tomwer/synctools/stacks/reconstruction/normalization.py,sha256=wcw-tHjKUQMcija0bCExDl0InYsKHZNTeTk4w_hnaDI,5362
764
764
  tomwer/synctools/stacks/reconstruction/saaxis.py,sha256=N5LM4QPE1H06WXjEH-PGIMfWgCHkwR02QR3PENZ_JzE,7126
@@ -776,10 +776,10 @@ tomwer/tests/test_utils.py,sha256=D0rNDSK6csEOYBY_7gD-4A3jp8rYAm8L1_Xg34A9I2s,30
776
776
  tomwer/tests/utils.py,sha256=RAXx5A99WD4Vyuv_wjHBdr-Xu7UiThHRKw2eiB5GX10,107
777
777
  tomwer/third_part/WaitingOverlay.py,sha256=GnqiytcJDp_24Cmz_2nZAP5HfpL3Yh7AzR2ATIusGsg,3906
778
778
  tomwer/third_part/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
779
- tomwer-1.3.12.dist-info/LICENSE,sha256=yR_hIZ1MfDh9x2_s23uFqBH7m5DgrBl9nJKkE37YChM,1877
780
- tomwer-1.3.12.dist-info/METADATA,sha256=bUzdE3iiLKgWG_xxxestUTCEGqOuBQm0hw7MIbxm1SM,11460
781
- tomwer-1.3.12.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
782
- tomwer-1.3.12.dist-info/entry_points.txt,sha256=fIcDnCxjgwzfIylLYhUsFyiNZjZMxsfRQBxi4f-cJg8,440
783
- tomwer-1.3.12.dist-info/namespace_packages.txt,sha256=Iut-JTfT11SZHHm77_ZeszD7pZDWXcTweCbvrJpqDyQ,14
784
- tomwer-1.3.12.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
785
- tomwer-1.3.12.dist-info/RECORD,,
779
+ tomwer-1.3.14.dist-info/LICENSE,sha256=yR_hIZ1MfDh9x2_s23uFqBH7m5DgrBl9nJKkE37YChM,1877
780
+ tomwer-1.3.14.dist-info/METADATA,sha256=yc29gleRofOwWWwjUVeO8n0RbmTjEblhC5rSondwT2o,11460
781
+ tomwer-1.3.14.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
782
+ tomwer-1.3.14.dist-info/entry_points.txt,sha256=fIcDnCxjgwzfIylLYhUsFyiNZjZMxsfRQBxi4f-cJg8,440
783
+ tomwer-1.3.14.dist-info/namespace_packages.txt,sha256=Iut-JTfT11SZHHm77_ZeszD7pZDWXcTweCbvrJpqDyQ,14
784
+ tomwer-1.3.14.dist-info/top_level.txt,sha256=Yz5zKh0FPiImtzHYcPuztG1AO8-6KEpUWgoChGbA0Ys,21
785
+ tomwer-1.3.14.dist-info/RECORD,,