tomwer 1.0.3__py3-none-any.whl → 1.1.0__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 (269) hide show
  1. orangecontrib/tomwer/tutorials/EBS_tomo_listener.ows +39 -0
  2. orangecontrib/tomwer/tutorials/cast_volume.ows +34 -0
  3. orangecontrib/tomwer/tutorials/simple_slice_reconstruction.ows +39 -0
  4. orangecontrib/tomwer/tutorials/simple_volume_local_reconstruction.ows +49 -0
  5. orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +59 -0
  6. orangecontrib/tomwer/tutorials/using_saaxis_to_find_cor.ows +44 -0
  7. orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +1 -1
  8. orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +14 -4
  9. orangecontrib/tomwer/widgets/cluster/__init__.py +1 -1
  10. orangecontrib/tomwer/widgets/control/DataListOW.py +12 -5
  11. orangecontrib/tomwer/widgets/control/DataListenerOW.py +18 -9
  12. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +13 -6
  13. orangecontrib/tomwer/widgets/control/DataTransfertOW.py +3 -5
  14. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +8 -4
  15. orangecontrib/tomwer/widgets/control/DataWatcherOW.py +4 -6
  16. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +49 -62
  17. orangecontrib/tomwer/widgets/control/FilterOW.py +2 -4
  18. orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +93 -0
  19. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +135 -129
  20. orangecontrib/tomwer/widgets/control/NotifierOW.py +34 -9
  21. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +3 -5
  22. orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +19 -13
  23. orangecontrib/tomwer/widgets/control/VolumeSelector.py +12 -4
  24. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +11 -7
  25. orangecontrib/tomwer/widgets/control/icons/notification.svg +4 -4
  26. orangecontrib/tomwer/widgets/control/icons/nxtomomill.png +0 -0
  27. orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +8 -5
  28. orangecontrib/tomwer/widgets/control/icons/tomoobjserie.png +0 -0
  29. orangecontrib/tomwer/widgets/control/icons/tomoobjserie.svg +73 -78
  30. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +16 -4
  31. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +100 -0
  32. orangecontrib/tomwer/widgets/edit/icons/image_key_editor.png +0 -0
  33. orangecontrib/tomwer/widgets/edit/icons/image_key_upgrader.png +0 -0
  34. orangecontrib/tomwer/widgets/edit/icons/nx_tomo_editor.png +0 -0
  35. orangecontrib/tomwer/widgets/edit/icons/nx_tomo_editor.svg +123 -0
  36. orangecontrib/tomwer/widgets/edit/test/test_dark_flat_patch.py +21 -1
  37. orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py +1 -1
  38. orangecontrib/tomwer/widgets/edit/test/test_image_key_upgrader.py +1 -1
  39. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +25 -0
  40. orangecontrib/tomwer/widgets/other/PythonScriptOW.py +19 -11
  41. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +20 -14
  42. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +24 -10
  43. orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +26 -21
  44. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +29 -12
  45. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +44 -17
  46. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +28 -20
  47. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +24 -18
  48. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +6 -6
  49. orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +4 -2
  50. orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.png +0 -0
  51. orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.svg +11 -8
  52. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +10 -4
  53. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
  54. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +69 -0
  55. orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +2 -4
  56. orangecontrib/tomwer/widgets/visualization/icons/nx_tomo_metadata_viewer.png +0 -0
  57. orangecontrib/tomwer/widgets/visualization/icons/nx_tomo_metadata_viewer.svg +105 -0
  58. tomwer/__main__.py +10 -5
  59. tomwer/app/canvas_launcher/config.py +10 -10
  60. tomwer/app/canvas_launcher/mainwindow.py +68 -6
  61. tomwer/app/canvas_launcher/widgetsscheme.py +1 -3
  62. tomwer/app/darkref.py +16 -12
  63. tomwer/app/imagekeyeditor.py +2 -2
  64. tomwer/app/imagekeyupgrader.py +104 -0
  65. tomwer/app/intensitynormalization.py +0 -1
  66. tomwer/app/nxtomoeditor.py +103 -0
  67. tomwer/app/rsync.py +1 -1
  68. tomwer/core/cluster/cluster.py +1 -1
  69. tomwer/core/futureobject.py +1 -0
  70. tomwer/core/process/control/datalistener/datalistener.py +7 -1
  71. tomwer/core/process/control/datalistener/rpcserver.py +3 -4
  72. tomwer/core/process/control/datawatcher/datawatcher.py +18 -18
  73. tomwer/core/process/control/datawatcher/datawatcherobserver.py +5 -8
  74. tomwer/core/process/control/datawatcher/datawatcherprocess.py +2 -3
  75. tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -2
  76. tomwer/core/process/control/nxtomomill.py +33 -58
  77. tomwer/core/process/control/scanlist.py +2 -1
  78. tomwer/core/process/control/scanselector.py +7 -0
  79. tomwer/core/process/control/scantransfer.py +2 -2
  80. tomwer/core/process/control/scanvalidator.py +6 -5
  81. tomwer/core/process/control/singletomoobj.py +2 -1
  82. tomwer/core/process/control/timer.py +2 -1
  83. tomwer/core/process/control/tomoobjserie.py +8 -2
  84. tomwer/core/process/control/volumeselector.py +2 -1
  85. tomwer/core/process/control/volumesymlink.py +2 -1
  86. tomwer/core/process/edit/darkflatpatch.py +2 -1
  87. tomwer/core/process/edit/imagekeyeditor.py +4 -3
  88. tomwer/core/process/reconstruction/axis/axis.py +29 -32
  89. tomwer/core/process/reconstruction/axis/mode.py +3 -2
  90. tomwer/core/process/reconstruction/axis/params.py +35 -16
  91. tomwer/core/process/reconstruction/darkref/darkrefs.py +90 -707
  92. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +44 -16
  93. tomwer/core/process/reconstruction/darkref/params.py +62 -67
  94. tomwer/core/process/reconstruction/lamino/tofu.py +1 -2
  95. tomwer/core/process/reconstruction/nabu/castvolume.py +21 -26
  96. tomwer/core/process/reconstruction/nabu/nabucommon.py +36 -38
  97. tomwer/core/process/reconstruction/nabu/nabuscores.py +28 -13
  98. tomwer/core/process/reconstruction/nabu/nabuslices.py +41 -14
  99. tomwer/core/process/reconstruction/nabu/nabuvolume.py +21 -12
  100. tomwer/core/process/reconstruction/nabu/utils.py +32 -3
  101. tomwer/core/process/reconstruction/normalization/normalization.py +9 -8
  102. tomwer/core/process/reconstruction/saaxis/saaxis.py +46 -20
  103. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +38 -12
  104. tomwer/core/process/reconstruction/test/__init__.py +0 -39
  105. tomwer/core/process/reconstruction/test/test_axis_params.py +25 -3
  106. tomwer/core/process/reconstruction/test/test_darkref_copy.py +117 -1
  107. tomwer/core/process/script/python.py +16 -12
  108. tomwer/core/process/task.py +3 -7
  109. tomwer/core/process/test/test_axis.py +1 -1
  110. tomwer/core/process/test/test_dark_and_flat.py +41 -111
  111. tomwer/core/process/test/test_data_listener.py +0 -29
  112. tomwer/core/process/test/test_data_transfer.py +10 -14
  113. tomwer/core/process/test/test_nabu.py +1 -1
  114. tomwer/core/process/test/test_normalization.py +1 -1
  115. tomwer/core/process/visualization/liveslice.py +6 -0
  116. tomwer/core/scan/blissscan.py +37 -2
  117. tomwer/core/scan/edfscan.py +19 -8
  118. tomwer/core/scan/hdf5scan.py +10 -4
  119. tomwer/core/scan/scanbase.py +35 -29
  120. tomwer/core/scan/scanfactory.py +3 -17
  121. tomwer/core/scan/test/test_h5.py +1 -1
  122. tomwer/core/scan/test/test_process_registration.py +0 -11
  123. tomwer/core/scan/test/test_scan.py +32 -30
  124. tomwer/core/settings.py +2 -2
  125. tomwer/core/test/test_utils.py +1 -1
  126. tomwer/core/tomwer_object.py +19 -0
  127. tomwer/core/utils/__init__.py +0 -45
  128. tomwer/core/utils/char.py +2 -0
  129. tomwer/core/utils/gpu.py +5 -5
  130. tomwer/core/utils/nxtomoutils.py +2 -2
  131. tomwer/core/utils/scanutils.py +50 -0
  132. tomwer/core/utils/volumeutils.py +13 -0
  133. tomwer/core/volume/edfvolume.py +4 -0
  134. tomwer/core/volume/hdf5volume.py +4 -0
  135. tomwer/core/volume/jp2kvolume.py +4 -0
  136. tomwer/core/volume/rawvolume.py +22 -5
  137. tomwer/core/volume/tiffvolume.py +4 -0
  138. tomwer/core/volume/volumebase.py +19 -12
  139. tomwer/core/volume/volumefactory.py +20 -1
  140. tomwer/gui/cluster/slurm.py +1 -1
  141. tomwer/gui/cluster/supervisor.py +0 -2
  142. tomwer/gui/cluster/test/test_cluster.py +2 -2
  143. tomwer/gui/control/datalist.py +109 -36
  144. tomwer/gui/control/datatransfert.py +1 -1
  145. tomwer/gui/control/datawatcher/configuration.py +0 -2
  146. tomwer/gui/control/datawatcher/datawatcher.py +23 -13
  147. tomwer/gui/control/datawatcher/datawatcherobserver.py +1 -1
  148. tomwer/gui/control/observations.py +0 -3
  149. tomwer/gui/control/selectorwidgetbase.py +42 -12
  150. tomwer/gui/control/serie/seriecreator.py +967 -0
  151. tomwer/{web/__init__.py → gui/control/serie/seriewaiter.py} +5 -7
  152. tomwer/gui/control/singletomoobj.py +15 -4
  153. tomwer/gui/control/test/test_datalist.py +1 -1
  154. tomwer/gui/control/test/test_datalistener.py +1 -1
  155. tomwer/gui/control/test/test_inputwidget.py +1 -1
  156. tomwer/gui/control/test/test_process_manager.py +1 -13
  157. tomwer/gui/control/test/test_scanselector.py +1 -1
  158. tomwer/gui/control/test/test_scanvalidator.py +1 -1
  159. tomwer/gui/control/test/test_single_tomo_obj.py +1 -1
  160. tomwer/gui/control/test/test_volume_dialog.py +19 -7
  161. tomwer/gui/control/test/test_volumeselector.py +4 -4
  162. tomwer/gui/debugtools/datasetgenerator.py +1 -9
  163. tomwer/gui/edit/dkrfpatch.py +2 -3
  164. tomwer/gui/edit/imagekeyeditor.py +12 -11
  165. tomwer/gui/edit/nxtomoeditor.py +475 -0
  166. tomwer/gui/edit/test/test_dkrf_patch.py +2 -14
  167. tomwer/gui/edit/test/test_image_key_editor.py +2 -2
  168. tomwer/gui/edit/test/test_nx_editor.py +155 -0
  169. tomwer/gui/icons.py +0 -1
  170. tomwer/gui/qfolderdialog.py +11 -0
  171. tomwer/gui/reconstruction/axis/CompareImages.py +27 -29
  172. tomwer/gui/reconstruction/axis/axis.py +2 -0
  173. tomwer/gui/reconstruction/axis/radioaxis.py +70 -14
  174. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +7 -9
  175. tomwer/gui/reconstruction/darkref/darkrefwidget.py +22 -24
  176. tomwer/gui/reconstruction/lamino/tofu/projections.py +1 -1
  177. tomwer/gui/reconstruction/lamino/tofu/tofu.py +3 -3
  178. tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +4 -4
  179. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +10 -5
  180. tomwer/gui/reconstruction/nabu/castvolume.py +103 -24
  181. tomwer/gui/reconstruction/nabu/check.py +1 -1
  182. tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +352 -0
  183. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +0 -9
  184. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +1 -1
  185. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +18 -19
  186. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +30 -7
  187. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +26 -15
  188. tomwer/gui/reconstruction/nabu/slices.py +10 -4
  189. tomwer/gui/reconstruction/nabu/slurm.py +1 -1
  190. tomwer/gui/reconstruction/nabu/volume.py +13 -7
  191. tomwer/gui/reconstruction/normalization/intensity.py +1 -5
  192. tomwer/gui/reconstruction/saaxis/corrangeselector.py +10 -37
  193. tomwer/gui/reconstruction/saaxis/saaxis.py +11 -7
  194. tomwer/gui/reconstruction/saaxis/sliceselector.py +11 -26
  195. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +13 -8
  196. tomwer/gui/reconstruction/scores/scoreplot.py +67 -62
  197. tomwer/gui/reconstruction/test/test_axis.py +2 -2
  198. tomwer/gui/reconstruction/test/test_lamino.py +2 -2
  199. tomwer/gui/reconstruction/test/test_nabu.py +14 -1
  200. tomwer/gui/reconstruction/test/test_saaxis.py +8 -17
  201. tomwer/gui/reconstruction/test/test_sadeltabeta.py +7 -13
  202. tomwer/gui/stackplot.py +11 -28
  203. tomwer/gui/test/test_axis_gui.py +4 -4
  204. tomwer/gui/test/test_qfolder_dialog.py +12 -0
  205. tomwer/gui/utils/inputwidget.py +42 -22
  206. tomwer/gui/utils/lineselector/lineselector.py +13 -21
  207. tomwer/gui/utils/scandescription.py +2 -4
  208. tomwer/gui/utils/slider.py +1 -102
  209. tomwer/gui/utils/unitsystem.py +48 -11
  210. tomwer/gui/visualization/dataviewer.py +24 -17
  211. tomwer/gui/visualization/diffviewer/diffviewer.py +2 -11
  212. tomwer/gui/visualization/nxtomometadata.py +21 -0
  213. tomwer/gui/visualization/scanoverview.py +0 -1
  214. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +72 -0
  215. tomwer/gui/visualization/test/test_stacks.py +1 -1
  216. tomwer/gui/visualization/tomoobjoverview.py +49 -0
  217. tomwer/gui/visualization/volumeoverview.py +64 -0
  218. tomwer/gui/visualization/volumeviewer.py +1 -1
  219. tomwer/io/utils/utils.py +2 -2
  220. tomwer/resources/gui/icons/multi-document-save.png +0 -0
  221. tomwer/resources/gui/icons/multi-document-save.svg +101 -0
  222. tomwer/resources/gui/illustrations/ctf_z1.png +0 -0
  223. tomwer/resources/gui/illustrations/ctf_z1.svg +471 -0
  224. tomwer/synctools/axis.py +0 -1
  225. tomwer/synctools/darkref.py +0 -1
  226. tomwer/synctools/datalistener.py +5 -1
  227. tomwer/synctools/imageloaderthread.py +2 -2
  228. tomwer/synctools/saaxis.py +0 -1
  229. tomwer/synctools/sadeltabeta.py +0 -1
  230. tomwer/synctools/stacks/edit/imagekeyeditor.py +1 -1
  231. tomwer/synctools/stacks/processingstack.py +2 -2
  232. tomwer/synctools/stacks/reconstruction/castvolume.py +1 -0
  233. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +1 -1
  234. tomwer/synctools/stacks/reconstruction/lamino.py +1 -3
  235. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +0 -2
  236. tomwer/synctools/test/test_darkRefs.py +32 -149
  237. tomwer/synctools/test/test_foldertransfer.py +1 -1
  238. tomwer/synctools/test/test_scanstages.py +2 -2
  239. tomwer/tests/conftest.py +51 -0
  240. tomwer/{test → tests}/test_scripts.py +1 -1
  241. tomwer/tests/test_utils.py +10 -0
  242. tomwer/{test → tests}/utils/utilstest.py +0 -11
  243. tomwer/version.py +3 -3
  244. {tomwer-1.0.3.dist-info → tomwer-1.1.0.dist-info}/METADATA +14 -16
  245. {tomwer-1.0.3.dist-info → tomwer-1.1.0.dist-info}/RECORD +255 -235
  246. {tomwer-1.0.3.dist-info → tomwer-1.1.0.dist-info}/WHEEL +1 -1
  247. {tomwer-1.0.3.dist-info → tomwer-1.1.0.dist-info}/entry_points.txt +6 -0
  248. orangecontrib/tomwer/setup.py +0 -45
  249. orangecontrib/tomwer/widgets/setup.py +0 -49
  250. tomwer/app/process.py +0 -153
  251. tomwer/core/process/reconstruction/nabu/slurm.py +0 -36
  252. tomwer/core/process/reconstruction/utils/nabu_slice_exec.py +0 -10
  253. tomwer/core/utils/laminoutils.py +0 -80
  254. tomwer/gui/utils/lineselector/lineselection.py +0 -76
  255. tomwer/setup.py +0 -52
  256. tomwer/slurm/executor.py +0 -36
  257. tomwer/slurm/job.py +0 -349
  258. tomwer/slurm/utils.py +0 -44
  259. tomwer/web/client.py +0 -43
  260. tomwer/web/config.py +0 -36
  261. tomwer/web/test/test_graylog_connection.py +0 -59
  262. {tomwer/slurm → orangecontrib/tomwer/tutorials}/__init__.py +0 -0
  263. /tomwer/{test → gui/control/serie}/__init__.py +0 -0
  264. /tomwer/{web/test → tests}/__init__.py +0 -0
  265. /tomwer/{test → tests}/utils/__init__.py +0 -0
  266. /tomwer-1.0.3-py3.8-nspkg.pth → /tomwer-1.1.0-py3.9-nspkg.pth +0 -0
  267. {tomwer-1.0.3.dist-info → tomwer-1.1.0.dist-info}/LICENSE +0 -0
  268. {tomwer-1.0.3.dist-info → tomwer-1.1.0.dist-info}/namespace_packages.txt +0 -0
  269. {tomwer-1.0.3.dist-info → tomwer-1.1.0.dist-info}/top_level.txt +0 -0
@@ -58,7 +58,6 @@ _logger = logging.getLogger(__name__)
58
58
 
59
59
 
60
60
  class SAAxisWindow(_SAAxisWindow):
61
-
62
61
  sigResultsToBeShow = qt.Signal()
63
62
  """signal emit when some results are ready to be display"""
64
63
 
@@ -75,7 +74,6 @@ class SAAxisWindow(_SAAxisWindow):
75
74
  self._clusterConfig = None
76
75
 
77
76
  def setClusterConfig(self, cluster_config: dict):
78
-
79
77
  if not isinstance(
80
78
  cluster_config, (dict, type(None), SlurmClusterConfiguration)
81
79
  ):
@@ -192,7 +190,8 @@ class SAAxisWindow(_SAAxisWindow):
192
190
  if scan is None:
193
191
  return
194
192
  assert isinstance(scan, TomwerScanBase)
195
- selected_cor_value = self.getCurrentCorValue()
193
+ selected_cor_value = self.getCurrentCorValue() or scan.saaxis_params.autofocus
194
+ # if validate is done manually then pick current cor value; else we are in 'auto mode' and get it from the autofocus.
196
195
  details = ProcessManager().get_dataset_details(
197
196
  dataset_id=scan.get_identifier(), process=self._processing_stack
198
197
  )
@@ -208,6 +207,12 @@ class SAAxisWindow(_SAAxisWindow):
208
207
  )
209
208
  else:
210
209
  scan.axis_params.set_relative_value(selected_cor_value)
210
+ if scan.nabu_recons_params is not None:
211
+ if "reconstruction" not in scan.nabu_recons_params:
212
+ scan.nabu_recons_params["reconstruction"] = {}
213
+ scan.nabu_recons_params["reconstruction"][
214
+ "rotation_axis_position"
215
+ ] = scan.axis_params.absolute_cor_value
211
216
  infos = "cor selected for {}: relative: {}, absolute: {}".format(
212
217
  scan,
213
218
  scan.axis_params.relative_cor_value,
@@ -288,11 +293,7 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
288
293
  sigScanReady = qt.Signal(TomwerScanBase)
289
294
  """Signal emitted when a scan is ready"""
290
295
 
291
- _rpSetting = Setting(dict())
292
- # kept for compatibility
293
- "SAAxisRP store as dict"
294
-
295
- static_input = Setting({"data": None, "sa_axis_params": None})
296
+ _ewoks_default_inputs = Setting({"data": None, "sa_axis_params": None})
296
297
 
297
298
  class Inputs:
298
299
  data = Input(
@@ -336,10 +337,8 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
336
337
  )
337
338
  self._layout.addWidget(self._widget)
338
339
 
339
- sa_axis_params = self.static_input.get("sa_axis_params", None)
340
- if sa_axis_params is None:
341
- sa_axis_params = self._rpSetting
342
- self.setConfiguration(sa_axis_params)
340
+ sa_axis_params = self._ewoks_default_inputs.get("sa_axis_params", None)
341
+ self.setConfiguration(sa_axis_params or {})
343
342
 
344
343
  # connect signal / slot
345
344
  self._widget.sigConfigurationChanged.connect(self._updateSettings)
@@ -354,6 +353,16 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
354
353
  # expose API
355
354
  self.wait_processing = self._widget.wait_processing
356
355
 
356
+ def __new__(cls, *args, **kwargs):
357
+ # ensure backward compatibility with 'static_input'
358
+ static_input = kwargs.get("stored_settings", {}).get("static_input", None)
359
+ if static_input not in (None, {}):
360
+ _logger.warning(
361
+ "static_input has been deprecated. Will be replaced by _ewoks_default_inputs in the workflow file. Please save the workflow to apply modifications"
362
+ )
363
+ kwargs["stored_settings"]["_ewoks_default_inputs"] = static_input
364
+ return super().__new__(cls, *args, **kwargs)
365
+
357
366
  def setConfiguration(self, configuration):
358
367
  if "workflow" in configuration:
359
368
  autofocus_lock = configuration["workflow"].get("autofocus_lock", None)
@@ -365,6 +374,9 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
365
374
  def getCurrentCorValue(self):
366
375
  return self._widget.getCurrentCorValue()
367
376
 
377
+ def setEstimatedCorPosition(self, value):
378
+ self._widget.setEstimatedCorPosition(value=value)
379
+
368
380
  def load_sinogram(self):
369
381
  self._widget.loadSinogram()
370
382
 
@@ -437,18 +449,14 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
437
449
  def _updateSettings(self):
438
450
  config = self._widget.getConfiguration()
439
451
  config.pop("cluster_config", None)
440
- self._rpSetting = config
441
- self._rpSetting["workflow"] = {
442
- "autofocus_lock": self._widget.isAutoFocusLock(),
443
- }
444
452
 
445
- self.static_input = {
453
+ self._ewoks_default_inputs = {
446
454
  "data": None,
447
455
  "sa_axis_params": self._widget.getConfiguration(),
448
456
  }
449
- self.static_input["sa_axis_params"][
450
- "autofocus_lock"
451
- ] = self._widget.isAutoFocusLock()
457
+ self._ewoks_default_inputs["sa_axis_params"]["workflow"] = {
458
+ "autofocus_lock": self._widget.isAutoFocusLock(),
459
+ }
452
460
 
453
461
  def _raiseResults(self):
454
462
  if not self.isAutoFocusLock():
@@ -67,7 +67,6 @@ class SADeltaBetaWindow(_SADeltaBetaWindow):
67
67
  self._clusterConfig = None
68
68
 
69
69
  def setClusterConfig(self, cluster_config: dict):
70
-
71
70
  if not isinstance(
72
71
  cluster_config, (dict, type(None), SlurmClusterConfiguration)
73
72
  ):
@@ -126,7 +125,9 @@ class SADeltaBetaWindow(_SADeltaBetaWindow):
126
125
  if scan is None:
127
126
  return
128
127
  assert isinstance(scan, TomwerScanBase)
129
- selected_db_value = self.getCurrentDeltaBetaValue()
128
+ selected_db_value = (
129
+ self.getCurrentDeltaBetaValue() or scan.sa_delta_beta_params.autofocus
130
+ )
130
131
  if selected_db_value is None:
131
132
  infos = "no selected delta / beta value. {} skip SADeltaBetaParams".format(
132
133
  scan
@@ -138,6 +139,10 @@ class SADeltaBetaWindow(_SADeltaBetaWindow):
138
139
  )
139
140
  else:
140
141
  scan.sa_delta_beta_params.set_db_selected_value(selected_db_value)
142
+ if scan.nabu_recons_params is not None:
143
+ if "phase" not in scan.nabu_recons_params:
144
+ scan.nabu_recons_params["phase"] = {}
145
+ scan.nabu_recons_params["phase"]["delta_beta"] = (selected_db_value,)
141
146
  infos = "delta / beta selected for {}: {},".format(
142
147
  scan, scan.sa_delta_beta_params.value
143
148
  )
@@ -222,10 +227,7 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
222
227
  sigScanReady = qt.Signal(TomwerScanBase)
223
228
  """Signal emitted when a scan is ready"""
224
229
 
225
- _rpSetting = Setting(dict())
226
- "settings store as dict"
227
-
228
- static_input = Setting({"data": None, "sa_delta_beta_params": None})
230
+ _ewoks_default_inputs = Setting({"data": None, "sa_delta_beta_params": None})
229
231
 
230
232
  class Inputs:
231
233
  data = Input(name="data", type=TomwerScanBase, default=True, multiple=False)
@@ -265,10 +267,10 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
265
267
  )
266
268
  self._layout.addWidget(self._widget)
267
269
 
268
- sa_delta_beta_params = self.static_input.get("sa_delta_beta_params", None)
269
- if sa_delta_beta_params is None:
270
- sa_delta_beta_params = self._rpSetting
271
- self.setConfiguration(sa_delta_beta_params)
270
+ sa_delta_beta_params = self._ewoks_default_inputs.get(
271
+ "sa_delta_beta_params", None
272
+ )
273
+ self.setConfiguration(sa_delta_beta_params or {})
272
274
 
273
275
  # connect signal / slot
274
276
  self._widget.sigConfigurationChanged.connect(self._updateSettings)
@@ -280,6 +282,16 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
280
282
  # expose API
281
283
  self.wait_processing = self._widget.wait_processing
282
284
 
285
+ def __new__(cls, *args, **kwargs):
286
+ # ensure backward compatibility with 'static_input'
287
+ static_input = kwargs.get("stored_settings", {}).get("static_input", None)
288
+ if static_input not in (None, {}):
289
+ _logger.warning(
290
+ "static_input has been deprecated. Will be replaced by _ewoks_default_inputs in the workflow file. Please save the workflow to apply modifications"
291
+ )
292
+ kwargs["stored_settings"]["_ewoks_default_inputs"] = static_input
293
+ return super().__new__(cls, *args, **kwargs)
294
+
283
295
  def setConfiguration(self, configuration):
284
296
  if "workflow" in configuration:
285
297
  autofocus_lock = configuration["workflow"].get("autofocus_lock", None)
@@ -363,17 +375,11 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
363
375
  def _updateSettings(self):
364
376
  config = self._widget.getConfiguration()
365
377
  config.pop("cluster_config", None)
366
- self._rpSetting = config
367
- self._rpSetting["workflow"] = {
368
- "autofocus_lock": self._widget.isAutoFocusLock(),
369
- }
370
- # keep for backward compatibility
371
-
372
- self.static_input = {
378
+ self._ewoks_default_inputs = {
373
379
  "data": None,
374
380
  "sa_delta_beta_params": self._widget.getConfiguration(),
375
381
  }
376
- self.static_input["sa_delta_beta_params"]["workflow"] = {
382
+ self._ewoks_default_inputs["sa_delta_beta_params"]["workflow"] = {
377
383
  "autofocus_lock": self._widget.isAutoFocusLock(),
378
384
  }
379
385
 
@@ -133,7 +133,7 @@ class SinoNormOW(WidgetLongProcessing, SuperviseOW):
133
133
  compress_signal = False
134
134
  allows_cycle = True
135
135
 
136
- _rpSetting = Setting(dict())
136
+ _ewoks_default_inputs = Setting(dict())
137
137
 
138
138
  sigScanReady = qt.Signal(TomwerScanBase)
139
139
  "Signal emitted when a scan is ended"
@@ -300,10 +300,10 @@ class SinoNormOW(WidgetLongProcessing, SuperviseOW):
300
300
  self._window.stop()
301
301
 
302
302
  def _updateSettings(self):
303
- self._rpSetting = self._window.getConfiguration()
304
- self._rpSetting["__lock__"] = self.isLocked()
303
+ self._ewoks_default_inputs = self._window.getConfiguration()
304
+ self._ewoks_default_inputs["__lock__"] = self.isLocked()
305
305
 
306
306
  def loadSettings(self):
307
- self._window.setConfiguration(self._rpSetting)
308
- if "__lock__" in self._rpSetting:
309
- self.setLocked(self._rpSetting["__lock__"])
307
+ self._window.setConfiguration(self._ewoks_default_inputs)
308
+ if "__lock__" in self._ewoks_default_inputs:
309
+ self.setLocked(self._ewoks_default_inputs["__lock__"])
@@ -75,7 +75,7 @@ class TofuOW(WidgetLongProcessing, SuperviseOW):
75
75
  _reconsParams = settings.Setting(dict())
76
76
  """Parameters directly editabled from the TOFU interface"""
77
77
  # kept for compatibility
78
- static_input = settings.Setting({"data": None, "lamino_params": None})
78
+ _ewoks_default_inputs = settings.Setting({"data": None, "lamino_params": None})
79
79
 
80
80
  _additionalOpts = settings.Setting(dict())
81
81
  """Parameters which can be add on the expert tab from TOFU"""
@@ -108,7 +108,9 @@ class TofuOW(WidgetLongProcessing, SuperviseOW):
108
108
  self._box.layout().addWidget(self._mainWidget)
109
109
  self._box.layout().addWidget(self._widgetControl)
110
110
 
111
- lamino_params = self.static_input.get("lamino_params", None)
111
+ lamino_params = self._ewoks_default_inputs.get( # pylint: disable=E1101
112
+ "lamino_params", None
113
+ )
112
114
  if lamino_params is None:
113
115
  lamino_params = self._reconsParams
114
116
  self._mainWidget.setParameters(lamino_params)
@@ -14,8 +14,11 @@
14
14
  viewBox="0 0 48 48"
15
15
  version="1.1"
16
16
  id="SVGRoot"
17
- inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
18
- sodipodi:docname="nabu.svg">
17
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
18
+ sodipodi:docname="nabu_2d.svg"
19
+ inkscape:export-filename="/media/payno/830add5c-f5d7-4db2-875e-03be4f0a67f0/dev/tomography/tomwer/orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.png"
20
+ inkscape:export-xdpi="59.900002"
21
+ inkscape:export-ydpi="59.900002">
19
22
  <defs
20
23
  id="defs815" />
21
24
  <sodipodi:namedview
@@ -26,14 +29,14 @@
26
29
  inkscape:pageopacity="0.0"
27
30
  inkscape:pageshadow="2"
28
31
  inkscape:zoom="5.3333333"
29
- inkscape:cx="-29.508774"
30
- inkscape:cy="36.425261"
32
+ inkscape:cx="-96.821274"
33
+ inkscape:cy="34.925261"
31
34
  inkscape:document-units="px"
32
35
  inkscape:current-layer="g1399"
33
36
  showgrid="false"
34
- inkscape:window-width="1920"
35
- inkscape:window-height="1016"
36
- inkscape:window-x="0"
37
+ inkscape:window-width="1848"
38
+ inkscape:window-height="1136"
39
+ inkscape:window-x="72"
37
40
  inkscape:window-y="27"
38
41
  inkscape:window-maximized="1"
39
42
  inkscape:grid-bbox="true" />
@@ -45,7 +48,7 @@
45
48
  <dc:format>image/svg+xml</dc:format>
46
49
  <dc:type
47
50
  rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
48
- <dc:title></dc:title>
51
+ <dc:title />
49
52
  </cc:Work>
50
53
  </rdf:RDF>
51
54
  </metadata>
@@ -70,7 +70,7 @@ class DataViewerOW(widget.OWBaseWidget, openclass=True):
70
70
  data = Input(name="data", type=TomwerScanBase)
71
71
 
72
72
  def __init__(self, parent=None):
73
- widget.OWBaseWidget.__init__(self, parent)
73
+ super().__init__(parent)
74
74
  self._layout = gui.vBox(self.mainArea, self.name).layout()
75
75
  self.viewer = DataViewer(parent=self)
76
76
  self.viewer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Expanding)
@@ -115,9 +115,15 @@ class DataViewerOW(widget.OWBaseWidget, openclass=True):
115
115
  return qt.QSize(400, 500)
116
116
 
117
117
  def _updateSettings(self):
118
- self._viewer_config["mode"] = self.viewer.getDisplayMode()
119
- self._viewer_config["slice_opt"] = self.viewer.getSliceOption()
120
- self._viewer_config["radio_opt"] = self.viewer.getRadioOption()
118
+ self._viewer_config[ # pylint: disable=E1137
119
+ "mode"
120
+ ] = self.viewer.getDisplayMode().value
121
+ self._viewer_config[ # pylint: disable=E1137
122
+ "slice_opt"
123
+ ] = self.viewer.getSliceOption().value
124
+ self._viewer_config[ # pylint: disable=E1137
125
+ "radio_opt"
126
+ ] = self.viewer.getRadioOption().value
121
127
 
122
128
  def _setSettings(self, settings):
123
129
  old_state = self.viewer.blockSignals(True)
@@ -74,4 +74,4 @@ class DiffViewerOW(widget.OWBaseWidget, openclass=True):
74
74
  self.viewer.addScan(scan)
75
75
 
76
76
  def sizeHint(self):
77
- return qt.QSize(400, 500)
77
+ return qt.QSize(500, 700)
@@ -0,0 +1,69 @@
1
+ from orangewidget import widget, gui
2
+ from tomwer.gui.visualization.nxtomometadata import NXtomoMetadataViewer
3
+ from orangewidget.widget import Input, Output
4
+ from tomwer.core.scan.hdf5scan import HDF5TomoScan
5
+ from tomwer.core.scan.scanbase import TomwerScanBase
6
+ from silx.gui import qt
7
+
8
+
9
+ class NXtomoMetadataViewerOW(widget.OWBaseWidget, openclass=True):
10
+ """
11
+ Widget to siplay NXtomo metadata
12
+ """
13
+
14
+ name = "nxtomo-metadata-viewer"
15
+ id = "orange.widgets.tomwer.visualization.NXtomoMetadataViewerOW.NXtomoMetadataViewerOW"
16
+ description = "Interface to display some metadata of an NXtomo"
17
+ icon = "icons/nx_tomo_metadata_viewer.svg"
18
+ priority = 13
19
+ keywords = [
20
+ "hdf5",
21
+ "nexus",
22
+ "tomwer",
23
+ "file",
24
+ "visualize",
25
+ "visualization",
26
+ "display",
27
+ "NXTomo",
28
+ "editor",
29
+ "energy",
30
+ "distance",
31
+ "pixel size",
32
+ ]
33
+
34
+ class Inputs:
35
+ data = Input(name="data", type=TomwerScanBase)
36
+
37
+ class Outputs:
38
+ data = Output(name="data", type=TomwerScanBase)
39
+
40
+ want_main_area = True
41
+ resizing_enabled = True
42
+ compress_signal = False
43
+
44
+ def __init__(self, parent=None, *args, **kwargs):
45
+ super().__init__(parent=parent, *args, **kwargs)
46
+
47
+ _layout = gui.vBox(self.mainArea, self.name).layout()
48
+ self.widget = NXtomoMetadataViewer(parent=self)
49
+ _layout.addWidget(self.widget)
50
+
51
+ def _validateScan(self, scan):
52
+ self.Outputs.data.send(scan)
53
+ super().hide()
54
+
55
+ @Inputs.data
56
+ def setScan(self, scan):
57
+ if scan is None:
58
+ pass
59
+ elif not isinstance(scan, HDF5TomoScan):
60
+ raise TypeError(
61
+ f"expect to have an instance of {HDF5TomoScan}. {type(scan)} provided."
62
+ )
63
+ else:
64
+ self.widget.setScan(scan)
65
+ self.show()
66
+ self.raise_()
67
+
68
+ def sizeHint(self):
69
+ return qt.QSize(400, 500)
@@ -30,7 +30,6 @@ __date__ = "19/03/2018"
30
30
  from silx.gui import qt
31
31
  from orangewidget import widget, gui
32
32
  from orangewidget.widget import Input
33
- from tomwer.web.client import OWClient
34
33
  from tomwer.gui.samplemoved import SampleMovedWidget
35
34
  from tomwer.core.scan.scanbase import TomwerScanBase
36
35
  import tomwer.core.process.visualization.samplemoved
@@ -40,7 +39,7 @@ import logging
40
39
  logger = logging.getLogger(__name__)
41
40
 
42
41
 
43
- class SampleMovedOW(widget.OWBaseWidget, OWClient, openclass=True):
42
+ class SampleMovedOW(widget.OWBaseWidget, openclass=True):
44
43
  """
45
44
  Simple widget exposing two images side by side to see if a sample moved
46
45
  during the acquisition.
@@ -72,8 +71,7 @@ class SampleMovedOW(widget.OWBaseWidget, OWClient, openclass=True):
72
71
  data = Input(name="data", type=TomwerScanBase)
73
72
 
74
73
  def __init__(self, parent=None):
75
- widget.OWBaseWidget.__init__(self, parent)
76
- OWClient.__init__(self)
74
+ super().__init__(parent)
77
75
 
78
76
  layout = gui.vBox(self.mainArea, self.name).layout()
79
77
 
@@ -0,0 +1,105 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:xlink="http://www.w3.org/1999/xlink"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ width="48"
14
+ height="48"
15
+ viewBox="0 0 12.7 12.7"
16
+ version="1.1"
17
+ id="svg901"
18
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
19
+ sodipodi:docname="nx_tomo_metadata_viewer.svg"
20
+ inkscape:export-filename="/media/payno/830add5c-f5d7-4db2-875e-03be4f0a67f0/dev/tomography/tomwer/orangecontrib/tomwer/widgets/visualization/icons/nx_tomo_metadata_viewer.png"
21
+ inkscape:export-xdpi="59.900002"
22
+ inkscape:export-ydpi="59.900002">
23
+ <defs
24
+ id="defs895" />
25
+ <sodipodi:namedview
26
+ id="base"
27
+ pagecolor="#ffffff"
28
+ bordercolor="#666666"
29
+ borderopacity="1.0"
30
+ inkscape:pageopacity="0.0"
31
+ inkscape:pageshadow="2"
32
+ inkscape:zoom="3.959798"
33
+ inkscape:cx="-32.267824"
34
+ inkscape:cy="1.1453318"
35
+ inkscape:document-units="mm"
36
+ inkscape:current-layer="layer1"
37
+ showgrid="false"
38
+ units="px"
39
+ inkscape:window-width="1848"
40
+ inkscape:window-height="1136"
41
+ inkscape:window-x="72"
42
+ inkscape:window-y="27"
43
+ inkscape:window-maximized="1" />
44
+ <metadata
45
+ id="metadata898">
46
+ <rdf:RDF>
47
+ <cc:Work
48
+ rdf:about="">
49
+ <dc:format>image/svg+xml</dc:format>
50
+ <dc:type
51
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
52
+ <dc:title></dc:title>
53
+ </cc:Work>
54
+ </rdf:RDF>
55
+ </metadata>
56
+ <g
57
+ inkscape:label="Layer 1"
58
+ inkscape:groupmode="layer"
59
+ id="layer1"
60
+ transform="translate(0,-284.3)">
61
+ <g
62
+ transform="matrix(0.67999756,0,0,1.4705936,-0.07800087,-0.17577001)"
63
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.24015903px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.07525919"
64
+ id="text2005">
65
+ <path
66
+ inkscape:connector-curvature="0"
67
+ d="M 0.19471413,195.6209 H 1.1392864 l 2.2989224,4.3374 v -4.3374 h 0.6806477 v 5.18473 H 3.1742841 l -2.29892227,-4.33739 v 4.33739 h -0.6806477 z"
68
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.1120739px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
69
+ id="path869" />
70
+ <path
71
+ inkscape:connector-curvature="0"
72
+ d="m 5.264845,195.6209 h 0.7535742 l 1.2883689,1.92735 1.2953142,-1.92735 h 0.7535742 l -1.6668923,2.48992 1.7780185,2.69481 H 8.7132284 l -1.4585307,-2.20516 -1.4689489,2.20516 H 5.0287019 l 1.850945,-2.76773 z"
73
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.1120739px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
74
+ id="path871" />
75
+ <path
76
+ inkscape:connector-curvature="0"
77
+ d="m 10.340185,198.30877 v 0.55216 h 0.658075 v 0.24829 h -0.658075 v 1.0557 q 0,0.23788 0.06424,0.3056 0.06598,0.0677 0.265661,0.0677 h 0.328169 v 0.26739 h -0.328169 q -0.369842,0 -0.510486,-0.13717 -0.140644,-0.13891 -0.140644,-0.50354 v -1.0557 H 9.7845543 v -0.24829 h 0.2344067 v -0.55216 z"
78
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
79
+ id="path873" />
80
+ <path
81
+ inkscape:connector-curvature="0"
82
+ d="m 12.17203,199.08491 q -0.25698,0 -0.406305,0.20142 -0.149326,0.19968 -0.149326,0.54869 0,0.349 0.147589,0.55042 0.149326,0.19968 0.408042,0.19968 0.255242,0 0.404568,-0.20142 0.149326,-0.20141 0.149326,-0.54868 0,-0.34554 -0.149326,-0.54695 -0.149326,-0.20316 -0.404568,-0.20316 z m 0,-0.27087 q 0.416723,0 0.654602,0.27087 0.237879,0.27087 0.237879,0.75011 0,0.47749 -0.237879,0.7501 -0.237879,0.27087 -0.654602,0.27087 -0.41846,0 -0.656339,-0.27087 -0.236143,-0.27261 -0.236143,-0.7501 0,-0.47924 0.236143,-0.75011 0.237879,-0.27087 0.656339,-0.27087 z"
83
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
84
+ id="path875" />
85
+ <path
86
+ inkscape:connector-curvature="0"
87
+ d="m 15.108191,199.23424 q 0.119808,-0.21531 0.286497,-0.31775 0.166689,-0.10245 0.392414,-0.10245 0.303861,0 0.468814,0.21358 0.164953,0.21183 0.164953,0.60424 v 1.17377 h -0.321224 v -1.16335 q 0,-0.27955 -0.09897,-0.41499 -0.09897,-0.13543 -0.302124,-0.13543 -0.248298,0 -0.392414,0.16495 -0.144117,0.16496 -0.144117,0.44972 v 1.0991 h -0.321224 v -1.16335 q 0,-0.28129 -0.09897,-0.41499 -0.09897,-0.13543 -0.305597,-0.13543 -0.244825,0 -0.388941,0.16669 -0.144117,0.16495 -0.144117,0.44798 v 1.0991 h -0.321224 v -1.9447 h 0.321224 v 0.30212 q 0.10939,-0.17884 0.262188,-0.26392 0.152799,-0.0851 0.362897,-0.0851 0.211834,0 0.359423,0.10766 0.149326,0.10765 0.220516,0.31254 z"
88
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
89
+ id="path877" />
90
+ <path
91
+ inkscape:connector-curvature="0"
92
+ d="m 17.811682,199.08491 q -0.256979,0 -0.406305,0.20142 -0.149326,0.19968 -0.149326,0.54869 0,0.349 0.147589,0.55042 0.149326,0.19968 0.408042,0.19968 0.255243,0 0.404568,-0.20142 0.149326,-0.20141 0.149326,-0.54868 0,-0.34554 -0.149326,-0.54695 -0.149325,-0.20316 -0.404568,-0.20316 z m 0,-0.27087 q 0.416723,0 0.654602,0.27087 0.23788,0.27087 0.23788,0.75011 0,0.47749 -0.23788,0.7501 -0.237879,0.27087 -0.654602,0.27087 -0.41846,0 -0.656339,-0.27087 -0.236143,-0.27261 -0.236143,-0.7501 0,-0.47924 0.236143,-0.75011 0.237879,-0.27087 0.656339,-0.27087 z"
93
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
94
+ id="path879" />
95
+ </g>
96
+ <image
97
+ width="8.9820642"
98
+ height="8.2470732"
99
+ preserveAspectRatio="none"
100
+ xlink:href="data:image/png;base64,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 QmCC "
101
+ id="image1813"
102
+ x="4.855176"
103
+ y="283.63773" />
104
+ </g>
105
+ </svg>
tomwer/__main__.py CHANGED
@@ -80,6 +80,11 @@ def main():
80
80
  module_name="tomwer.app.imagekeyeditor",
81
81
  description="Tool to modify in place frames image key parameter.",
82
82
  )
83
+ launcher.add_command(
84
+ "image-key-upgrader",
85
+ module_name="tomwer.app.imagekeyupgrader",
86
+ description="Tool to upgrade in place frames image key parameter.",
87
+ )
83
88
  launcher.add_command(
84
89
  "norm-intensity",
85
90
  module_name="tomwer.app.intensitynormalization",
@@ -100,16 +105,16 @@ def main():
100
105
  module_name="tomwer.app.nabuapp",
101
106
  description="Use nabu to reconstruct a given scan",
102
107
  )
108
+ launcher.add_command(
109
+ "nxtomo-editor",
110
+ module_name="tomwer.app.nxtomoeditor",
111
+ description="Use to edit an NXtomo",
112
+ )
103
113
  launcher.add_command(
104
114
  "ows-to-script",
105
115
  module_name="tomwer.app.ows_to_script",
106
116
  description="Convert a .ows file to python script",
107
117
  )
108
- launcher.add_command(
109
- "process",
110
- module_name="tomwer.app.process",
111
- description="Process a given scan with a defined" "workflow",
112
- )
113
118
  launcher.add_command(
114
119
  "rsync",
115
120
  module_name="tomwer.app.rsync",
@@ -124,12 +124,12 @@ class TomwerConfig(config.Config):
124
124
  #: Submit a bug report action in the Help menu
125
125
  "Bug Report": "https://gitlab.esrf.fr/tomotools/tomwer/-/issues",
126
126
  #: A url quick tour/getting started url
127
- "Quick Start": "http://www.edna-site.org/pub/doc/tomwer/video/canvas/start_up/",
127
+ "Quick Start": "https://www.youtube.com/playlist?list=PLddRXwP6Z6F9KOu1V5o6H24KPH5Ikuk2f",
128
128
  #: The 'full' documentation, should be something like current /docs/
129
129
  #: but specific for 'Visual Programing' only
130
- "Documentation": "http://www.edna-site.org/pub/doc/tomwer/latest/",
130
+ "Documentation": "https://tomotools.gitlab-pages.esrf.fr/nxtomomill/index.html",
131
131
  #: YouTube tutorials
132
- "Screencasts": "http://www.edna-site.org/pub/doc/tomwer/video",
132
+ "Screencasts": "https://www.youtube.com/@tomotools",
133
133
  }
134
134
 
135
135
 
@@ -187,13 +187,13 @@ class TerminalTextDocument(_TerminalTextDocument):
187
187
  # remove linux reset sequence
188
188
  string = string.replace("\033[1;%dm", "")
189
189
  # remove linux reset sequence
190
- string = string.replace("", "")
191
- string = string.replace("", "")
192
- string = string.replace("", "")
193
- string = string.replace("", "")
194
- string = string.replace("", "")
195
- string = string.replace("", "")
196
- string = string.replace("", "")
190
+ string = string.replace("\x1B[1m", "")
191
+ string = string.replace("\x1B[1;30m", "")
192
+ string = string.replace("\x1B[1;31m", "")
193
+ string = string.replace("\x1B[1;32m", "")
194
+ string = string.replace("\x1B[1;33m", "")
195
+ string = string.replace("\x1B[1;34m", "")
196
+ string = string.replace("\x1B[1;35m", "")
197
197
 
198
198
  color = self.get_log_level(string) or qt.Qt.red
199
199
  charformat.setForeground(color)