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
@@ -41,8 +41,9 @@ from nabu.pipeline.fullfield.nabu_config import (
41
41
  from silx.utils.enum import Enum as _Enum
42
42
 
43
43
  import tomwer.version
44
+ from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
44
45
  from tomwer.core.scan.edfscan import EDFTomoScan
45
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
46
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
46
47
  from tomwer.core.scan.scanbase import TomwerScanBase
47
48
  from tomwer.core.volume.edfvolume import EDFVolume
48
49
  from tomwer.core.volume.hdf5volume import HDF5Volume
@@ -148,27 +149,30 @@ def get_recons_volume_identifier(
148
149
  file_format: str,
149
150
  scan: TomwerScanBase,
150
151
  slice_index: typing.Union[int, None],
151
- start_z: typing.Union[int, None],
152
- end_z: typing.Union[int, None],
153
- expects_single_slice: bool,
152
+ axis: NabuPlane,
154
153
  ) -> tuple:
155
154
  """
156
155
  return tuple of DataUrl for existings slices
157
156
  """
157
+ axis = NabuPlane.from_value(axis)
158
158
  file_format = file_format.lower()
159
159
  if file_format in ("hdf5", "h5", "hdf"):
160
160
  if slice_index is not None:
161
161
  # case of a single hdf5 file
162
- file_name = "_".join((file_prefix, str(slice_index).zfill(6)))
162
+ file_name = "_".join(
163
+ (file_prefix, "plane", axis.value, str(slice_index).zfill(6))
164
+ )
163
165
  else:
164
166
  file_name = file_prefix
165
167
  file_name = ".".join((file_name, file_format))
166
168
  file_path = os.path.join(location, file_name)
167
169
 
168
- if isinstance(scan, HDF5TomoScan):
170
+ if isinstance(scan, NXtomoScan):
169
171
  entry = scan.entry
170
172
  elif isinstance(scan, EDFTomoScan):
171
173
  entry = "entry"
174
+ else:
175
+ raise NotImplementedError(f"unrecognized scan type ({type(scan)})")
172
176
 
173
177
  volumes = (
174
178
  HDF5Volume(
@@ -179,7 +183,9 @@ def get_recons_volume_identifier(
179
183
  elif file_format in ("vol", "raw"):
180
184
  if slice_index is not None:
181
185
  # case of a single hdf5 file
182
- file_name = "_".join((file_prefix, str(slice_index).zfill(6)))
186
+ file_name = "_".join(
187
+ (file_prefix, "plane", axis.value, str(slice_index).zfill(6))
188
+ )
183
189
  else:
184
190
  file_name = file_prefix
185
191
  file_name = ".".join((file_name, file_format))
@@ -223,6 +229,79 @@ def get_recons_volume_identifier(
223
229
  return tuple([volume.get_identifier() for volume in volumes])
224
230
 
225
231
 
232
+ def get_multi_cor_recons_volume_identifiers(
233
+ scan: TomwerScanBase,
234
+ slice_index: int,
235
+ location: str,
236
+ file_prefix: str,
237
+ cors: tuple,
238
+ file_format: str,
239
+ axis=NabuPlane.XY,
240
+ ) -> dict:
241
+ """
242
+ util to retrieve Volumes (identifier) reconstructed by nabu-multicor
243
+
244
+ :param TomwerScanBase scan: scam processed by the nabu-multicor
245
+ :param str location: location of the files
246
+ :param tuple cors: cors for which we want the reconstructed slices. As this extension is created by nabu
247
+ the cor reference is in absolute.
248
+ :param str file_format: file format of the reconstruction
249
+
250
+ :return: a dict with absolute cor value as key and the Volume identifier as value
251
+ """
252
+ _logger.info("Deduce volume identifiers for nabu-multicor")
253
+ if isinstance(slice_index, str):
254
+ slice_index = slice_index_to_int(
255
+ slice_index=slice_index,
256
+ scan=scan,
257
+ axis=axis, # for now we always expect the multicor to be done along Z
258
+ )
259
+ assert isinstance(
260
+ slice_index, int
261
+ ), "slice_index is expected to be an int or to be converted to it"
262
+ res = {}
263
+ if isinstance(scan, EDFTomoScan):
264
+ entry = "entry"
265
+ else:
266
+ entry = scan.entry
267
+
268
+ for cor in cors:
269
+ file_path = os.path.join(
270
+ location,
271
+ f"{file_prefix}_{cor:.3f}_{str(slice_index).zfill(5)}.{file_format}",
272
+ )
273
+
274
+ if file_format in ("hdf5", "h5", "hdf"):
275
+ file_path = os.path.join(
276
+ location,
277
+ f"{file_prefix}_{cor:.3f}_{str(slice_index).zfill(5)}.{file_format}",
278
+ )
279
+ volume = HDF5Volume(
280
+ file_path=file_path,
281
+ data_path="/".join([entry, "reconstruction"]),
282
+ )
283
+ elif file_format in ("vol", "raw"):
284
+ volume = (RawVolume(file_path=file_path),)
285
+ elif file_format in ("jp2", "jp2k", "edf", "tiff"):
286
+ if file_format in ("jp2k", "jp2"):
287
+ constructor = JP2KVolume
288
+ elif file_format == "edf":
289
+ constructor = EDFVolume
290
+ elif file_format == "tiff":
291
+ constructor = TIFFVolume
292
+ else:
293
+ raise NotImplementedError
294
+ file_path = location
295
+ volume = constructor(
296
+ folder=os.path.dirname(file_path),
297
+ volume_basename=os.path.basename(file_path),
298
+ )
299
+ else:
300
+ raise ValueError(f"file_format {file_format} is not handled for now")
301
+ res[cor] = volume.get_identifier()
302
+ return res
303
+
304
+
226
305
  class _NabuMode(_Enum):
227
306
  FULL_FIELD = "standard acquisition"
228
307
  HALF_ACQ = "half acquisition"
@@ -302,24 +381,6 @@ class _NabuProcessing(_Enum):
302
381
  return (_NabuProcessing.RECONSTRUCTION,)
303
382
 
304
383
 
305
- class ConfigurationLevel(_Enum):
306
- REQUIRED = "required"
307
- OPTIONAL = "optional"
308
- ADVANCED = "advanced"
309
-
310
- def _get_num_value(self) -> int:
311
- if self is self.REQUIRED:
312
- return 0
313
- elif self is self.OPTIONAL:
314
- return 1
315
- elif self is self.ADVANCED:
316
- return 2
317
-
318
- def __le__(self, other):
319
- assert isinstance(other, ConfigurationLevel)
320
- return self._get_num_value() <= other._get_num_value()
321
-
322
-
323
384
  class _NabuPostProcessing(_Enum):
324
385
  """Define all the post processing action available"""
325
386
 
@@ -374,9 +435,12 @@ class _NabuPaddingType(_Enum):
374
435
  EDGES = "edges"
375
436
 
376
437
 
377
- class _RingCorrectionMethod(_Enum):
438
+ class RingCorrectionMethod(_Enum):
378
439
  NONE = "None"
379
440
  MUNCH = "munch"
441
+ VO = "vo"
442
+ MEAN_SUBTRACTION = "mean-subtraction"
443
+ MEAN_DIVISION = "mean-division"
380
444
 
381
445
 
382
446
  def nabu_std_err_has_error(errs: typing.Optional[bytes]):
@@ -390,10 +454,19 @@ def nabu_std_err_has_error(errs: typing.Optional[bytes]):
390
454
  return (
391
455
  "warning" in line
392
456
  or "Warning" in line
457
+ or "cupyx.jit.rawkernel" in line
393
458
  or "deprecated" in line
394
459
  or line.replace(" ", "") == ""
395
460
  or "unable to load" in line
396
461
  or "deprecated" in line
462
+ or "self.module = SourceModule(self.src, **self.sourcemodule_kwargs)"
463
+ in line
464
+ or "return SourceModule(" in line
465
+ or "CUBLAS" in line
466
+ or "Not supported for EDF"
467
+ in line # debatable but very disturbing from the gui side... anyway EDF days are coming to an end
468
+ or "PerformanceWarning" in line
469
+ or "jitify._init_module()" in line
397
470
  )
398
471
 
399
472
  if errs is None:
@@ -435,3 +508,68 @@ def update_cfg_file_after_transfer(config_file_path, old_path, new_path):
435
508
  config=config_as_dict,
436
509
  options_level="advanced",
437
510
  )
511
+
512
+
513
+ def slice_index_to_int(
514
+ slice_index: typing.Union[int, str],
515
+ scan: TomwerScanBase,
516
+ axis=NabuPlane.XY,
517
+ ) -> int:
518
+ """
519
+ cast a slice to an index. The slice can be a string in ['first', 'last', 'middle']
520
+ """
521
+ axis = NabuPlane.from_value(axis)
522
+ if slice_index == "fisrt":
523
+ return 0
524
+ elif slice_index == "last":
525
+ if scan is None:
526
+ # backward compatibility in the case the scan is not provided. Should not happen anymore
527
+ _logger.warning("Scan not provided. Consider the 2048 width detector")
528
+ return 2047
529
+ elif scan.dim_2 is not None:
530
+ return scan.dim_2 - 1
531
+ else:
532
+ # this could happen on some EDF scans. Not expected to happen for HDF5
533
+ _logger.warning("unable to get dim size, guess this is 2048 width")
534
+ # in this
535
+ return 2047
536
+ elif slice_index == "middle":
537
+ if scan is None:
538
+ # backward compatibility in the case the scan is not provided. Should not happen anymore
539
+ _logger.warning("Scan not provided. Consider the 1024 width detector")
540
+ # default middle.
541
+ return 1024
542
+ elif axis is NabuPlane.XY:
543
+ if scan.dim_2 is None:
544
+ _logger.warning("unable to get dim size, guess this is 2048 height")
545
+ return 1024
546
+ else:
547
+ return scan.dim_2 // 2
548
+ elif axis in (NabuPlane.YZ, NabuPlane.XZ):
549
+ if scan.dim_1 is None:
550
+ _logger.warning("unable to get dim size, guess this is 2048 width")
551
+ return 1024
552
+ else:
553
+ return scan.dim_1 // 2
554
+ else:
555
+ raise ValueError(f"axis {axis} is not handled")
556
+ else:
557
+ return int(slice_index)
558
+
559
+
560
+ def get_nabu_multicor_file_prefix(scan):
561
+ if isinstance(scan, EDFTomoScan):
562
+ dataset_path = scan.path
563
+ elif isinstance(scan, NXtomoScan):
564
+ dataset_path = scan.master_file
565
+ else:
566
+ raise TypeError(f"{type(scan)} is not handled")
567
+
568
+ if os.path.isfile(dataset_path): # hdf5
569
+ file_prefix = os.path.basename(dataset_path).split(".")[0]
570
+ elif os.path.isdir(dataset_path):
571
+ file_prefix = os.path.basename(dataset_path)
572
+ else:
573
+ raise ValueError(f"dataset location {scan.path} is neither a file or directory")
574
+ file_prefix += "_rec" # avoid overwriting dataset
575
+ return file_prefix
@@ -0,0 +1,108 @@
1
+ from __future__ import annotations
2
+ import os
3
+ import logging
4
+ from silx.utils.enum import Enum as _Enum
5
+ from tomwer.io.utils.raw_and_processed_data import (
6
+ to_processed_data_path,
7
+ to_raw_data_path,
8
+ )
9
+ from tomwer.core.scan.scanbase import TomwerScanBase
10
+ from tomwer.core.utils.scanutils import format_output_location
11
+
12
+ _logger = logging.getLogger(__name__)
13
+
14
+
15
+ PROCESS_FOLDER_NAME = "reconstructed_volumes"
16
+
17
+
18
+ class ProcessDataOutputDirMode(_Enum):
19
+ IN_SCAN_FOLDER = "same folder as scan"
20
+ PROCESSED_DATA_FOLDER = "PROCESSED_DATA folder"
21
+ RAW_DATA_FOLDER = "RAW_DATA folder"
22
+ OTHER = "other"
23
+
24
+
25
+ class NabuOutputFileFormat(_Enum):
26
+ TIFF = "tiff"
27
+ HDF5 = "hdf5"
28
+ JP2K = "jp2"
29
+ EDF = "edf"
30
+ RAW = "vol"
31
+
32
+ @classmethod
33
+ def from_value(cls, value):
34
+ if isinstance(value, str):
35
+ value = value.lstrip(".")
36
+ return super().from_value(value)
37
+
38
+
39
+ def get_file_format(file_str):
40
+ extension = os.path.splitext(file_str.lower())[-1]
41
+ extension = extension.lstrip(".")
42
+ if extension in ("tiff", "tif"):
43
+ return NabuOutputFileFormat.TIFF
44
+ elif extension in ("hdf5", "hdf", "h5"):
45
+ return NabuOutputFileFormat.HDF5
46
+ elif extension in ("jp2", "jp2k", "jpg2k"):
47
+ return NabuOutputFileFormat.JP2K
48
+ elif extension in ("edf",):
49
+ return NabuOutputFileFormat.EDF
50
+ elif extension in ("vol", "raw"):
51
+ return NabuOutputFileFormat.RAW
52
+ else:
53
+ raise ValueError(f"Unrecognized file extension {extension} from {file_str}")
54
+
55
+
56
+ def get_output_folder_from_scan(
57
+ mode: ProcessDataOutputDirMode,
58
+ scan: TomwerScanBase,
59
+ nabu_location: str | None,
60
+ file_basename: str,
61
+ file_format: NabuOutputFileFormat,
62
+ ) -> tuple[str, str]:
63
+ """
64
+ :return: (location, location_cfg_files). Location is the nabu configuration field 'output/location' 'location_cfg_files' is the information on where to save the nabu configuration file
65
+
66
+ """
67
+ output_mode = ProcessDataOutputDirMode.from_value(mode)
68
+ file_format = NabuOutputFileFormat.from_value(file_format)
69
+
70
+ if output_mode is ProcessDataOutputDirMode.OTHER and nabu_location in ("", None):
71
+ _logger.info(
72
+ "output dir requested is other bit no path provided. Fall back on the output dir to the scan folder"
73
+ )
74
+ # note: this is only an info because we expect to pass by this one for all .ows configuration (before 1.3 version)
75
+ # as there was no different option by the time
76
+ output_mode = ProcessDataOutputDirMode.IN_SCAN_FOLDER
77
+
78
+ if output_mode is ProcessDataOutputDirMode.OTHER:
79
+ assert nabu_location not in (
80
+ "",
81
+ None,
82
+ ), "nabu_location not provided when expected"
83
+ location = format_output_location(nabu_location, scan=scan)
84
+ location_cfg_files = location
85
+ elif output_mode in (
86
+ ProcessDataOutputDirMode.IN_SCAN_FOLDER,
87
+ ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER,
88
+ ProcessDataOutputDirMode.RAW_DATA_FOLDER,
89
+ ):
90
+ # otherwise default location will be the data root level
91
+ location = os.path.join(scan.path, PROCESS_FOLDER_NAME)
92
+ location_cfg_files = location
93
+ if file_format in (
94
+ NabuOutputFileFormat.EDF.value,
95
+ NabuOutputFileFormat.TIFF.value,
96
+ NabuOutputFileFormat.JP2K.value,
97
+ ): # if user specify the location
98
+ location = "/".join([location, file_basename])
99
+ if output_mode is ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER:
100
+ location = to_processed_data_path(location)
101
+ location_cfg_files = to_processed_data_path(location_cfg_files)
102
+ if output_mode is ProcessDataOutputDirMode.RAW_DATA_FOLDER:
103
+ location = to_raw_data_path(location)
104
+ location_cfg_files = to_raw_data_path(location_cfg_files)
105
+ else:
106
+ raise NotImplementedError(f"mode {output_mode.value} is not implemented yet")
107
+
108
+ return location, location_cfg_files