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,169 +1,184 @@
1
- # import logging
2
-
3
- # from orangewidget import gui
4
- # from orangewidget.settings import Setting
5
- # from orangewidget.widget import Input, Output
6
- # from orangecontrib.tomwer.orange.managedprocess import TomwerWithStackStack
7
- # from silx.gui import qt
8
- # from typing import Optional
9
-
10
- # from tomwer.core.futureobject import FutureTomwerObject
11
- # from tomwer.core.scan.scanbase import TomwerScanBase
12
- # from tomwer.gui.reconstruction.nabu.helical import HelicalPrepareWeightsDouble
13
- # from tomwer.core.process.reconstruction.nabu.helical import (
14
- # NabuHelicalPrepareWeightsDouble,
15
- # )
16
- # from tomwer.core.scan.hdf5scan import HDF5TomoScan
17
-
18
- # _logger = logging.getLogger(__name__)
19
-
20
-
21
- # class NabuHelicalPrepareWeightsDoubleOW(
22
- # TomwerWithStackStack,
23
- # ewokstaskclass=NabuHelicalPrepareWeightsDouble,
24
- # ):
25
- # """
26
- # widget used to call the `nabu-helical-prepare-weights-double` application on a dedicated thread. It define weights map and double flat field.
27
-
28
- # :param parent: the parent widget
29
- # """
30
-
31
- # # note of this widget should be the one registered on the documentation
32
- # name = "helical prerate weights double"
33
- # id = "orangecontrib.tomwer.widgets.reconstruction.NabuHelicalPrepareWeightsDoubleOW.NabuHelicalPrepareWeightsDoubleOW"
34
- # description = "compute map of weights requested for nabu helical reconstruction"
35
- # icon = "icons/nabu_prepare_weights_double.svg"
36
- # priority = 199
37
- # keywords = [
38
- # "tomography",
39
- # "nabu",
40
- # "reconstruction",
41
- # "nabu-helical",
42
- # "helical",
43
- # "weights",
44
- # "prepare",
45
- # ]
46
-
47
- # want_main_area = True
48
- # want_control_area = False
49
- # resizing_enabled = True
50
-
51
- # _ewoks_default_inputs = Setting(
52
- # {
53
- # "data": None,
54
- # "transition_width": 50,
55
- # "processes_file": "",
56
- # }
57
- # )
58
-
59
- # sigScanReady = qt.Signal(TomwerScanBase)
60
- # "Signal emitted when a scan is ended"
61
-
62
- # TIMEOUT = 30
63
-
64
- # class Inputs:
65
- # data = Input(
66
- # name="data",
67
- # type=TomwerScanBase,
68
- # doc="one scan to be process",
69
- # default=True,
70
- # multiple=False,
71
- # )
72
-
73
- # class Outputs:
74
- # data = Output(name="data", type=TomwerScanBase, doc="one scan to be process")
75
- # future_tomo_obj = Output(
76
- # name="future_tomo_obj",
77
- # type=FutureTomwerObject,
78
- # doc="future object (process remotely)",
79
- # )
80
-
81
- # LOGGER = _logger
82
-
83
- # def __init__(self, parent=None):
84
- # super().__init__(parent)
85
- # self.__scan = None
86
-
87
- # # gui definition
88
- # _layout = gui.vBox(self.mainArea, self.name).layout()
89
- # self.widget = HelicalPrepareWeightsDouble(parent=self)
90
- # _layout.addWidget(self.widget)
91
-
92
- # ## connect signal / slot
93
- # self.widget.sigConfigChanged.connect(self._updateSettings)
94
-
95
- # self.task_output_changed_callbacks.add(self._notify_state)
96
-
97
- # ## handle settings
98
- # self._loadSettings()
99
- # self.task_executor_queue.sigComputationStarted.connect(self._newTaskStarted)
100
-
101
- # def _updateSettings(self):
102
- # config = self.widget.getConfiguration()
103
- # for key in ("transition_width", "processes_file"):
104
- # self._ewoks_default_inputs[key] = config[key] # pylint: disable=E1137
105
-
106
- # @property
107
- # def request_input(self):
108
- # return self.__request_input
109
-
110
- # @request_input.setter
111
- # def request_input(self, request):
112
- # self.__request_input = request
113
-
114
- # def get_task_inputs(self):
115
- # assert self.__scan is not None
116
- # return {
117
- # "data": self.__scan,
118
- # "transition_width": self.widget.getConfiguration()["transition_width"],
119
- # "processes_file": self.widget.getConfiguration()["processes_file"],
120
- # }
121
-
122
- # def handleNewSignals(self) -> None:
123
- # """Invoked by the workflow signal propagation manager after all
124
- # signals handlers have been called.
125
- # """
126
- # # for now we want to avoid propagation any processing.
127
- # # task will be executed only when the user validates the dialog
128
- # data = super().get_task_inputs().get("data", None)
129
- # if data is not None:
130
- # if not isinstance(data, HDF5TomoScan):
131
- # raise TypeError(
132
- # f"data is expected to be an instance of HDF5TomoScan. {type(data)} are not handled"
133
- # )
134
- # self.add(data.path)
135
-
136
- # def _loadSettings(self):
137
- # self.widget.setConfiguration(self._ewoks_default_inputs)
138
-
139
- # def _newTaskStarted(self):
140
- # try:
141
- # task_executor = self.sender()
142
- # scan = task_executor.current_task.inputs.data
143
- # self.notify_on_going(scan)
144
- # except Exception:
145
- # pass
146
-
147
- # def _notify_state(self):
148
- # try:
149
- # task_executor = self.sender()
150
- # task_suceeded = task_executor.succeeded
151
- # scan = task_executor.current_task.outputs.data
152
- # if task_suceeded:
153
- # self.notify_succeed(scan=scan)
154
- # else:
155
- # self.notify_failed(scan=scan)
156
- # except Exception as e:
157
- # _logger.error(f"failed to handle task finished callback. Raiseon is {e}")
158
-
159
- # @Inputs.data
160
- # def process_data(self, scan: Optional[TomwerScanBase]):
161
- # if scan is None:
162
- # return
163
- # else:
164
- # self.__scan = scan
165
- # self.notify_pending(scan=scan)
166
- # self.execute_ewoks_task()
167
-
168
- # def sizeHint(self) -> qt.QSize:
169
- # return qt.QSize(650, 60)
1
+ import logging
2
+
3
+ from orangewidget import gui
4
+ from orangewidget.settings import Setting
5
+ from orangewidget.widget import Input, Output
6
+ from orangecontrib.tomwer.orange.managedprocess import TomwerWithStackStack
7
+ from silx.gui import qt
8
+ from typing import Optional
9
+
10
+ from tomwer.core.futureobject import FutureTomwerObject
11
+ from tomwer.core.scan.scanbase import TomwerScanBase
12
+ from tomwer.gui.reconstruction.nabu.helical import HelicalPrepareWeightsDouble
13
+ from tomwer.core.process.reconstruction.nabu.helical import (
14
+ NabuHelicalPrepareWeightsDouble,
15
+ )
16
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
17
+
18
+ _logger = logging.getLogger(__name__)
19
+
20
+
21
+ class NabuHelicalPrepareWeightsDoubleOW(
22
+ TomwerWithStackStack,
23
+ ewokstaskclass=NabuHelicalPrepareWeightsDouble,
24
+ ):
25
+ """
26
+ widget used to call the `nabu-helical-prepare-weights-double` application on a dedicated thread. It define weights map and double flat field.
27
+
28
+ :param parent: the parent widget
29
+ """
30
+
31
+ # note of this widget should be the one registered on the documentation
32
+ name = "helical prerate weights double"
33
+ id = "orangecontrib.tomwer.widgets.reconstruction.NabuHelicalPrepareWeightsDoubleOW.NabuHelicalPrepareWeightsDoubleOW"
34
+ description = "compute map of weights requested for nabu helical reconstruction"
35
+ icon = "icons/nabu_prepare_weights_double.svg"
36
+ priority = 199
37
+ keywords = [
38
+ "tomography",
39
+ "nabu",
40
+ "reconstruction",
41
+ "nabu-helical",
42
+ "helical",
43
+ "weights",
44
+ "prepare",
45
+ ]
46
+
47
+ want_main_area = True
48
+ want_control_area = False
49
+ resizing_enabled = True
50
+
51
+ _ewoks_default_inputs = Setting(
52
+ {
53
+ "data": None,
54
+ "transition_width_vertical": 50,
55
+ "transition_width_horizontal": 50,
56
+ "processes_file": "",
57
+ "rotation_axis_position": 0,
58
+ }
59
+ )
60
+
61
+ _ewoks_inputs_to_hide_from_orange = (
62
+ "progress",
63
+ "processes_file",
64
+ "transition_width_vertical",
65
+ "transition_width_horizontal",
66
+ "rotation_axis_position",
67
+ )
68
+
69
+ sigScanReady = qt.Signal(TomwerScanBase)
70
+ "Signal emitted when a scan is ended"
71
+
72
+ TIMEOUT = 30
73
+
74
+ class Inputs:
75
+ data = Input(
76
+ name="data",
77
+ type=TomwerScanBase,
78
+ doc="one scan to be process",
79
+ default=True,
80
+ multiple=False,
81
+ )
82
+
83
+ class Outputs:
84
+ data = Output(name="data", type=TomwerScanBase, doc="one scan to be process")
85
+ future_tomo_obj = Output(
86
+ name="future_tomo_obj",
87
+ type=FutureTomwerObject,
88
+ doc="future object (process remotely)",
89
+ )
90
+
91
+ LOGGER = _logger
92
+
93
+ def __init__(self, parent=None):
94
+ super().__init__(parent)
95
+ self.__scan = None
96
+
97
+ # gui definition
98
+ _layout = gui.vBox(self.mainArea, self.name).layout()
99
+ self.widget = HelicalPrepareWeightsDouble(parent=self)
100
+ _layout.addWidget(self.widget)
101
+
102
+ ## connect signal / slot
103
+ self.widget.sigConfigChanged.connect(self._updateSettings)
104
+
105
+ if isinstance(self.task_output_changed_callbacks, set):
106
+ self.task_output_changed_callbacks.add(self._notify_state)
107
+ elif isinstance(self.task_output_changed_callbacks, list):
108
+ self.task_output_changed_callbacks.append(self._notify_state)
109
+ else:
110
+ raise NotImplementedError
111
+
112
+ ## handle settings
113
+ self._loadSettings()
114
+ self.task_executor_queue.sigComputationStarted.connect(self._newTaskStarted)
115
+
116
+ def _updateSettings(self):
117
+ config = self.widget.getConfiguration()
118
+ for key in ("transition_width", "processes_file"):
119
+ self._ewoks_default_inputs[key] = config[key] # pylint: disable=E1137
120
+
121
+ @property
122
+ def request_input(self):
123
+ return self.__request_input
124
+
125
+ @request_input.setter
126
+ def request_input(self, request):
127
+ self.__request_input = request
128
+
129
+ def get_task_inputs(self):
130
+ assert self.__scan is not None
131
+ return {
132
+ "data": self.__scan,
133
+ "transition_width": self.widget.getConfiguration()["transition_width"],
134
+ "processes_file": self.widget.getConfiguration()["processes_file"],
135
+ }
136
+
137
+ def handleNewSignals(self) -> None:
138
+ """Invoked by the workflow signal propagation manager after all
139
+ signals handlers have been called.
140
+ """
141
+ # for now we want to avoid propagation any processing.
142
+ # task will be executed only when the user validates the dialog
143
+ data = super().get_task_inputs().get("data", None)
144
+ if data is not None:
145
+ if not isinstance(data, NXtomoScan):
146
+ raise TypeError(
147
+ f"data is expected to be an instance of NXtomoScan. {type(data)} are not handled"
148
+ )
149
+ self.add(data.path)
150
+
151
+ def _loadSettings(self):
152
+ self.widget.setConfiguration(self._ewoks_default_inputs)
153
+
154
+ def _newTaskStarted(self):
155
+ try:
156
+ task_executor = self.sender()
157
+ scan = task_executor.current_task.inputs.data
158
+ self.notify_on_going(scan)
159
+ except Exception:
160
+ pass
161
+
162
+ def _notify_state(self):
163
+ try:
164
+ task_executor = self.sender()
165
+ task_suceeded = task_executor.succeeded
166
+ scan = task_executor.current_task.outputs.data
167
+ if task_suceeded:
168
+ self.notify_succeed(scan=scan)
169
+ else:
170
+ self.notify_failed(scan=scan)
171
+ except Exception as e:
172
+ _logger.error(f"failed to handle task finished callback. Raiseon is {e}")
173
+
174
+ @Inputs.data
175
+ def process_data(self, scan: Optional[TomwerScanBase]):
176
+ if scan is None:
177
+ return
178
+ else:
179
+ self.__scan = scan
180
+ self.notify_pending(scan=scan)
181
+ self.execute_ewoks_task()
182
+
183
+ def sizeHint(self) -> qt.QSize:
184
+ return qt.QSize(650, 60)
@@ -28,6 +28,7 @@ __license__ = "MIT"
28
28
  __date__ = "14/02/2020"
29
29
 
30
30
 
31
+ import os
31
32
  import copy
32
33
  import logging
33
34
  from contextlib import AbstractContextManager
@@ -44,6 +45,10 @@ from tomwer.core.futureobject import FutureTomwerObject
44
45
  from tomwer.core.process.reconstruction.nabu.nabuslices import NabuSlicesTask
45
46
  from tomwer.core.scan.scanbase import TomwerScanBase, _TomwerBaseDock
46
47
  from tomwer.core.volume.volumefactory import VolumeFactory
48
+ from tomwer.core.process.icat.gallery import (
49
+ IcatScreenshots,
50
+ deduce_dataset_gallery_location,
51
+ )
47
52
  from tomwer.gui.reconstruction.nabu.slices import NabuWindow
48
53
  from tomwer.synctools.stacks.reconstruction.nabu import NabuSliceProcessStack
49
54
 
@@ -109,6 +114,12 @@ class NabuOW(WidgetLongProcessing, SuperviseOW):
109
114
 
110
115
  slice_urls = Output(name="slice urls", type=tuple, doc="tuple of urls created")
111
116
 
117
+ screenshots = Output(
118
+ name="screenshots",
119
+ type=IcatScreenshots,
120
+ doc="screenshots that can be saved",
121
+ )
122
+
112
123
  class DialogCM(AbstractContextManager):
113
124
  """Simple context manager to hide / show button dialogs"""
114
125
 
@@ -262,7 +273,19 @@ class NabuOW(WidgetLongProcessing, SuperviseOW):
262
273
  )
263
274
  if len(slice_urls) > 0:
264
275
  slice_urls = tuple(slice_urls)
276
+ # provide list of reconstructed slices
265
277
  self.Outputs.slice_urls.send(slice_urls)
278
+ # provide list of screenshots
279
+ self.Outputs.screenshots.send(
280
+ IcatScreenshots(
281
+ data_dir=deduce_dataset_gallery_location(scan),
282
+ screenshots={
283
+ os.path.splitext(os.path.basename(url.file_path()))[0]: url
284
+ for url in slice_urls
285
+ },
286
+ scan=scan,
287
+ )
288
+ )
266
289
 
267
290
  self.sigScanReady.emit(scan)
268
291
  if future_tomo_obj is not None:
@@ -45,6 +45,11 @@ from orangecontrib.tomwer.widgets.utils import WidgetLongProcessing
45
45
  from tomwer.core import settings
46
46
  from tomwer.core.cluster import SlurmClusterConfiguration
47
47
  from tomwer.core.futureobject import FutureTomwerObject
48
+ from tomwer.core.process.icat.gallery import (
49
+ IcatScreenshots,
50
+ deduce_dataset_gallery_location,
51
+ select_screenshot_from_volume,
52
+ )
48
53
  from tomwer.core.process.reconstruction.nabu import utils as nabu_utils
49
54
  from tomwer.core.process.reconstruction.nabu.nabuvolume import NabuVolumeTask
50
55
  from tomwer.core.scan.scanbase import TomwerScanBase
@@ -123,6 +128,11 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
123
128
  volume_urls = Output(
124
129
  name="volume urls", type=tuple, doc="url of the volume(s) reconstructed"
125
130
  )
131
+ screenshots = Output(
132
+ name="screenshots",
133
+ type=IcatScreenshots,
134
+ doc="screenshots that can be saved",
135
+ )
126
136
 
127
137
  class DialogCM(AbstractContextManager):
128
138
  """Simple context manager to hida / show button dialogs"""
@@ -172,7 +182,7 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
172
182
 
173
183
  if nabu_volume_params not in (dict(), None):
174
184
  try:
175
- self._nabuWidget.setConfiguration(nabu_volume_params)
185
+ self.setConfiguration(nabu_volume_params)
176
186
  except Exception:
177
187
  _logger.warning("fail to load reconstruction settings")
178
188
 
@@ -213,14 +223,19 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
213
223
  config = scan.nabu_recons_params
214
224
  # update output format if requested
215
225
  if self._nabuWidget._mainWidget.redefineNabuFileFormat():
216
- config.get("output")[
226
+ config["output"][
217
227
  "file_format"
218
228
  ] = self._nabuWidget._mainWidget.getNabuFileFormat()
219
229
  # update output location if requested
220
230
  if self._nabuWidget._mainWidget.redefineOutputLocation():
221
- config.get("output")["location"] = format_output_location(
222
- location=self._nabuWidget._mainWidget.getNabuOutputLocation(),
223
- scan=scan,
231
+ location = self._nabuWidget._mainWidget.getNabuOutputLocation()
232
+ if location is not None:
233
+ location = format_output_location(location=location, scan=scan)
234
+ config["output"]["location"] = location
235
+ config["output"][
236
+ "output_dir_mode"
237
+ ] = (
238
+ self._nabuWidget._mainWidget._outputLocationWidget.getOutputDirMode().value
224
239
  )
225
240
 
226
241
  if "phase" in config and "delta_beta" in config["phase"]:
@@ -314,7 +329,26 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
314
329
  assert isinstance(volume_id, VolumeIdentifier)
315
330
  volume_urls.extend(VolumeFactory.from_identifier_to_vol_urls(volume_id))
316
331
  if len(volume_urls) > 0:
332
+ # send list of reconcstructed volume
317
333
  self.Outputs.volume_urls.send(tuple(volume_urls))
334
+ # send list of screenshots
335
+ screenshots = {}
336
+ [
337
+ screenshots.update(
338
+ select_screenshot_from_volume(
339
+ VolumeFactory.create_tomo_object_from_identifier(volume_id)
340
+ )
341
+ )
342
+ for volume_id in scan.latest_vol_reconstructions
343
+ ]
344
+ self.Outputs.screenshots.send(
345
+ IcatScreenshots(
346
+ data_dir=deduce_dataset_gallery_location(scan),
347
+ screenshots=screenshots,
348
+ scan=scan,
349
+ ),
350
+ )
351
+
318
352
  # send volume identifier(s) # only one expected
319
353
  n_rec_volumes = len(scan.latest_vol_reconstructions)
320
354
  if n_rec_volumes > 0:
@@ -43,9 +43,9 @@ from silx.gui import qt
43
43
  import tomwer.core.process.reconstruction.saaxis.saaxis
44
44
  from orangecontrib.tomwer.orange.managedprocess import SuperviseOW
45
45
  from orangecontrib.tomwer.orange.settings import CallbackSettingsHandler
46
- from tomwer.core import settings, utils
46
+ from tomwer.core import settings
47
+ from tomwer.core.utils.lbsram import is_low_on_memory
47
48
  from tomwer.core.cluster import SlurmClusterConfiguration
48
- from tomwer.core.futureobject import FutureTomwerObject
49
49
  from tomwer.core.process.reconstruction.axis import AxisTask
50
50
  from tomwer.core.process.reconstruction.saaxis.saaxis import SAAxisTask
51
51
  from tomwer.core.scan.scanbase import TomwerScanBase, _TomwerBaseDock
@@ -270,12 +270,14 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
270
270
  Details about :ref:`saaxis score calculation`
271
271
  """
272
272
 
273
- name = "semi-automated center of rotation"
273
+ name = "multi-cor (sa-axis)"
274
274
  id = "orange.widgets.tomwer.sa_axis"
275
- description = "use to compute the center of rotation semi automatic way"
275
+ description = "Reconstruct a slice with different center of rotation (cor) values"
276
276
  icon = "icons/saaxis.png"
277
277
  priority = 21
278
278
  keywords = [
279
+ "multi",
280
+ "multi-cor",
279
281
  "tomography",
280
282
  "semi automatic",
281
283
  "half automatic",
@@ -322,12 +324,6 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
322
324
  class Outputs:
323
325
  data = Output(name="data", type=TomwerScanBase, doc="one scan to be process")
324
326
 
325
- future_out = Output(
326
- name="future_tomo_obj",
327
- type=FutureTomwerObject,
328
- doc="data with some remote processing",
329
- )
330
-
331
327
  def __init__(self, parent=None):
332
328
  """
333
329
 
@@ -347,7 +343,6 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
347
343
 
348
344
  # connect signal / slot
349
345
  self._widget.sigConfigurationChanged.connect(self._updateSettings)
350
- self.destroyed.connect(self._widget.stop)
351
346
  self._widget._processing_stack.sigComputationStarted.connect(
352
347
  self._startProcessing
353
348
  )
@@ -358,6 +353,17 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
358
353
  # expose API
359
354
  self.wait_processing = self._widget.wait_processing
360
355
 
356
+ def getWaitingOverlay(self):
357
+ return self._widget._tabWidget._resultsViewer._plot.getWaiterOverlay()
358
+
359
+ def _startProcessing(self, *args, **kwargs):
360
+ self.getWaitingOverlay().show()
361
+ super()._startProcessing()
362
+
363
+ def _endProcessing(self, *args, **kwargs):
364
+ self.getWaitingOverlay().hide()
365
+ super()._endProcessing()
366
+
361
367
  def __new__(cls, *args, **kwargs):
362
368
  # ensure backward compatibility with 'static_input'
363
369
  static_input = kwargs.get("stored_settings", {}).get("static_input", None)
@@ -404,9 +410,7 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
404
410
  scan.saaxis_params = QSAAxisParams()
405
411
  self._skipCurrentScan(new_scan=scan)
406
412
 
407
- if settings.isOnLbsram(scan) and utils.isLowOnMemory(
408
- settings.get_lbsram_path()
409
- ):
413
+ if settings.isOnLbsram(scan) and is_low_on_memory(settings.get_lbsram_path()):
410
414
  self.notify_skip(
411
415
  scan=scan,
412
416
  details=f"saaxis has been skiped for {scan} because of low space in lbsram",
@@ -484,13 +488,5 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
484
488
  self.show()
485
489
  self._widget.showResults()
486
490
 
487
- def stop(self):
488
- self._widget.stop()
489
-
490
- def close(self):
491
- self.stop()
492
- self._widget = None
493
- super().close()
494
-
495
491
  def getConfiguration(self):
496
492
  return self._widget.getConfiguration()