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
@@ -6,7 +6,7 @@ from nabu.io.reader import load_images_from_dataurl_dict
6
6
  from nabu.app.prepare_weights_double import create_heli_maps
7
7
 
8
8
  from tomwer.core.process.task import TaskWithProgress
9
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
9
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
10
10
  from tomwer.core.utils.scanutils import format_output_location
11
11
 
12
12
 
@@ -17,8 +17,10 @@ class NabuHelicalPrepareWeightsDouble(
17
17
  TaskWithProgress,
18
18
  input_names=(
19
19
  "data",
20
- "transition_width",
20
+ "transition_width_vertical",
21
+ "transition_width_horizontal",
21
22
  "processes_file",
23
+ "rotation_axis_position",
22
24
  ),
23
25
  optional_input_names=("progress",),
24
26
  output_names=("data",),
@@ -26,8 +28,8 @@ class NabuHelicalPrepareWeightsDouble(
26
28
  def run(self):
27
29
  # TODO: handle future /cluster config ???
28
30
  scan = self.inputs.data
29
- if not isinstance(scan, HDF5TomoScan):
30
- raise TypeError(f"data is expected to be an instance of {HDF5TomoScan}")
31
+ if not isinstance(scan, NXtomoScan):
32
+ raise TypeError(f"data is expected to be an instance of {NXtomoScan}")
31
33
  dataset_info = HDF5DatasetAnalyzer(
32
34
  scan.master_file,
33
35
  extra_options={"h5_entry": scan.entry},
@@ -48,7 +50,9 @@ class NabuHelicalPrepareWeightsDouble(
48
50
  profile=mappe,
49
51
  process_file_name=scan.helical.processes_files,
50
52
  entry_name=scan.entry,
51
- transition_width=self.inputs.transition_width,
53
+ transition_width_vertical=self.inputs.transition_width_vertical,
54
+ transition_width_horizontal=self.inputs.transition_width_horizontal,
55
+ rotation_axis_position=self.inputs.rotation_axis_position,
52
56
  )
53
57
 
54
58
  self.outputs.data = scan
@@ -39,29 +39,37 @@ import uuid
39
39
  from typing import Iterable, Optional, Union
40
40
  import signal
41
41
  import psutil
42
+ import sys
42
43
 
43
44
  import numpy
44
45
  from silx.io.url import DataUrl
45
- from silx.utils.enum import Enum as _Enum
46
+ from silx.io.utils import open as open_hdf5
46
47
  from sluurp.executor import submit as submit_to_slurm_cluster
47
48
  from sluurp.job import SBatchScriptJob
48
49
  from tomoscan.io import HDF5File
49
50
  from tomoscan.normalization import Method as INormMethod
51
+ from tomoscan.identifier import VolumeIdentifier
50
52
 
53
+ from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
51
54
  from tomwer.core.cluster.cluster import SlurmClusterConfiguration
52
55
  from tomwer.core.process.reconstruction.nabu.target import Target
53
56
  from tomwer.core.process.reconstruction.nabu.utils import (
54
57
  _NabuPhaseMethod,
55
58
  nabu_std_err_has_error,
56
59
  )
60
+ from tomwer.core.process.reconstruction.output import (
61
+ ProcessDataOutputDirMode,
62
+ get_output_folder_from_scan,
63
+ NabuOutputFileFormat,
64
+ )
57
65
  from tomwer.core.process.reconstruction.normalization.params import (
58
66
  _ValueSource as INormSource,
59
67
  )
60
68
  from tomwer.core.scan.edfscan import EDFTomoScan
61
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
69
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
62
70
  from tomwer.core.scan.scanbase import TomwerScanBase
63
- from tomwer.core.utils.scanutils import format_output_location
64
71
  from tomwer.core.utils.slurm import get_slurm_script_name, is_slurm_available
72
+ from tomwer.core.volume.volumefactory import VolumeFactory
65
73
 
66
74
  from . import settings, utils
67
75
 
@@ -85,37 +93,6 @@ else:
85
93
  has_nabu = True
86
94
 
87
95
 
88
- class NabuOutputFileFormat(_Enum):
89
- TIFF = "tiff"
90
- HDF5 = "hdf5"
91
- JP2K = "jp2"
92
- EDF = "edf"
93
- RAW = "vol"
94
-
95
- @classmethod
96
- def from_value(cls, value):
97
- if isinstance(value, str):
98
- value = value.lstrip(".")
99
- return super().from_value(value)
100
-
101
-
102
- def get_file_format(file_str):
103
- extension = os.path.splitext(file_str.lower())[-1]
104
- extension = extension.lstrip(".")
105
- if extension in ("tiff", "tif"):
106
- return NabuOutputFileFormat.TIFF
107
- elif extension in ("hdf5", "hdf", "h5"):
108
- return NabuOutputFileFormat.HDF5
109
- elif extension in ("jp2", "jp2k", "jpg2k"):
110
- return NabuOutputFileFormat.JP2K
111
- elif extension in ("edf",):
112
- return NabuOutputFileFormat.EDF
113
- elif extension in ("vol", "raw"):
114
- return NabuOutputFileFormat.RAW
115
- else:
116
- raise ValueError(f"Unrecognized file extension {extension} from {file_str}")
117
-
118
-
119
96
  class ResultsRun:
120
97
  """
121
98
  Base class of results for nabu
@@ -165,24 +142,44 @@ class ResultsLocalRun(ResultsWithStd):
165
142
 
166
143
  def __init__(
167
144
  self,
168
- results_urls: tuple,
145
+ results_identifiers: tuple,
169
146
  *args,
170
147
  **kwargs,
171
148
  ) -> None:
172
149
  super().__init__(*args, **kwargs)
173
- if not isinstance(results_urls, Iterable):
150
+ if not isinstance(results_identifiers, Iterable):
174
151
  raise TypeError(
175
- f"results_urls is expected to be an Iterable not {type(results_urls)}"
152
+ f"results_urls is expected to be an Iterable not {type(results_identifiers)}"
176
153
  )
177
- self.__results_urls = results_urls
154
+
155
+ # check all identifiers
156
+ def check_identifier(identifier):
157
+ if isinstance(identifier, str):
158
+ vol = VolumeFactory.create_tomo_object_from_identifier(
159
+ identifier=identifier
160
+ )
161
+ return vol.get_identifier()
162
+ elif not isinstance(identifier, VolumeIdentifier):
163
+ raise TypeError(
164
+ f"identifiers are expected to be VolumeIdentifier. Get {type(identifier)} instead."
165
+ )
166
+ else:
167
+ return identifier
168
+
169
+ self.__results_identifiers = tuple(
170
+ [
171
+ check_identifier(identifier=identifier)
172
+ for identifier in results_identifiers
173
+ ]
174
+ )
178
175
 
179
176
  @property
180
- def results_urls(self) -> tuple:
181
- return self.__results_urls
177
+ def results_identifiers(self) -> tuple:
178
+ return self.__results_identifiers
182
179
 
183
180
  def __str__(self) -> str:
184
181
  res = super().__str__()
185
- res += f"\n - result urls: {self.results_urls}"
182
+ res += f"\n - result urls: {self.results_identifiers}"
186
183
  return res
187
184
 
188
185
 
@@ -231,6 +228,7 @@ class _NabuBaseReconstructor:
231
228
  target: Target,
232
229
  cluster_config: Optional[Union[dict, SlurmClusterConfiguration]],
233
230
  process_name: str,
231
+ axis: NabuPlane = NabuPlane.XY,
234
232
  ) -> None:
235
233
  self._scan = scan
236
234
  self._target = Target.from_value(target)
@@ -238,6 +236,7 @@ class _NabuBaseReconstructor:
238
236
  self._process_name = process_name
239
237
  self._process = None
240
238
  self._cancelled = False
239
+ self._axis = NabuPlane.from_value(axis)
241
240
  # nabu subprocess if run locally
242
241
  if isinstance(cluster_config, SlurmClusterConfiguration):
243
242
  self._cluster_config = cluster_config
@@ -270,6 +269,10 @@ class _NabuBaseReconstructor:
270
269
  def process_name(self):
271
270
  return self._process_name
272
271
 
272
+ @property
273
+ def axis(self) -> NabuPlane:
274
+ return self._axis
275
+
273
276
  def only_create_config_file(self):
274
277
  """Should we run the reconstruction or only create the configuration file"""
275
278
  return False
@@ -287,8 +290,6 @@ class _NabuBaseReconstructor:
287
290
  config_to_dump: dict,
288
291
  config_file: str,
289
292
  file_format: str,
290
- start_z: Optional[int],
291
- end_z: Optional[int],
292
293
  info: Optional[str],
293
294
  process_name: str,
294
295
  ):
@@ -308,8 +309,7 @@ class _NabuBaseReconstructor:
308
309
  conf_file=config_file,
309
310
  file_format=file_format,
310
311
  config_to_dump=config_to_dump,
311
- start_z=start_z,
312
- end_z=end_z,
312
+ axis=config_to_dump["reconstruction"].get("slice_plane", "XY"),
313
313
  )
314
314
  elif self.target is Target.SLURM:
315
315
  _logger.info(
@@ -319,8 +319,6 @@ class _NabuBaseReconstructor:
319
319
  conf_file=config_file,
320
320
  config_to_dump=config_to_dump,
321
321
  cluster_config=self.cluster_config.to_dict(),
322
- start_z=start_z,
323
- end_z=end_z,
324
322
  process_name=process_name,
325
323
  info=info,
326
324
  )
@@ -341,11 +339,10 @@ class _NabuBaseReconstructor:
341
339
 
342
340
  def _run_nabu_locally(
343
341
  self,
342
+ axis: NabuPlane,
344
343
  conf_file: str,
345
344
  file_format: str,
346
345
  config_to_dump: dict,
347
- start_z: int,
348
- end_z: int,
349
346
  ) -> ResultsLocalRun:
350
347
  """
351
348
  run locally nabu for a single configuration file.
@@ -365,7 +362,7 @@ class _NabuBaseReconstructor:
365
362
 
366
363
  command = " ".join(
367
364
  (
368
- "python3",
365
+ sys.executable,
369
366
  "-m",
370
367
  settings.NABU_FULL_FIELD_APP_PATH,
371
368
  conf_file,
@@ -396,13 +393,11 @@ class _NabuBaseReconstructor:
396
393
  slice_index=None,
397
394
  scan=self.scan,
398
395
  file_format=file_format,
399
- start_z=start_z,
400
- end_z=end_z,
401
- expects_single_slice=self.EXPECTS_SINGLE_SLICE,
396
+ axis=axis,
402
397
  )
403
398
  return ResultsLocalRun(
404
399
  success=not nabu_std_err_has_error(errs),
405
- results_urls=recons_urls,
400
+ results_identifiers=recons_urls,
406
401
  std_out=outs,
407
402
  std_err=errs,
408
403
  config=config_to_dump, # config_slices,
@@ -413,8 +408,6 @@ class _NabuBaseReconstructor:
413
408
  conf_file: str,
414
409
  config_to_dump: dict,
415
410
  cluster_config: dict,
416
- start_z: int,
417
- end_z: int,
418
411
  process_name: str,
419
412
  info: str,
420
413
  ) -> ResultSlurmRun:
@@ -521,26 +514,28 @@ class _NabuBaseReconstructor:
521
514
  "delta_beta"
522
515
  ][0]
523
516
  db = round(float(config["phase"]["delta_beta"]))
517
+ # retrieve axis used
518
+ axis = config.get("reconstruction", {}).get("slice_plane", "XY")
519
+
524
520
  # handle output
525
521
  if "output" in config:
526
- _file_name = self._get_file_basename_reconstruction(pag=pag, db=db, ctf=ctf)
522
+ _file_name = self._get_file_basename_reconstruction(
523
+ pag=pag, db=db, ctf=ctf, axis=axis
524
+ )
527
525
  config["output"]["file_prefix"] = _file_name
528
- location = config["output"].get("location", None)
529
- if location not in ("", None):
530
- location = format_output_location(location, scan=self.scan)
531
- location_cfg_files = location
532
- else:
533
- # otherwise default location will be the data root level
534
- location = self.scan.path
535
- location_cfg_files = location
536
- # TODO: if is a single file - append prefix
537
- if config["output"].get("file_format") in (
538
- NabuOutputFileFormat.EDF.value,
539
- NabuOutputFileFormat.TIFF.value,
540
- NabuOutputFileFormat.JP2K.value,
541
- ): # if user specify the location
542
- location = "/".join([location, _file_name])
543
-
526
+ location, location_cfg_files = get_output_folder_from_scan(
527
+ mode=ProcessDataOutputDirMode.from_value(
528
+ config["output"].get(
529
+ "output_dir_mode", ProcessDataOutputDirMode.OTHER
530
+ )
531
+ ),
532
+ nabu_location=config["output"].get("location", None),
533
+ scan=self.scan,
534
+ file_basename=_file_name,
535
+ file_format=config["output"].get(
536
+ "file_format", NabuOutputFileFormat.HDF5
537
+ ),
538
+ )
544
539
  # add reconstruction path to the list. scan `reconstruction_paths` register all the existing path where
545
540
  # reconstruction are saved in order to be able to browse them all
546
541
  self.scan.add_reconstruction_path(location)
@@ -587,9 +582,7 @@ class _NabuBaseReconstructor:
587
582
  # if an url exists insure we can access it
588
583
  dataset_url = DataUrl(path=dataset_url)
589
584
  if os.path.exists(dataset_url.file_path()):
590
- with HDF5File(
591
- dataset_url.file_path(), mode="r", swmr="True"
592
- ) as h5f:
585
+ with open_hdf5(dataset_url.file_path()) as h5f:
593
586
  if dataset_url.data_path() not in h5f:
594
587
  dataset_url = None
595
588
  else:
@@ -624,7 +617,7 @@ class _NabuBaseReconstructor:
624
617
  raise NotImplementedError(f"source type {source.value} is not handled")
625
618
  return config, nabu_cfg_folder
626
619
 
627
- def _get_file_basename_reconstruction(self, pag, db, ctf):
620
+ def _get_file_basename_reconstruction(self, pag, db, ctf, axis):
628
621
  """return created file base name"""
629
622
  raise NotImplementedError("Base class")
630
623
 
@@ -661,7 +654,7 @@ def dump_normalization_array_for_nabu(
661
654
  f"array is expected to be a numpy array or a scalar and not {type(array)}"
662
655
  )
663
656
  # save the value to a dedicated path in "nabu_tomwer_serving_hatch"
664
- if isinstance(scan, HDF5TomoScan):
657
+ if isinstance(scan, NXtomoScan):
665
658
  entry_path = scan.entry
666
659
  elif isinstance(scan, EDFTomoScan):
667
660
  entry_path = "entry"