tomwer 1.3.27__py3-none-any.whl → 1.4.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 (638) hide show
  1. orangecontrib/tomwer/orange/managedprocess.py +1 -29
  2. orangecontrib/tomwer/orange/settings.py +2 -28
  3. orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
  4. orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
  5. orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
  6. orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
  7. orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
  8. orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
  9. orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
  10. orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
  11. orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
  12. orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
  13. orangecontrib/tomwer/widgets/__init__.py +3 -5
  14. orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
  15. orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
  16. orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
  17. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
  18. orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
  19. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
  20. orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
  21. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
  22. orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
  23. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
  24. orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
  25. orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
  26. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
  27. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
  28. orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
  29. orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
  30. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
  31. orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
  32. orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
  33. orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
  34. orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
  35. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
  36. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
  37. orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
  38. orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
  39. orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
  40. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
  41. orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
  42. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
  43. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
  44. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
  45. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
  46. orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
  47. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
  48. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
  49. orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
  50. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
  51. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
  52. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
  53. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
  54. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
  55. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
  56. orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
  57. orangecontrib/tomwer/widgets/utils.py +2 -29
  58. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
  59. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
  60. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
  61. orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
  62. orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
  63. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
  64. orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
  65. tomwer/__init__.py +3 -28
  66. tomwer/__main__.py +8 -4
  67. tomwer/app/__init__.py +2 -0
  68. tomwer/app/axis.py +8 -10
  69. tomwer/app/canvas.py +23 -29
  70. tomwer/app/canvas_launcher/config.py +14 -102
  71. tomwer/app/canvas_launcher/environ.py +5 -8
  72. tomwer/app/canvas_launcher/mainwindow.py +175 -69
  73. tomwer/app/canvas_launcher/splash.py +1 -3
  74. tomwer/app/canvas_launcher/utils.py +47 -0
  75. tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
  76. tomwer/app/diffframe.py +2 -0
  77. tomwer/app/imagekeyeditor.py +2 -1
  78. tomwer/app/imagekeyupgrader.py +2 -0
  79. tomwer/app/multicor.py +5 -2
  80. tomwer/app/multipag.py +16 -5
  81. tomwer/app/nabuapp.py +2 -1
  82. tomwer/app/nxtomoeditor.py +17 -12
  83. tomwer/app/patchrawdarkflat.py +2 -0
  84. tomwer/app/radiostack.py +3 -2
  85. tomwer/app/reducedarkflat.py +3 -0
  86. tomwer/app/samplemoved.py +2 -0
  87. tomwer/app/scanviewer.py +2 -0
  88. tomwer/app/sinogramviewer.py +2 -0
  89. tomwer/app/slicestack.py +11 -13
  90. tomwer/app/stitching/common.py +431 -0
  91. tomwer/app/stopdatalistener.py +3 -0
  92. tomwer/app/ystitching.py +26 -0
  93. tomwer/app/zstitching.py +8 -363
  94. tomwer/core/__init__.py +2 -28
  95. tomwer/core/cluster/__init__.py +3 -0
  96. tomwer/core/cluster/cluster.py +10 -26
  97. tomwer/core/futureobject.py +17 -43
  98. tomwer/core/log/__init__.py +2 -0
  99. tomwer/core/log/processlog.py +0 -28
  100. tomwer/core/process/cluster/supervisor.py +52 -34
  101. tomwer/core/process/conditions/filters.py +3 -28
  102. tomwer/core/process/control/datalistener/datalistener.py +7 -75
  103. tomwer/core/process/control/datalistener/rpcserver.py +8 -38
  104. tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
  105. tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
  106. tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
  107. tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
  108. tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
  109. tomwer/core/process/control/datawatcher/status.py +1 -26
  110. tomwer/core/process/control/emailnotifier.py +11 -23
  111. tomwer/core/process/control/nxtomoconcatenate.py +20 -18
  112. tomwer/core/process/control/nxtomomill.py +9 -44
  113. tomwer/core/process/control/scanlist.py +0 -27
  114. tomwer/core/process/control/scantransfer.py +15 -13
  115. tomwer/core/process/control/scanvalidator.py +4 -30
  116. tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
  117. tomwer/core/process/control/timer.py +1 -27
  118. tomwer/core/process/control/tomoobjseries.py +12 -0
  119. tomwer/core/process/drac/binning.py +37 -0
  120. tomwer/core/process/drac/dracbase.py +170 -0
  121. tomwer/core/process/drac/gallery.py +109 -0
  122. tomwer/core/process/drac/output.py +12 -0
  123. tomwer/core/process/drac/processeddataset.py +147 -0
  124. tomwer/core/process/drac/publish.py +118 -0
  125. tomwer/core/process/drac/rawdataset.py +142 -0
  126. tomwer/core/process/drac/tests/test_gallery.py +71 -0
  127. tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
  128. tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
  129. tomwer/core/process/edit/darkflatpatch.py +1 -28
  130. tomwer/core/process/edit/imagekeyeditor.py +4 -32
  131. tomwer/core/process/edit/nxtomoeditor.py +307 -0
  132. tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
  133. tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
  134. tomwer/core/process/output.py +9 -2
  135. tomwer/core/process/reconstruction/__init__.py +0 -26
  136. tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
  137. tomwer/core/process/reconstruction/axis/axis.py +47 -804
  138. tomwer/core/process/reconstruction/axis/mode.py +89 -25
  139. tomwer/core/process/reconstruction/axis/params.py +131 -283
  140. tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
  141. tomwer/core/process/reconstruction/axis/side.py +8 -0
  142. tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
  143. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
  144. tomwer/core/process/reconstruction/darkref/params.py +1 -28
  145. tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
  146. tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
  147. tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
  148. tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
  149. tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
  150. tomwer/core/process/reconstruction/nabu/plane.py +10 -0
  151. tomwer/core/process/reconstruction/nabu/settings.py +1 -28
  152. tomwer/core/process/reconstruction/nabu/target.py +0 -28
  153. tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
  154. tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
  155. tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
  156. tomwer/core/process/reconstruction/nabu/utils.py +11 -60
  157. tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
  158. tomwer/core/process/reconstruction/normalization/params.py +3 -35
  159. tomwer/core/process/reconstruction/output.py +14 -19
  160. tomwer/core/process/reconstruction/paramsbase.py +4 -33
  161. tomwer/core/process/reconstruction/saaxis/params.py +5 -33
  162. tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
  163. tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
  164. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
  165. tomwer/core/process/reconstruction/scores/params.py +9 -39
  166. tomwer/core/process/reconstruction/scores/scores.py +10 -42
  167. tomwer/core/process/reconstruction/tests/__init__.py +0 -0
  168. tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
  169. tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
  170. tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
  171. tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
  172. tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
  173. tomwer/core/process/reconstruction/utils/cor.py +8 -4
  174. tomwer/core/process/script/python.py +1 -27
  175. tomwer/core/process/script/tests/test_script.py +41 -0
  176. tomwer/core/process/stitching/metadataholder.py +5 -4
  177. tomwer/core/process/stitching/nabustitcher.py +35 -5
  178. tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
  179. tomwer/core/process/task.py +20 -63
  180. tomwer/core/process/tests/__init__.py +0 -0
  181. tomwer/core/process/{test → tests}/test_conditions.py +1 -28
  182. tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
  183. tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
  184. tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
  185. tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
  186. tomwer/core/process/{test → tests}/test_nabu.py +2 -33
  187. tomwer/core/process/{test → tests}/test_normalization.py +1 -26
  188. tomwer/core/process/{test → tests}/test_timer.py +1 -27
  189. tomwer/core/process/utils.py +2 -31
  190. tomwer/core/process/visualization/dataviewer.py +1 -26
  191. tomwer/core/process/visualization/diffviewer.py +1 -26
  192. tomwer/core/process/visualization/imagestackviewer.py +0 -26
  193. tomwer/core/process/visualization/radiostack.py +0 -26
  194. tomwer/core/process/visualization/samplemoved.py +0 -28
  195. tomwer/core/process/visualization/sinogramviewer.py +0 -27
  196. tomwer/core/process/visualization/slicestack.py +0 -28
  197. tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
  198. tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
  199. tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
  200. tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
  201. tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
  202. tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
  203. tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
  204. tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
  205. tomwer/core/process/visualization/volumeviewer.py +0 -29
  206. tomwer/core/scan/__init__.py +3 -27
  207. tomwer/core/scan/blissscan.py +5 -34
  208. tomwer/core/scan/edfscan.py +19 -53
  209. tomwer/core/scan/hdf5scan.py +2 -2
  210. tomwer/core/scan/nxtomoscan.py +48 -54
  211. tomwer/core/scan/scanbase.py +107 -203
  212. tomwer/core/scan/scanfactory.py +11 -41
  213. tomwer/core/scan/tests/__init__.py +0 -0
  214. tomwer/core/scan/tests/test_edf.py +25 -0
  215. tomwer/core/scan/tests/test_future_scan.py +35 -0
  216. tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
  217. tomwer/core/scan/tests/test_process_registration.py +64 -0
  218. tomwer/core/settings.py +18 -40
  219. tomwer/core/tests/__init__.py +0 -0
  220. tomwer/core/tests/test_scanutils.py +26 -0
  221. tomwer/core/{test → tests}/test_utils.py +1 -28
  222. tomwer/core/tomwer_object.py +4 -0
  223. tomwer/core/utils/__init__.py +2 -0
  224. tomwer/core/utils/char.py +0 -28
  225. tomwer/core/utils/deprecation.py +12 -38
  226. tomwer/core/utils/dictutils.py +1 -3
  227. tomwer/core/utils/ftseriesutils.py +1 -27
  228. tomwer/core/utils/gpu.py +0 -28
  229. tomwer/core/utils/image.py +8 -39
  230. tomwer/core/utils/locker.py +1 -28
  231. tomwer/core/utils/logconfig.py +0 -27
  232. tomwer/core/utils/normalization.py +4 -31
  233. tomwer/core/utils/nxtomoutils.py +8 -38
  234. tomwer/core/utils/resource.py +0 -26
  235. tomwer/core/utils/scanutils.py +23 -52
  236. tomwer/core/utils/slurm.py +7 -30
  237. tomwer/core/utils/spec.py +6 -6
  238. tomwer/core/utils/tests/__init__.py +0 -0
  239. tomwer/core/utils/tests/test_image.py +30 -0
  240. tomwer/core/utils/tests/test_nxtomo.py +38 -0
  241. tomwer/core/utils/tests/test_scan_utils.py +46 -0
  242. tomwer/core/utils/tests/test_time.py +6 -0
  243. tomwer/core/utils/threads.py +0 -26
  244. tomwer/core/utils/time.py +0 -27
  245. tomwer/core/volume/__init__.py +4 -0
  246. tomwer/core/volume/edfvolume.py +1 -28
  247. tomwer/core/volume/hdf5volume.py +1 -28
  248. tomwer/core/volume/jp2kvolume.py +1 -27
  249. tomwer/core/volume/rawvolume.py +1 -28
  250. tomwer/core/volume/tests/test_volumes.py +21 -0
  251. tomwer/core/volume/tiffvolume.py +1 -28
  252. tomwer/core/volume/volumebase.py +5 -0
  253. tomwer/core/volume/volumefactory.py +7 -33
  254. tomwer/gui/__init__.py +0 -28
  255. tomwer/gui/cluster/__init__.py +2 -0
  256. tomwer/gui/cluster/slurm.py +297 -95
  257. tomwer/gui/cluster/supervisor.py +1 -27
  258. tomwer/gui/cluster/tests/__init__.py +0 -0
  259. tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
  260. tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
  261. tomwer/gui/conditions/__init__.py +2 -0
  262. tomwer/gui/conditions/filter.py +1 -26
  263. tomwer/gui/configuration/__init__.py +2 -0
  264. tomwer/gui/control/__init__.py +2 -0
  265. tomwer/gui/control/actions.py +2 -28
  266. tomwer/gui/control/datadiscovery.py +4 -3
  267. tomwer/gui/control/datalist.py +64 -69
  268. tomwer/gui/control/datalistener.py +1 -39
  269. tomwer/gui/control/datareacheractions.py +1 -28
  270. tomwer/gui/control/datatransfert.py +2 -29
  271. tomwer/gui/control/datavalidator.py +3 -37
  272. tomwer/gui/control/datawatcher/__init__.py +0 -28
  273. tomwer/gui/control/datawatcher/configuration.py +1 -28
  274. tomwer/gui/control/datawatcher/datawatcher.py +3 -32
  275. tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
  276. tomwer/gui/control/history.py +5 -35
  277. tomwer/gui/control/nxtomomill.py +3 -30
  278. tomwer/gui/control/observations.py +61 -55
  279. tomwer/gui/control/reducedarkflatselector.py +24 -20
  280. tomwer/gui/control/scanselectorwidget.py +2 -28
  281. tomwer/gui/control/selectorwidgetbase.py +17 -17
  282. tomwer/gui/control/series/__init__.py +0 -0
  283. tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
  284. tomwer/gui/control/series/serieswaiter.py +0 -0
  285. tomwer/gui/control/series/test/test_creator.py +424 -0
  286. tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
  287. tomwer/gui/control/singletomoobj.py +1 -1
  288. tomwer/gui/control/tests/__init__.py +0 -0
  289. tomwer/gui/control/tests/test_datalist.py +47 -0
  290. tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
  291. tomwer/gui/control/tests/test_datavalidator.py +27 -0
  292. tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
  293. tomwer/gui/control/tests/test_process_manager.py +38 -0
  294. tomwer/gui/control/tests/test_scan_observations.py +23 -0
  295. tomwer/gui/control/tests/test_scanselector.py +42 -0
  296. tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
  297. tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
  298. tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
  299. tomwer/gui/control/volumeselectorwidget.py +2 -30
  300. tomwer/gui/dataportal/__init__.py +2 -0
  301. tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
  302. tomwer/gui/dataportal/gallery.py +133 -0
  303. tomwer/gui/dataportal/outputformat.py +0 -0
  304. tomwer/gui/dataportal/publish.py +96 -0
  305. tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
  306. tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
  307. tomwer/gui/debugtools/__init__.py +2 -0
  308. tomwer/gui/debugtools/datasetgenerator.py +1 -30
  309. tomwer/gui/debugtools/objectinspector.py +1 -29
  310. tomwer/gui/dialog/QDataDialog.py +89 -0
  311. tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
  312. tomwer/gui/dialog/__init__.py +1 -0
  313. tomwer/gui/edit/__init__.py +2 -0
  314. tomwer/gui/edit/dkrfpatch.py +52 -87
  315. tomwer/gui/edit/imagekeyeditor.py +18 -54
  316. tomwer/gui/edit/nxtomoeditor.py +113 -300
  317. tomwer/gui/edit/nxtomowarmer.py +3 -2
  318. tomwer/gui/edit/tests/__init__.py +0 -0
  319. tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
  320. tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
  321. tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
  322. tomwer/gui/fonts.py +5 -0
  323. tomwer/gui/icons.py +28 -66
  324. tomwer/gui/illustrations.py +4 -34
  325. tomwer/gui/imagefromfile.py +5 -30
  326. tomwer/gui/metadataloader.py +36 -0
  327. tomwer/gui/qconfigfile.py +3 -0
  328. tomwer/gui/qlefilesystem.py +3 -0
  329. tomwer/gui/reconstruction/__init__.py +2 -0
  330. tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
  331. tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
  332. tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
  333. tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
  334. tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
  335. tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
  336. tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
  337. tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
  338. tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
  339. tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
  340. tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
  341. tomwer/gui/reconstruction/axis/__init__.py +2 -2
  342. tomwer/gui/reconstruction/darkref/__init__.py +0 -27
  343. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
  344. tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
  345. tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
  346. tomwer/gui/reconstruction/nabu/check.py +7 -33
  347. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
  348. tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
  349. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
  350. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
  351. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
  352. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
  353. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
  354. tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
  355. tomwer/gui/reconstruction/nabu/platform.py +94 -0
  356. tomwer/gui/reconstruction/nabu/slices.py +81 -45
  357. tomwer/gui/reconstruction/nabu/slurm.py +1 -27
  358. tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
  359. tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
  360. tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
  361. tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
  362. tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
  363. tomwer/gui/reconstruction/nabu/volume.py +62 -90
  364. tomwer/gui/reconstruction/normalization/intensity.py +5 -32
  365. tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
  366. tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
  367. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
  368. tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
  369. tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
  370. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
  371. tomwer/gui/reconstruction/scores/control.py +2 -30
  372. tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
  373. tomwer/gui/reconstruction/tests/__init__.py +0 -0
  374. tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
  375. tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
  376. tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
  377. tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
  378. tomwer/gui/samplemoved/__init__.py +2 -30
  379. tomwer/gui/samplemoved/selectiontable.py +3 -33
  380. tomwer/gui/settings.py +7 -0
  381. tomwer/gui/stackplot.py +33 -661
  382. tomwer/gui/stacks.py +261 -135
  383. tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
  384. tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
  385. tomwer/gui/stitching/StitchingWindow.py +586 -0
  386. tomwer/gui/stitching/__init__.py +2 -0
  387. tomwer/gui/stitching/alignment.py +90 -0
  388. tomwer/gui/stitching/axisorderedlist.py +44 -34
  389. tomwer/gui/stitching/config/axisparams.py +25 -11
  390. tomwer/gui/stitching/config/output.py +6 -5
  391. tomwer/gui/stitching/config/positionoveraxis.py +313 -51
  392. tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
  393. tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
  394. tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
  395. tomwer/gui/stitching/normalization.py +1 -0
  396. tomwer/gui/stitching/preview.py +59 -0
  397. tomwer/gui/stitching/singleaxis.py +57 -0
  398. tomwer/gui/stitching/stitchandbackground.py +3 -2
  399. tomwer/gui/stitching/stitching_preview.py +44 -36
  400. tomwer/gui/stitching/stitching_raw.py +5 -3
  401. tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
  402. tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
  403. tomwer/gui/stitching/tests/test_normalization.py +27 -0
  404. tomwer/gui/stitching/tests/test_preview.py +68 -0
  405. tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
  406. tomwer/gui/stitching/tests/utils.py +92 -0
  407. tomwer/gui/stitching/utils.py +14 -0
  408. tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
  409. tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
  410. tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
  411. tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
  412. tomwer/gui/tests/__init__.py +0 -0
  413. tomwer/gui/tests/test_axis_gui.py +43 -0
  414. tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
  415. tomwer/gui/utils/RangeWidget.py +44 -0
  416. tomwer/gui/utils/buttons.py +4 -3
  417. tomwer/gui/utils/completer.py +2 -33
  418. tomwer/gui/utils/flow.py +11 -40
  419. tomwer/gui/utils/gpu.py +60 -0
  420. tomwer/gui/utils/illustrations.py +1 -26
  421. tomwer/gui/utils/inputwidget.py +35 -73
  422. tomwer/gui/utils/lineselector/lineselector.py +9 -46
  423. tomwer/gui/utils/loadingmode.py +81 -0
  424. tomwer/gui/utils/qt_utils.py +9 -0
  425. tomwer/gui/utils/sandboxes.py +1 -26
  426. tomwer/gui/utils/scandescription.py +2 -31
  427. tomwer/gui/utils/scrollarea.py +6 -55
  428. tomwer/gui/utils/slider.py +4 -28
  429. tomwer/gui/utils/splashscreen.py +0 -28
  430. tomwer/gui/utils/step.py +14 -13
  431. tomwer/gui/utils/tests/test_completer.py +41 -0
  432. tomwer/gui/utils/tests/test_line_selector.py +21 -0
  433. tomwer/gui/utils/tests/test_splashscreen.py +8 -0
  434. tomwer/gui/utils/tests/test_vignettes.py +68 -0
  435. tomwer/gui/utils/unitsystem.py +15 -69
  436. tomwer/gui/utils/utils.py +4 -5
  437. tomwer/gui/utils/vignettes.py +10 -41
  438. tomwer/gui/utils/waiterthread.py +0 -26
  439. tomwer/gui/visualization/__init__.py +2 -0
  440. tomwer/gui/visualization/dataviewer.py +68 -421
  441. tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
  442. tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
  443. tomwer/gui/visualization/fullscreenplot.py +5 -5
  444. tomwer/gui/visualization/imagestack.py +403 -0
  445. tomwer/gui/visualization/nxtomometadata.py +0 -4
  446. tomwer/gui/visualization/reconstructionparameters.py +14 -32
  447. tomwer/gui/visualization/scanoverview.py +33 -66
  448. tomwer/gui/visualization/sinogramviewer.py +2 -28
  449. tomwer/gui/visualization/test/__init__.py +0 -28
  450. tomwer/gui/visualization/test/test_dataviewer.py +1 -28
  451. tomwer/gui/visualization/test/test_diffviewer.py +1 -28
  452. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
  453. tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
  454. tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
  455. tomwer/gui/visualization/test/test_stacks.py +184 -115
  456. tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
  457. tomwer/gui/visualization/tomoobjoverview.py +2 -2
  458. tomwer/gui/visualization/volumeoverview.py +3 -2
  459. tomwer/gui/visualization/volumeviewer.py +47 -43
  460. tomwer/io/__init__.py +2 -0
  461. tomwer/io/utils/h5pyutils.py +1 -27
  462. tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
  463. tomwer/io/utils/test/test_utils.py +67 -0
  464. tomwer/io/utils/utils.py +2 -31
  465. tomwer/resources/__init__.py +13 -33
  466. tomwer/resources/gui/icons/edit_downstream.svg +114 -0
  467. tomwer/resources/gui/icons/edit_upstream.svg +112 -0
  468. tomwer/resources/gui/icons/free_edition.svg +23 -0
  469. tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
  470. tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
  471. tomwer/resources/gui/icons/search.png +0 -0
  472. tomwer/resources/gui/icons/search.svg +23 -0
  473. tomwer/resources/gui/icons/warning.png +0 -0
  474. tomwer/synctools/__init__.py +2 -0
  475. tomwer/synctools/axis.py +1 -27
  476. tomwer/synctools/darkref.py +1 -26
  477. tomwer/synctools/datalistener.py +1 -27
  478. tomwer/synctools/datatransfert.py +2 -27
  479. tomwer/synctools/imageloaderthread.py +1 -28
  480. tomwer/synctools/rsyncmanager.py +1 -25
  481. tomwer/synctools/saaxis.py +1 -26
  482. tomwer/synctools/sadeltabeta.py +1 -26
  483. tomwer/synctools/stacks/control/datalistener.py +1 -26
  484. tomwer/synctools/stacks/processingstack.py +4 -33
  485. tomwer/synctools/stacks/reconstruction/axis.py +6 -53
  486. tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
  487. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
  488. tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
  489. tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
  490. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
  491. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
  492. tomwer/synctools/tests/__init__.py +0 -0
  493. tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
  494. tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
  495. tomwer/synctools/utils/scanstages.py +2 -31
  496. tomwer/tests/__init__.py +1 -0
  497. tomwer/tests/app/test_stitching.py +95 -0
  498. tomwer/tests/datasets.py +1 -5
  499. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
  500. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
  501. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
  502. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
  503. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
  504. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
  505. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
  506. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
  507. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
  508. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
  509. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
  510. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
  511. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
  512. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
  513. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
  514. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
  515. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
  516. orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
  517. tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
  518. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
  519. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
  520. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
  521. tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
  522. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
  523. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
  524. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
  525. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
  526. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
  527. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
  528. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
  529. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
  530. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
  531. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
  532. tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
  533. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
  534. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
  535. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
  536. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
  537. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
  538. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
  539. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
  540. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
  541. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
  542. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
  543. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
  544. tomwer/tests/test_ewoks/test_conversion.py +104 -0
  545. tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
  546. tomwer/tests/test_ewoks/test_workflows.py +138 -0
  547. tomwer/utils.py +11 -39
  548. tomwer/version.py +2 -2
  549. {tomwer-1.3.27.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
  550. tomwer-1.4.0.dist-info/METADATA +337 -0
  551. tomwer-1.4.0.dist-info/RECORD +912 -0
  552. {tomwer-1.3.27.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
  553. {tomwer-1.3.27.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
  554. orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
  555. orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
  556. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
  557. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
  558. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
  559. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
  560. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
  561. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  562. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
  563. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  564. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
  565. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
  566. orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
  567. orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
  568. tomwer/core/log/logger.py +0 -130
  569. tomwer/core/process/control/test/test_volume_link.py +0 -74
  570. tomwer/core/process/control/tomoobjserie.py +0 -12
  571. tomwer/core/process/control/volumesymlink.py +0 -200
  572. tomwer/core/process/icat/createscreenshots.py +0 -100
  573. tomwer/core/process/icat/gallery.py +0 -377
  574. tomwer/core/process/icat/icatbase.py +0 -36
  575. tomwer/core/process/icat/publish.py +0 -228
  576. tomwer/core/process/icat/screenshots.py +0 -27
  577. tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
  578. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
  579. tomwer/core/process/test/test_axis.py +0 -309
  580. tomwer/core/process/visualization/liveslice.py +0 -6
  581. tomwer/core/progress.py +0 -100
  582. tomwer/core/scan/test/test_edf.py +0 -53
  583. tomwer/core/scan/test/test_future_scan.py +0 -61
  584. tomwer/core/scan/test/test_h5.py +0 -96
  585. tomwer/core/scan/test/test_process_registration.py +0 -109
  586. tomwer/core/test/test_scanutils.py +0 -53
  587. tomwer/gui/control/emailnotifier.py +0 -174
  588. tomwer/gui/control/serie/seriewaiter.py +0 -28
  589. tomwer/gui/control/test/__init__.py +0 -28
  590. tomwer/gui/control/test/test_datalist.py +0 -96
  591. tomwer/gui/control/test/test_datavalidator.py +0 -54
  592. tomwer/gui/control/test/test_email.py +0 -35
  593. tomwer/gui/control/test/test_process_manager.py +0 -65
  594. tomwer/gui/control/test/test_scanselector.py +0 -67
  595. tomwer/gui/edit/test/__init__.py +0 -28
  596. tomwer/gui/icat/gallery.py +0 -214
  597. tomwer/gui/icat/publish.py +0 -187
  598. tomwer/gui/reconstruction/axis/axis.py +0 -733
  599. tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
  600. tomwer/gui/stitching/stitching.py +0 -1388
  601. tomwer/gui/test/__init__.py +0 -28
  602. tomwer/gui/test/test_axis_gui.py +0 -34
  603. tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
  604. tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
  605. tomwer/third_part/WaitingOverlay.py +0 -110
  606. tomwer-1.3.27-py3.11-nspkg.pth +0 -1
  607. tomwer-1.3.27.dist-info/METADATA +0 -292
  608. tomwer-1.3.27.dist-info/RECORD +0 -785
  609. tomwer-1.3.27.dist-info/namespace_packages.txt +0 -1
  610. /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
  611. {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
  612. {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
  613. /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
  614. {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
  615. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
  616. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
  617. {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
  618. {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
  619. {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
  620. {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
  621. {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
  622. {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
  623. {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
  624. /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
  625. /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
  626. /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
  627. /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
  628. /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
  629. /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
  630. /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
  631. /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
  632. /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
  633. /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
  634. /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
  635. /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
  636. /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
  637. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
  638. {tomwer-1.3.27.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,25 +1,15 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  import weakref
3
- from typing import Optional
4
- from functools import lru_cache as cache
5
5
 
6
- import h5py
7
6
  import numpy
8
7
  from silx.gui import qt
9
- from silx.io.utils import h5py_read_dataset
10
- from silx.io.dictdump import dicttonx
11
-
12
- from tomoscan.io import HDF5File
13
- from nxtomo.paths.nxtomo import get_paths as get_nexus_paths
14
- from nxtomo.nxobject.nxdetector import ImageKey
15
- from nxtomo.nxobject.nxdetector import FOV
16
- from nxtomo.nxobject.nxtransformations import NXtransformations
17
- from nxtomo.utils.transformation import (
18
- build_matrix,
19
- UDDetTransformation,
20
- LRDetTransformation,
21
- )
22
8
 
9
+ from nxtomo.nxobject.nxdetector import ImageKey, FOV
10
+ from nxtomo.utils.transformation import build_matrix
11
+
12
+ from tomwer.core.process.edit.nxtomoeditor import NXtomoEditorTask, NXtomoEditorKeys
23
13
  from tomwer.core.scan.nxtomoscan import NXtomoScan
24
14
  from tomwer.gui.utils.buttons import PadlockButton
25
15
  from tomwer.gui.utils.scandescription import ScanNameLabelAndShape
@@ -30,6 +20,10 @@ _logger = logging.getLogger(__name__)
30
20
 
31
21
 
32
22
  class NXtomoEditorDialog(qt.QDialog):
23
+ """
24
+ Dialog embedding instances of NXtomoEditor and NXtomoProxyWarmer
25
+ """
26
+
33
27
  def __init__(self, parent=None, hide_lockers=True) -> None:
34
28
  super().__init__(parent)
35
29
  self.setLayout(qt.QVBoxLayout())
@@ -46,33 +40,40 @@ class NXtomoEditorDialog(qt.QDialog):
46
40
  self.layout().addWidget(self._buttons)
47
41
 
48
42
  # expose API
49
- def setScan(self, scan):
43
+ def setScan(self, scan: NXtomoScan) -> None:
50
44
  self.mainWidget.setScan(scan)
51
45
  self._warmer.setScan(scan)
52
46
 
53
- def overwriteNXtomo(self):
54
- self.mainWidget.overwriteNXtomo()
55
-
56
47
  def hasLockField(self) -> bool:
57
48
  return self.mainWidget.hasLockField()
58
49
 
59
50
  def getConfiguration(self) -> dict:
60
51
  return self.mainWidget.getConfiguration()
61
52
 
62
- def setConfiguration(self, config):
53
+ def setConfiguration(self, config: dict) -> None:
63
54
  self.mainWidget.setConfiguration(config)
64
55
 
56
+ def getConfigurationForTask(self) -> dict:
57
+ return self.mainWidget.getConfigurationForTask()
58
+
65
59
 
66
60
  class NXtomoEditor(qt.QWidget):
67
61
  """
68
- class to edit parameter of a NXtomo.
62
+ Widget to edit a set of field from a NXtomo.
69
63
  The preliminary goal is to let the user define pixel / voxel position and x and z positions
70
64
  in order to simplify stitching down the line
71
65
 
72
- As energy and scan range was also often requested this part is also editable (user bonus ^^)
66
+ As energy and field of view was also often requested this part is also editable.
67
+
68
+ Each field contains a widget to define it values and a LockButton. The LockButton can be used to automate the
69
+ processing.
70
+
71
+ When the scan to edit is set each field widget will be updated **at the condition** the field is not locked.
72
+ Else existing value will be kept.
73
73
  """
74
74
 
75
75
  sigEditingFinished = qt.Signal()
76
+ """emit when edition is finished"""
76
77
 
77
78
  def __init__(self, parent=None, hide_lockers=True):
78
79
  super().__init__(parent)
@@ -227,70 +228,40 @@ class NXtomoEditor(qt.QWidget):
227
228
  self._yFlippedCB.toggled.connect(self._editingFinished)
228
229
  self._yFlippedLB.toggled.connect(self._editingFinished)
229
230
 
230
- def _editingFinished(self, *args, **kwargs):
231
- self.sigEditingFinished.emit()
232
-
233
- def hasLockField(self) -> bool:
234
- """return True if the widget has at least one lock field"""
235
- return True in [locker.isLocked() for locker in self._lockerPBs]
236
-
237
- def hideLockers(self, hide: bool):
238
- for locker in self._lockerPBs:
239
- locker.setVisible(not hide)
240
-
241
- def getEditableWidgets(self):
242
- return self._editableWidgets
243
-
244
- def setScan(self, scan):
245
- if scan is None:
246
- self._scan = scan
247
- elif not isinstance(scan, NXtomoScan):
248
- raise TypeError(
249
- f"{scan} is expected to be an instance of {NXtomoScan}. Not {type(scan)}"
250
- )
251
- else:
252
- self._scan = weakref.ref(scan)
253
- self._scanInfoQLE.setScan(scan)
254
- # scan will only be read and not kept
255
- self.update_tree()
256
-
257
- def getScan(self):
258
- if self._scan is None or self._scan() is None:
259
- return None
260
- else:
261
- return self._scan()
262
-
263
- def update_tree(self):
231
+ def update_tree(self) -> None:
264
232
  if self.getScan() is not None:
265
- for fct in (
266
- self._updateInstrument,
267
- self._updateSample,
268
- ):
269
- try:
270
- fct()
271
- except Exception as e:
272
- _logger.info(e)
233
+ self._updateInstrument()
234
+ self._updateSample()
273
235
  self._tree.resizeColumnToContents(0)
274
236
 
275
- def _updateInstrument(self):
237
+ def _updateInstrument(self) -> None:
276
238
  scan = self.getScan()
277
239
  if scan is None:
278
240
  return
279
241
  else:
280
- self._updateEnergy(scan=scan)
281
- self._updatePixelSize(scan=scan)
282
- self._updateFlipped(scan=scan)
283
- self._updateFieldOfView(scan=scan)
284
- self._updateDistance(scan=scan)
242
+ for name, fct in {
243
+ "energy": self._updateEnergy,
244
+ "pixel size": self._updatePixelSize,
245
+ "frame flips": self._updateFlipped,
246
+ "field of view": self._updateFieldOfView,
247
+ "sample-detector distance": self._updateDistance,
248
+ }.items():
249
+ try:
250
+ fct(scan=scan)
251
+ except Exception as e:
252
+ _logger.error(f"Failed to update {name}. Error is {e}")
285
253
 
286
- def _updateSample(self):
254
+ def _updateSample(self) -> None:
287
255
  scan = self.getScan()
288
256
  if scan is None:
289
257
  return
290
258
  else:
291
- self._updateTranslations(scan=scan)
259
+ try:
260
+ self._updateTranslations(scan=scan)
261
+ except Exception as e:
262
+ _logger.error(f"Fail to update translations. Error is {e}")
292
263
 
293
- def _updateTranslations(self, scan: NXtomoScan):
264
+ def _updateTranslations(self, scan: NXtomoScan) -> None:
294
265
  assert isinstance(scan, NXtomoScan)
295
266
 
296
267
  # note: for now and in order to allow edition we expect to have at most a unique value. Will fail for helicoidal
@@ -313,32 +284,14 @@ class NXtomoEditor(qt.QWidget):
313
284
  self._xTranslationQLE.setValue(x_translation)
314
285
  self._zTranslationQLE.setValue(z_translation)
315
286
 
316
- def _updateFieldOfView(self, scan):
287
+ def _updateFieldOfView(self, scan: NXtomoScan) -> None:
317
288
  if not self._fieldOfViewLB.isLocked():
318
289
  # if in ''auto mode: we want to overwrite the NXtomo existing value by the one of the GUI
319
290
  idx = self._fieldOfViewCB.findText(FOV.from_value(scan.field_of_view).value)
320
291
  if idx > 0:
321
292
  self._fieldOfViewCB.setCurrentIndex(idx)
322
293
 
323
- @staticmethod
324
- @cache(maxsize=None)
325
- def _get_UD_flip_matrix():
326
- return UDDetTransformation().as_matrix()
327
-
328
- @staticmethod
329
- @cache(maxsize=None)
330
- def _get_LR_flip_matrix():
331
- return LRDetTransformation().as_matrix()
332
-
333
- @staticmethod
334
- @cache(maxsize=None)
335
- def _get_UD_AND_LR_flip_matrix():
336
- return numpy.matmul(
337
- NXtomoEditor._get_UD_flip_matrix(),
338
- NXtomoEditor._get_LR_flip_matrix(),
339
- )
340
-
341
- def _updateFlipped(self, scan):
294
+ def _updateFlipped(self, scan: NXtomoScan) -> None:
342
295
  transformations = list(scan.get_detector_transformations(tuple()))
343
296
  transformation_matrix_det_space = build_matrix(transformations)
344
297
  if transformation_matrix_det_space is None or numpy.allclose(
@@ -347,17 +300,17 @@ class NXtomoEditor(qt.QWidget):
347
300
  flip_ud = False
348
301
  flip_lr = False
349
302
  elif numpy.array_equal(
350
- transformation_matrix_det_space, NXtomoEditor._get_UD_flip_matrix()
303
+ transformation_matrix_det_space, NXtomoEditorTask.Y_FLIP_MATRIX
351
304
  ):
352
305
  flip_ud = True
353
306
  flip_lr = False
354
307
  elif numpy.allclose(
355
- transformation_matrix_det_space, NXtomoEditor._get_LR_flip_matrix()
308
+ transformation_matrix_det_space, NXtomoEditorTask.Z_FLIP_MATRIX
356
309
  ):
357
310
  flip_ud = False
358
311
  flip_lr = True
359
312
  elif numpy.allclose(
360
- transformation_matrix_det_space, NXtomoEditor._get_UD_AND_LR_flip_matrix()
313
+ transformation_matrix_det_space, NXtomoEditorTask.Y_AND_Z_flip_MATRIX
361
314
  ):
362
315
  flip_ud = True
363
316
  flip_lr = True
@@ -372,19 +325,19 @@ class NXtomoEditor(qt.QWidget):
372
325
  if (not self._yFlippedLB.isLocked()) and flip_ud is not None:
373
326
  self._yFlippedCB.setChecked(flip_ud)
374
327
 
375
- def _updateDistance(self, scan):
328
+ def _updateDistance(self, scan: NXtomoScan) -> None:
376
329
  if not self._distanceLB.isLocked():
377
330
  # if in ''auto mode: we want to overwrite the NXtomo existing value by the one of the GUI
378
331
  self._distanceMetricEntry.setValue(scan.distance)
379
332
 
380
- def _updateEnergy(self, scan):
333
+ def _updateEnergy(self, scan: NXtomoScan) -> None:
381
334
  assert isinstance(scan, NXtomoScan)
382
335
  if not self._energyLockerLB.isLocked():
383
336
  # if in ''auto mode: we want to overwrite the NXtomo existing value by the one of the GUI
384
337
  energy = scan.energy
385
338
  self._energyEntry.setValue(energy)
386
339
 
387
- def _updatePixelSize(self, scan):
340
+ def _updatePixelSize(self, scan: NXtomoScan) -> None:
388
341
  assert isinstance(scan, NXtomoScan)
389
342
  if not self._xPixelSizeLB.isLocked():
390
343
  x_pixel_size = scan.x_pixel_size
@@ -393,6 +346,39 @@ class NXtomoEditor(qt.QWidget):
393
346
  y_pixel_size = scan.y_pixel_size
394
347
  self._yPixelSizeMetricEntry.setValue(y_pixel_size)
395
348
 
349
+ def _editingFinished(self, *args, **kwargs):
350
+ self.sigEditingFinished.emit()
351
+
352
+ def hasLockField(self) -> bool:
353
+ """return True if the widget has at least one lock field"""
354
+ return True in [locker.isLocked() for locker in self._lockerPBs]
355
+
356
+ def hideLockers(self, hide: bool) -> None:
357
+ for locker in self._lockerPBs:
358
+ locker.setVisible(not hide)
359
+
360
+ def getEditableWidgets(self) -> tuple[qt.QWidget]:
361
+ return tuple(self._editableWidgets)
362
+
363
+ def setScan(self, scan: NXtomoScan | None) -> None:
364
+ if scan is None:
365
+ self._scan = scan
366
+ elif not isinstance(scan, NXtomoScan):
367
+ raise TypeError(
368
+ f"{scan} is expected to be an instance of {NXtomoScan}. Not {type(scan)}"
369
+ )
370
+ else:
371
+ self._scan = weakref.ref(scan)
372
+ self._scanInfoQLE.setScan(scan)
373
+ # scan will only be read and not kept
374
+ self.update_tree()
375
+
376
+ def getScan(self) -> NXtomoScan | None:
377
+ if self._scan is None or self._scan() is None:
378
+ return None
379
+ else:
380
+ return self._scan()
381
+
396
382
  def getConfiguration(self) -> dict:
397
383
  """
398
384
  Return a dict with field full name as key
@@ -401,37 +387,39 @@ class NXtomoEditor(qt.QWidget):
401
387
  limitation: for now sample position are not handled because this is a 'corner case' for now
402
388
  """
403
389
  return {
404
- "instrument.beam.energy": (
390
+ NXtomoEditorKeys.ENERGY: (
405
391
  self._energyEntry.getValue(),
406
392
  self._energyLockerLB.isLocked(),
407
393
  ),
408
- "instrument.detector.x_pixel_size": (
394
+ NXtomoEditorKeys.X_PIXEL_SIZE: (
409
395
  self._xPixelSizeMetricEntry.getValue(),
410
396
  self._xPixelSizeLB.isLocked(),
411
397
  ),
412
- "instrument.detector.y_pixel_size": (
398
+ NXtomoEditorKeys.Y_PIXEL_SIZE: (
413
399
  self._yPixelSizeMetricEntry.getValue(),
414
400
  self._yPixelSizeLB.isLocked(),
415
401
  ),
416
- "instrument.detector.distance": (
402
+ NXtomoEditorKeys.SAMPLE_DETECTOR_DISTANCE: (
417
403
  self._distanceMetricEntry.getValue(),
418
404
  self._distanceLB.isLocked(),
419
405
  ),
420
- "instrument.detector.field_of_view": (
406
+ NXtomoEditorKeys.FIELD_OF_VIEW: (
421
407
  self._fieldOfViewCB.currentText(),
422
408
  self._fieldOfViewLB.isChecked(),
423
409
  ),
424
- "instrument.detector.x_flipped": (
410
+ NXtomoEditorKeys.X_FLIPPED: (
425
411
  self._xFlippedCB.isChecked(),
426
412
  self._xFlippedLB.isChecked(),
427
413
  ),
428
- "instrument.detector.y_flipped": (
414
+ NXtomoEditorKeys.Y_FLIPPED: (
429
415
  self._yFlippedCB.isChecked(),
430
416
  self._yFlippedLB.isChecked(),
431
417
  ),
418
+ NXtomoEditorKeys.X_TRANSLATION: (self._xTranslationQLE.getValue(),),
419
+ NXtomoEditorKeys.Z_TRANSLATION: (self._zTranslationQLE.getValue(),),
432
420
  }
433
421
 
434
- def setConfiguration(self, config: dict):
422
+ def setConfiguration(self, config: dict) -> None:
435
423
  energy = config.get("instrument.beam.energy", None)
436
424
  if energy is not None:
437
425
  energy, energy_locked = energy
@@ -476,201 +464,27 @@ class NXtomoEditor(qt.QWidget):
476
464
  self._yFlippedCB.setChecked(y_flipped)
477
465
  self._yFlippedLB.setLock(y_flipped_locked)
478
466
 
479
- def clear(self):
480
- self._tree.clear()
481
-
482
- def overwriteNXtomo(self):
483
- """overwrite data on disk"""
484
- scan = self.getScan()
485
- if scan is None:
486
- _logger.warning("no scan found to be saved")
487
- return
488
- nexus_paths = get_nexus_paths(scan.nexus_version)
489
- assert isinstance(scan, NXtomoScan)
490
- with HDF5File(scan.master_file, mode="a") as h5f:
491
- entry = h5f[scan.entry]
492
- # overwrite energy
493
- energy = self._energyEntry.getValue()
494
- self.__write_to_file(
495
- entry=entry,
496
- path=nexus_paths.ENERGY_PATH,
497
- value=energy,
498
- name="energy",
499
- expected_type=float,
500
- units="kev",
501
- )
502
- # overwrite x pixel size
503
- self.__write_to_file(
504
- entry=entry,
505
- path=nexus_paths.X_PIXEL_SIZE_PATH,
506
- value=self._xPixelSizeMetricEntry.getValue(),
507
- name="x pixel size",
508
- expected_type=float,
509
- units="m",
510
- )
511
- # overwrite y pixel size
512
- self.__write_to_file(
513
- entry=entry,
514
- path=nexus_paths.Y_PIXEL_SIZE_PATH,
515
- value=self._yPixelSizeMetricEntry.getValue(),
516
- name="y pixel size",
517
- expected_type=float,
518
- units="m",
519
- )
520
- n_frames = len(scan.image_key_control)
521
-
522
- # overwrite x translation
523
- self.__write_to_file(
524
- entry=entry,
525
- path=nexus_paths.X_TRANS_PATH,
526
- value=self._xTranslationQLE.getValue(),
527
- name="x translation",
528
- expected_type=float,
529
- n_value=n_frames,
530
- units="m",
531
- )
532
- # overwrite z translation
533
- self.__write_to_file(
534
- entry=entry,
535
- path=nexus_paths.Z_TRANS_PATH,
536
- value=self._zTranslationQLE.getValue(),
537
- name="z translation",
538
- expected_type=float,
539
- n_value=n_frames,
540
- units="m",
541
- )
542
- # overwrite sample detector distance
543
- self.__write_to_file(
544
- entry=entry,
545
- path=nexus_paths.DISTANCE_PATH,
546
- value=self._distanceMetricEntry.getValue(),
547
- name="z translation",
548
- expected_type=float,
549
- units="m",
550
- )
551
- # overwrite FOV
552
- self.__write_to_file(
553
- entry=entry,
554
- path=nexus_paths.FOV_PATH,
555
- value=self._fieldOfViewCB.currentText(),
556
- name="field of view",
557
- expected_type=str,
558
- )
559
-
560
- # solve NXtranformations
561
- nx_transformations = NXtransformations()
562
- if self._xFlippedCB.isChecked():
563
- nx_transformations.add_transformation(LRDetTransformation())
564
- if self._yFlippedCB.isChecked():
565
- nx_transformations.add_transformation(UDDetTransformation())
566
-
567
- nx_dict = nx_transformations.to_nx_dict(
568
- nexus_path_version=scan.nexus_version,
569
- data_path="/".join(
570
- (
571
- nexus_paths.INSTRUMENT_PATH,
572
- nexus_paths.nx_instrument_paths.DETECTOR_PATH,
573
- )
574
- ),
575
- solve_empty_dependency=True,
576
- )
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",
605
- )
606
-
607
- # clear caches to make sure all modifications will be considered
608
- scan.clear_caches()
609
- scan.clear_frames_caches()
610
-
611
- @staticmethod
612
- def _newValueIsExistingValue(dataset: h5py.Dataset, new_value, units):
467
+ def getConfigurationForTask(self) -> dict:
613
468
  """
614
- return true if the given value is same as the one stored
469
+ default configuration is stored as field: (field_value, filed_is_locked) when the task expects field_key: field_value
470
+ Because we need to be able to reload settings of the LockButton.
471
+ But the task doesn't care about it. She only want to know which field must be edited. So we need to filter the dict value.
615
472
  """
616
- current_value = h5py_read_dataset(dataset)
617
- attrs = dataset.attrs
618
- current_unit = attrs.get("units", attrs.get("unit", None))
619
- if units != current_unit:
620
- # if the unit is not the same, eithen if the value is the same we will overwrite it
621
- return False
622
- else:
623
- if isinstance(new_value, numpy.ndarray) and isinstance(
624
- current_value, numpy.ndarray
625
- ):
626
- return numpy.array_equal(new_value, current_value)
627
- elif numpy.isscalar(current_value) and numpy.isscalar(new_value):
628
- return current_value == new_value
629
- else:
630
- return False
631
-
632
- @staticmethod
633
- def __write_to_file(
634
- entry: h5py.Group, path: str, value, name, expected_type, n_value=1, units=None
635
- ):
636
- if path is None:
637
- # if the path does not exists (no handled by this version of nexus for example)
638
- return
473
+ return {key: value[0] for key, value in self.getConfiguration().items()}
639
474
 
640
- # try to cast the value
641
- if isinstance(value, str):
642
- value = value.replace(" ", "")
643
- if value.lower() == "none" or "..." in value:
644
- # if value is not defined or is an array not overwrite by the user (case of the ... )
645
- return
646
- elif value is None:
647
- pass
648
- else:
649
- try:
650
- value = expected_type(value)
651
- except (ValueError, TypeError) as e:
652
- _logger.error(f"Fail to overwrite {name} of {entry.name}. Error is {e}")
653
- return
654
-
655
- if path in entry:
656
- if NXtomoEditor._newValueIsExistingValue(
657
- dataset=entry[path], new_value=value, units=units
658
- ):
659
- # if no need to overwrite
660
- return
661
- else:
662
- del entry[path]
663
- if value is None:
664
- return
665
- elif n_value == 1:
666
- entry[path] = value
667
- else:
668
- entry[path] = numpy.array([value] * n_value)
669
- if units is not None:
670
- entry[path].attrs["units"] = units
475
+ def clear(self) -> None:
476
+ self._tree.clear()
671
477
 
672
478
 
673
479
  class _TranslationMetricEntry(MetricEntry):
480
+ """
481
+ Widget to define a translation along one axis.
482
+
483
+ The behavior is limited at the moment.
484
+ * either the array contains a unique value on the array and a float is displayed
485
+ * either the array contains several unique values and then '...' will be displayed. Users cannot provide an array in this case.
486
+ """
487
+
674
488
  LOADED_ARRAY = "loaded array"
675
489
 
676
490
  class TranslationValidator(qt.QDoubleValidator):
@@ -688,11 +502,10 @@ class _TranslationMetricEntry(MetricEntry):
688
502
  super().__init__(name, default_unit=default_unit, parent=parent)
689
503
  self._qlePixelSize.setValidator(self.TranslationValidator(self))
690
504
 
691
- def getValue(self):
505
+ def getValue(self) -> float:
692
506
  """
693
507
 
694
508
  :return: the value in meter
695
- :rtype: float
696
509
  """
697
510
  if "..." in self._qlePixelSize.text():
698
511
  # in this case this is the representation of an array, we don;t wan't to overwrite it
@@ -715,7 +528,7 @@ class EnergyEntry(qt.QLineEdit):
715
528
  a0 = str(a0)
716
529
  super().setText(a0)
717
530
 
718
- def getValue(self) -> Optional[float]:
531
+ def getValue(self) -> float | None:
719
532
  txt = self.text().replace(" ", "")
720
533
  if txt in ("unknown", ""):
721
534
  return None
@@ -1,4 +1,5 @@
1
- from typing import Optional
1
+ from __future__ import annotations
2
+
2
3
  import h5py
3
4
  from silx.gui import qt
4
5
  from silx.io.utils import open as open_hdf5
@@ -41,7 +42,7 @@ class NXtomoProxyWarmer(qt.QWidget):
41
42
  # set up
42
43
  self.setScan(None)
43
44
 
44
- def setScan(self, scan: Optional[NXtomoScan]):
45
+ def setScan(self, scan: NXtomoScan | None):
45
46
  if scan is None:
46
47
  self._activateWarning(False)
47
48
  elif isinstance(scan, NXtomoScan):
File without changes
@@ -1,31 +1,5 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2017 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "28/10/2020"
2
+ from __future__ import annotations
29
3
 
30
4
 
31
5
  import shutil
@@ -167,8 +141,8 @@ class TestDarkRefPatchWidget(TestCaseQt):
167
141
  file_path=self._scanWithDarkAndRef.master_file,
168
142
  data_path=self._scanWithDarkAndRef.entry,
169
143
  )
170
- self._widget.setStartDarkUrl(url, serie_index=0)
171
- self._widget.setStartFlatUrl(url, serie_index=1)
144
+ self._widget.setStartDarkUrl(url, series_index=0)
145
+ self._widget.setStartFlatUrl(url, series_index=1)
172
146
  self.assertTrue(self._widget.getStartDarkUrl() is not None)
173
147
  self.assertTrue(self._widget.getStartDarkUrl().is_valid())
174
148
  self.assertTrue(self._widget.getStartFlatUrl() is not None)
@@ -1,31 +1,5 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2017 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "28/10/2020"
2
+ from __future__ import annotations
29
3
 
30
4
 
31
5
  import tempfile