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
@@ -1,31 +1,5 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2016-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__ = "12/12/2018"
2
+ from __future__ import annotations
29
3
 
30
4
 
31
5
  import logging
@@ -0,0 +1,12 @@
1
+ from ewokscore.task import Task as EwoksTask
2
+
3
+
4
+ class _TomoobjseriesPlaceHolder(
5
+ EwoksTask, input_names=["series"], output_names=["series"]
6
+ ):
7
+ """
8
+ task to define a tomography 'serie'
9
+ """
10
+
11
+ def run(self):
12
+ self.outputs.s = self.inputs.series
@@ -0,0 +1,37 @@
1
+ import numpy
2
+ from silx.utils.enum import Enum as _Enum
3
+
4
+
5
+ class Binning(_Enum):
6
+ ONE_BY_ONE = "1x1"
7
+ TWO_BY_TWO = "2x2"
8
+ FOUR_BY_FOUR = "4x4"
9
+ HEIGHT_BY_HEIGHT = "8x8"
10
+ SIXTEEN_BY_SIXTEEN = "16x16"
11
+ THIRTY_TWO_BY_THIRTY_TWO = "32x32"
12
+ SIXTY_FOUR_BY_SIXTY_FOUR = "64x64"
13
+ ONE_HUNDRED_TWENTY_HEIGHT_BY_ONE_HUNDRED_TWENTY_HEIGHT = "128x128"
14
+
15
+ @staticmethod
16
+ def _bin_data(data, binning):
17
+ if not isinstance(data, numpy.ndarray):
18
+ raise TypeError("data should be a numpy array")
19
+ if not data.ndim == 2:
20
+ raise ValueError("data is expected to be 2d")
21
+ binning = Binning.from_value(binning)
22
+ if binning is Binning.ONE_BY_ONE:
23
+ return data
24
+ elif binning is Binning.TWO_BY_TWO:
25
+ return data[::2, ::2]
26
+ elif binning is Binning.FOUR_BY_FOUR:
27
+ return data[::4, ::4]
28
+ elif binning is Binning.HEIGHT_BY_HEIGHT:
29
+ return data[::8, ::8]
30
+ elif binning is Binning.SIXTEEN_BY_SIXTEEN:
31
+ return data[::16, ::16]
32
+ elif binning is Binning.THIRTY_TWO_BY_THIRTY_TWO:
33
+ return data[::32, ::32]
34
+ elif binning is Binning.SIXTY_FOUR_BY_SIXTY_FOUR:
35
+ return data[::64, ::64]
36
+ else:
37
+ raise NotImplementedError
@@ -0,0 +1,170 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import numpy
5
+ import logging
6
+ from PIL import Image
7
+ from silx.io.url import DataUrl
8
+
9
+ from .binning import Binning
10
+ from .output import OutputFormat
11
+
12
+ from tomoscan.utils.io import filter_esrf_mounting_points
13
+ from tomoscan.esrf.scan.utils import get_data, from_bliss_original_file_to_raw
14
+
15
+ from tomwer.core.process.drac.output import DATASET_GALLERY_DIR_NAME
16
+ from tomwer.core.tomwer_object import TomwerObject
17
+ from tomwer.core.scan.scanbase import TomwerScanBase
18
+
19
+
20
+ _logger = logging.getLogger(__name__)
21
+
22
+ __all__ = [
23
+ "DracDatasetBase",
24
+ ]
25
+
26
+
27
+ class DracDatasetBase:
28
+ """
29
+ Abstract class for a drac dataset (that should be publish to the data portal).
30
+ A drac dataset is defined by the following elements:
31
+ * a directory
32
+ * metadata
33
+ """
34
+
35
+ def __init__(self, data_dir: str, tomo_obj: TomwerObject) -> None:
36
+ """
37
+ :param data_dir: directory containing processed data
38
+ :param tomo_obj: tomwer object referee for the processing
39
+ """
40
+ self._data_dir = filter_esrf_mounting_points(data_dir)
41
+ self._tomo_obj = tomo_obj
42
+ self._gallery_file_binning = Binning.TWO_BY_TWO
43
+ self._gallery_output_format = OutputFormat.PNG
44
+ self._gallery_overwrite = True
45
+
46
+ @property
47
+ def gallery_output_binning(self) -> Binning:
48
+ "Binning factor to be used when saving gallery images"
49
+ return self._gallery_file_binning
50
+
51
+ @gallery_output_binning.setter
52
+ def gallery_output_binning(self, binning: Binning):
53
+ binning = Binning(binning)
54
+ self._gallery_file_binning = binning
55
+
56
+ @property
57
+ def gallery_output_format(self) -> OutputFormat:
58
+ "Output format of the images stored in the gallery"
59
+ return self._gallery_output_format
60
+
61
+ @gallery_output_format.setter
62
+ def gallery_output_format(self, format: OutputFormat):
63
+ format = OutputFormat(format)
64
+ self._gallery_output_format = format
65
+
66
+ @property
67
+ def gallery_overwrite(self) -> bool:
68
+ return self._gallery_overwrite
69
+
70
+ @gallery_overwrite.setter
71
+ def gallery_overwrite(self, overwrite: bool) -> None:
72
+ self._gallery_overwrite = overwrite
73
+
74
+ @property
75
+ def dataset_name(self) -> str:
76
+ """
77
+ Return the name of the dataset to be given to the drac dataset.
78
+ A drac dataset is store according to a (dataset_path, dataset_name). By default if several are pushed with the same key,
79
+ only the most recent one will be stored
80
+ """
81
+ raise NotImplementedError("Base class")
82
+
83
+ def get_gallery_dir(self) -> str:
84
+ return os.path.join(self.data_dir, DATASET_GALLERY_DIR_NAME)
85
+
86
+ def build_gallery(self):
87
+ """callback to build the drac-dataset gallery"""
88
+ pass
89
+
90
+ @property
91
+ def data_dir(self):
92
+ return self._data_dir
93
+
94
+ @property
95
+ def tomo_obj(self):
96
+ return self._tomo_obj
97
+
98
+ @property
99
+ def metadata(self) -> dict:
100
+ raise NotImplementedError("Base class")
101
+
102
+ @property
103
+ def bliss_raw_datasets(self) -> tuple[str]:
104
+ raise NotImplementedError("Base class")
105
+
106
+ @staticmethod
107
+ def from_scan_to_raws(scan: TomwerScanBase) -> tuple[str]:
108
+ assert isinstance(
109
+ scan, TomwerScanBase
110
+ ), f"scan should be an instance of {TomwerScanBase}. Got {type(scan)}"
111
+ bliss_original_files = scan.get_bliss_original_files()
112
+ if bliss_original_files is None:
113
+ bliss_original_files = ()
114
+ return tuple(
115
+ [
116
+ from_bliss_original_file_to_raw(bliss_original_file)
117
+ for bliss_original_file in bliss_original_files
118
+ ]
119
+ )
120
+
121
+ def to_dict(self):
122
+ return {
123
+ "output_dir": self.data_dir,
124
+ "drac_metadata": self.metadata,
125
+ }
126
+
127
+ def save_to_gallery(
128
+ self,
129
+ output_file_name: str,
130
+ image: numpy.ndarray | DataUrl,
131
+ lower_bound: float | None = None,
132
+ upper_bound: float | None = None,
133
+ ) -> None:
134
+ format = self.gallery_output_format
135
+ overwrite = self.gallery_overwrite
136
+ binning = self.gallery_output_binning
137
+
138
+ gallery_dir = self.get_gallery_dir()
139
+ os.makedirs(gallery_dir, exist_ok=True)
140
+
141
+ if isinstance(image, DataUrl):
142
+ image = get_data(image)
143
+
144
+ if image.ndim == 3 and image.shape[0] == 1:
145
+ image = image.reshape(image.shape[1:])
146
+ elif image.ndim != 2:
147
+ raise ValueError(f"Only 2D grayscale images are handled. Got {image.shape}")
148
+
149
+ # If both bounds are provided, apply clamping and normalization
150
+ # If not it will use the min/max of each image
151
+ if lower_bound is not None and upper_bound is not None:
152
+ image = numpy.clip(image, lower_bound, upper_bound)
153
+ image = image - lower_bound
154
+ image *= 255.0 / (upper_bound - lower_bound)
155
+ else:
156
+ min_val, max_val = image.min(), image.max()
157
+ image = image - min_val
158
+ if max_val > min_val: # Avoid division by zero if image is constant
159
+ image *= 255.0 / (max_val - min_val)
160
+
161
+ # Binning the data if required
162
+ image = Binning._bin_data(data=image, binning=binning)
163
+
164
+ # Convert to a PIL Image and save
165
+ img = Image.fromarray(image.astype(numpy.uint8), mode="L")
166
+ if not output_file_name.endswith(f".{format.value}"):
167
+ output_file_name = output_file_name + f".{format.value}"
168
+ if not overwrite and os.path.exists(output_file_name):
169
+ raise OSError(f"File already exists ({output_file_name})")
170
+ img.save(output_file_name)
@@ -0,0 +1,109 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+
5
+ from nxtomomill.converter.hdf5.utils import PROCESSED_DATA_DIR_NAME, RAW_DATA_DIR_NAME
6
+
7
+ from tomwer.io.utils.raw_and_processed_data import to_processed_data_path
8
+ from tomwer.core.scan.scanbase import TomwerScanBase
9
+ from .output import DATASET_GALLERY_DIR_NAME, PROPOSAL_GALLERY_DIR_NAME
10
+
11
+ __all__ = ["deduce_dataset_gallery_location", "deduce_proposal_GALLERY_location"]
12
+
13
+
14
+ def deduce_dataset_gallery_location(scan_obj: TomwerScanBase) -> str:
15
+ """
16
+ From scan path deduce the 'dataset' path to the gallery.
17
+ Warning: dataset gallery is different then the 'proposal' gallery
18
+ """
19
+ if not isinstance(scan_obj, TomwerScanBase):
20
+ raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
21
+
22
+ file_path = os.path.abspath(scan_obj.path)
23
+
24
+ split_path = file_path.split(os.sep)
25
+ # reverse it to find the lower level value of 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' if by any 'chance' has several in the path
26
+ # then we will replace the 'lower one' in the string. This is where the GALLERY will be added
27
+ split_path = split_path[::-1]
28
+ # check if already contain in a "PROCESSED_DATA" directory
29
+ try:
30
+ index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
31
+ except ValueError:
32
+ pass
33
+ index_processed_data = None
34
+ try:
35
+ index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
36
+ except ValueError:
37
+ # if the value is not in the list
38
+ index_raw_data = None
39
+
40
+ if index_processed_data is None and index_raw_data is None:
41
+ # if not in any "PROCESSED_DATA" or "RAW_DATA" directory
42
+ return scan_obj.get_relative_file(
43
+ file_name=DATASET_GALLERY_DIR_NAME, with_dataset_prefix=False
44
+ )
45
+ elif index_processed_data is not None and index_raw_data is not None:
46
+ if index_raw_data > index_processed_data:
47
+ # if PROCESSED_DATA lower in the path than RAW_DATA
48
+ split_path[index_processed_data] = RAW_DATA_DIR_NAME
49
+ # reorder path to original
50
+ split_path = list(split_path[::-1])
51
+ split_path.append(DATASET_GALLERY_DIR_NAME)
52
+ # move it to PROCESSED_DATA when possible
53
+ path = os.sep.join(split_path)
54
+ path = to_processed_data_path(path)
55
+ return path
56
+
57
+
58
+ def deduce_proposal_GALLERY_location(scan_obj: TomwerScanBase) -> str:
59
+ """
60
+ Policy: look if the scan_obj.path is in 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' directories.
61
+ If find any (before any 'GALLERY_DIR_NAME' directory) replace it "GALLERY_DIR_NAME".
62
+ If none of those are found then create it at the same level as the scan
63
+
64
+ :param scan_obj: scan_obj for which we want the GALLERY directory
65
+ :return: gallery path (to save screenshots for example)
66
+ """
67
+ if not isinstance(scan_obj, TomwerScanBase):
68
+ raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
69
+
70
+ file_path = os.path.abspath(scan_obj.path)
71
+
72
+ split_path = file_path.split(os.sep)
73
+ # reverse it to find the lower level value of 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' if by any 'chance' has several in the path
74
+ # then we will replace the 'lower one' in the string. This is where the GALLERY will be added
75
+ split_path = split_path[::-1]
76
+ # check if already contain in a "PROCESSED_DATA" directory
77
+ try:
78
+ index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
79
+ except ValueError:
80
+ pass
81
+ index_processed_data = None
82
+ try:
83
+ index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
84
+ except ValueError:
85
+ # if the value is not in the list
86
+ index_raw_data = None
87
+
88
+ if index_processed_data is None and index_raw_data is None:
89
+ # if not in any "PROCESSED_DATA" or "RAW_DATA" directory
90
+ return scan_obj.get_relative_file(
91
+ file_name=PROPOSAL_GALLERY_DIR_NAME, with_dataset_prefix=False
92
+ )
93
+ elif index_processed_data is not None and index_raw_data is not None:
94
+ if index_raw_data > index_processed_data:
95
+ # if PROCESSED_DATA lower in the path than RAW_DATA
96
+ split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
97
+ else:
98
+ # if RAW_DATA lower in the path than PROCESSED_DATA
99
+ split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
100
+ elif index_raw_data is not None:
101
+ # if the path contains only PROCESSED_DATA or RAW_DATA (expected behavior for online acquistion)
102
+ split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
103
+ else:
104
+ assert index_processed_data is not None, "index_processed_data is None"
105
+ split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
106
+
107
+ # reorder path to original
108
+ split_path = split_path[::-1]
109
+ return os.sep.join(split_path)
@@ -0,0 +1,12 @@
1
+ from silx.utils.enum import Enum as _Enum
2
+
3
+
4
+ PROPOSAL_GALLERY_DIR_NAME = "GALLERY"
5
+ DATASET_GALLERY_DIR_NAME = "gallery"
6
+
7
+
8
+ class OutputFormat(_Enum):
9
+ """possible output format to save screenshots"""
10
+
11
+ PNG = "png"
12
+ JPEG = "jpg"
@@ -0,0 +1,147 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import numpy
5
+ from .dracbase import DracDatasetBase
6
+ from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
7
+ from tomwer.core.scan.scanbase import TomwerScanBase
8
+ from tomwer.core.volume.volumebase import TomwerVolumeBase
9
+ from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
10
+ from tomwer.core.process.reconstruction.output import (
11
+ PROCESS_FOLDER_RECONSTRUCTED_VOLUMES,
12
+ )
13
+
14
+
15
+ __all__ = ["DracReconstructedVolumeDataset"]
16
+
17
+
18
+ class DracReconstructedVolumeDataset(DracDatasetBase):
19
+ """
20
+ Class to associate reconstructed volume(s) to an drac (processed) dataset
21
+ """
22
+
23
+ def __init__(self, tomo_obj: TomwerVolumeBase, source_scan: TomwerScanBase) -> None:
24
+ if not isinstance(tomo_obj, TomwerVolumeBase):
25
+ raise TypeError(
26
+ f"tomo_obj should be an instance of {TomwerVolumeBase}. Got {type(tomo_obj)}"
27
+ )
28
+
29
+ super().__init__(tomo_obj=tomo_obj, data_dir=tomo_obj.icat_data_dir)
30
+ self._n_slices_per_axis = 3
31
+ self.__source_scan = source_scan
32
+ self.__bliss_raw_dataset = self.from_scan_to_raws(scan=self.__source_scan)
33
+
34
+ @staticmethod
35
+ def make_serializable(obj):
36
+ """
37
+ Recursively convert numpy arrays to lists and replace string "None" with None in a given object.
38
+ """
39
+ if isinstance(obj, dict):
40
+ return {
41
+ key: DracReconstructedVolumeDataset.make_serializable(value)
42
+ for key, value in obj.items()
43
+ }
44
+ elif isinstance(obj, (list, tuple)):
45
+ return [
46
+ DracReconstructedVolumeDataset.make_serializable(item) for item in obj
47
+ ]
48
+ elif isinstance(obj, numpy.ndarray):
49
+ return obj.tolist()
50
+ else:
51
+ return obj
52
+
53
+ @property
54
+ def metadata(self) -> dict:
55
+ assert isinstance(self.tomo_obj, TomwerVolumeBase)
56
+ metadata = self.tomo_obj.build_drac_metadata()
57
+ metadata["Sample_name"] = self.source_scan.sample_name
58
+ return metadata
59
+
60
+ @property
61
+ def dataset_name(self) -> str:
62
+ """name to give to the drac (processed) dataset."""
63
+ return PROCESS_FOLDER_RECONSTRUCTED_VOLUMES
64
+
65
+ @property
66
+ def source_scan(self) -> TomwerScanBase:
67
+ return self.__source_scan
68
+
69
+ @property
70
+ def bliss_raw_datasets(self) -> tuple[str]:
71
+ return self.__bliss_raw_dataset
72
+
73
+ @property
74
+ def n_slices_per_axis(self) -> int:
75
+ "number of slices to sample per axis"
76
+ return self._n_slices_per_axis
77
+
78
+ @n_slices_per_axis.setter
79
+ def n_slices_per_axis(self, n: int) -> None:
80
+ self._n_slices_per_axis = n
81
+
82
+ def get_slices_to_extract(self) -> tuple[tuple[int, tuple[int]]]:
83
+ """
84
+ Compute the slices to be retrieve along each dimension according to 'n_slices_per_axis'
85
+
86
+ return tuple (A) is a two elements tuple. First element if the axis (B).
87
+ Second is the tuple of indices to extract along the axis (B)
88
+ indices are equally spaced in each dimensions
89
+ """
90
+ result: list[tuple[int, tuple[int]]] = []
91
+ volume = self.tomo_obj
92
+ if not isinstance(volume, TomwerVolumeBase):
93
+ raise TypeError(
94
+ f"Volume is expected to be an instance of {TomwerVolumeBase}. Got {type(volume)}"
95
+ )
96
+ volume_shape = volume.get_volume_shape()
97
+ for axis, axis_len in enumerate(volume_shape):
98
+ for slice_index in numpy.linspace(
99
+ 0, axis_len, endpoint=False, num=self.n_slices_per_axis + 1
100
+ )[1:]:
101
+ result.append((axis, numpy.round(slice_index).astype(numpy.uint16)))
102
+ return tuple(result)
103
+
104
+ def build_gallery(self):
105
+ gallery_dir = self.get_gallery_dir()
106
+ volume = self.tomo_obj
107
+ slices = volume.get_slices(slices=self.get_slices_to_extract())
108
+
109
+ # Stack all slices into a single array to compute the global percentiles
110
+ all_slices = numpy.concatenate([slice_ for slice_ in slices.values()])
111
+ lower_bound = numpy.percentile(all_slices, 1)
112
+ upper_bound = numpy.percentile(all_slices, 99)
113
+
114
+ for (axis, slice_index), slice_ in slices.items():
115
+ self.save_to_gallery(
116
+ output_file_name=self.get_output_file_name(
117
+ output_dir=gallery_dir,
118
+ axis=axis,
119
+ slice_index=slice_index,
120
+ volume=volume,
121
+ ),
122
+ image=slice_,
123
+ lower_bound=lower_bound,
124
+ upper_bound=upper_bound,
125
+ )
126
+
127
+ @staticmethod
128
+ def get_output_file_name(
129
+ output_dir: str, axis: int, slice_index: int, volume: TomwerVolumeBase
130
+ ) -> str:
131
+ axis = NabuPlane.from_value(axis)
132
+ if isinstance(volume, VolumeSingleFrameBase):
133
+ basename = volume.get_volume_basename()
134
+ else:
135
+ basename = os.path.splitext(os.path.basename(volume.data_url.file_path()))[
136
+ 0
137
+ ]
138
+ axis_folder = os.path.join(
139
+ os.path.abspath(output_dir),
140
+ str(axis.value),
141
+ )
142
+ os.makedirs(axis_folder, exist_ok=True)
143
+ # warning: for ordering drac needs to have the axis in a dedicated folder
144
+ return os.path.join(
145
+ axis_folder,
146
+ f"{basename}_capture_{axis.value}_{str(slice_index).zfill(6)}",
147
+ )
@@ -0,0 +1,118 @@
1
+ from __future__ import annotations
2
+ import logging
3
+
4
+ from tomwer.core.process.task import Task
5
+ from tomwer.core.process.drac.dracbase import DracDatasetBase
6
+
7
+ from processview.core.manager import DatasetState, ProcessManager
8
+
9
+ try:
10
+ from pyicat_plus.client.main import IcatClient # noqa F401
11
+ except ImportError:
12
+ has_pyicat_plus = False
13
+ else:
14
+ has_pyicat_plus = True
15
+
16
+ _logger = logging.getLogger(__name__)
17
+
18
+ __all__ = [
19
+ "PublishICatDatasetTask",
20
+ ]
21
+
22
+
23
+ class PublishICatDatasetTask(
24
+ Task,
25
+ input_names=(
26
+ "data_portal_processed_datasets",
27
+ "beamline",
28
+ "proposal",
29
+ "dataset",
30
+ ),
31
+ optional_input_names=(
32
+ "dry_run",
33
+ "__process__",
34
+ ),
35
+ ):
36
+ """
37
+ publish a list of 'IcatDataBase' instances.
38
+
39
+ `IcatDataBase` provide API to retrieve data and metadata to be publish
40
+
41
+ input field:
42
+ * data_portal_processed_datasets: list of 'DracDatasetBase' instances.
43
+ * beamline: name of the beamline (bm05, id19...)
44
+ * proposal: proposal name
45
+ """
46
+
47
+ def run(self):
48
+ for icat_data in self.inputs.data_portal_processed_datasets:
49
+ if not isinstance(icat_data, DracDatasetBase):
50
+ raise TypeError(f"icat_data should be an instance of {DracDatasetBase}")
51
+
52
+ # build gallery (if needed by the icat data)
53
+
54
+ process = self.get_input_value("__process__", None)
55
+
56
+ if process is not None and icat_data.tomo_obj is not None:
57
+ ProcessManager().notify_dataset_state(
58
+ dataset=icat_data.tomo_obj,
59
+ process=process(),
60
+ state=DatasetState.ON_GOING,
61
+ )
62
+
63
+ icat_data.build_gallery()
64
+
65
+ try:
66
+ self.publish_to_data_portal(
67
+ path=icat_data.data_dir,
68
+ metadata=icat_data.metadata,
69
+ raw=icat_data.bliss_raw_datasets,
70
+ dataset=icat_data.dataset_name,
71
+ )
72
+
73
+ except Exception as e:
74
+ if process is not None and icat_data.tomo_obj is not None:
75
+ ProcessManager().notify_dataset_state(
76
+ dataset=icat_data.tomo_obj,
77
+ process=process(),
78
+ state=DatasetState.FAILED,
79
+ )
80
+ raise e
81
+ else:
82
+ if process is not None and icat_data.tomo_obj is not None:
83
+ ProcessManager().notify_dataset_state(
84
+ dataset=icat_data.tomo_obj,
85
+ process=process(),
86
+ state=DatasetState.SUCCEED,
87
+ )
88
+
89
+ def publish_to_data_portal(self, path: str, metadata: dict, raw: str, dataset: str):
90
+ """publish path to data_portal (drac) with given metadata"""
91
+ if not self.inputs.dry_run:
92
+ if not has_pyicat_plus:
93
+ raise RuntimeError(
94
+ "pyicat_plus not installed it. Please install it to be able to publish dataset to icat"
95
+ )
96
+ icat_client = IcatClient(
97
+ metadata_urls=("bcu-mq-01.esrf.fr:61613", "bcu-mq-02.esrf.fr:61613")
98
+ )
99
+
100
+ _logger.info(
101
+ "publish to icat: %s",
102
+ {
103
+ "path": path,
104
+ "beamline": self.inputs.beamline,
105
+ "proposal": self.inputs.proposal,
106
+ "raw": raw,
107
+ "dataset": dataset,
108
+ "metadata": metadata,
109
+ },
110
+ )
111
+ icat_client.store_processed_data(
112
+ beamline=self.inputs.beamline,
113
+ proposal=self.inputs.proposal,
114
+ dataset=dataset,
115
+ path=path,
116
+ metadata=metadata,
117
+ raw=raw,
118
+ )