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,377 +0,0 @@
1
- import logging
2
- import os
3
- from math import floor
4
-
5
- import numpy
6
- from nxtomomill.converter.hdf5.utils import PROCESSED_DATA_DIR_NAME, RAW_DATA_DIR_NAME
7
- from PIL import Image
8
- from silx.io.url import DataUrl
9
- from silx.utils.enum import Enum as _Enum
10
- from tomoscan.esrf.scan.utils import get_data
11
- from tomoscan.esrf.volume.hdf5volume import HDF5Volume
12
- from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
13
-
14
- from tomwer.io.utils.raw_and_processed_data import to_processed_data_path
15
- from tomwer.core.scan.edfscan import EDFTomoScan
16
- from tomwer.core.process.task import Task
17
- from tomwer.core.scan.scanbase import TomwerScanBase
18
- from tomwer.core.volume.volumebase import TomwerVolumeBase
19
- from tomwer.core.process.icat.screenshots import IcatScreenshots
20
- from tomwer.core.process.icat.publish import (
21
- PublishProcessedDataFolderTask,
22
- from_bliss_original_file_to_raw,
23
- )
24
- from processview.core.manager import DatasetState, ProcessManager
25
-
26
- _logger = logging.getLogger(__name__)
27
-
28
- PROPOSAL_GALLERY_DIR_NAME = "GALLERY"
29
- DATASET_GALLERY_DIR_NAME = "gallery"
30
-
31
-
32
- class OutputFormat(_Enum):
33
- """possible output format to save screenshots"""
34
-
35
- PNG = "png"
36
- JPEG = "jpg"
37
-
38
-
39
- class Binning(_Enum):
40
- ONE_BY_ONE = "1x1"
41
- TWO_BY_TWO = "2x2"
42
- FOUR_BY_FOUR = "4x4"
43
- HEIGHT_BY_HEIGHT = "8x8"
44
- SIXTEEN_BY_SIXTEEN = "16x16"
45
- THIRTY_TWO_BY_THIRTY_TWO = "32x32"
46
- SIXTY_FOUR_BY_SIXTY_FOUR = "64x64"
47
- ONE_HUNDRED_TWENTY_HEIGHT_BY_ONE_HUNDRED_TWENTY_HEIGHT = "128x128"
48
-
49
- @staticmethod
50
- def _bin_data(data, binning):
51
- if not isinstance(data, numpy.ndarray):
52
- raise TypeError("data should be a numpy array")
53
- if not data.ndim == 2:
54
- raise ValueError("data is expected to be 2d")
55
- binning = Binning.from_value(binning)
56
- if binning is Binning.ONE_BY_ONE:
57
- return data
58
- elif binning is Binning.TWO_BY_TWO:
59
- return data[::2, ::2]
60
- elif binning is Binning.FOUR_BY_FOUR:
61
- return data[::4, ::4]
62
- elif binning is Binning.HEIGHT_BY_HEIGHT:
63
- return data[::8, ::8]
64
- elif binning is Binning.SIXTEEN_BY_SIXTEEN:
65
- return data[::16, ::16]
66
- elif binning is Binning.THIRTY_TWO_BY_THIRTY_TWO:
67
- return data[::32, ::32]
68
- elif binning is Binning.SIXTY_FOUR_BY_SIXTY_FOUR:
69
- return data[::64, ::64]
70
- else:
71
- raise NotImplementedError
72
-
73
-
74
- def deduce_dataset_gallery_location(scan_obj: TomwerScanBase) -> str:
75
- """
76
- From scan path deduce the 'dataset' path to the gallery.
77
- Warning: dataset gallery is different then the 'proposal' gallery
78
- """
79
- if not isinstance(scan_obj, TomwerScanBase):
80
- raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
81
-
82
- file_path = os.path.abspath(scan_obj.path)
83
-
84
- split_path = file_path.split(os.sep)
85
- # 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
86
- # then we will replace the 'lower one' in the string. This is where the GALLERY will be added
87
- split_path = split_path[::-1]
88
- # check if already contain in a "PROCESSED_DATA" directory
89
- try:
90
- index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
91
- except ValueError:
92
- pass
93
- index_processed_data = None
94
- try:
95
- index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
96
- except ValueError:
97
- # if the value is not in the list
98
- index_raw_data = None
99
-
100
- if index_processed_data is None and index_raw_data is None:
101
- # if not in any "PROCESSED_DATA" or "RAW_DATA" directory
102
- return scan_obj.get_relative_file(
103
- file_name=DATASET_GALLERY_DIR_NAME, with_dataset_prefix=False
104
- )
105
- elif index_processed_data is not None and index_raw_data is not None:
106
- if index_raw_data > index_processed_data:
107
- # if PROCESSED_DATA lower in the path than RAW_DATA
108
- split_path[index_processed_data] = RAW_DATA_DIR_NAME
109
- # reorder path to original
110
- split_path = list(split_path[::-1])
111
- split_path.append(DATASET_GALLERY_DIR_NAME)
112
- # move it to PPROCESSED_DATA when possible
113
- path = os.sep.join(split_path)
114
- path = to_processed_data_path(path)
115
- return path
116
-
117
-
118
- def deduce_proposal_GALLERY_location(scan_obj: TomwerScanBase) -> str:
119
- """
120
- Policy: look if the scan_obj.path is in 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' directories.
121
- If find any (before any 'GALLERY_DIR_NAME' directory) replace it "GALLERY_DIR_NAME".
122
- If none of those are found then create it at the same level as the scan
123
-
124
- :param TomwerScanBase scan_obj: scan_obj for which we want the GALLERY directory
125
- :return: gallery path (to save screeshots for example)
126
- """
127
- if not isinstance(scan_obj, TomwerScanBase):
128
- raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
129
-
130
- file_path = os.path.abspath(scan_obj.path)
131
-
132
- split_path = file_path.split(os.sep)
133
- # 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
134
- # then we will replace the 'lower one' in the string. This is where the GALLERY will be added
135
- split_path = split_path[::-1]
136
- # check if already contain in a "PROCESSED_DATA" directory
137
- try:
138
- index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
139
- except ValueError:
140
- pass
141
- index_processed_data = None
142
- try:
143
- index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
144
- except ValueError:
145
- # if the value is not in the list
146
- index_raw_data = None
147
-
148
- if index_processed_data is None and index_raw_data is None:
149
- # if not in any "PROCESSED_DATA" or "RAW_DATA" directory
150
- return scan_obj.get_relative_file(
151
- file_name=PROPOSAL_GALLERY_DIR_NAME, with_dataset_prefix=False
152
- )
153
- elif index_processed_data is not None and index_raw_data is not None:
154
- if index_raw_data > index_processed_data:
155
- # if PROCESSED_DATA lower in the path than RAW_DATA
156
- split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
157
- else:
158
- # if RAW_DATA lower in the path than PROCESSED_DATA
159
- split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
160
- elif index_raw_data is not None:
161
- # if the path contains only PROCESSED_DATA or RAW_DATA (expected behavior for online acquistion)
162
- split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
163
- else:
164
- assert index_processed_data is not None, "index_processed_data is None"
165
- split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
166
-
167
- # reorder path to original
168
- split_path = split_path[::-1]
169
- return os.sep.join(split_path)
170
-
171
-
172
- def select_screenshot_from_volume(volume: TomwerVolumeBase) -> dict:
173
- """
174
- return a subset of url for a volume.
175
- Warning: this function will be called each time a nabu slice or a nabu volume is executer from orangecontrig.
176
- So it must stay 'low processing' function to avoid slowing down everything
177
- """
178
- if not isinstance(volume, TomwerVolumeBase):
179
- raise TypeError(
180
- f"volume is expected to be an instance of {TomwerVolumeBase}. Get {type(volume)}"
181
- )
182
-
183
- if isinstance(volume, VolumeSingleFrameBase):
184
- volume_urls = tuple(volume.browse_data_urls())
185
- # lets take the three equally spaced slices (3/6, 4/6 and 5/6)
186
- n_slices = len(volume_urls)
187
- # note: using a dict ensure to get a set of DataUrl in case an Url is used several time
188
- # workaround: DataUrl is not hashable
189
- screenshots = {
190
- f"{os.path.splitext(os.path.basename(volume_urls[floor(i * n_slices / 6)].file_path()))}": volume_urls[
191
- floor(i * n_slices / 6)
192
- ]
193
- for i in range(2, 5)
194
- }
195
- return screenshots
196
- elif isinstance(volume, HDF5Volume):
197
- volume_url = next(volume.browse_data_urls())
198
- n_slices = volume.get_volume_shape()[0]
199
- # note: using a dict ensure to get a set of DataUrl in case an Url is used several time
200
- # workaround: DataUrl is not hashable
201
- screenshots = {
202
- f"{os.path.splitext(os.path.basename(volume_url.file_path()))[0]}_{floor(i / 6 * n_slices)}": DataUrl(
203
- file_path=volume_url.file_path(),
204
- data_path=volume_url.data_path(),
205
- scheme="silx",
206
- data_slice=floor(i / 6 * n_slices),
207
- )
208
- for i in range(2, 5)
209
- }
210
- return screenshots
211
- else:
212
- _logger.warning(
213
- f"volume {type(volume)} does not allow to create screenshot for now"
214
- )
215
- return ()
216
-
217
-
218
- class SaveScreenshotsToGalleryTask(
219
- Task,
220
- input_names=("screenshots",), # screenshots as instance of :class:Screenshots
221
- optional_input_names=("format", "overwrite", "binning"),
222
- ):
223
- """simple task to do the binding between orange design and 'SaveScreenshotsTask'"""
224
-
225
- def run(self):
226
- if not isinstance(self.inputs.screenshots, IcatScreenshots):
227
- raise TypeError(
228
- f"'screenshots' is expected to be an instance of {IcatScreenshots}. get {type(self.inputs.screenshots)}"
229
- )
230
-
231
- inputs = self.inputs.screenshots.to_dict()
232
- if self.get_input_value("overwrite", None) is not None:
233
- inputs["overwrite"] = self.inputs.overwrite
234
- if self.get_input_value("format", None) is not None:
235
- inputs["format"] = self.inputs.format
236
- if self.get_input_value("binning", None) is not None:
237
- inputs["binning"] = self.inputs.binning
238
- task = SaveScreenshotsTask(
239
- inputs=inputs,
240
- )
241
- task.run()
242
-
243
-
244
- class SaveScreenshotsTask(
245
- Task,
246
- input_names=("screenshots_as_dict", "output_dir"),
247
- optional_input_names=("format", "overwrite", "binning"),
248
- ):
249
- """Task which save a set of screenshot to the output_dir under required format"""
250
-
251
- def run(self):
252
- format = OutputFormat.from_value(
253
- self.get_input_value("format", OutputFormat.PNG)
254
- )
255
- overwrite = self.get_input_value("overwrite", False)
256
- binning = self.get_input_value("binning", Binning.ONE_BY_ONE)
257
-
258
- os.makedirs(self.inputs.output_dir, exist_ok=True)
259
- for screenshot_name, data_url in self.inputs.screenshots_as_dict.items():
260
- if not isinstance(data_url, DataUrl):
261
- raise TypeError("screenshot values are expected to DataUrl")
262
- data = get_data(data_url)
263
- if not isinstance(data, numpy.ndarray) and data.ndim != 2:
264
- raise TypeError("screenshot are expected to be 2D numpy arrays")
265
- if not isinstance(screenshot_name, str):
266
- raise TypeError(
267
- f"screenshot keys are expected to be str. Get {type(screenshot_name)}"
268
- )
269
-
270
- if data.ndim == 3 and data.shape[0] == 1:
271
- data = data.reshape(data.shape[1:])
272
- elif data.ndim != 2:
273
- raise ValueError(
274
- f"only 2D grayscale image are handled. Get {data.shape}"
275
- )
276
- # if qt is available use it as this is simpler and more powerful
277
- # clamp data in 0-256
278
- data = data.astype(numpy.float32)
279
- data = Binning._bin_data(data=data, binning=binning)
280
- data *= 255.0 / data.max()
281
-
282
- # do a rescale else use qt instead
283
- img = Image.fromarray(data, mode=None)
284
- img = img.convert("L")
285
- output_file = os.path.join(
286
- self.inputs.output_dir,
287
- ".".join([screenshot_name, format.value]),
288
- )
289
- if not overwrite and os.path.exists(output_file):
290
- raise OSError(f"File already exists ({output_file})")
291
- img.save(output_file)
292
-
293
-
294
- class SaveToGalleryAndPublishTask(
295
- Task,
296
- input_names=(
297
- "screenshots",
298
- "beamline",
299
- "dataset",
300
- "proposal",
301
- "format",
302
- ),
303
- optional_input_names=(
304
- "dry_run",
305
- "__process__",
306
- ),
307
- ):
308
- def __init__(
309
- self, varinfo=None, inputs=None, node_id=None, node_attrs=None, execinfo=None
310
- ):
311
- super().__init__(varinfo, inputs, node_id, node_attrs, execinfo)
312
- self._process = self.get_input_value("__process__", None)
313
- self._task_save = SaveScreenshotsToGalleryTask(
314
- inputs=inputs,
315
- )
316
-
317
- scan = self.inputs.screenshots.scan
318
- if isinstance(scan, EDFTomoScan):
319
- raise TypeError(
320
- "scan is an EDFTomoScan. Not handled for publishing processed data to icat"
321
- )
322
- raw = from_bliss_original_file_to_raw(scan.get_bliss_orginal_files())
323
-
324
- path = self.inputs.screenshots.data_dir
325
- # path = os.path.dirname(self.inputs.screenshots.data_dir)
326
-
327
- self._task_publish = PublishProcessedDataFolderTask(
328
- inputs={
329
- "beamline": self.inputs.beamline,
330
- "dataset": self.inputs.dataset,
331
- "proposal": self.inputs.proposal,
332
- "path": path, # must be the dataset path
333
- "raw": raw,
334
- "dry_run": self.get_input_value("dry_run", False),
335
- "metadata": self.inputs.screenshots.metadata,
336
- },
337
- )
338
-
339
- def run(self):
340
- if self._process is not None:
341
- ProcessManager().notify_dataset_state(
342
- dataset=self.inputs.screenshots.scan,
343
- process=self._process(),
344
- state=DatasetState.ON_GOING,
345
- )
346
- # save screenshots to gallery
347
- try:
348
- self._task_save.run()
349
- except Exception as e:
350
- if self._process is not None:
351
- ProcessManager().notify_dataset_state(
352
- dataset=self.inputs.screenshots.scan,
353
- process=self._process(),
354
- state=DatasetState.FAILED,
355
- details=str(e),
356
- )
357
- raise e
358
-
359
- # publication
360
- try:
361
- self._task_publish.run()
362
- except Exception as e:
363
- if self._process is not None:
364
- ProcessManager().notify_dataset_state(
365
- dataset=self.inputs.screenshots.scan,
366
- process=self._process(),
367
- state=DatasetState.FAILED,
368
- details=str(e),
369
- )
370
- raise e
371
- else:
372
- if self._process is not None:
373
- ProcessManager().notify_dataset_state(
374
- dataset=self.inputs.screenshots.scan,
375
- process=self._process(),
376
- state=DatasetState.SUCCEED,
377
- )
@@ -1,36 +0,0 @@
1
- import weakref
2
- from tomwer.core.scan.scanbase import TomwerScanBase
3
-
4
-
5
- class IcatProcessedDataBase:
6
- """
7
- Container class to get all the information about processed data to be publish
8
- """
9
-
10
- def __init__(self, data_dir: str, scan: TomwerScanBase) -> None:
11
- self._output_dir = data_dir
12
- # output dir for the screenshots. The default is expected to be provided by the task creating the screenshot.
13
- # it can be overwrite by the 'SaveScreenshotTask' if an output dir is provided
14
- self._scan = weakref.ref(scan) if scan is not None else scan
15
-
16
- @property
17
- def data_dir(self):
18
- return self._output_dir
19
-
20
- @property
21
- def scan(self):
22
- return self._scan() if self._scan is not None else None
23
-
24
- @property
25
- def metadata(self) -> dict:
26
- scan = self.scan
27
- if scan is not None:
28
- return scan.build_icat_metadata()
29
- else:
30
- return {}
31
-
32
- def to_dict(self):
33
- return {
34
- "output_dir": self.data_dir,
35
- "icat_metadata": self.metadata,
36
- }
@@ -1,228 +0,0 @@
1
- from __future__ import annotations
2
- import os
3
- import logging
4
-
5
- from tomwer.core.process.task import Task
6
- from tomwer.core.scan.scanbase import TomwerScanBase
7
- from tomwer.core.scan.edfscan import EDFTomoScan
8
- from tomwer.core.volume.hdf5volume import HDF5VolumeIdentifier
9
- from tomwer.core.volume.rawvolume import RawVolumeIdentifier
10
- from tomwer.io.utils.raw_and_processed_data import file_is_on_processed_data
11
- from tomoscan.identifier import VolumeIdentifier
12
- from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
13
-
14
- from processview.core.manager import DatasetState, ProcessManager
15
-
16
- try:
17
- from pyicat_plus.client.main import IcatClient # noqa F401
18
- except ImportError:
19
- has_pyicat_plus = False
20
- else:
21
- has_pyicat_plus = True
22
-
23
- _logger = logging.getLogger(__name__)
24
-
25
-
26
- class PublishProcessedDataFolderTask(
27
- Task,
28
- input_names=(
29
- "beamline",
30
- "proposal",
31
- "dataset",
32
- "path",
33
- "raw",
34
- ),
35
- optional_input_names=(
36
- "metadata",
37
- "dry_run",
38
- ),
39
- ):
40
- """publish a list of volume to icat for the provided beamline && dataset && proposal"""
41
-
42
- def run(self):
43
- beamline = self.inputs.beamline
44
- proposal = self.inputs.proposal
45
- dataset = self.inputs.dataset
46
- raw = self.inputs.raw
47
- metadata = self.get_input_value("metadata", {})
48
- path = self.inputs.path
49
- dry_run = self.get_input_value("dry_run", False)
50
-
51
- # checks (need because can be pass by a GUI and will set those values to empty string mostly)
52
- missing = []
53
- if beamline in (None, ""):
54
- missing.append("beamline")
55
- if proposal in (None, ""):
56
- missing.append("proposal")
57
- if dataset in (None, ""):
58
- missing.append("dataset")
59
- if raw is None or len(raw) == 0:
60
- missing.append("raw")
61
-
62
- if len(missing) > 0:
63
- mess = f"Missing information about {','.join(missing)}"
64
- _logger.error(mess)
65
- raise ValueError(mess)
66
- if not os.path.exists(path):
67
- raise ValueError(f"path: {path} doesn't exists")
68
-
69
- if not file_is_on_processed_data(str(path)):
70
- # for now it is safer to limit the publication of metadata to the folder contained in 'PROCESSED_DATA'
71
- raise ValueError(
72
- f"processed data dir ({path}) is not in a PROCESSED_DATA folder. Cannot publish it"
73
- )
74
- # publish
75
- if not has_pyicat_plus:
76
- raise ImportError("pyicat_plus not installed")
77
-
78
- if not dry_run:
79
- print("will publish")
80
- from pprint import pprint
81
-
82
- pprint(
83
- {
84
- "beamline": beamline,
85
- "proposal": proposal,
86
- "dataset": dataset,
87
- "path": path,
88
- "metadata": metadata,
89
- "raw": raw,
90
- }
91
- )
92
- icat_client = IcatClient(
93
- metadata_urls=("bcu-mq-01.esrf.fr:61613", "bcu-mq-02.esrf.fr:61613")
94
- )
95
-
96
- icat_client.store_processed_data(
97
- beamline=beamline,
98
- proposal=proposal,
99
- dataset=dataset,
100
- path=path,
101
- metadata=metadata,
102
- raw=raw,
103
- )
104
-
105
-
106
- class PublishReconstructedVolumeFromScanTask(
107
- Task,
108
- input_names=(
109
- "data",
110
- "beamline",
111
- "proposal",
112
- "dataset",
113
- ),
114
- optional_input_names=(
115
- "metadata",
116
- "dry_run",
117
- "__process__",
118
- ),
119
- ):
120
- """
121
- Proxy to PublishProcessedDataTask
122
- publish processed data from a 'TomwerScanBase' instance. We expect volume to be registered under 'latest_vol_reconstructions' property.
123
- """
124
-
125
- def __init__(
126
- self, varinfo=None, inputs=None, node_id=None, node_attrs=None, execinfo=None
127
- ):
128
- super().__init__(varinfo, inputs, node_id, node_attrs, execinfo)
129
- scan = self.inputs.data
130
-
131
- if not isinstance(scan, TomwerScanBase):
132
- raise TypeError(f"scan is expected to be an instance of {TomwerScanBase}")
133
- if isinstance(scan, EDFTomoScan):
134
- raise TypeError(
135
- "EDFTomoScan is not handling for pushing processed data to icat"
136
- )
137
- else:
138
- raw = from_bliss_original_file_to_raw(scan.get_bliss_orginal_files())
139
-
140
- def get_volume_identifier_path_to_save(volume_identfier):
141
- assert isinstance(volume_identfier, VolumeIdentifier)
142
- if isinstance(
143
- volume_identfier, (HDF5VolumeIdentifier, RawVolumeIdentifier)
144
- ):
145
- return os.path.dirname(volume_identfier.file_path)
146
- elif isinstance(volume_identfier, VolumeSingleFrameBase):
147
- if volume_identfier.url is not None:
148
- return volume_identfier.url.file_path()
149
- elif volume_identfier.data_url.file_path() is not None:
150
- return volume_identfier.data_url.file_path()
151
- else:
152
- raise ValueError(
153
- f"identifier type {type(volume_identfier)} is not handled"
154
- )
155
-
156
- paths_to_save = set(
157
- [
158
- get_volume_identifier_path_to_save(volume_id)
159
- for volume_id in scan.latest_vol_reconstructions
160
- ]
161
- )
162
- self._sub_tasks = [
163
- PublishProcessedDataFolderTask(
164
- inputs={
165
- "beamline": self.inputs.beamline,
166
- "proposal": self.inputs.proposal,
167
- "dataset": self.inputs.dataset,
168
- "path": path_to_save,
169
- "raw": raw,
170
- "metadata": scan.build_icat_metadata(),
171
- "dry_run": self.get_input_value("dry_run", False),
172
- }
173
- )
174
- for path_to_save in paths_to_save
175
- ]
176
-
177
- def run(self):
178
- scan = self.inputs.data
179
- process = self.get_input_value("__process__", None)
180
-
181
- if process is not None:
182
- ProcessManager().notify_dataset_state(
183
- dataset=scan,
184
- process=process(),
185
- state=DatasetState.ON_GOING,
186
- )
187
-
188
- try:
189
- for sub_task in self._sub_tasks:
190
- sub_task.run()
191
- except Exception as e:
192
- if process is not None:
193
- ProcessManager().notify_dataset_state(
194
- dataset=scan,
195
- process=process(),
196
- state=DatasetState.FAILED,
197
- )
198
- raise e
199
- else:
200
- if process is not None:
201
- ProcessManager().notify_dataset_state(
202
- dataset=scan,
203
- process=process(),
204
- state=DatasetState.SUCCEED,
205
- )
206
-
207
-
208
- def from_bliss_original_file_to_raw(bliss_original_files: tuple | None) -> tuple:
209
- """
210
- convert NXtomo 'bliss_original_files' to icat raw parameter (folder containing the raw)
211
- without '/mnt/multipath-shares' prefix
212
- """
213
- if bliss_original_files is None:
214
- return None
215
-
216
- # TODO: FIXME
217
- def fix_path(file_path):
218
- path = os.path.dirname(file_path)
219
- if "/mnt/multipath-shares" in path:
220
- # no simple workaround. abspath return a path with '/mnt/multipath-shares'
221
- _logger.info(
222
- "looks like raw data is given with '/mnt/multipath-shares' prefix. Icat will fail on it. Must remove it. No proper other handling found :()"
223
- )
224
- # small workaround to fix abspath. Should not be the case anymore so raise an error
225
- path.replace("/mnt/multipath-shares", "")
226
- return path
227
-
228
- return tuple([os.path.dirname(bliss_file) for bliss_file in bliss_original_files])
@@ -1,27 +0,0 @@
1
- """utils around screenshots.
2
- """
3
-
4
- from .icatbase import IcatProcessedDataBase
5
- from tomwer.core.scan.scanbase import TomwerScanBase
6
-
7
-
8
- class IcatScreenshots(IcatProcessedDataBase):
9
- """Class to define an icat process publishing screenshot (so to the galery)"""
10
-
11
- def __init__(self, data_dir: str, screenshots: dict, scan: TomwerScanBase) -> None:
12
- super().__init__(data_dir, scan)
13
- if not isinstance(screenshots, dict):
14
- raise TypeError(
15
- f"Screenshots is expected to be a dict. Get {type(screenshots)} instead."
16
- )
17
-
18
- self._screenshots = screenshots
19
-
20
- @property
21
- def screenshots(self):
22
- return self._screenshots
23
-
24
- def to_dict(self):
25
- res = super().to_dict()
26
- res["screenshots_as_dict"] = self.screenshots
27
- return res