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
@@ -42,7 +42,7 @@ from silx.gui import qt
42
42
  from silx.io.url import DataUrl
43
43
  from silx.utils.enum import Enum as _Enum
44
44
 
45
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
45
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
46
46
  from tomwer.core.scan.scanbase import TomwerScanBase
47
47
  from tomwer.core.scan.scanfactory import ScanFactory
48
48
  from tomwer.core.utils.image import shift_img
@@ -158,7 +158,7 @@ class _FrameSelector(qt.QWidget):
158
158
  if self._scan.flats is not None:
159
159
  urls = self._scan.flats.values()
160
160
  elif type_selected == self.FrameType.PROJ:
161
- if isinstance(self._scan, HDF5TomoScan):
161
+ if isinstance(self._scan, NXtomoScan):
162
162
  angles_and_urls = self._scan.get_proj_angle_url(with_alignment=False)
163
163
  for angle, url in angles_and_urls.items():
164
164
  urls.append(url)
@@ -267,10 +267,10 @@ class _FramesSelector(qt.QWidget):
267
267
  self._rightSelector.layout().setContentsMargins(0, 0, 0, 0)
268
268
 
269
269
  # signal / slot connection
270
- self._leftSelector.sigCorrectionChanged.connect(self._leftFrameUpdReq)
271
- self._rightSelector.sigCorrectionChanged.connect(self._rightFrameUpdReq)
272
- self._leftSelector.sigSelectedUrlChanged.connect(self._leftFrameUpdReq)
273
- self._rightSelector.sigSelectedUrlChanged.connect(self._rightFrameUpdReq)
270
+ self._leftSelector.sigCorrectionChanged.connect(self.sigLeftFrameUpdateReq)
271
+ self._rightSelector.sigCorrectionChanged.connect(self.sigRightFrameUpdateReq)
272
+ self._leftSelector.sigSelectedUrlChanged.connect(self.sigLeftFrameUpdateReq)
273
+ self._rightSelector.sigSelectedUrlChanged.connect(self.sigRightFrameUpdateReq)
274
274
  self._leftScanCB.sigScanChanged.connect(self._leftScanChanged)
275
275
  self._rightScanCB.sigScanChanged.connect(self._rightScanChanged)
276
276
  self._leftScanCB.sigRequestScanAdd.connect(self._addScanFrmDialogLeft)
@@ -314,12 +314,6 @@ class _FramesSelector(qt.QWidget):
314
314
  def getRightUrl(self):
315
315
  return self._rightSelector.getCurrentUrl()
316
316
 
317
- def _rightFrameUpdReq(self):
318
- self.sigRightFrameUpdateReq.emit()
319
-
320
- def _leftFrameUpdReq(self):
321
- self.sigLeftFrameUpdateReq.emit()
322
-
323
317
  def _addScanFrmDialogLeft(self):
324
318
  self._addScanFrmDialog(link_to="left")
325
319
 
@@ -542,7 +536,7 @@ class _ScanComboBox(qt.QWidget):
542
536
 
543
537
  # connect signal / slot
544
538
  self._scansCB.currentIndexChanged.connect(self._scanChanged)
545
- self._addButton.pressed.connect(self._addScanCallback)
539
+ self._addButton.released.connect(self.sigRequestScanAdd)
546
540
 
547
541
  def clear(self):
548
542
  self._scans = set()
@@ -574,6 +568,3 @@ class _ScanComboBox(qt.QWidget):
574
568
  return None
575
569
  else:
576
570
  return scan
577
-
578
- def _addScanCallback(self):
579
- self.sigRequestScanAdd.emit()
@@ -91,8 +91,8 @@ class TwoFramesShiftTab(qt.QTabWidget, _FrameShiftsBase):
91
91
  self._absoluteShiftWidget = Absolute2FramesShift(self)
92
92
  self.addTab(self._absoluteShiftWidget, self.ShiftMode.ABSOLUTE.value)
93
93
  # connect signal / slot
94
- self._absoluteShiftWidget.sigShiftsChanged.connect(self._propagateSignal)
95
- self._relativeShiftWidget.sigShiftsChanged.connect(self._propagateSignal)
94
+ self._absoluteShiftWidget.sigShiftsChanged.connect(self.sigShiftsChanged)
95
+ self._relativeShiftWidget.sigShiftsChanged.connect(self.sigShiftsChanged)
96
96
  # set up
97
97
  self.setCurrentWidget(self._relativeShiftWidget)
98
98
  self._relativeShiftWidget.setFocus(qt.Qt.OtherFocusReason)
@@ -102,9 +102,6 @@ class TwoFramesShiftTab(qt.QTabWidget, _FrameShiftsBase):
102
102
  def getRelativeShiftWidget(self):
103
103
  return self._relativeShiftWidget
104
104
 
105
- def _propagateSignal(self, shift_infos: tuple):
106
- self.sigShiftsChanged.emit(shift_infos)
107
-
108
105
  def getShiftMode(self):
109
106
  if self.currentWidget() is self._relativeShiftWidget:
110
107
  return self.ShiftMode.RELATIVE
@@ -32,7 +32,7 @@ import logging
32
32
  import weakref
33
33
 
34
34
  from silx.gui import qt
35
- from tomoscan.scanbase import FOV
35
+ from nxtomo.nxobject.nxdetector import FOV
36
36
 
37
37
  from tomwer.core.scan.edfscan import EDFTomoScan
38
38
  from tomwer.core.scan.scanbase import TomwerScanBase
@@ -35,14 +35,8 @@ import logging
35
35
  import weakref
36
36
 
37
37
  from silx.gui import qt
38
-
39
- try:
40
- from silx.gui.plot.ImageStack import ( # noqa F401
41
- PlotWithWaitingLabel as _PlotWithWaitingLabel,
42
- )
43
- except ImportError:
44
- from silx.gui.plot.ImageStack import _PlotWithWaitingLabel # noqa F401
45
-
38
+ from silx.gui.plot import Plot2D
39
+ from silx.gui.widgets.WaitingOverlay import WaitingOverlay
46
40
  from tomwer.gui.settings import Y_AXIS_DOWNWARD
47
41
 
48
42
  _logger = logging.getLogger(__name__)
@@ -72,13 +66,16 @@ class SinogramViewer(qt.QMainWindow):
72
66
  # used to memorize sinogram properties when load it.
73
67
  # Contains (str(scan), line, oversampling)
74
68
 
75
- self._plot = _PlotWithWaitingLabel(parent=self)
76
- self._plot.getPlotWidget().setYAxisInverted(Y_AXIS_DOWNWARD)
77
- plot = self._plot.getPlotWidget()
78
- plot.getDefaultColormap().setVRange(None, None)
79
- plot.setAxesDisplayed(False)
80
- plot.setKeepDataAspectRatio(True)
81
- self._plot.setWaiting(False)
69
+ self._plot = Plot2D(parent=self)
70
+ self._plotWaiter = WaitingOverlay(self._plot)
71
+ self._plotWaiter.hide()
72
+ self._plotWaiter.setIconSize(qt.QSize(30, 30))
73
+
74
+ self._plot.getMaskAction().setVisible(False)
75
+ self._plot.setYAxisInverted(Y_AXIS_DOWNWARD)
76
+ self._plot.getDefaultColormap().setVRange(None, None)
77
+ self._plot.setAxesDisplayed(False)
78
+ self._plot.setKeepDataAspectRatio(True)
82
79
  self._dockOpt = qt.QDockWidget(self)
83
80
  self._options = SinogramOpts(parent=self, orientation=opts_orientation)
84
81
  self._dockOpt.setWidget(self._options)
@@ -95,7 +92,7 @@ class SinogramViewer(qt.QMainWindow):
95
92
  self._loadingThread.finished.connect(self._sinogram_loaded)
96
93
 
97
94
  # expose API
98
- self.getActiveImage = plot.getActiveImage
95
+ self.getActiveImage = self._plot.getActiveImage
99
96
 
100
97
  # set up
101
98
  if scan is not None:
@@ -131,18 +128,12 @@ class SinogramViewer(qt.QMainWindow):
131
128
  self._options.setSubsampling(value)
132
129
 
133
130
  def _updatePlot(self, sinogram):
134
- self._plot.getPlotWidget().addImage(data=sinogram)
135
- self._plot.getPlotWidget().replot()
136
-
137
- def _editionLocked(self, locked):
138
- self.sigAxisEditionLocked.emit(locked)
139
-
140
- def _applyRequested(self):
141
- self.sigApply.emit()
131
+ self._plot.addImage(data=sinogram)
132
+ self._plot.replot()
142
133
 
143
134
  def _sinogram_loaded(self):
144
135
  """callback when the sinogram is loaded"""
145
- self._plot.setWaiting(False)
136
+ self._plotWaiter.hide()
146
137
  if self._scan is None or self._scan() is None:
147
138
  return
148
139
  assert self._sinoInfoCache is not None
@@ -167,7 +158,7 @@ class SinogramViewer(qt.QMainWindow):
167
158
  )
168
159
  return
169
160
  # update scan
170
- self._plot.setWaiting(True)
161
+ self._plotWaiter.show()
171
162
  self.sigSinoLoadStarted.emit()
172
163
  self._sinoInfoCache = (
173
164
  str(self._scan()),
@@ -182,18 +173,14 @@ class SinogramViewer(qt.QMainWindow):
182
173
  self._loadingThread.start()
183
174
 
184
175
  def clear(self):
185
- self._plot.getPlotWidget().clear()
176
+ self._plot.clear()
186
177
 
187
178
  def close(self):
188
- self._stopAnimationThread()
179
+ self._plotWaiter.hide()
189
180
  self._plot.close()
190
181
  self._plot = None
191
182
  super().close()
192
183
 
193
- def _stopAnimationThread(self):
194
- if self._plot is not None:
195
- self._plot.stopUpdateThread()
196
-
197
184
 
198
185
  class _LoadSinoThread(qt.QThread):
199
186
  def init(self, data, line, subsampling):
@@ -272,15 +259,12 @@ class SinogramOpts(qt.QDialog):
272
259
 
273
260
  # connect signal / slot
274
261
  self._buttons.button(qt.QDialogButtonBox.Apply).clicked.connect(
275
- self._updateSinogram
262
+ self.sigUpdateRequested
276
263
  )
277
264
 
278
265
  def setLineSelectionVisible(self, visible):
279
266
  self._lineSelWidget.setVisible(visible)
280
267
 
281
- def _updateSinogram(self):
282
- self.sigUpdateRequested.emit()
283
-
284
268
  def setScan(self, scan):
285
269
  old = self.blockSignals(True)
286
270
  # update line max and value
@@ -37,7 +37,7 @@ import unittest
37
37
  from silx.gui import qt
38
38
  from silx.gui.utils.testutils import TestCaseQt
39
39
 
40
- from tomwer.core.utils.scanutils import MockHDF5
40
+ from tomwer.core.utils.scanutils import MockNXtomo
41
41
  from tomwer.gui.visualization.diffviewer import DiffFrameViewer
42
42
 
43
43
  logging.disable(logging.INFO)
@@ -52,14 +52,14 @@ class TestDiffViewer(TestCaseQt):
52
52
  self._widget.setAttribute(qt.Qt.WA_DeleteOnClose)
53
53
 
54
54
  self.tmp_dir = tempfile.mkdtemp()
55
- self.scan1 = MockHDF5(
55
+ self.scan1 = MockNXtomo(
56
56
  scan_path=os.path.join(self.tmp_dir, "myscan"),
57
57
  n_proj=20,
58
58
  n_ini_proj=20,
59
59
  dim=10,
60
60
  ).scan
61
61
 
62
- self.scan2 = MockHDF5(
62
+ self.scan2 = MockNXtomo(
63
63
  scan_path=os.path.join(self.tmp_dir, "myscan"),
64
64
  n_proj=20,
65
65
  n_ini_proj=20,
@@ -2,11 +2,11 @@ import os
2
2
 
3
3
  import numpy
4
4
  import pytest
5
- from nxtomomill.nexus.nxtomo import NXtomo
5
+ from nxtomo.application.nxtomo import NXtomo
6
6
  from silx.gui import qt
7
- from tomoscan.esrf.scan.hdf5scan import ImageKey
7
+ from nxtomo.nxobject.nxdetector import ImageKey
8
8
 
9
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
9
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
10
10
  from tomwer.gui.visualization.nxtomometadata import NXtomoMetadataViewer
11
11
  from tomwer.tests.conftest import qtapp # noqa F401
12
12
 
@@ -37,7 +37,7 @@ def test_nx_editor(
37
37
  data_path=entry,
38
38
  )
39
39
 
40
- scan = HDF5TomoScan(file_path, entry)
40
+ scan = NXtomoScan(file_path, entry)
41
41
 
42
42
  # 2.0 create the widget and do the edition
43
43
  widget = NXtomoMetadataViewer()
@@ -38,7 +38,7 @@ import unittest
38
38
  from silx.gui import qt
39
39
  from silx.gui.utils.testutils import SignalListener, TestCaseQt
40
40
 
41
- from tomwer.core.utils.scanutils import MockHDF5
41
+ from tomwer.core.utils.scanutils import MockNXtomo
42
42
  from tomwer.gui.visualization import sinogramviewer
43
43
 
44
44
  logging.disable(logging.INFO)
@@ -53,7 +53,7 @@ class TestSinogramViewer(TestCaseQt):
53
53
  self._widget.setAttribute(qt.Qt.WA_DeleteOnClose)
54
54
 
55
55
  self.tmp_dir = tempfile.mkdtemp()
56
- self.scan = MockHDF5(
56
+ self.scan = MockNXtomo(
57
57
  scan_path=os.path.join(self.tmp_dir, "myscan"),
58
58
  n_proj=20,
59
59
  n_ini_proj=20,
@@ -39,7 +39,7 @@ from silx.gui import qt
39
39
  from silx.gui.utils.testutils import TestCaseQt
40
40
  from tomoscan.esrf.volume.edfvolume import EDFVolume
41
41
 
42
- from tomwer.core.utils.scanutils import MockHDF5
42
+ from tomwer.core.utils.scanutils import MockNXtomo
43
43
  from tomwer.gui.stacks import RadioStack, SliceStack
44
44
  from tomwer.tests.utils import skip_gui_test
45
45
 
@@ -67,7 +67,7 @@ class TestSliceStack(TestCaseQt):
67
67
  n_slice_per_scan = 1
68
68
  with tempfile.TemporaryDirectory() as root_dir:
69
69
  for i_scan in range(n_scan):
70
- scan = MockHDF5(
70
+ scan = MockNXtomo(
71
71
  scan_path=os.path.join(root_dir, f"scan{i_scan}"),
72
72
  n_proj=10,
73
73
  n_ini_proj=10,
@@ -103,7 +103,7 @@ class TestRadioStack(TestCaseQt):
103
103
  self.slider = weakref.ref(self._widget._viewer._qslider)
104
104
  self._tmp_dir = tempfile.mkdtemp()
105
105
  os.makedirs(self._tmp_dir, exist_ok=True)
106
- self._scan = MockHDF5(
106
+ self._scan = MockNXtomo(
107
107
  os.path.join(self._tmp_dir, "my_scan"),
108
108
  n_proj=30,
109
109
  dim=10,
@@ -1,84 +1,82 @@
1
- # coding: utf-8
2
- # /*##########################################################################
3
- # Copyright (C) 2016 European Synchrotron Radiation Facility
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
- #
23
- #############################################################################*/
24
-
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "21/06/2021"
29
-
30
-
31
1
  import logging
32
2
  import os
33
- import shutil
34
- import tempfile
35
- import unittest
36
-
3
+ import pytest
37
4
  import numpy
5
+ from time import sleep
6
+
38
7
  from silx.gui import qt
39
- from silx.gui.utils.testutils import TestCaseQt
40
8
  from tomoscan.esrf.volume.hdf5volume import HDF5Volume
9
+ from tomoscan.esrf.volume.tiffvolume import TIFFVolume, has_tifffile
41
10
 
42
- from tomwer.core.utils.scanutils import MockHDF5
11
+ from tomwer.tests.conftest import qtapp # noqa F401
12
+ from tomwer.core.utils.scanutils import MockNXtomo
43
13
  from tomwer.gui.visualization.volumeviewer import VolumeViewer
44
14
 
45
15
  logging.disable(logging.INFO)
46
16
 
47
17
 
48
- class TestDiffViewer(TestCaseQt):
49
- """unit test for the :class:_ImageStack widget"""
18
+ @pytest.mark.skipif(not has_tifffile, reason="tifffile not available")
19
+ def test_volume_viewer(
20
+ qtapp, # noqa F811
21
+ tmp_path,
22
+ ):
23
+ """
24
+ test the volume viewer setting a scan having an HDF5 volume linked to it
25
+ """
26
+
27
+ widget = VolumeViewer(parent=None)
28
+ widget.setAttribute(qt.Qt.WA_DeleteOnClose)
29
+
30
+ tmp_dir = tmp_path / "test_volume_viewer"
31
+ tmp_dir.mkdir()
32
+
33
+ # step 1 - test setting a scan containing a HDF5Volume
34
+ scan = MockNXtomo(
35
+ scan_path=os.path.join(str(tmp_dir), "myscan"),
36
+ n_proj=20,
37
+ n_ini_proj=20,
38
+ dim=10,
39
+ ).scan
40
+ volume = HDF5Volume(
41
+ file_path=os.path.join(scan.path, "volume.hdf5"),
42
+ data_path="entry",
43
+ data=numpy.random.random(60 * 10 * 10).reshape(60, 10, 10),
44
+ )
45
+ volume.save()
50
46
 
51
- def setUp(self):
52
- TestCaseQt.setUp(self)
53
- self._widget = VolumeViewer(parent=None)
54
- self._widget.setAttribute(qt.Qt.WA_DeleteOnClose)
47
+ scan.set_latest_vol_reconstructions(
48
+ [
49
+ volume,
50
+ ]
51
+ )
55
52
 
56
- self.tmp_dir = tempfile.mkdtemp()
53
+ widget.setScan(scan)
54
+ assert widget._centralWidget.data() is not None
55
+ widget.clear()
56
+ assert widget._centralWidget.data() is None
57
57
 
58
- self.scan = MockHDF5(
59
- scan_path=os.path.join(self.tmp_dir, "myscan"),
60
- n_proj=20,
61
- n_ini_proj=20,
62
- dim=10,
63
- ).scan
64
- volume = HDF5Volume(
65
- file_path=os.path.join(self.scan.path, "volume.hdf5"),
66
- data_path="entry",
67
- data=numpy.random.random(60 * 10 * 10).reshape(60, 10, 10),
68
- )
69
- volume.save()
58
+ # step 2: test setting a a tiff volume dirrectly
59
+ volume = TIFFVolume(
60
+ folder=os.path.join(tmp_dir, "my_tiff_vol"),
61
+ data=numpy.random.random(60 * 100 * 100).reshape(60, 100, 100),
62
+ )
63
+ volume.save()
70
64
 
71
- self.scan.set_latest_vol_reconstructions(
72
- [
73
- volume,
74
- ]
75
- )
65
+ # 2.1 test with the data being in cache
66
+ widget.setVolume(volume=volume)
67
+ assert widget._centralWidget.data() is not None
68
+ widget.clear()
69
+ assert widget._centralWidget.data() is None
76
70
 
77
- def tearDown(self):
78
- shutil.rmtree(self.tmp_dir)
79
- self._widget.close()
80
- self._widget = None
81
- unittest.TestCase.tearDown(self)
71
+ # 2.2 test with the data not being in cache anymore
72
+ volume.clear_cache()
82
73
 
83
- def test(self):
84
- self._widget.setScan(self.scan)
74
+ widget.setVolume(volume=volume)
75
+ # wait_for_processing_finished
76
+ while qt.QApplication.instance().hasPendingEvents():
77
+ qt.QApplication.instance().processEvents()
78
+ sleep(1.2) # wait for the thread to be processed
79
+ while qt.QApplication.instance().hasPendingEvents():
80
+ qt.QApplication.instance().processEvents()
81
+ # end waiting
82
+ assert widget._centralWidget.data() is not None