tomwer 1.3.26__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.26.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.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
  553. {tomwer-1.3.26.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 -1392
  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.26-py3.11-nspkg.pth +0 -1
  607. tomwer-1.3.26.dist-info/METADATA +0 -292
  608. tomwer-1.3.26.dist-info/RECORD +0 -785
  609. tomwer-1.3.26.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.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,307 @@
1
+ from __future__ import annotations
2
+
3
+ import gc
4
+ import logging
5
+ import h5py
6
+ import numpy
7
+
8
+ from collections import namedtuple
9
+ from typing import Any
10
+
11
+ from silx.io.utils import h5py_read_dataset
12
+
13
+ from tomoscan.io import HDF5File
14
+
15
+ from nxtomo.paths.nxtomo import get_paths as get_nexus_paths
16
+ from nxtomo.nxobject.nxtransformations import NXtransformations
17
+ from nxtomo.utils.transformation import (
18
+ DetYFlipTransformation,
19
+ DetZFlipTransformation,
20
+ )
21
+
22
+ from tomwer.core.process.task import Task
23
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
24
+
25
+ _EditorFieldInfo = namedtuple(
26
+ "_EditorFieldInfo", ["nexus_path", "name", "expected_type", "units", "n_value"]
27
+ )
28
+
29
+ _logger = logging.getLogger(__name__)
30
+
31
+
32
+ class NXtomoEditorKeys:
33
+ """namespace to store all keys used by the nxtomo editor"""
34
+
35
+ ENERGY = "instrument.beam.energy"
36
+ X_PIXEL_SIZE = "instrument.detector.x_pixel_size"
37
+ Y_PIXEL_SIZE = "instrument.detector.y_pixel_size"
38
+ SAMPLE_DETECTOR_DISTANCE = "instrument.detector.distance"
39
+ FIELD_OF_VIEW = "instrument.detector.field_of_view"
40
+ X_FLIPPED = "instrument.detector.x_flipped"
41
+ Y_FLIPPED = "instrument.detector.y_flipped"
42
+ X_TRANSLATION = "sample.x_translation"
43
+ Y_TRANSLATION = "sample.y_translation"
44
+ Z_TRANSLATION = "sample.z_translation"
45
+
46
+
47
+ class NXtomoEditorTask(
48
+ Task,
49
+ input_names=("data", "configuration"),
50
+ output_names=("data",),
51
+ ):
52
+ """
53
+ task to edit a couple of field of a NXtomo
54
+ """
55
+
56
+ Y_FLIP_MATRIX = DetYFlipTransformation(flip=True).as_matrix()
57
+ # up-down flip matrix
58
+ Z_FLIP_MATRIX = DetZFlipTransformation(flip=True).as_matrix()
59
+ # left-right flip matrix
60
+ Y_AND_Z_flip_MATRIX = numpy.matmul(
61
+ Y_FLIP_MATRIX,
62
+ Z_FLIP_MATRIX,
63
+ )
64
+
65
+ def run(self):
66
+ scan = self.inputs.data
67
+ if scan is None:
68
+ _logger.warning("no scan found to be saved")
69
+ return
70
+ if not isinstance(scan, NXtomoScan):
71
+ raise TypeError(
72
+ f"data is expected to be an instance of {NXtomoScan}. Got {type(scan)}"
73
+ )
74
+
75
+ configuration = self.inputs.configuration
76
+ if not isinstance(configuration, dict):
77
+ raise TypeError(
78
+ f"configuration is expected to be an instance of {dict}. Got {type(configuration)}"
79
+ )
80
+
81
+ n_frames = len(scan.image_key_control)
82
+ mapping = self.build_mapping(
83
+ nexus_version=scan.nexus_version, n_frames=n_frames
84
+ )
85
+
86
+ x_flip = configuration.pop(NXtomoEditorKeys.X_FLIPPED, None)
87
+ y_flip = configuration.pop(NXtomoEditorKeys.Y_FLIPPED, None)
88
+
89
+ with HDF5File(scan.master_file, mode="a") as h5f:
90
+ entry = h5f[scan.entry]
91
+
92
+ for field, field_value in configuration.items():
93
+ if field not in mapping:
94
+ raise ValueError(f"field unknown ({field})")
95
+ self.__write_to_file(
96
+ entry=entry,
97
+ path=mapping[field].nexus_path,
98
+ value=field_value,
99
+ name=mapping[field].name,
100
+ expected_type=mapping[field].expected_type,
101
+ units=mapping[field].units,
102
+ n_value=mapping[field].n_value,
103
+ )
104
+
105
+ # solve NXtransformations
106
+ if x_flip is not None or y_flip is not None:
107
+ nx_transformations, detector_transformation_path = (
108
+ self.get_detector_transformations(
109
+ scan_entry=scan.entry,
110
+ x_flip=x_flip if x_flip is not None else scan.x_flipped,
111
+ y_flip=y_flip if y_flip is not None else scan.y_flipped,
112
+ nexus_version=scan.nexus_version,
113
+ )
114
+ )
115
+ else:
116
+ nx_transformations = detector_transformation_path = None
117
+
118
+ # make sure the file has been removed (fix https://gitlab.esrf.fr/tomotools/tomwer/-/merge_requests/874#note_366688).
119
+ gc.collect()
120
+ if nx_transformations is not None:
121
+ nx_transformations.save(
122
+ file_path=scan.master_file,
123
+ data_path=detector_transformation_path,
124
+ nexus_path_version=scan.nexus_version,
125
+ overwrite=True,
126
+ )
127
+ # clear caches to make sure all modifications will be considered
128
+ scan.clear_caches()
129
+ scan.clear_frames_caches()
130
+ self.outputs.data = scan
131
+
132
+ @staticmethod
133
+ def get_detector_transformations(
134
+ scan_entry: str, x_flip: bool, y_flip: bool, nexus_version: float | None
135
+ ) -> dict:
136
+ nexus_paths = get_nexus_paths(nexus_version)
137
+ if nexus_paths.nx_detector_paths.NX_TRANSFORMATIONS is None:
138
+ # old NXtomo are not handling NX_TRANSFORMATIONS
139
+ _logger.debug(
140
+ "Old version of NXtomo found. No information about transformation will be saved"
141
+ )
142
+ return
143
+
144
+ nx_transformations = NXtransformations()
145
+ nx_transformations.add_transformation(DetYFlipTransformation(flip=y_flip))
146
+ nx_transformations.add_transformation(DetZFlipTransformation(flip=x_flip))
147
+
148
+ detector_transformation_path = "/".join(
149
+ (
150
+ scan_entry,
151
+ nexus_paths.INSTRUMENT_PATH,
152
+ nexus_paths.nx_instrument_paths.DETECTOR_PATH,
153
+ nexus_paths.nx_detector_paths.NX_TRANSFORMATIONS,
154
+ ),
155
+ )
156
+ return nx_transformations, detector_transformation_path
157
+
158
+ @staticmethod
159
+ def __write_to_file(
160
+ entry: h5py.Group,
161
+ path: str,
162
+ value: Any,
163
+ name: str,
164
+ expected_type: type,
165
+ n_value: int = 1,
166
+ units=None,
167
+ ) -> None:
168
+ if path is None:
169
+ # if the path does not exists (no handled by this version of nexus for example)
170
+ return
171
+
172
+ # try to cast the value
173
+ if isinstance(value, str):
174
+ value = value.replace(" ", "")
175
+ if value.lower() == "none" or "..." in value:
176
+ # if value is not defined or is an array not overwrite by the user (case of the ... )
177
+ return
178
+ elif value is None:
179
+ pass
180
+ else:
181
+ try:
182
+ value = expected_type(value)
183
+ except (ValueError, TypeError) as e:
184
+ _logger.error(f"Fail to overwrite {name} of {entry.name}. Error is {e}")
185
+ return
186
+
187
+ if path in entry:
188
+ if not NXtomoEditorTask.isFieldValueDifferent(
189
+ dataset=entry[path], new_value=value, units=units
190
+ ):
191
+ # if no need to overwrite
192
+ return
193
+ else:
194
+ del entry[path]
195
+ if value is None:
196
+ return
197
+ elif n_value == 1:
198
+ entry[path] = value
199
+ else:
200
+ entry[path] = numpy.array([value] * n_value)
201
+ if units is not None:
202
+ entry[path].attrs["units"] = units
203
+
204
+ @staticmethod
205
+ def isFieldValueDifferent(dataset: h5py.Dataset, new_value, units) -> bool:
206
+ """
207
+ return False if the given value is the same as the one stored.
208
+
209
+ This is a small improvement to avoid rewrite field if we can avoid it.
210
+ The reason behind is that the orange widget will update the field when it receive a scan (of the unlock field).
211
+ But then users can edit any field. As we don't want to bother with complex stuff like for each field keep track if
212
+ It has been modified or not the orange widget will always require to modify all possible field even is not modified.
213
+ """
214
+ current_value = h5py_read_dataset(dataset)
215
+ attrs = dataset.attrs
216
+ current_unit = attrs.get("units", attrs.get("unit", None))
217
+ if units != current_unit:
218
+ # if the unit is not the same, even if the value is the same we will overwrite it
219
+ return True
220
+ else:
221
+ if isinstance(new_value, numpy.ndarray) and isinstance(
222
+ current_value, numpy.ndarray
223
+ ):
224
+ return not numpy.array_equal(new_value, current_value)
225
+ elif numpy.isscalar(current_value) and numpy.isscalar(new_value):
226
+ return current_value != new_value
227
+ else:
228
+ return True
229
+
230
+ @staticmethod
231
+ def build_mapping(
232
+ nexus_version: float | None, n_frames: int
233
+ ) -> dict[NXtomoEditorKeys, _EditorFieldInfo]:
234
+ """
235
+ for the different field that can be edited we provide an instance of _EditorFieldInfo
236
+ with all metadata needed to save this particular field.
237
+
238
+ Note: X_flip and y_flip are saved differently as the two parameters are coupled we want either to save both or none of it.
239
+ """
240
+ nexus_paths = get_nexus_paths(nexus_version)
241
+
242
+ return {
243
+ # energy
244
+ NXtomoEditorKeys.ENERGY: _EditorFieldInfo(
245
+ nexus_path=nexus_paths.ENERGY_PATH,
246
+ expected_type=float,
247
+ units="kev",
248
+ name="energy",
249
+ n_value=1,
250
+ ),
251
+ # x pixel size
252
+ NXtomoEditorKeys.X_PIXEL_SIZE: _EditorFieldInfo(
253
+ nexus_path=nexus_paths.X_PIXEL_SIZE_PATH,
254
+ expected_type=float,
255
+ units="m",
256
+ name="x pixel size",
257
+ n_value=1,
258
+ ),
259
+ # y pixel size
260
+ NXtomoEditorKeys.Y_PIXEL_SIZE: _EditorFieldInfo(
261
+ nexus_path=nexus_paths.Y_PIXEL_SIZE_PATH,
262
+ expected_type=float,
263
+ units="m",
264
+ name="y pixel size",
265
+ n_value=1,
266
+ ),
267
+ # sample / detector distance
268
+ NXtomoEditorKeys.SAMPLE_DETECTOR_DISTANCE: _EditorFieldInfo(
269
+ nexus_path=nexus_paths.DISTANCE_PATH,
270
+ expected_type=float,
271
+ units="m",
272
+ name="sample detector distance",
273
+ n_value=1,
274
+ ),
275
+ # overwrite FOV
276
+ NXtomoEditorKeys.FIELD_OF_VIEW: _EditorFieldInfo(
277
+ nexus_path=nexus_paths.FOV_PATH,
278
+ expected_type=str,
279
+ units=None,
280
+ name="field of view",
281
+ n_value=1,
282
+ ),
283
+ # x translation
284
+ NXtomoEditorKeys.X_TRANSLATION: _EditorFieldInfo(
285
+ nexus_path=nexus_paths.X_TRANS_PATH,
286
+ expected_type=float,
287
+ units="m",
288
+ name="x translation",
289
+ n_value=n_frames,
290
+ ),
291
+ # y translation
292
+ NXtomoEditorKeys.Y_TRANSLATION: _EditorFieldInfo(
293
+ nexus_path=nexus_paths.Y_TRANS_PATH,
294
+ expected_type=float,
295
+ units="m",
296
+ name="y translation",
297
+ n_value=n_frames,
298
+ ),
299
+ # z translation
300
+ NXtomoEditorKeys.Z_TRANSLATION: _EditorFieldInfo(
301
+ nexus_path=nexus_paths.Z_TRANS_PATH,
302
+ expected_type=float,
303
+ units="m",
304
+ name="z translation",
305
+ n_value=n_frames,
306
+ ),
307
+ }
@@ -0,0 +1,243 @@
1
+ # coding: utf-8
2
+ from __future__ import annotations
3
+
4
+
5
+ import os
6
+ import shutil
7
+ import tempfile
8
+ import unittest
9
+
10
+ import h5py
11
+ import numpy
12
+ from silx.io.url import DataUrl
13
+ from silx.io.utils import h5py_read_dataset
14
+ from tomoscan.esrf.scan.mock import MockNXtomo
15
+
16
+ from tomwer.core.process.edit.darkflatpatch import DarkFlatPatchTask
17
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
18
+
19
+
20
+ class BaseTestAddDarkAndFlats(unittest.TestCase):
21
+ """
22
+ Unit test on nxtomomill.utils.add_dark_flat_nx_file function
23
+ """
24
+
25
+ def setUp(self) -> None:
26
+ self.tmpdir = tempfile.mkdtemp()
27
+ simple_nx_path = os.path.join(self.tmpdir, "simple_case")
28
+ self.dim = 55
29
+ self.nproj = 20
30
+ self._simple_nx = MockNXtomo(
31
+ scan_path=simple_nx_path,
32
+ n_proj=self.nproj,
33
+ n_ini_proj=self.nproj,
34
+ create_ini_dark=False,
35
+ create_ini_flat=False,
36
+ create_final_flat=False,
37
+ dim=self.dim,
38
+ ).scan
39
+ with h5py.File(self._simple_nx.master_file, mode="r") as h5s:
40
+ data_path = "/".join(
41
+ (self._simple_nx.entry, "instrument", "detector", "data")
42
+ )
43
+ self._raw_data = h5py_read_dataset(h5s[data_path])
44
+ nx_with_vds_path = os.path.join(self.tmpdir, "case_with_vds")
45
+ self._nx_with_virtual_dataset = MockNXtomo(
46
+ scan_path=nx_with_vds_path,
47
+ n_proj=0,
48
+ n_ini_proj=0,
49
+ create_ini_dark=False,
50
+ create_ini_flat=False,
51
+ create_final_flat=False,
52
+ dim=self.dim,
53
+ ).scan
54
+ self._create_vds(
55
+ source_file=self._simple_nx.master_file,
56
+ source_data_path=self._simple_nx.entry,
57
+ target_file=self._nx_with_virtual_dataset.master_file,
58
+ target_data_path=self._nx_with_virtual_dataset.entry,
59
+ copy_other_data=True,
60
+ )
61
+ self._patch_nxtomo_flags(self._nx_with_virtual_dataset)
62
+
63
+ nx_with_vds_path_and_links = os.path.join(
64
+ self.tmpdir, "case_with_vds_and_links"
65
+ )
66
+ self._nx_with_virtual_dataset_with_link = MockNXtomo(
67
+ scan_path=nx_with_vds_path_and_links,
68
+ n_proj=0,
69
+ n_ini_proj=0,
70
+ create_ini_dark=False,
71
+ create_ini_flat=False,
72
+ create_final_flat=False,
73
+ dim=self.dim,
74
+ ).scan
75
+ self._create_vds(
76
+ source_file=self._simple_nx.master_file,
77
+ source_data_path=self._simple_nx.entry,
78
+ target_file=self._nx_with_virtual_dataset_with_link.master_file,
79
+ target_data_path=self._nx_with_virtual_dataset_with_link.entry,
80
+ copy_other_data=True,
81
+ )
82
+ self._patch_nxtomo_flags(self._nx_with_virtual_dataset_with_link)
83
+
84
+ # create dark
85
+ self.start_dark = (
86
+ numpy.random.random((self.dim * self.dim))
87
+ .reshape(1, self.dim, self.dim)
88
+ .astype("f")
89
+ )
90
+ self.start_dark_file = os.path.join(self.tmpdir, "dark.hdf5")
91
+ self.start_dark_entry = "data"
92
+ self.start_dark_url = self._save_raw(
93
+ data=self.start_dark,
94
+ entry=self.start_dark_entry,
95
+ file_path=self.start_dark_file,
96
+ )
97
+
98
+ self.end_dark = (
99
+ numpy.random.random((self.dim * self.dim * 2))
100
+ .reshape(2, self.dim, self.dim)
101
+ .astype("f")
102
+ )
103
+ self.end_dark_file = os.path.join(self.tmpdir, "dark.hdf5")
104
+ self.end_dark_entry = "data2"
105
+ self.end_dark_url = self._save_raw(
106
+ data=self.end_dark, entry=self.end_dark_entry, file_path=self.end_dark_file
107
+ )
108
+
109
+ # create flats
110
+ self.start_flat = (
111
+ numpy.random.random((self.dim * self.dim * 3))
112
+ .reshape(3, self.dim, self.dim)
113
+ .astype("f")
114
+ )
115
+ self.start_flat_file = os.path.join(self.tmpdir, "start_flat.hdf5")
116
+ self.start_flat_entry = "/root/flat"
117
+ self.start_flat_url = self._save_raw(
118
+ data=self.start_flat,
119
+ entry=self.start_flat_entry,
120
+ file_path=self.start_flat_file,
121
+ )
122
+
123
+ self.end_flat = (
124
+ numpy.random.random((self.dim * self.dim))
125
+ .reshape(1, self.dim, self.dim)
126
+ .astype("f")
127
+ )
128
+ # save the end flat in the simple case file to insure all cases are
129
+ # consider
130
+ self.end_flat_file = self._simple_nx.master_file
131
+ self.end_flat_entry = "flat"
132
+ self.end_flat_url = self._save_raw(
133
+ data=self.end_flat, entry=self.end_flat_entry, file_path=self.end_flat_file
134
+ )
135
+
136
+ def _save_raw(self, data, entry, file_path) -> DataUrl:
137
+ with h5py.File(file_path, mode="a") as h5s:
138
+ h5s[entry] = data
139
+ return DataUrl(file_path=file_path, data_path=entry, scheme="silx")
140
+
141
+ def _create_vds(
142
+ self,
143
+ source_file: str,
144
+ source_data_path: str,
145
+ target_file: str,
146
+ target_data_path: str,
147
+ copy_other_data: bool,
148
+ ):
149
+ """Create virtual dataset and links from source to target
150
+
151
+ :param source_file:
152
+ :param source_data_path:
153
+ :param target_file:
154
+ :param target_data_path:
155
+ :param copy_other_data: we want to create two cases: one copying
156
+ datasets 'image_key'... and the other
157
+ one linking them. Might have a difference
158
+ of behavior when overwriting for example
159
+ """
160
+ assert source_file != target_file, "file should be different"
161
+ # link data
162
+ n_frames = 0
163
+ # for now we only consider the original data
164
+ with h5py.File(source_file, mode="r") as o_h5s:
165
+ old_path = os.path.join(source_data_path, "instrument", "detector", "data")
166
+ n_frames += o_h5s[old_path].shape[0]
167
+ shape = o_h5s[old_path].shape
168
+ data_type = o_h5s[old_path].dtype
169
+
170
+ layout = h5py.VirtualLayout(shape=shape, dtype=data_type)
171
+ assert os.path.exists(source_file)
172
+ with h5py.File(source_file, mode="r") as ppp:
173
+ assert source_data_path in ppp
174
+ layout[:] = h5py.VirtualSource(path_or_dataset=o_h5s[old_path])
175
+
176
+ det_path = os.path.join(target_data_path, "instrument", "detector")
177
+ with h5py.File(target_file, mode="a") as h5s:
178
+ detector_node = h5s.require_group(det_path)
179
+ detector_node.create_virtual_dataset("data", layout, fillvalue=-5)
180
+
181
+ for path in (
182
+ os.path.join("instrument", "detector", "image_key"),
183
+ os.path.join("instrument", "detector", "image_key_control"),
184
+ os.path.join("instrument", "detector", "count_time"),
185
+ os.path.join("sample", "rotation_angle"),
186
+ ):
187
+ old_path = os.path.join(source_data_path, path)
188
+ new_path = os.path.join(target_data_path, path)
189
+ with h5py.File(target_file, mode="a") as h5s:
190
+ if copy_other_data:
191
+ with h5py.File(source_file, mode="r") as o_h5s:
192
+ if new_path in h5s:
193
+ del h5s[new_path]
194
+ h5s[new_path] = h5py_read_dataset(o_h5s[old_path])
195
+ elif source_file == target_file:
196
+ h5s[new_path] = h5py.SoftLink(old_path)
197
+ else:
198
+ relpath = os.path.relpath(source_file, os.path.dirname(target_file))
199
+ h5s[new_path] = h5py.ExternalLink(relpath, old_path)
200
+
201
+ def _patch_nxtomo_flags(self, scan):
202
+ """Insure necessary flags are here"""
203
+ with h5py.File(scan.master_file, mode="a") as h5s:
204
+ instrument_path = os.path.join(scan.entry, "instrument")
205
+ instrument_node = h5s.require_group(instrument_path)
206
+ if "NX_class" not in instrument_node.attrs:
207
+ instrument_node.attrs["NX_class"] = "NXinstrument"
208
+ detector_node = instrument_node.require_group("detector")
209
+ if "NX_class" not in detector_node.attrs:
210
+ detector_node.attrs["NX_class"] = "NXdetector"
211
+ if "data" in instrument_node:
212
+ if "interpretation" not in instrument_node.attrs:
213
+ instrument_node["data"].attrs["interpretation"] = "image"
214
+
215
+ sample_path = os.path.join(scan.entry, "sample")
216
+ sample_node = h5s.require_group(sample_path)
217
+ if "NX_class" not in sample_node:
218
+ sample_node.attrs["NX_class"] = "NXsample"
219
+
220
+ def tearDown(self) -> None:
221
+ shutil.rmtree(self.tmpdir)
222
+
223
+
224
+ class TestDaarkFlatPatch(BaseTestAddDarkAndFlats):
225
+ def test(self):
226
+ scan = NXtomoScan(
227
+ self._nx_with_virtual_dataset_with_link.master_file,
228
+ self._nx_with_virtual_dataset_with_link.entry,
229
+ )
230
+ process = DarkFlatPatchTask(
231
+ inputs={
232
+ "data": scan,
233
+ "serialize_output_data": False,
234
+ "configuration": {
235
+ "darks_start": self.start_dark_url,
236
+ },
237
+ },
238
+ )
239
+ process.definition()
240
+ process.program_version()
241
+ process.program_name()
242
+ # TODO: properties should be part of inputs
243
+ process.run()
@@ -0,0 +1,99 @@
1
+ # coding: utf-8
2
+ from __future__ import annotations
3
+
4
+
5
+ import os
6
+ import shutil
7
+ import tempfile
8
+ import unittest
9
+
10
+ import pytest
11
+ from nxtomo.nxobject.nxdetector import ImageKey
12
+
13
+ from tomwer.core.process.edit.imagekeyeditor import (
14
+ ImageKeyEditorTask,
15
+ ImageKeyUpgraderTask,
16
+ )
17
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
18
+ from tomwer.core.utils.scanutils import MockNXtomo
19
+
20
+
21
+ class TestImageKeyEditor(unittest.TestCase):
22
+ def setUp(self):
23
+ self.tempdir = tempfile.mkdtemp()
24
+ dim = 10
25
+ mock = MockNXtomo(
26
+ scan_path=os.path.join(self.tempdir, "scan1"),
27
+ n_proj=10,
28
+ n_ini_proj=10,
29
+ scan_range=180,
30
+ dim=dim,
31
+ )
32
+ self.scan = mock.scan
33
+
34
+ def tearDown(self):
35
+ shutil.rmtree(self.tempdir)
36
+
37
+ def test(self):
38
+ process = ImageKeyEditorTask(
39
+ inputs={
40
+ "data": self.scan,
41
+ "serialize_output_data": False,
42
+ "configuration": {
43
+ "modifications": {
44
+ 0: ImageKey.INVALID.value,
45
+ 3: ImageKey.ALIGNMENT.value,
46
+ },
47
+ },
48
+ }
49
+ )
50
+ process.definition()
51
+ process.program_version()
52
+ process.program_name()
53
+ process.run()
54
+
55
+
56
+ def test_ImageKeyUpgraderTask(tmp_path):
57
+ """
58
+ test ImageKeyUpgraderTask task
59
+ """
60
+ test_dir = tmp_path / "test_image_key_upgrader"
61
+ os.makedirs(test_dir)
62
+ scan = MockNXtomo(
63
+ scan_path=test_dir,
64
+ n_proj=20,
65
+ n_ini_proj=20,
66
+ create_ini_dark=False,
67
+ ).scan
68
+
69
+ operations = {
70
+ ImageKey.PROJECTION: ImageKey.DARK_FIELD,
71
+ }
72
+
73
+ with pytest.raises(TypeError):
74
+ ImageKeyUpgraderTask(
75
+ inputs={
76
+ "data": None,
77
+ "operations": operations,
78
+ },
79
+ ).run()
80
+
81
+ with pytest.raises(TypeError):
82
+ ImageKeyUpgraderTask(
83
+ inputs={
84
+ "data": scan,
85
+ "operations": None,
86
+ },
87
+ ).run()
88
+
89
+ task = ImageKeyUpgraderTask(
90
+ inputs={
91
+ "data": scan,
92
+ "operations": operations,
93
+ },
94
+ )
95
+ task.run()
96
+
97
+ scan = NXtomoScan(scan.master_file, scan.entry)
98
+ assert len(scan.projections) == 0
99
+ assert len(scan.darks) == 20
@@ -1,12 +1,12 @@
1
1
  from __future__ import annotations
2
2
  import os
3
+ import warnings
3
4
  from silx.utils.enum import Enum as _Enum
4
5
 
5
6
 
6
7
  class ProcessDataOutputDirMode(_Enum):
7
8
  IN_SCAN_FOLDER = "same folder as scan"
8
9
  PROCESSED_DATA_FOLDER = "PROCESSED_DATA folder"
9
- RAW_DATA_FOLDER = "RAW_DATA folder"
10
10
  OTHER = "other"
11
11
 
12
12
  @classmethod
@@ -17,7 +17,14 @@ class ProcessDataOutputDirMode(_Enum):
17
17
  elif value == "processed data dir":
18
18
  return cls.PROCESSED_DATA_FOLDER
19
19
  elif value == "raw data dir":
20
- return cls.RAW_DATA_FOLDER
20
+ # Deprecation logic
21
+ warnings.warn(
22
+ "'RAW_DATA output' is deprecated since writing to 'RAW_DATA' folder is forbidden."
23
+ "Redirecting to 'PROCESSED_DATA_FOLDER'.",
24
+ DeprecationWarning,
25
+ stacklevel=2,
26
+ )
27
+ return cls.PROCESSED_DATA_FOLDER
21
28
  return super().from_value(value)
22
29
 
23
30