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
@@ -0,0 +1,58 @@
1
+ <?xml version='1.0' encoding='utf-8'?>
2
+ <scheme version="2.0" title="Reconstruction of a volume and publication to icat" description="">
3
+ <nodes>
4
+ <node id="0" name="scan selector" qualified_name="orangecontrib.tomwer.widgets.control.DataSelectorOW.DataSelectorOW" project_name="tomwer" version="" title="scan selector" position="(150, 150)" />
5
+ <node id="1" name="reduced darks and flats" qualified_name="orangecontrib.tomwer.widgets.reconstruction.DarkRefAndCopyOW.DarkRefAndCopyOW" project_name="tomwer" version="" title="reduced darks and flats" position="(324.0, 183.0)" />
6
+ <node id="2" name="default center of rotation" qualified_name="orangecontrib.tomwer.widgets.reconstruction.AxisOW.AxisOW" project_name="tomwer" version="" title="default center of rotation" position="(490.0, 218.0)" />
7
+ <node id="3" name="nabu slice reconstruction" qualified_name="orangecontrib.tomwer.widgets.reconstruction.NabuOW.NabuOW" project_name="tomwer" version="" title="nabu slice reconstruction" position="(649.0, 261.0)" />
8
+ <node id="4" name="data viewer" qualified_name="orangecontrib.tomwer.widgets.visualization.DataViewerOW.DataViewerOW" project_name="tomwer" version="" title="data viewer" position="(818.0, 248.0)" />
9
+ <node id="5" name="nabu volume reconstruction" qualified_name="orangecontrib.tomwer.widgets.reconstruction.NabuVolumeOW.NabuVolumeOW" project_name="tomwer" version="" title="nabu volume reconstruction" position="(812.0, 391.0)" />
10
+ <node id="6" name="volume viewer" qualified_name="orangecontrib.tomwer.widgets.visualization.VolumeViewerOW.VolumeViewerOW" project_name="tomwer" version="" title="volume viewer" position="(986.75, 383.25)" />
11
+ <node id="7" name="create raw data screenshots" qualified_name="orangecontrib.tomwer.widgets.icat.RawDataScreenshotCreatorOW.RawDataScreenshotCreatorOW" project_name="tomwer" version="" title="create raw data screenshots" position="(321.0, 509.0)" />
12
+ <node id="8" name="save to gallery and publish" qualified_name="orangecontrib.tomwer.widgets.icat.SaveToGalleryAndPublishOW.SaveToGalleryAndPublishOW" project_name="tomwer" version="" title="save to gallery and publish" position="(506.0, 510.0)" />
13
+ <node id="9" name="save to gallery and publish" qualified_name="orangecontrib.tomwer.widgets.icat.SaveToGalleryAndPublishOW.SaveToGalleryAndPublishOW" project_name="tomwer" version="" title="save to gallery and publish (1)" position="(731.0, 514.0)" />
14
+ <node id="10" name="Publish processed data to icat" qualified_name="orangecontrib.tomwer.widgets.icat.PublishProcessedDataOW.PublishProcessedDataOW" project_name="tomwer" version="" title="Publish processed data to icat" position="(990.0, 514.0)" />
15
+ </nodes>
16
+ <links>
17
+ <link id="0" source_node_id="0" sink_node_id="1" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
18
+ <link id="1" source_node_id="1" sink_node_id="2" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
19
+ <link id="2" source_node_id="2" sink_node_id="3" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
20
+ <link id="3" source_node_id="3" sink_node_id="4" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
21
+ <link id="4" source_node_id="3" sink_node_id="5" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
22
+ <link id="5" source_node_id="5" sink_node_id="6" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
23
+ <link id="6" source_node_id="0" sink_node_id="7" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
24
+ <link id="7" source_node_id="7" sink_node_id="8" source_channel="screenshots" sink_channel="screenshots" enabled="true" source_channel_id="screenshots" sink_channel_id="screenshots" />
25
+ <link id="8" source_node_id="3" sink_node_id="9" source_channel="screenshots" sink_channel="screenshots" enabled="true" source_channel_id="screenshots" sink_channel_id="screenshots" />
26
+ <link id="9" source_node_id="5" sink_node_id="10" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
27
+ </links>
28
+ <annotations>
29
+ <arrow id="0" start="(267.0, 56.0)" end="(194.0, 105.0)" fill="#C1272D" />
30
+ <text id="1" type="text/plain" rect="(276.25, 17.75, 150.0, 31.0)" font-family="Ubuntu" font-size="16">provide dataset</text>
31
+ <text id="2" type="text/plain" rect="(146.0, 597.0, 168.0, 89.0)" font-family="Cantarell" font-size="16">create screenshot for raw projection, raw falt and raw dark</text>
32
+ <text id="3" type="text/plain" rect="(413.0, 612.0, 215.0, 62.0)" font-family="Cantarell" font-size="16">save screenshot to the gallry and publish to icat</text>
33
+ <arrow id="4" start="(630.0, 605.0)" end="(674.0, 573.0)" fill="#C1272D" />
34
+ <arrow id="5" start="(475.99999999999994, 612.0)" end="(477.99999999999994, 568.0)" fill="#C1272D" />
35
+ <arrow id="6" start="(607.0, 387.0)" end="(671.0, 395.0)" fill="#C1272D" />
36
+ <text id="7" type="text/plain" rect="(449.0, 350.0, 150.0, 51.0)" font-family="Cantarell" font-size="16">screenshot of the reconstructed slice</text>
37
+ <arrow id="8" start="(235.0, 592.0)" end="(281.0, 521.0)" fill="#C1272D" />
38
+ <text id="9" type="text/plain" rect="(901.0, 618.0, 179.0, 70.0)" font-family="Cantarell" font-size="16">publish reconstructed volume to icat</text>
39
+ <arrow id="10" start="(980.0, 621.0)" end="(981.0, 579.0)" fill="#C1272D" />
40
+ </annotations>
41
+ <thumbnail />
42
+ <node_properties>
43
+ <properties node_id="0" format="literal">{'_scanIDs': [], 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
44
+ <properties node_id="1" format="literal">{'_ewoks_default_inputs': {'data': None, 'dark_ref_params': None}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
45
+ <properties node_id="2" format="literal">{'_ewoks_default_inputs': {'data': None, 'axis_params': {'MODE': 'manual', 'POSITION_VALUE': None, 'CALC_INPUT_TYPE': 'transmission_nopag', 'ANGLE_MODE': '0-180', 'USE_SINOGRAM': False, 'SINOGRAM_LINE': '', 'SINOGRAM_SUBSAMPLING': 10, 'AXIS_URL_1': '', 'AXIS_URL_2': '', 'LOOK_AT_STDMAX': False, 'NEAR_WX': 5, 'FINE_STEP_X': 0.1, 'SCALE_IMG2_TO_IMG1': False, 'NEAR_POSITION': 0.0, 'PADDING_MODE': 'edge', 'FLIP_LR': True, 'COMPOSITE_OPTS': {'theta': 10, 'n_subsampling_y': 10, 'oversampling': 4, 'take_log': True, 'near_pos': 0, 'near_width': 20}, 'SIDE': 'all', 'COR_OPTIONS': ''}, 'gui': {'mode_is_lock': False, 'value_is_lock': False, 'auto_update_estimated_cor': True}}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
46
+ <properties node_id="3" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_params': None}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
47
+ <properties node_id="4" format="literal">{'_viewer_config': {}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
48
+ <properties node_id="5" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_volume_params': None, 'nabu_params': None}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
49
+ <properties node_id="6" format="literal">{'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
50
+ <properties node_id="7" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
51
+ <properties node_id="8" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
52
+ <properties node_id="9" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
53
+ <properties node_id="10" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
54
+ </node_properties>
55
+ <session_state>
56
+ <window_groups />
57
+ </session_state>
58
+ </scheme>
@@ -22,9 +22,10 @@
22
22
  #
23
23
  #############################################################################
24
24
 
25
- import sysconfig
26
-
27
- import pkg_resources
25
+ try:
26
+ from orangecanvas.utils.pkgmeta import get_distribution
27
+ except ImportError:
28
+ from pkg_resources import get_distribution
28
29
 
29
30
  ICON = "../widgets/icons/tomwer.png"
30
31
 
@@ -33,12 +34,13 @@ BACKGROUND = "#C0CCFF"
33
34
 
34
35
  # Entry point for main Orange categories/widgets discovery
35
36
  def widget_discovery(discovery):
36
- dist = pkg_resources.get_distribution("tomwer")
37
+ dist = get_distribution("tomwer")
37
38
  pkgs = [
38
39
  "orangecontrib.tomwer.widgets.cluster",
39
40
  "orangecontrib.tomwer.widgets.control",
40
41
  "orangecontrib.tomwer.widgets.debugtools",
41
42
  "orangecontrib.tomwer.widgets.edit",
43
+ # "orangecontrib.tomwer.widgets.icat",
42
44
  "orangecontrib.tomwer.widgets.reconstruction",
43
45
  # "orangecontrib.tomwer.widgets.stitching",
44
46
  "orangecontrib.tomwer.widgets.visualization",
@@ -53,11 +55,9 @@ WIDGET_HELP_PATH = (
53
55
  # You still need to build help pages using
54
56
  # make htmlhelp
55
57
  # inside doc folder
56
- ("/build/sphinx/htmlhelp/index.html", None),
57
- #
58
- # Documentation included in wheel
59
- # Correct DATA_FILES entry is needed in setup.py and documentation has to be built
60
- # # before the wheel is created.
61
- (f"{sysconfig.get_path('data')}/help/tomwer/index.html", None),
62
- ("http://www.silx.org/pub/doc/tomwer/htmlhelp/0.9/", None),
58
+ # (
59
+ # "/home/payno/Documents/dev/tomography/tomwer/build/html/canvas/widgets/widgets.html",
60
+ # None,
61
+ # ),
62
+ ("https://tomwer.readthedocs.io/en/latest/canvas/widgets/widgets.html", None),
63
63
  )
@@ -13,7 +13,7 @@ import tomwer.core.process.control.datadiscovery
13
13
  from orangecontrib.tomwer.widgets.utils import WidgetLongProcessing
14
14
  from tomwer.core.scan.blissscan import BlissScan
15
15
  from tomwer.core.scan.edfscan import EDFTomoScan
16
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
16
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
17
17
  from tomwer.core.scan.scanbase import TomwerScanBase
18
18
  from tomwer.core.scan.scanfactory import ScanFactory
19
19
  from tomwer.core.scan.scantype import ScanType
@@ -217,7 +217,7 @@ class _DiscoverThread(qt.QThread):
217
217
  ):
218
218
  self.sigDataFound.emit(scan)
219
219
  elif (
220
- isinstance(scan, HDF5TomoScan)
220
+ isinstance(scan, NXtomoScan)
221
221
  and self._research_type is ScanType.NX_TOMO
222
222
  ):
223
223
  self.sigDataFound.emit(scan)
@@ -35,9 +35,9 @@ from orangewidget.widget import Input, Output, OWBaseWidget
35
35
  from silx.gui import qt
36
36
 
37
37
  import tomwer.core.process.control.scanlist
38
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
38
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
39
39
  from tomwer.core.scan.scanbase import TomwerScanBase
40
- from tomwer.gui.control.datalist import GenericScanListDialog
40
+ from tomwer.gui.control.datalist import GenericScanListWindow
41
41
 
42
42
  logger = logging.getLogger(__name__)
43
43
 
@@ -73,19 +73,21 @@ class DataListOW(OWBaseWidget, openclass=True):
73
73
  :param parent: the parent widget
74
74
  """
75
75
  super().__init__(parent)
76
- self.widget = GenericScanListDialog(parent=self)
76
+
77
+ self.widget = GenericScanListWindow(parent=self)
78
+ self.widget.setWindowFlags(qt.Qt.Widget)
77
79
  self.widget.sigUpdated.connect(self._updateSettings)
78
80
  self._loadSettings()
79
81
  layout = gui.vBox(self.mainArea, self.name).layout()
80
82
  layout.addWidget(self.widget)
81
- self.widget._sendButton.clicked.connect(self._sendList)
83
+ self.widget._widget._sendButton.clicked.connect(self._sendList)
82
84
 
83
85
  # expose API
84
86
  self.n_scan = self.widget.n_scan
85
87
 
86
88
  # alias used for the 'simple workflow' for now
87
89
  self.start = self._sendList
88
- self.clear = self.widget.clear
90
+ self.clear = self.widget._widget.clear
89
91
 
90
92
  def _sendList(self):
91
93
  """Send a signal for each list to the next widget"""
@@ -107,8 +109,8 @@ class DataListOW(OWBaseWidget, openclass=True):
107
109
  # kept for backward compatibility since 0.11. To be removed on the future version.
108
110
  if "@" in scan:
109
111
  entry, file_path = scan.split("@")
110
- hdf5_tomo_scan = HDF5TomoScan(entry=entry, scan=file_path)
111
- self.add(hdf5_tomo_scan)
112
+ nxtomo_scan = NXtomoScan(entry=entry, scan=file_path)
113
+ self.add(nxtomo_scan)
112
114
  else:
113
115
  self.add(scan)
114
116
 
@@ -258,12 +258,12 @@ class DataListenerOW(
258
258
 
259
259
  def _jsonRPCConfigChanged(self):
260
260
  self._blissConfiguration = self._widget.getBlissServerConfiguration()
261
- self._static_input[ # pylint: disable=E1137
262
- "bliss_server_configuration"
263
- ] = self._widget.getBlissServerConfiguration()
264
- self._static_input[ # pylint: disable=E1137
265
- "output_dir"
266
- ] = self._widget.getOutputFolder()
261
+ self._static_input["bliss_server_configuration"] = ( # pylint: disable=E1137
262
+ self._widget.getBlissServerConfiguration()
263
+ )
264
+ self._static_input["output_dir"] = ( # pylint: disable=E1137
265
+ self._widget.getOutputFolder()
266
+ )
267
267
  if self.is_active():
268
268
  self.activate(False)
269
269
  self.activate(True)
@@ -35,7 +35,7 @@ from orangewidget.widget import Input, Output, OWBaseWidget
35
35
  from silx.gui import qt
36
36
 
37
37
  import tomwer.core.process.control.scanselector
38
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
38
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
39
39
  from tomwer.core.scan.scanbase import TomwerScanBase
40
40
  from tomwer.gui.control.scanselectorwidget import ScanSelectorWidget
41
41
 
@@ -72,22 +72,21 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
72
72
  super().__init__(parent)
73
73
 
74
74
  self.widget = ScanSelectorWidget(parent=self)
75
+ self.widget.setWindowFlags(qt.Qt.Widget)
75
76
  self._loadSettings()
76
77
 
77
78
  self.widget.sigUpdated.connect(self._updateSettings)
78
79
  self.widget.sigSelectionChanged.connect(self.changeSelection)
79
80
  layout = gui.vBox(self.mainArea, self.name).layout()
80
81
  layout.addWidget(self.widget)
81
- # expose API
82
- self.setActiveScan = self.widget.setActiveData
83
- self.selectAll = self.widget.selectAll
84
- self.n_scan = self.widget.n_scan
85
- self.add = self.widget.add
86
82
 
87
83
  @Inputs.data
88
84
  def addScan(self, scan, *args, **kwargs):
85
+ self.add(scan)
86
+
87
+ def add(self, scan):
89
88
  if scan is not None:
90
- self.widget.add(scan)
89
+ self.widget.add(scan=scan)
91
90
 
92
91
  def changeSelection(self, list_objs):
93
92
  if list_objs is None:
@@ -105,7 +104,9 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
105
104
  """send output signals for each selected items"""
106
105
  sItem = self.widget.dataList.selectedItems()
107
106
  if sItem and len(sItem) >= 1:
108
- selection = [_item.text() for _item in sItem]
107
+ selection = [
108
+ _item.data(qt.Qt.UserRole).get_identifier().to_str() for _item in sItem
109
+ ]
109
110
  self.changeSelection(list_objs=selection)
110
111
 
111
112
  def _loadSettings(self):
@@ -114,8 +115,8 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
114
115
  # kept for backward compatibility since 0.11. To be removed on the future version.
115
116
  if "@" in scan:
116
117
  entry, file_path = scan.split("@")
117
- hdf5_tomo_scan = HDF5TomoScan(entry=entry, scan=file_path)
118
- self.addScan(hdf5_tomo_scan)
118
+ nxtomo_scan = NXtomoScan(entry=entry, scan=file_path)
119
+ self.addScan(nxtomo_scan)
119
120
  else:
120
121
  self.addScan(scan)
121
122
 
@@ -132,3 +133,13 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
132
133
  self.widget.removeSelectedDatasets()
133
134
  else:
134
135
  super().keyPressEvent(event)
136
+
137
+ # expose API
138
+ def setActiveScan(self, data):
139
+ self.widget.setActiveData(data=data)
140
+
141
+ def selectAll(self):
142
+ return self.widget.selectAll()
143
+
144
+ def n_scan(self):
145
+ return self.widget.n_scan()
@@ -166,12 +166,12 @@ class DataValidatorOW(SuperviseOW):
166
166
  def _updateSettings(self):
167
167
  viewer = self._widget._centralWidget
168
168
  self._viewer_config["mode"] = viewer.getDisplayMode() # pylint: disable=E1137
169
- self._viewer_config[ # pylint: disable=E1137
170
- "slice_opt"
171
- ] = viewer.getSliceOption()
172
- self._viewer_config[ # pylint: disable=E1137
173
- "radio_opt"
174
- ] = viewer.getRadioOption()
169
+ self._viewer_config["slice_opt"] = ( # pylint: disable=E1137
170
+ viewer.getSliceOption()
171
+ )
172
+ self._viewer_config["radio_opt"] = ( # pylint: disable=E1137
173
+ viewer.getRadioOption()
174
+ )
175
175
 
176
176
  def _setSettings(self, settings):
177
177
  viewer = self._widget._centralWidget
@@ -38,7 +38,7 @@ from orangecontrib.tomwer.orange.managedprocess import TomwerWithStackStack
38
38
  from orangecontrib.tomwer.widgets.control.NXTomomillMixIn import NXTomomillMixIn
39
39
  from tomwer.core.process.control.nxtomomill import EDFToNxProcess
40
40
  from tomwer.core.scan.edfscan import EDFTomoScan
41
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
41
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
42
42
  from tomwer.gui.control.datalist import EDFDataListMainWindow
43
43
 
44
44
  logger = logging.getLogger(__name__)
@@ -54,7 +54,7 @@ class EDF2NXOW(
54
54
  to HDF5scan.
55
55
  """
56
56
 
57
- name = "edf2nx-nxtomomill"
57
+ name = "nxtomomill - edf2nx (Spec-EDF)"
58
58
  id = "orange.widgets.tomwer.control.NXTomomillOW.EDF2NXOW"
59
59
  description = "Convert folders with .edf to .nx"
60
60
  icon = "icons/edf2nx.svg"
@@ -79,6 +79,12 @@ class EDF2NXOW(
79
79
 
80
80
  LOGGER = logger
81
81
 
82
+ _ewoks_inputs_to_hide_from_orange = (
83
+ "edf_to_nx_configuration",
84
+ "progress",
85
+ "serialize_output_data",
86
+ )
87
+
82
88
  def __init__(self, parent=None):
83
89
  self.__configuration_cache = None
84
90
  # cache updated for each folder in order to match `_execute_ewoks_task` design
@@ -89,7 +95,7 @@ class EDF2NXOW(
89
95
  self.widget = EDFDataListMainWindow(parent=self)
90
96
  _layout.addWidget(self.widget)
91
97
  # for edf default output path is still the 'near to input file'
92
- self.widget._dialog._nxTomomillOutputWidget._closeToBlissFileRB.setChecked(True)
98
+ self.widget._dialog._nxTomomillOutputWidget._inScanFolder.setChecked(True)
93
99
  # add 'convert auto' check box
94
100
  self._convertAutoCB = qt.QCheckBox(
95
101
  "convert automatically when edf scan send through 'edf scan' channel", self
@@ -109,7 +115,12 @@ class EDF2NXOW(
109
115
  edf_to_nx_configuration=EDFConfig().to_dict(),
110
116
  )
111
117
 
112
- self.task_output_changed_callbacks.add(self._notify_state)
118
+ if isinstance(self.task_output_changed_callbacks, set):
119
+ self.task_output_changed_callbacks.add(self._notify_state)
120
+ elif isinstance(self.task_output_changed_callbacks, list):
121
+ self.task_output_changed_callbacks.append(self._notify_state)
122
+ else:
123
+ raise NotImplementedError
113
124
 
114
125
  # handle settings
115
126
  self._loadSettings()
@@ -175,8 +186,14 @@ class EDF2NXOW(
175
186
  edf_to_nx_configuration=self.__configuration_cache.to_dict()
176
187
  )
177
188
 
178
- self.notify_on_going(scan=HDF5TomoScan(output_file, output_entry))
179
- self._execute_ewoks_task(propagate=True)
189
+ self.notify_on_going(scan=NXtomoScan(output_file, output_entry))
190
+ try:
191
+ self._execute_ewoks_task( # pylint: disable=E1123
192
+ propagate=True,
193
+ log_missing_inputs=False,
194
+ )
195
+ except Exception:
196
+ self._execute_ewoks_task(propagate=True) # pylint: disable=E1123
180
197
 
181
198
  def get_task_inputs(self):
182
199
  return {
@@ -204,7 +221,7 @@ class EDF2NXOW(
204
221
  task_suceeded = task_executor.succeeded
205
222
  config = task_executor.current_task.inputs.edf_to_nx_configuration
206
223
  config = EDFConfig.from_dict(config)
207
- scan = HDF5TomoScan(
224
+ scan = NXtomoScan(
208
225
  config.output_file,
209
226
  "entry",
210
227
  )
@@ -4,14 +4,14 @@ from orangewidget.settings import Setting
4
4
  from silx.gui import qt
5
5
  from ewoksorange.bindings.owwidgets import OWEwoksWidgetNoThread
6
6
 
7
- import tomwer.core.process.control.email
8
- from tomwer.gui.control.email import Emailwidget
9
- from tomwer.core.utils import concatenate_dict
7
+ import tomwer.core.process.control.emailnotifier
8
+ from tomwer.gui.control.emailnotifier import Emailwidget
9
+ from tomwer.core.utils.dictutils import concatenate_dict
10
10
 
11
11
 
12
12
  class EmailOW(
13
13
  OWEwoksWidgetNoThread,
14
- ewokstaskclass=tomwer.core.process.control.email.TomoEmailTask,
14
+ ewokstaskclass=tomwer.core.process.control.emailnotifier.TomoEmailTask,
15
15
  ):
16
16
  """
17
17
  This widget will browse a folder and sub folder to find valid tomo scan project.
@@ -36,9 +36,9 @@ class NXTomomillMixIn:
36
36
  assert (
37
37
  self.CONFIG_CLS is not None
38
38
  ), "inheriting classes are expected to redefine CONFIG_CLS"
39
- self._ewoks_default_inputs[
40
- "nxtomomill_cfg_file"
41
- ] = cfg_file # pylint: disable=E1137
39
+ self._ewoks_default_inputs["nxtomomill_cfg_file"] = (
40
+ cfg_file # pylint: disable=E1137
41
+ )
42
42
 
43
43
  if os.path.exists(cfg_file):
44
44
  try:
@@ -39,9 +39,12 @@ from orangecontrib.tomwer.orange.managedprocess import TomwerWithStackStack
39
39
  from orangecontrib.tomwer.widgets.control.NXTomomillMixIn import NXTomomillMixIn
40
40
  from tomwer.core.process.control.nxtomomill import H5ToNxProcess
41
41
  from tomwer.core.scan.blissscan import BlissScan
42
- from tomwer.core.scan.hdf5scan import HDF5TomoScan, HDF5TomoScanIdentifier
42
+ from tomwer.core.scan.nxtomoscan import NXtomoScan, NXtomoScanIdentifier
43
43
  from tomwer.gui.control.datalist import BlissHDF5DataListMainWindow
44
44
  from tomwer.gui.control.nxtomomill import NXTomomillInput, OverwriteMessage
45
+ from tomwer.core.process.output import ProcessDataOutputDirMode
46
+ from ewoksorange.bindings.owwidgets import invalid_data
47
+
45
48
 
46
49
  logger = logging.getLogger(__name__)
47
50
 
@@ -56,7 +59,7 @@ class NXTomomillOW(
56
59
  to HDF5scan.
57
60
  """
58
61
 
59
- name = "bliss(HDF5)-nxtomomill"
62
+ name = "nxtomomill h52nx (bliss-HDF5)"
60
63
  id = "orange.widgets.tomwer.control.NXTomomillOW.NXTomomillOW"
61
64
  description = (
62
65
  "Read a bliss .h5 file and extract from it all possible"
@@ -74,6 +77,7 @@ class NXTomomillOW(
74
77
  "NXTomo",
75
78
  "tomography",
76
79
  "nxtomomill",
80
+ "h52nx",
77
81
  ]
78
82
 
79
83
  want_main_area = True
@@ -84,6 +88,12 @@ class NXTomomillOW(
84
88
 
85
89
  LOGGER = logger
86
90
 
91
+ _ewoks_inputs_to_hide_from_orange = (
92
+ "h5_to_nx_configuration",
93
+ "progress",
94
+ "serialize_output_data",
95
+ )
96
+
87
97
  def __init__(self, parent=None):
88
98
  TomwerWithStackStack.__init__(self, parent=parent)
89
99
  NXTomomillMixIn.__init__(self)
@@ -113,7 +123,12 @@ class NXTomomillOW(
113
123
  self.update_default_inputs(
114
124
  h5_to_nx_configuration=HDF5Config().to_dict(),
115
125
  )
116
- self.task_output_changed_callbacks.add(self._notify_state)
126
+ if isinstance(self.task_output_changed_callbacks, set):
127
+ self.task_output_changed_callbacks.add(self._notify_state)
128
+ elif isinstance(self.task_output_changed_callbacks, list):
129
+ self.task_output_changed_callbacks.append(self._notify_state)
130
+ else:
131
+ raise NotImplementedError
117
132
 
118
133
  # handle settings
119
134
  self._loadSettings()
@@ -124,13 +139,14 @@ class NXTomomillOW(
124
139
  # kept for backward compatibility since 0.11. To be removed on the future version.
125
140
  if "@" in scan:
126
141
  entry, file_path = scan.split("@")
127
- hdf5_tomo_scan = HDF5TomoScan(entry=entry, scan=file_path)
128
- self.add(hdf5_tomo_scan)
142
+ nxtomo_scan = NXtomoScan(entry=entry, scan=file_path)
143
+ self.add(nxtomo_scan)
129
144
  else:
130
145
  self._scans.append(scan)
131
- self._ewoks_default_inputs[ # pylint: disable=E1137
132
- "output_dir"
133
- ] = self.widget.getOutputFolder()
146
+ output_dir = self.widget.getOutputFolder()
147
+ if isinstance(output_dir, ProcessDataOutputDirMode):
148
+ output_dir = output_dir.value
149
+ self._ewoks_default_inputs["output_dir"] = output_dir # pylint: disable=E1137
134
150
 
135
151
  @property
136
152
  def request_input(self):
@@ -152,15 +168,13 @@ class NXTomomillOW(
152
168
  """
153
169
  # for now we want to avoid propagation any processing.
154
170
  # task will be executed only when the user validates the dialog
155
- h5_scan = super().get_task_inputs().get("hdf5_scan", None)
156
- if h5_scan is not None:
157
- if not isinstance(h5_scan, H5ToNxProcess):
158
- raise TypeError(
159
- "hdf5_scan is expected to be an instance of HDF5TomoScan"
160
- )
161
- self.add(h5_scan.path)
171
+ bliss_scan = super().get_task_inputs().get("bliss_scan", None)
172
+ if bliss_scan is not None:
173
+ if not isinstance(bliss_scan, BlissScan):
174
+ raise TypeError("bliss_scan is expected to be an instance of BlissScan")
175
+ self.add(bliss_scan.master_file)
162
176
 
163
- def _convertAndSend(self, bliss_url):
177
+ def _convertAndSend(self, bliss_url: str):
164
178
  """
165
179
 
166
180
  :param str bliss_url: string at entry@file format
@@ -170,7 +184,7 @@ class NXTomomillOW(
170
184
  copy(self.get_default_input_values()["h5_to_nx_configuration"])
171
185
  )
172
186
 
173
- identifier = HDF5TomoScanIdentifier.from_str(bliss_url)
187
+ identifier = NXtomoScanIdentifier.from_str(bliss_url)
174
188
  bliss_scan = BlissScan(
175
189
  master_file=identifier.file_path,
176
190
  entry=identifier.data_path,
@@ -235,7 +249,13 @@ class NXTomomillOW(
235
249
  self.update_default_inputs(
236
250
  h5_to_nx_configuration=self.__configuration_cache.to_dict()
237
251
  )
238
- self._execute_ewoks_task(propagate=True)
252
+ try:
253
+ self._execute_ewoks_task( # pylint: disable=E1123
254
+ propagate=True,
255
+ log_missing_inputs=False,
256
+ )
257
+ except Exception:
258
+ self._execute_ewoks_task(propagate=True) # pylint: disable=E1123
239
259
 
240
260
  def _loadSettings(self):
241
261
  for scan in self._scans:
@@ -279,23 +299,27 @@ class NXTomomillOW(
279
299
  # reset the GUI for input (reset all the cache for answers)
280
300
  self._canOverwriteOutputs = False
281
301
  for bliss_url in self.widget.datalist.selectedItems():
282
- identifier = HDF5TomoScanIdentifier.from_str(bliss_url.text())
302
+ data = bliss_url.data(qt.Qt.UserRole)
303
+ assert isinstance(data, NXtomoScan)
304
+ identifier = data.get_identifier()
283
305
  self._inputGUI.setBlissScan(
284
306
  entry=identifier.data_path, file_path=identifier.file_path
285
307
  )
286
- self._convertAndSend(bliss_url.text())
308
+ self._convertAndSend(identifier.to_str())
287
309
 
288
310
  def _sendAll(self):
289
311
  """Send a signal for each scan found to the next widget"""
290
312
  self._inputGUI = NXTomomillInput()
291
313
  # reset the GUI for input (reset all the cache for answers)
292
314
  self._canOverwriteOutputs = False
293
- for bliss_url in self.widget.datalist.selectedItems():
294
- identifier = HDF5TomoScanIdentifier.from_str(bliss_url.text())
315
+ for bliss_url in self.widget.datalist._myitems.values():
316
+ data = bliss_url.data(qt.Qt.UserRole)
317
+ identifier = data.get_identifier()
318
+ assert isinstance(data, NXtomoScan)
295
319
  self._inputGUI.setBlissScan(
296
320
  entry=identifier.data_path, file_path=identifier.file_path
297
321
  )
298
- self._convertAndSend(bliss_url.text())
322
+ self._convertAndSend(identifier.to_str())
299
323
 
300
324
  def _notify_state(self):
301
325
  try:
@@ -310,3 +334,20 @@ class NXTomomillOW(
310
334
  self.notify_failed(scan=scan)
311
335
  except Exception as e:
312
336
  logger.error(f"failed to handle task finished callback. Raiseon is {e}")
337
+
338
+ def trigger_downstream(self) -> None:
339
+ for ewoksname, var in self.get_task_outputs().items():
340
+ # note: for now we want to trigger 'data' for each items of 'datas'
341
+ if ewoksname == "serie" and not (
342
+ invalid_data.is_invalid_data(var.value) or var.value is None
343
+ ):
344
+ for data in var.value:
345
+ data_channel = self._get_output_signal("data")
346
+ data_channel.send(data)
347
+ serie_channel = self._get_output_signal("serie")
348
+ # then send the list of value / serie (also know as datas)
349
+ serie_channel.send(var.value)
350
+ elif ewoksname == "data" and not (
351
+ invalid_data.is_invalid_data(var.value) or var.value is None
352
+ ):
353
+ pass # handle by 'serie' in this case