tomwer 1.2.1__py3-none-any.whl → 1.3.12__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 (334) hide show
  1. orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
  2. orangecontrib/tomwer/widgets/__init__.py +11 -11
  3. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
  4. orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
  5. orangecontrib/tomwer/widgets/control/DataListenerOW.py +6 -6
  6. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
  7. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +6 -6
  8. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +24 -7
  9. orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
  10. orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +3 -3
  11. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +64 -23
  12. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +20 -8
  13. orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
  14. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +6 -6
  15. orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
  16. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
  17. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +5 -5
  18. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
  19. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
  20. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +8 -1
  21. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
  22. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
  23. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
  24. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
  25. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
  26. orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
  27. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  28. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
  29. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
  30. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
  31. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  32. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
  33. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
  34. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
  35. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +22 -20
  36. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +19 -3
  37. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +184 -169
  38. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
  39. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
  40. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +18 -22
  41. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +18 -26
  42. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +15 -19
  43. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +9 -9
  44. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
  45. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
  46. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
  47. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +0 -1
  48. orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
  49. tomwer/__main__.py +7 -64
  50. tomwer/app/axis.py +3 -3
  51. tomwer/app/canvas.py +8 -0
  52. tomwer/app/canvas_launcher/config.py +16 -14
  53. tomwer/app/canvas_launcher/environ.py +1 -0
  54. tomwer/app/canvas_launcher/mainwindow.py +4 -1
  55. tomwer/app/darkref.py +1 -1
  56. tomwer/app/darkrefpatch.py +1 -1
  57. tomwer/app/diffframe.py +3 -3
  58. tomwer/app/imagekeyeditor.py +5 -5
  59. tomwer/app/imagekeyupgrader.py +5 -5
  60. tomwer/app/intensitynormalization.py +14 -13
  61. tomwer/app/{saaxis.py → multicor.py} +3 -3
  62. tomwer/app/{sadeltabeta.py → multipag.py} +3 -3
  63. tomwer/app/nabuapp.py +0 -11
  64. tomwer/app/radiostack.py +6 -4
  65. tomwer/app/samplemoved.py +3 -2
  66. tomwer/app/scanviewer.py +4 -2
  67. tomwer/app/sinogramviewer.py +3 -2
  68. tomwer/app/slicestack.py +3 -2
  69. tomwer/app/zstitching.py +88 -6
  70. tomwer/core/cluster/cluster.py +26 -0
  71. tomwer/core/log/logger.py +7 -5
  72. tomwer/core/process/conditions/filters.py +1 -1
  73. tomwer/core/process/control/datalistener/datalistener.py +19 -14
  74. tomwer/core/process/control/datawatcher/edfdwprocess.py +0 -9
  75. tomwer/core/process/control/nxtomoconcatenate.py +13 -13
  76. tomwer/core/process/control/nxtomomill.py +92 -34
  77. tomwer/core/process/control/scantransfer.py +20 -43
  78. tomwer/core/process/control/scanvalidator.py +3 -2
  79. tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
  80. tomwer/core/process/control/test/test_email.py +4 -4
  81. tomwer/core/process/control/test/test_h52nx_process.py +59 -7
  82. tomwer/core/process/control/test/test_volume_link.py +64 -64
  83. tomwer/core/process/control/timer.py +1 -1
  84. tomwer/core/process/control/volumesymlink.py +200 -200
  85. tomwer/core/process/edit/darkflatpatch.py +14 -15
  86. tomwer/core/process/edit/imagekeyeditor.py +41 -39
  87. tomwer/core/process/icat/__init__.py +0 -0
  88. tomwer/core/process/icat/createscreenshots.py +100 -0
  89. tomwer/core/process/icat/gallery.py +377 -0
  90. tomwer/core/process/icat/icatbase.py +36 -0
  91. tomwer/core/process/icat/publish.py +228 -0
  92. tomwer/core/process/icat/screenshots.py +27 -0
  93. tomwer/core/process/output.py +52 -0
  94. tomwer/core/process/reconstruction/axis/axis.py +280 -69
  95. tomwer/core/process/reconstruction/axis/mode.py +163 -48
  96. tomwer/core/process/reconstruction/axis/params.py +29 -21
  97. tomwer/core/process/reconstruction/darkref/darkrefs.py +41 -127
  98. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +4 -3
  99. tomwer/core/process/reconstruction/darkref/params.py +1 -1
  100. tomwer/core/process/reconstruction/nabu/castvolume.py +4 -4
  101. tomwer/core/process/reconstruction/nabu/helical.py +9 -5
  102. tomwer/core/process/reconstruction/nabu/nabucommon.py +71 -78
  103. tomwer/core/process/reconstruction/nabu/nabuscores.py +425 -53
  104. tomwer/core/process/reconstruction/nabu/nabuslices.py +114 -93
  105. tomwer/core/process/reconstruction/nabu/nabuvolume.py +54 -27
  106. tomwer/core/process/reconstruction/nabu/plane.py +9 -0
  107. tomwer/core/process/reconstruction/nabu/settings.py +2 -2
  108. tomwer/core/process/reconstruction/nabu/utils.py +164 -26
  109. tomwer/core/process/reconstruction/output.py +108 -0
  110. tomwer/core/process/reconstruction/saaxis/saaxis.py +238 -264
  111. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +151 -87
  112. tomwer/core/process/reconstruction/scores/params.py +7 -4
  113. tomwer/core/process/reconstruction/scores/scores.py +13 -0
  114. tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
  115. tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
  116. tomwer/core/process/reconstruction/test/test_darkref_copy.py +7 -7
  117. tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
  118. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
  119. tomwer/core/process/stitching/nabustitcher.py +13 -12
  120. tomwer/core/process/task.py +34 -26
  121. tomwer/core/process/test/test_axis.py +13 -12
  122. tomwer/core/process/test/test_dark_and_flat.py +10 -7
  123. tomwer/core/process/test/test_data_transfer.py +10 -8
  124. tomwer/core/process/test/test_nabu.py +14 -6
  125. tomwer/core/process/test/test_normalization.py +4 -4
  126. tomwer/core/scan/blissscan.py +3 -3
  127. tomwer/core/scan/edfscan.py +13 -10
  128. tomwer/core/scan/hdf5scan.py +19 -530
  129. tomwer/core/scan/nxtomoscan.py +534 -0
  130. tomwer/core/scan/scanbase.py +72 -44
  131. tomwer/core/scan/scanfactory.py +13 -13
  132. tomwer/core/scan/test/test_edf.py +2 -2
  133. tomwer/core/scan/test/test_future_scan.py +3 -3
  134. tomwer/core/scan/test/test_h5.py +18 -16
  135. tomwer/core/scan/test/test_process_registration.py +4 -40
  136. tomwer/core/scan/test/test_scan.py +5 -78
  137. tomwer/core/settings.py +22 -2
  138. tomwer/core/test/test_scanutils.py +8 -7
  139. tomwer/core/test/test_utils.py +35 -28
  140. tomwer/core/tomwer_object.py +1 -1
  141. tomwer/core/utils/__init__.py +0 -466
  142. tomwer/core/utils/deprecation.py +1 -1
  143. tomwer/core/utils/dictutils.py +14 -0
  144. tomwer/core/utils/lbsram.py +35 -0
  145. tomwer/core/utils/nxtomoutils.py +1 -1
  146. tomwer/core/utils/scanutils.py +6 -6
  147. tomwer/core/utils/spec.py +263 -0
  148. tomwer/core/volume/edfvolume.py +6 -6
  149. tomwer/core/volume/hdf5volume.py +6 -6
  150. tomwer/core/volume/jp2kvolume.py +6 -6
  151. tomwer/core/volume/rawvolume.py +6 -6
  152. tomwer/core/volume/tiffvolume.py +12 -12
  153. tomwer/core/volume/volumefactory.py +2 -2
  154. tomwer/gui/cluster/slurm.py +274 -65
  155. tomwer/gui/cluster/supervisor.py +12 -0
  156. tomwer/gui/cluster/test/test_cluster.py +14 -2
  157. tomwer/gui/cluster/test/test_supervisor.py +3 -3
  158. tomwer/gui/configuration/__init__.py +0 -0
  159. tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
  160. tomwer/gui/configuration/level.py +22 -0
  161. tomwer/gui/control/actions.py +54 -0
  162. tomwer/gui/control/datalist.py +83 -16
  163. tomwer/gui/control/datalistener.py +4 -16
  164. tomwer/gui/control/datawatcher/controlwidget.py +2 -4
  165. tomwer/gui/control/datawatcher/datawatcher.py +1 -24
  166. tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
  167. tomwer/gui/control/history.py +2 -2
  168. tomwer/gui/control/observations.py +2 -2
  169. tomwer/gui/control/reducedarkflatselector.py +9 -9
  170. tomwer/gui/control/selectorwidgetbase.py +36 -9
  171. tomwer/gui/control/serie/seriecreator.py +5 -22
  172. tomwer/gui/control/test/test_email.py +1 -1
  173. tomwer/gui/control/test/test_scanvalidator.py +6 -5
  174. tomwer/gui/control/test/test_single_tomo_obj.py +3 -3
  175. tomwer/gui/control/tomoobjdisplaymode.py +8 -0
  176. tomwer/gui/debugtools/datasetgenerator.py +3 -3
  177. tomwer/gui/edit/dkrfpatch.py +20 -26
  178. tomwer/gui/edit/imagekeyeditor.py +11 -12
  179. tomwer/gui/edit/nxtomoeditor.py +111 -44
  180. tomwer/gui/edit/nxtomowarmer.py +7 -6
  181. tomwer/gui/edit/test/test_dkrf_patch.py +13 -13
  182. tomwer/gui/edit/test/test_image_key_editor.py +3 -3
  183. tomwer/gui/edit/test/test_nx_editor.py +40 -16
  184. tomwer/gui/icat/__init__.py +0 -0
  185. tomwer/gui/icat/createscreenshots.py +80 -0
  186. tomwer/gui/icat/gallery.py +214 -0
  187. tomwer/gui/icat/publish.py +187 -0
  188. tomwer/gui/imagefromfile.py +2 -2
  189. tomwer/gui/qfolderdialog.py +24 -1
  190. tomwer/gui/reconstruction/axis/CompareImages.py +88 -168
  191. tomwer/gui/reconstruction/axis/axis.py +171 -57
  192. tomwer/gui/reconstruction/axis/radioaxis.py +122 -257
  193. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
  194. tomwer/gui/reconstruction/darkref/darkrefwidget.py +2 -1
  195. tomwer/gui/reconstruction/nabu/castvolume.py +14 -3
  196. tomwer/gui/reconstruction/nabu/check.py +9 -9
  197. tomwer/gui/reconstruction/nabu/helical.py +29 -12
  198. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
  199. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +2 -1
  200. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +126 -35
  201. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +39 -32
  202. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +222 -31
  203. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +57 -27
  204. tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
  205. tomwer/gui/reconstruction/nabu/slices.py +10 -11
  206. tomwer/gui/reconstruction/nabu/volume.py +22 -10
  207. tomwer/gui/reconstruction/normalization/intensity.py +18 -48
  208. tomwer/gui/reconstruction/saaxis/corrangeselector.py +8 -24
  209. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
  210. tomwer/gui/reconstruction/saaxis/saaxis.py +9 -21
  211. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +45 -12
  212. tomwer/gui/reconstruction/scores/control.py +2 -9
  213. tomwer/gui/reconstruction/scores/scoreplot.py +13 -11
  214. tomwer/gui/reconstruction/test/test_axis.py +41 -16
  215. tomwer/gui/reconstruction/test/test_nabu.py +31 -9
  216. tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
  217. tomwer/gui/reconstruction/test/test_sadeltabeta.py +12 -2
  218. tomwer/gui/settings.py +5 -28
  219. tomwer/gui/stackplot.py +2 -5
  220. tomwer/gui/stitching/action.py +49 -0
  221. tomwer/gui/stitching/config/axisparams.py +7 -24
  222. tomwer/gui/stitching/config/output.py +10 -8
  223. tomwer/gui/stitching/config/positionoveraxis.py +22 -23
  224. tomwer/gui/stitching/normalization.py +117 -0
  225. tomwer/gui/stitching/stitchandbackground.py +4 -6
  226. tomwer/gui/stitching/stitching.py +267 -45
  227. tomwer/gui/stitching/stitching_preview.py +62 -55
  228. tomwer/gui/stitching/stitching_raw.py +13 -12
  229. tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
  230. tomwer/gui/utils/buttons.py +112 -29
  231. tomwer/gui/utils/inputwidget.py +43 -25
  232. tomwer/gui/utils/lineselector/lineselector.py +1 -1
  233. tomwer/gui/utils/scandescription.py +4 -0
  234. tomwer/gui/utils/step.py +144 -0
  235. tomwer/gui/utils/unitsystem.py +2 -5
  236. tomwer/gui/utils/vignettes.py +176 -15
  237. tomwer/gui/visualization/dataviewer.py +48 -35
  238. tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
  239. tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
  240. tomwer/gui/visualization/scanoverview.py +1 -1
  241. tomwer/gui/visualization/sinogramviewer.py +20 -36
  242. tomwer/gui/visualization/test/test_diffviewer.py +3 -3
  243. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
  244. tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
  245. tomwer/gui/visualization/test/test_stacks.py +3 -3
  246. tomwer/gui/visualization/test/test_volumeviewer.py +65 -67
  247. tomwer/gui/visualization/volumeviewer.py +114 -113
  248. tomwer/io/utils/h5pyutils.py +3 -3
  249. tomwer/io/utils/raw_and_processed_data.py +84 -0
  250. tomwer/io/utils/tomoobj.py +4 -6
  251. tomwer/io/utils/utils.py +7 -7
  252. tomwer/resources/gui/icons/parameters.svg +1 -1
  253. tomwer/resources/gui/icons/ruler.png +0 -0
  254. tomwer/resources/gui/icons/ruler.svg +273 -0
  255. tomwer/resources/gui/icons/short_description.png +0 -0
  256. tomwer/resources/gui/icons/short_description.svg +58 -0
  257. tomwer/resources/gui/icons/url.png +0 -0
  258. tomwer/resources/gui/icons/url.svg +58 -0
  259. tomwer/resources/gui/illustrations/no_rot.svg +1 -1
  260. tomwer/synctools/stacks/edit/darkflatpatch.py +19 -14
  261. tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
  262. tomwer/synctools/stacks/reconstruction/axis.py +4 -4
  263. tomwer/synctools/stacks/reconstruction/castvolume.py +22 -7
  264. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +25 -20
  265. tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
  266. tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
  267. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
  268. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
  269. tomwer/synctools/test/test_darkRefs.py +7 -58
  270. tomwer/synctools/test/test_foldertransfer.py +6 -6
  271. tomwer/synctools/utils/scanstages.py +6 -6
  272. tomwer/tests/conftest.py +34 -0
  273. tomwer/tests/datasets.py +13 -0
  274. tomwer/tests/test_scripts.py +91 -41
  275. tomwer/tests/utils.py +5 -0
  276. tomwer/third_part/WaitingOverlay.py +110 -0
  277. tomwer/third_part/__init__.py +0 -0
  278. tomwer/version.py +2 -2
  279. tomwer-1.3.12-py3.11-nspkg.pth +1 -0
  280. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/METADATA +73 -58
  281. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/RECORD +287 -286
  282. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/WHEEL +1 -1
  283. orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +0 -197
  284. orangecontrib/tomwer/widgets/reconstruction/icons/XY_lamino.svg +0 -168
  285. orangecontrib/tomwer/widgets/reconstruction/icons/XZ_lamino.svg +0 -275
  286. orangecontrib/tomwer/widgets/reconstruction/icons/YZ_lamino.svg +0 -182
  287. tomwer/app/lamino.py +0 -143
  288. tomwer/core/process/reconstruction/lamino/__init__.py +0 -1
  289. tomwer/core/process/reconstruction/lamino/tofu.py +0 -1000
  290. tomwer/core/process/test/test_lamino.py +0 -76
  291. tomwer/core/test/test_lamino.py +0 -92
  292. tomwer/gui/reconstruction/lamino/__init__.py +0 -31
  293. tomwer/gui/reconstruction/lamino/tofu/TofuOptionLoader.py +0 -107
  294. tomwer/gui/reconstruction/lamino/tofu/__init__.py +0 -1
  295. tomwer/gui/reconstruction/lamino/tofu/misc.py +0 -148
  296. tomwer/gui/reconstruction/lamino/tofu/projections.py +0 -896
  297. tomwer/gui/reconstruction/lamino/tofu/settings.py +0 -75
  298. tomwer/gui/reconstruction/lamino/tofu/tofu.py +0 -432
  299. tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +0 -567
  300. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +0 -760
  301. tomwer/gui/reconstruction/test/test_lamino.py +0 -189
  302. tomwer/resources/gui/icons/esrf_1.svg +0 -307
  303. tomwer/resources/gui/icons/lamino_parameters.svg +0 -70
  304. tomwer/resources/gui/icons/triangle.svg +0 -80
  305. tomwer/resources/gui/illustrations/lamino_angle.png +0 -0
  306. tomwer/resources/gui/illustrations/lamino_angle.svg +0 -509
  307. tomwer/resources/gui/illustrations/lamino_beta_angle.png +0 -0
  308. tomwer/resources/gui/illustrations/lamino_beta_angle.svg +0 -97
  309. tomwer/resources/gui/illustrations/lamino_theta_angle.png +0 -0
  310. tomwer/resources/gui/illustrations/lamino_theta_angle.svg +0 -368
  311. tomwer/resources/gui/illustrations/manual_slice.png +0 -0
  312. tomwer/resources/gui/illustrations/manual_slice.svg +0 -221
  313. tomwer/resources/gui/illustrations/psi_angle.png +0 -0
  314. tomwer/resources/gui/illustrations/psi_angle.svg +0 -479
  315. tomwer/resources/gui/illustrations/rotation_center.png +0 -0
  316. tomwer/resources/gui/illustrations/rotation_center.svg +0 -276
  317. tomwer/resources/gui/illustrations/slice_stack.png +0 -0
  318. tomwer/resources/gui/illustrations/slice_stack.svg +0 -266
  319. tomwer/resources/gui/illustrations/xy_slice.png +0 -0
  320. tomwer/resources/gui/illustrations/xy_slice.svg +0 -269
  321. tomwer/resources/gui/illustrations/xz_slice.png +0 -0
  322. tomwer/resources/gui/illustrations/xz_slice.svg +0 -270
  323. tomwer/resources/gui/illustrations/yz_slice.png +0 -0
  324. tomwer/resources/gui/illustrations/yz_slice.svg +0 -270
  325. tomwer/synctools/stacks/reconstruction/lamino.py +0 -233
  326. tomwer/synctools/test/test_scanstages.py +0 -162
  327. tomwer/tests/utils/__init__.py +0 -247
  328. tomwer/tests/utils/utilstest.py +0 -220
  329. tomwer-1.2.1-py3.11-nspkg.pth +0 -1
  330. /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
  331. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/LICENSE +0 -0
  332. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/entry_points.txt +0 -0
  333. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/namespace_packages.txt +0 -0
  334. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/top_level.txt +0 -0
@@ -1,33 +1,3 @@
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__ = "15/10/2019"
29
-
30
-
31
1
  import logging
32
2
 
33
3
  from silx.utils.enum import Enum as _Enum
@@ -35,6 +5,55 @@ from silx.utils.enum import Enum as _Enum
35
5
  _logger = logging.getLogger(__name__)
36
6
 
37
7
 
8
+ class AxisModeMetadata:
9
+ """
10
+ Util class to store metadata regarding processing of a mode.
11
+
12
+ Ease processing and display
13
+ Maybe this function should be part of nabu ?
14
+ """
15
+
16
+ def __init__(
17
+ self,
18
+ lockable,
19
+ tooltip="",
20
+ computing_constrains=(),
21
+ allows_padding=False,
22
+ valid_inputs=(),
23
+ valid_sides=(),
24
+ ) -> None:
25
+ self._lockable = lockable
26
+ self._tooltip = tooltip
27
+ self._computing_constrains = computing_constrains
28
+ self._allows_padding = allows_padding
29
+ self._valid_inputs = valid_inputs
30
+ self._valid_sides = valid_sides
31
+
32
+ @property
33
+ def is_lockable(self) -> bool:
34
+ return self._lockable
35
+
36
+ @property
37
+ def tooltip(self) -> str:
38
+ return self._tooltip
39
+
40
+ @property
41
+ def computing_constrains(self) -> tuple:
42
+ return self._computing_constrains
43
+
44
+ @property
45
+ def allows_padding(self) -> bool:
46
+ return self._allows_padding
47
+
48
+ @property
49
+ def valid_inputs(self) -> tuple:
50
+ return self._valid_inputs
51
+
52
+ @property
53
+ def valid_sides(self) -> tuple:
54
+ return self._valid_sides
55
+
56
+
38
57
  class _InputType(_Enum):
39
58
  SINOGRAM = "sinogram"
40
59
  RADIOS_X2 = "2 radios"
@@ -55,7 +74,11 @@ class AxisMode(_Enum):
55
74
  sliding_window_radios = "radios-sliding-window"
56
75
  sino_coarse_to_fine = "sino-coarse-to-fine"
57
76
  composite_coarse_to_fine = "composite-coarse-to-fine"
77
+ sino_fourier_angles = "sino-fourier-angles"
78
+ octave_accurate_radios = "radios-octave-accurate"
58
79
  read = "read"
80
+ # alias to composite_coarse_to_fine with near mode
81
+ near = "near"
59
82
 
60
83
  @classmethod
61
84
  def from_value(cls, value):
@@ -74,22 +97,114 @@ class AxisMode(_Enum):
74
97
  return super().from_value(value=value)
75
98
 
76
99
 
77
- _VALID_INPUTS = {
78
- AxisMode.centered: (_InputType.RADIOS_X2,),
79
- AxisMode.global_: (_InputType.RADIOS_X2,),
80
- AxisMode.manual: (_InputType.RADIOS_X2,),
81
- AxisMode.growing_window_radios: (_InputType.RADIOS_X2,),
82
- AxisMode.sliding_window_radios: (_InputType.RADIOS_X2,),
83
- AxisMode.sliding_window_sinogram: (_InputType.SINOGRAM,),
84
- AxisMode.growing_window_sinogram: (_InputType.SINOGRAM,),
85
- AxisMode.sino_coarse_to_fine: (_InputType.SINOGRAM,),
86
- AxisMode.composite_coarse_to_fine: (
87
- _InputType.COMPOSITE,
88
- ), # in fact it is more an n radio constrain
89
- AxisMode.read: None,
90
- }
91
-
92
- _AXIS_MODE_CONSTRAIN = {
93
- AxisMode.sino_coarse_to_fine: (_Constrain.FULL_TURN,),
94
- AxisMode.composite_coarse_to_fine: (_Constrain.FULL_TURN,),
100
+ AXIS_MODE_METADATAS = {
101
+ # manual
102
+ AxisMode.manual: AxisModeMetadata(
103
+ lockable=False,
104
+ tooltip="Enter or find manually the COR value",
105
+ computing_constrains=(),
106
+ allows_padding=False,
107
+ valid_inputs=(_InputType.RADIOS_X2,),
108
+ ),
109
+ # read
110
+ AxisMode.read: AxisModeMetadata(
111
+ lockable=False,
112
+ tooltip="Read COR value from a file",
113
+ computing_constrains=(),
114
+ allows_padding=False,
115
+ valid_inputs=None,
116
+ ),
117
+ # radio algorithm
118
+ AxisMode.centered: AxisModeMetadata(
119
+ lockable=True,
120
+ tooltip="Dedicated to fullfield. Previously named 'accurate'",
121
+ computing_constrains=(),
122
+ allows_padding=True,
123
+ valid_inputs=(_InputType.RADIOS_X2,),
124
+ ),
125
+ AxisMode.global_: AxisModeMetadata(
126
+ lockable=True,
127
+ tooltip="Algorithm which can work for both half acquisition and standard ('full field') acquisition",
128
+ computing_constrains=(),
129
+ allows_padding=True,
130
+ valid_inputs=(_InputType.RADIOS_X2,),
131
+ ),
132
+ AxisMode.growing_window_radios: AxisModeMetadata(
133
+ lockable=True,
134
+ tooltip="A auto-Cor method",
135
+ computing_constrains=(),
136
+ allows_padding=True,
137
+ valid_inputs=(_InputType.RADIOS_X2,),
138
+ valid_sides=("left", "right", "center", "all"),
139
+ ),
140
+ AxisMode.sliding_window_radios: AxisModeMetadata(
141
+ lockable=True,
142
+ tooltip="A method for estimating semi-automatically the CoR position. You have to provide a hint on where the CoR is (left, center, right).",
143
+ computing_constrains=(),
144
+ allows_padding=True,
145
+ valid_inputs=(_InputType.RADIOS_X2,),
146
+ valid_sides=("left", "right", "center", "near"),
147
+ ),
148
+ AxisMode.octave_accurate_radios: AxisModeMetadata(
149
+ lockable=True,
150
+ tooltip="Same method as the 'accurate' octave code",
151
+ computing_constrains=(),
152
+ allows_padding=True,
153
+ valid_inputs=(_InputType.RADIOS_X2,),
154
+ valid_sides=("center",),
155
+ ),
156
+ # sinogram algorithm
157
+ AxisMode.growing_window_sinogram: AxisModeMetadata(
158
+ lockable=True,
159
+ tooltip="A auto-Cor method",
160
+ computing_constrains=(),
161
+ allows_padding=True,
162
+ valid_inputs=(_InputType.SINOGRAM,),
163
+ valid_sides=("left", "right", "center", "all"),
164
+ ),
165
+ AxisMode.sliding_window_sinogram: AxisModeMetadata(
166
+ lockable=True,
167
+ tooltip="A method for estimating semi-automatically the CoR position. You have to provide a hint on where the CoR is (left, center, right).",
168
+ computing_constrains=(),
169
+ allows_padding=True,
170
+ valid_inputs=(_InputType.SINOGRAM,),
171
+ valid_sides=("left", "right", "center", "near"),
172
+ ),
173
+ AxisMode.sino_coarse_to_fine: AxisModeMetadata(
174
+ lockable=True,
175
+ tooltip="Estimate CoR from sinogram. Only works for 360 degrees scans.",
176
+ computing_constrains=(_Constrain.FULL_TURN,),
177
+ allows_padding=True,
178
+ valid_inputs=(_InputType.SINOGRAM,),
179
+ ),
180
+ AxisMode.sino_fourier_angles: AxisModeMetadata(
181
+ lockable=True,
182
+ tooltip="",
183
+ computing_constrains=(_Constrain.FULL_TURN,),
184
+ allows_padding=True,
185
+ valid_inputs=(_InputType.SINOGRAM,),
186
+ valid_sides=(
187
+ "left",
188
+ "right",
189
+ "center",
190
+ "near",
191
+ ),
192
+ ),
193
+ # coarse-to-fine algorithm
194
+ AxisMode.composite_coarse_to_fine: AxisModeMetadata(
195
+ lockable=True,
196
+ tooltip="A auto-Cor method",
197
+ computing_constrains=(_Constrain.FULL_TURN,),
198
+ allows_padding=True,
199
+ valid_inputs=(_InputType.COMPOSITE,),
200
+ valid_sides=("left", "right", "center", "near"),
201
+ ),
202
+ AxisMode.near: AxisModeMetadata(
203
+ lockable=True,
204
+ tooltip="Alias to composite_coarse_to_fine",
205
+ computing_constrains=(_Constrain.FULL_TURN,),
206
+ allows_padding=True,
207
+ valid_inputs=(_InputType.COMPOSITE,),
208
+ valid_sides=("left", "right", "center", "near"),
209
+ ),
95
210
  }
@@ -42,10 +42,10 @@ from tomoscan.esrf.scan.utils import get_data
42
42
 
43
43
  from tomwer.core.process.task import Task
44
44
  from tomwer.core.scan.scanbase import TomwerScanBase
45
- from tomwer.core.utils import getParametersFromParOrInfo
45
+ from tomwer.core.utils.spec import getParametersFromParOrInfo
46
46
 
47
47
  from .anglemode import CorAngleMode
48
- from .mode import AxisMode
48
+ from .mode import AxisMode, AXIS_MODE_METADATAS
49
49
  from .projectiontype import ProjectionType
50
50
 
51
51
  from nabu.preproc.phase import PaganinPhaseRetrieval
@@ -160,9 +160,9 @@ class AxisResource(object):
160
160
  else:
161
161
  self.__norme_data = scan.data_flat_field_correction(data=self.data)
162
162
  if log_ is True:
163
- self.__norme_data[
164
- numpy.isnan(self.__norme_data)
165
- ] = self.__norme_data.max()
163
+ self.__norme_data[numpy.isnan(self.__norme_data)] = (
164
+ self.__norme_data.max()
165
+ )
166
166
  if self.__norme_data.max() < 0:
167
167
  _logger.error("max data value < 0 unable to compute log")
168
168
  else:
@@ -173,9 +173,9 @@ class AxisResource(object):
173
173
  except Exception as e:
174
174
  _logger.error("Fail to apply log on radio" + e)
175
175
  else:
176
- self.__norme_data[
177
- numpy.isnan(self.__norme_data)
178
- ] = self.__norme_data.min()
176
+ self.__norme_data[numpy.isnan(self.__norme_data)] = (
177
+ self.__norme_data.min()
178
+ )
179
179
 
180
180
  return self.__norme_data
181
181
 
@@ -885,6 +885,9 @@ class AxisRP:
885
885
  pass
886
886
 
887
887
  def get_simple_str(self):
888
+ """
889
+ special information as a str for mode able to handle both sinogram and radios
890
+ """
888
891
  results = f"{self.mode.value}"
889
892
  if self.mode in (
890
893
  AxisMode.growing_window_radios,
@@ -898,18 +901,20 @@ class AxisRP:
898
901
 
899
902
  def get_nabu_cor_options_as_dict(self) -> str:
900
903
  options = {}
901
- if self.mode in (
902
- AxisMode.sliding_window_sinogram,
903
- AxisMode.sliding_window_radios,
904
- AxisMode.growing_window_sinogram,
905
- AxisMode.growing_window_radios,
906
- ):
907
- options["side"] = self.side
908
- elif self.mode in (AxisMode.composite_coarse_to_fine,):
909
- near_pos = self.composite_options.get("near_pos", 0.0)
904
+ if self.mode is AxisMode.near:
905
+ self.side = "near"
906
+ request_side = len(AXIS_MODE_METADATAS[self.mode].valid_sides) > 0
907
+ if request_side:
908
+
909
+ if self.side == "near":
910
+ options["side"] = self.composite_options.get(
911
+ "near_pos", self.estimated_cor
912
+ )
913
+ else:
914
+ options["side"] = self.side
915
+
916
+ if self.side == "near":
910
917
  near_width = self.composite_options.get("near_width", 20.0)
911
- options["side"] = self.side
912
- options["near_pos"] = near_pos
913
918
  options["near_width"] = near_width
914
919
 
915
920
  # append "extra_cor_options" to already handled cor options
@@ -917,8 +922,11 @@ class AxisRP:
917
922
 
918
923
  if extra_cor_options != "":
919
924
  for opt in self.extra_cor_options.replace(" ", "").split(";"):
920
- key, value = opt.split("=")
921
- options[key] = value
925
+ if len(opt.split("=")) == 2:
926
+ key, value = opt.split("=")
927
+ options[key] = value
928
+ else:
929
+ _logger.info(f"ignore option {opt}. Invalid synthax")
922
930
  return options
923
931
 
924
932
  @deprecated(replacement="get_nabu_cor_options_as_str", since_version="1.1")
@@ -37,17 +37,16 @@ from queue import Queue
37
37
 
38
38
  from processview.core.manager import DatasetState, ProcessManager
39
39
  from processview.core.superviseprocess import SuperviseProcess
40
- from silx.io.url import DataUrl
41
- from silx.io.utils import h5py_read_dataset
42
- from silx.utils.deprecation import deprecated_warning
40
+ from tomwer.core.utils.deprecation import deprecated_warning
43
41
 
44
- from tomoscan.framereducerbase import REDUCER_TARGET, ReduceMethod
45
- from tomoscan.io import HDF5File
42
+ from tomoscan.framereducer.target import REDUCER_TARGET
43
+ from tomoscan.framereducer.method import ReduceMethod
46
44
 
47
45
  import tomwer.version
48
- from tomwer.core import settings, utils
46
+ from tomwer.core import settings
47
+ from tomwer.core.utils.lbsram import is_low_on_memory
49
48
  from tomwer.core.process.task import Task
50
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
49
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
51
50
  from tomwer.core.scan.scanbase import TomwerScanBase
52
51
  from tomwer.core.scan.scanfactory import ScanFactory
53
52
  from tomwer.core.utils.scanutils import data_identifier_to_scan
@@ -241,57 +240,13 @@ class DarkRefsTask(
241
240
  :return: dictionary with index in the sequence as key and numpy array
242
241
  as value (or url if as_url set to True)
243
242
  """
244
- if entry is None:
245
- with HDF5File(process_file, "r", swmr=True) as h5f:
246
- entries = DarkRefsTask._get_process_nodes(
247
- root_node=h5f, process=DarkRefsTask
248
- )
249
- if len(entries) == 0:
250
- logger.info("unable to find a DarkRef process in %s" % process_file)
251
- return None
252
- elif len(entries) > 1:
253
- raise ValueError("several entry found, entry should be " "specify")
254
- else:
255
- entry = list(entries.keys())[0]
256
- logger.info("take %s as default entry" % entry)
257
-
258
- with HDF5File(process_file, "r", swmr=True) as h5f:
259
- if entry not in h5f.keys():
260
- logger.info(f"no dark found for {entry}")
261
- return {}
262
- dark_nodes = DarkRefsTask._get_process_nodes(
263
- root_node=h5f[entry], process=DarkRefsTask
264
- )
265
- index_to_path = {}
266
- for key, index in dark_nodes.items():
267
- index_to_path[index] = key
268
-
269
- if len(dark_nodes) == 0:
270
- return {}
271
- # take the last processed dark ref
272
- last_process_index = sorted(list(dark_nodes.values()))[-1]
273
- last_process_dark = index_to_path[last_process_index]
274
- if (len(index_to_path)) > 1:
275
- logger.debug(
276
- "several processing found for dark-ref,"
277
- "take the last one: %s" % last_process_dark
278
- )
279
-
280
- res = {}
281
- if "results" in h5f[last_process_dark].keys():
282
- results_node = h5f[last_process_dark]["results"]
283
- if "darks" in results_node.keys():
284
- darks = results_node["darks"]
285
- for index in darks:
286
- if as_url is True:
287
- res[int(index)] = DataUrl(
288
- file_path=process_file,
289
- data_path="/".join((darks.name, index)),
290
- scheme="silx",
291
- )
292
- else:
293
- res[int(index)] = h5py_read_dataset(darks[index])
294
- return res
243
+ deprecated_warning(
244
+ name="tomwer.core.process.reconstruction.darkref.DarkRefsTask.get_darks_frm_process_file",
245
+ type_="function",
246
+ reason="removed. Reduced dark / flat are expected to be stored on didicated files and not in tomwer_processes anymore",
247
+ since_version="1.2",
248
+ )
249
+ return None
295
250
 
296
251
  @staticmethod
297
252
  def get_flats_frm_process_file(
@@ -305,57 +260,13 @@ class DarkRefsTask(
305
260
  numpy.array
306
261
  :return:
307
262
  """
308
- if entry is None:
309
- with HDF5File(process_file, "r", swmr=True) as h5f:
310
- entries = DarkRefsTask._get_process_nodes(
311
- root_node=h5f, process=DarkRefsTask
312
- )
313
- if len(entries) == 0:
314
- logger.info("unable to find a DarkRef process in %s" % process_file)
315
- return None
316
- elif len(entries) > 1:
317
- raise ValueError("several entry found, entry should be " "specify")
318
- else:
319
- entry = list(entries.keys())[0]
320
- logger.info("take %s as default entry" % entry)
321
-
322
- with HDF5File(process_file, "r", swmr=True) as h5f:
323
- if entry not in h5f.keys():
324
- logger.info(f"no flats found for {entry}")
325
- return {}
326
- dkref_nodes = DarkRefsTask._get_process_nodes(
327
- root_node=h5f[entry], process=DarkRefsTask
328
- )
329
- index_to_path = {}
330
- for key, index in dkref_nodes.items():
331
- index_to_path[index] = key
332
-
333
- if len(dkref_nodes) == 0:
334
- return {}
335
- # take the last processed dark ref
336
- last_process_index = sorted(dkref_nodes.values())[-1]
337
- last_process_dkrf = index_to_path[last_process_index]
338
- if (len(index_to_path)) > 1:
339
- logger.debug(
340
- "several processing found for dark-ref,"
341
- f"take the last one: {last_process_dkrf}"
342
- )
343
-
344
- res = {}
345
- if "results" in h5f[last_process_dkrf].keys():
346
- results_node = h5f[last_process_dkrf]["results"]
347
- if "flats" in results_node.keys():
348
- flats = results_node["flats"]
349
- for index in flats:
350
- if as_url is True:
351
- res[int(index)] = DataUrl(
352
- file_path=process_file,
353
- data_path="/".join((flats.name, index)),
354
- scheme="silx",
355
- )
356
- else:
357
- res[int(index)] = h5py_read_dataset(flats[index])
358
- return res
263
+ deprecated_warning(
264
+ name="tomwer.core.process.reconstruction.darkref.DarkRefsTask.get_flats_frm_process_file",
265
+ type_="function",
266
+ reason="removed. Reduced dark / flat are expected to be stored on didicated files and not in tomwer_processes anymore",
267
+ since_version="1.2",
268
+ )
269
+ return None
359
270
 
360
271
  def run(self):
361
272
  if isinstance(self.inputs.data, str):
@@ -393,7 +304,7 @@ class DarkRefsTask(
393
304
  logger.processStarted(f"start dark and ref for {scan}")
394
305
  if (
395
306
  settings.isOnLbsram(scan)
396
- and utils.isLowOnMemory(settings.get_lbsram_path()) is True
307
+ and is_low_on_memory(settings.get_lbsram_path()) is True
397
308
  ):
398
309
  mess = (
399
310
  "low memory, do compute dark and flat field mean/median "
@@ -456,13 +367,14 @@ class DarkRefsTask(
456
367
  ):
457
368
  # cast darks and flats keys from int (index) to str
458
369
  o_darks = scan.reduced_darks
370
+ o_darks_infos = scan.reduced_darks_infos
459
371
  f_darks = {}
460
372
  for index, data in o_darks.items():
461
373
  f_darks[str(index)] = data
462
374
  interpretations["/".join(("darks", str(index)))] = "image"
463
375
  results["darks"] = f_darks
464
376
 
465
- scan.save_reduced_darks(f_darks, overwrite=True)
377
+ scan.save_reduced_darks(f_darks, darks_infos=o_darks_infos, overwrite=True)
466
378
  if (
467
379
  self.recons_params.flat_calc_method
468
380
  is not dkrf_reconsparams.ReduceMethod.NONE
@@ -470,33 +382,33 @@ class DarkRefsTask(
470
382
  ):
471
383
  results["flats"] = scan.reduced_flats
472
384
  o_flats = scan.reduced_flats
385
+ o_flats_infos = scan.reduced_flats_infos
473
386
  f_flats = {}
474
387
  for index, data in o_flats.items():
475
388
  f_flats[str(index)] = data
476
389
  interpretations["/".join(("flats", str(index)))] = "image"
477
390
  results["flats"] = f_flats
478
391
 
479
- scan.save_reduced_flats(f_flats, overwrite=True)
392
+ scan.save_reduced_flats(f_flats, flats_infos=o_flats_infos, overwrite=True)
480
393
 
481
394
  if len(results) > 0:
482
395
  # if some processing to be registered
483
396
  if scan.process_file is not None and not (
484
- isinstance(scan, HDF5TomoScan) and not self.__new_hdf5_entry_created
397
+ isinstance(scan, NXtomoScan) and not self.__new_hdf5_entry_created
485
398
  ):
486
- with scan.acquire_process_file_lock():
487
- entry = "entry"
488
- if hasattr(scan, "entry"):
489
- entry = scan.entry
490
- self.register_process(
491
- process_file=scan.process_file,
492
- entry=entry,
493
- configuration=self.recons_params.to_dict(),
494
- results=results,
495
- interpretations=interpretations,
496
- process_index=scan.pop_process_index(),
497
- overwrite=True,
498
- )
499
- logger.processSucceed(f"Dark and ref succeeded for {scan}")
399
+ entry = "entry"
400
+ if hasattr(scan, "entry"):
401
+ entry = scan.entry
402
+ self.register_process(
403
+ process_file=scan.process_file,
404
+ entry=entry,
405
+ configuration=self.recons_params.to_dict(),
406
+ results=results,
407
+ interpretations=interpretations,
408
+ process_index=scan.pop_process_index(),
409
+ overwrite=True,
410
+ )
411
+ logger.processSucceed(f"Dark and flat reduction succeeded for {scan}")
500
412
  self.notify_to_state_to_managed(
501
413
  dataset=scan, state=DatasetState.SUCCEED, details=None
502
414
  )
@@ -529,6 +441,7 @@ class DarkRefsTask(
529
441
  return_info=True,
530
442
  )
531
443
  scan.set_reduced_darks(darks=reduced_darks, darks_infos=metadata)
444
+
532
445
  try:
533
446
  scan.save_reduced_darks(
534
447
  darks=reduced_darks, darks_infos=metadata, overwrite=True
@@ -542,6 +455,7 @@ class DarkRefsTask(
542
455
  return_info=True,
543
456
  )
544
457
  scan.set_reduced_flats(flats=reduced_flats, flats_infos=metadata)
458
+
545
459
  try:
546
460
  scan.save_reduced_flats(
547
461
  flats=reduced_flats, flats_infos=metadata, overwrite=True
@@ -39,12 +39,13 @@ from typing import Union
39
39
 
40
40
  from silx.io.dictdump import dicttoh5, h5todict
41
41
  from silx.io.url import DataUrl
42
+ from silx.io.utils import open as open_hdf5
42
43
  from tomoscan.esrf.scan.utils import (
43
44
  copy_h5_dict_darks_to,
44
45
  copy_h5_dict_flats_to,
45
46
  cwd_context,
46
47
  )
47
- from tomoscan.framereducerbase import REDUCER_TARGET
48
+ from tomoscan.framereducer.target import REDUCER_TARGET
48
49
  from tomoscan.io import HDF5File
49
50
 
50
51
  from tomwer.core.process.reconstruction.darkref.darkrefs import DarkRefsTask
@@ -297,7 +298,7 @@ class DarkRefsCopy(DarkRefsTask):
297
298
  if not os.path.exists(self._save_file):
298
299
  return False
299
300
  else:
300
- with HDF5File(self._save_file, mode="r") as h5f:
301
+ with open_hdf5(self._save_file) as h5f:
301
302
  return self._flats_url.data_path() in h5f
302
303
 
303
304
  def has_dark_stored(self) -> bool:
@@ -309,7 +310,7 @@ class DarkRefsCopy(DarkRefsTask):
309
310
  if not os.path.exists(self._save_file):
310
311
  return False
311
312
  else:
312
- with HDF5File(self._save_file, mode="r") as h5f:
313
+ with open_hdf5(self._save_file) as h5f:
313
314
  return self._darks_url.data_path() in h5f
314
315
 
315
316
  def contains_dark(self, scan: TomwerScanBase) -> bool:
@@ -31,7 +31,7 @@ __date__ = "07/03/2019"
31
31
  import enum
32
32
 
33
33
  from silx.utils.enum import Enum as _Enum
34
- from tomoscan.framereducerbase import ReduceMethod
34
+ from tomoscan.framereducer.method import ReduceMethod
35
35
 
36
36
  from tomwer.core.process.reconstruction.darkref.settings import (
37
37
  DARKHST_PREFIX,
@@ -47,7 +47,7 @@ from tomoscan.volumebase import VolumeBase
47
47
  from tomwer.core.cluster.cluster import SlurmClusterConfiguration
48
48
  from tomwer.core.futureobject import FutureTomwerObject
49
49
  from tomwer.core.process.reconstruction.nabu import settings
50
- from tomwer.core.process.reconstruction.nabu.nabucommon import NabuOutputFileFormat
50
+ from tomwer.core.process.reconstruction.output import NabuOutputFileFormat
51
51
  from tomwer.core.process.task import Task
52
52
  from tomwer.core.utils.slurm import get_slurm_script_name
53
53
  from tomwer.core.utils.volumeutils import volume_identifier_to_volume
@@ -231,9 +231,9 @@ class CastVolumeTask(
231
231
  working_directory, "slurm_scripts", script_name
232
232
  )
233
233
  # for now force job name
234
- self._cluster_config[
235
- "job_name"
236
- ] = f"tomwer-cast-volume {input_volume.get_identifier().to_str()} to {output_volume.get_identifier().to_str()}"
234
+ self._cluster_config["job_name"] = (
235
+ f"tomwer-cast-volume {input_volume.get_identifier().to_str()} to {output_volume.get_identifier().to_str()}"
236
+ )
237
237
  job = SBatchScriptJob(
238
238
  slurm_config=self._cluster_config,
239
239
  script=(get_command(),),