tomwer 1.3.26__py3-none-any.whl → 1.4.0__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 (638) hide show
  1. orangecontrib/tomwer/orange/managedprocess.py +1 -29
  2. orangecontrib/tomwer/orange/settings.py +2 -28
  3. orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
  4. orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
  5. orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
  6. orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
  7. orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
  8. orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
  9. orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
  10. orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
  11. orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
  12. orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
  13. orangecontrib/tomwer/widgets/__init__.py +3 -5
  14. orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
  15. orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
  16. orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
  17. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
  18. orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
  19. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
  20. orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
  21. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
  22. orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
  23. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
  24. orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
  25. orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
  26. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
  27. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
  28. orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
  29. orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
  30. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
  31. orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
  32. orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
  33. orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
  34. orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
  35. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
  36. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
  37. orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
  38. orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
  39. orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
  40. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
  41. orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
  42. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
  43. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
  44. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
  45. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
  46. orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
  47. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
  48. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
  49. orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
  50. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
  51. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
  52. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
  53. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
  54. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
  55. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
  56. orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
  57. orangecontrib/tomwer/widgets/utils.py +2 -29
  58. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
  59. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
  60. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
  61. orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
  62. orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
  63. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
  64. orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
  65. tomwer/__init__.py +3 -28
  66. tomwer/__main__.py +8 -4
  67. tomwer/app/__init__.py +2 -0
  68. tomwer/app/axis.py +8 -10
  69. tomwer/app/canvas.py +23 -29
  70. tomwer/app/canvas_launcher/config.py +14 -102
  71. tomwer/app/canvas_launcher/environ.py +5 -8
  72. tomwer/app/canvas_launcher/mainwindow.py +175 -69
  73. tomwer/app/canvas_launcher/splash.py +1 -3
  74. tomwer/app/canvas_launcher/utils.py +47 -0
  75. tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
  76. tomwer/app/diffframe.py +2 -0
  77. tomwer/app/imagekeyeditor.py +2 -1
  78. tomwer/app/imagekeyupgrader.py +2 -0
  79. tomwer/app/multicor.py +5 -2
  80. tomwer/app/multipag.py +16 -5
  81. tomwer/app/nabuapp.py +2 -1
  82. tomwer/app/nxtomoeditor.py +17 -12
  83. tomwer/app/patchrawdarkflat.py +2 -0
  84. tomwer/app/radiostack.py +3 -2
  85. tomwer/app/reducedarkflat.py +3 -0
  86. tomwer/app/samplemoved.py +2 -0
  87. tomwer/app/scanviewer.py +2 -0
  88. tomwer/app/sinogramviewer.py +2 -0
  89. tomwer/app/slicestack.py +11 -13
  90. tomwer/app/stitching/common.py +431 -0
  91. tomwer/app/stopdatalistener.py +3 -0
  92. tomwer/app/ystitching.py +26 -0
  93. tomwer/app/zstitching.py +8 -363
  94. tomwer/core/__init__.py +2 -28
  95. tomwer/core/cluster/__init__.py +3 -0
  96. tomwer/core/cluster/cluster.py +10 -26
  97. tomwer/core/futureobject.py +17 -43
  98. tomwer/core/log/__init__.py +2 -0
  99. tomwer/core/log/processlog.py +0 -28
  100. tomwer/core/process/cluster/supervisor.py +52 -34
  101. tomwer/core/process/conditions/filters.py +3 -28
  102. tomwer/core/process/control/datalistener/datalistener.py +7 -75
  103. tomwer/core/process/control/datalistener/rpcserver.py +8 -38
  104. tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
  105. tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
  106. tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
  107. tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
  108. tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
  109. tomwer/core/process/control/datawatcher/status.py +1 -26
  110. tomwer/core/process/control/emailnotifier.py +11 -23
  111. tomwer/core/process/control/nxtomoconcatenate.py +20 -18
  112. tomwer/core/process/control/nxtomomill.py +9 -44
  113. tomwer/core/process/control/scanlist.py +0 -27
  114. tomwer/core/process/control/scantransfer.py +15 -13
  115. tomwer/core/process/control/scanvalidator.py +4 -30
  116. tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
  117. tomwer/core/process/control/timer.py +1 -27
  118. tomwer/core/process/control/tomoobjseries.py +12 -0
  119. tomwer/core/process/drac/binning.py +37 -0
  120. tomwer/core/process/drac/dracbase.py +170 -0
  121. tomwer/core/process/drac/gallery.py +109 -0
  122. tomwer/core/process/drac/output.py +12 -0
  123. tomwer/core/process/drac/processeddataset.py +147 -0
  124. tomwer/core/process/drac/publish.py +118 -0
  125. tomwer/core/process/drac/rawdataset.py +142 -0
  126. tomwer/core/process/drac/tests/test_gallery.py +71 -0
  127. tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
  128. tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
  129. tomwer/core/process/edit/darkflatpatch.py +1 -28
  130. tomwer/core/process/edit/imagekeyeditor.py +4 -32
  131. tomwer/core/process/edit/nxtomoeditor.py +307 -0
  132. tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
  133. tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
  134. tomwer/core/process/output.py +9 -2
  135. tomwer/core/process/reconstruction/__init__.py +0 -26
  136. tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
  137. tomwer/core/process/reconstruction/axis/axis.py +47 -804
  138. tomwer/core/process/reconstruction/axis/mode.py +89 -25
  139. tomwer/core/process/reconstruction/axis/params.py +131 -283
  140. tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
  141. tomwer/core/process/reconstruction/axis/side.py +8 -0
  142. tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
  143. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
  144. tomwer/core/process/reconstruction/darkref/params.py +1 -28
  145. tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
  146. tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
  147. tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
  148. tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
  149. tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
  150. tomwer/core/process/reconstruction/nabu/plane.py +10 -0
  151. tomwer/core/process/reconstruction/nabu/settings.py +1 -28
  152. tomwer/core/process/reconstruction/nabu/target.py +0 -28
  153. tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
  154. tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
  155. tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
  156. tomwer/core/process/reconstruction/nabu/utils.py +11 -60
  157. tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
  158. tomwer/core/process/reconstruction/normalization/params.py +3 -35
  159. tomwer/core/process/reconstruction/output.py +14 -19
  160. tomwer/core/process/reconstruction/paramsbase.py +4 -33
  161. tomwer/core/process/reconstruction/saaxis/params.py +5 -33
  162. tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
  163. tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
  164. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
  165. tomwer/core/process/reconstruction/scores/params.py +9 -39
  166. tomwer/core/process/reconstruction/scores/scores.py +10 -42
  167. tomwer/core/process/reconstruction/tests/__init__.py +0 -0
  168. tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
  169. tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
  170. tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
  171. tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
  172. tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
  173. tomwer/core/process/reconstruction/utils/cor.py +8 -4
  174. tomwer/core/process/script/python.py +1 -27
  175. tomwer/core/process/script/tests/test_script.py +41 -0
  176. tomwer/core/process/stitching/metadataholder.py +5 -4
  177. tomwer/core/process/stitching/nabustitcher.py +35 -5
  178. tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
  179. tomwer/core/process/task.py +20 -63
  180. tomwer/core/process/tests/__init__.py +0 -0
  181. tomwer/core/process/{test → tests}/test_conditions.py +1 -28
  182. tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
  183. tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
  184. tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
  185. tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
  186. tomwer/core/process/{test → tests}/test_nabu.py +2 -33
  187. tomwer/core/process/{test → tests}/test_normalization.py +1 -26
  188. tomwer/core/process/{test → tests}/test_timer.py +1 -27
  189. tomwer/core/process/utils.py +2 -31
  190. tomwer/core/process/visualization/dataviewer.py +1 -26
  191. tomwer/core/process/visualization/diffviewer.py +1 -26
  192. tomwer/core/process/visualization/imagestackviewer.py +0 -26
  193. tomwer/core/process/visualization/radiostack.py +0 -26
  194. tomwer/core/process/visualization/samplemoved.py +0 -28
  195. tomwer/core/process/visualization/sinogramviewer.py +0 -27
  196. tomwer/core/process/visualization/slicestack.py +0 -28
  197. tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
  198. tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
  199. tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
  200. tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
  201. tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
  202. tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
  203. tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
  204. tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
  205. tomwer/core/process/visualization/volumeviewer.py +0 -29
  206. tomwer/core/scan/__init__.py +3 -27
  207. tomwer/core/scan/blissscan.py +5 -34
  208. tomwer/core/scan/edfscan.py +19 -53
  209. tomwer/core/scan/hdf5scan.py +2 -2
  210. tomwer/core/scan/nxtomoscan.py +48 -54
  211. tomwer/core/scan/scanbase.py +107 -203
  212. tomwer/core/scan/scanfactory.py +11 -41
  213. tomwer/core/scan/tests/__init__.py +0 -0
  214. tomwer/core/scan/tests/test_edf.py +25 -0
  215. tomwer/core/scan/tests/test_future_scan.py +35 -0
  216. tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
  217. tomwer/core/scan/tests/test_process_registration.py +64 -0
  218. tomwer/core/settings.py +18 -40
  219. tomwer/core/tests/__init__.py +0 -0
  220. tomwer/core/tests/test_scanutils.py +26 -0
  221. tomwer/core/{test → tests}/test_utils.py +1 -28
  222. tomwer/core/tomwer_object.py +4 -0
  223. tomwer/core/utils/__init__.py +2 -0
  224. tomwer/core/utils/char.py +0 -28
  225. tomwer/core/utils/deprecation.py +12 -38
  226. tomwer/core/utils/dictutils.py +1 -3
  227. tomwer/core/utils/ftseriesutils.py +1 -27
  228. tomwer/core/utils/gpu.py +0 -28
  229. tomwer/core/utils/image.py +8 -39
  230. tomwer/core/utils/locker.py +1 -28
  231. tomwer/core/utils/logconfig.py +0 -27
  232. tomwer/core/utils/normalization.py +4 -31
  233. tomwer/core/utils/nxtomoutils.py +8 -38
  234. tomwer/core/utils/resource.py +0 -26
  235. tomwer/core/utils/scanutils.py +23 -52
  236. tomwer/core/utils/slurm.py +7 -30
  237. tomwer/core/utils/spec.py +6 -6
  238. tomwer/core/utils/tests/__init__.py +0 -0
  239. tomwer/core/utils/tests/test_image.py +30 -0
  240. tomwer/core/utils/tests/test_nxtomo.py +38 -0
  241. tomwer/core/utils/tests/test_scan_utils.py +46 -0
  242. tomwer/core/utils/tests/test_time.py +6 -0
  243. tomwer/core/utils/threads.py +0 -26
  244. tomwer/core/utils/time.py +0 -27
  245. tomwer/core/volume/__init__.py +4 -0
  246. tomwer/core/volume/edfvolume.py +1 -28
  247. tomwer/core/volume/hdf5volume.py +1 -28
  248. tomwer/core/volume/jp2kvolume.py +1 -27
  249. tomwer/core/volume/rawvolume.py +1 -28
  250. tomwer/core/volume/tests/test_volumes.py +21 -0
  251. tomwer/core/volume/tiffvolume.py +1 -28
  252. tomwer/core/volume/volumebase.py +5 -0
  253. tomwer/core/volume/volumefactory.py +7 -33
  254. tomwer/gui/__init__.py +0 -28
  255. tomwer/gui/cluster/__init__.py +2 -0
  256. tomwer/gui/cluster/slurm.py +297 -95
  257. tomwer/gui/cluster/supervisor.py +1 -27
  258. tomwer/gui/cluster/tests/__init__.py +0 -0
  259. tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
  260. tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
  261. tomwer/gui/conditions/__init__.py +2 -0
  262. tomwer/gui/conditions/filter.py +1 -26
  263. tomwer/gui/configuration/__init__.py +2 -0
  264. tomwer/gui/control/__init__.py +2 -0
  265. tomwer/gui/control/actions.py +2 -28
  266. tomwer/gui/control/datadiscovery.py +4 -3
  267. tomwer/gui/control/datalist.py +64 -69
  268. tomwer/gui/control/datalistener.py +1 -39
  269. tomwer/gui/control/datareacheractions.py +1 -28
  270. tomwer/gui/control/datatransfert.py +2 -29
  271. tomwer/gui/control/datavalidator.py +3 -37
  272. tomwer/gui/control/datawatcher/__init__.py +0 -28
  273. tomwer/gui/control/datawatcher/configuration.py +1 -28
  274. tomwer/gui/control/datawatcher/datawatcher.py +3 -32
  275. tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
  276. tomwer/gui/control/history.py +5 -35
  277. tomwer/gui/control/nxtomomill.py +3 -30
  278. tomwer/gui/control/observations.py +61 -55
  279. tomwer/gui/control/reducedarkflatselector.py +24 -20
  280. tomwer/gui/control/scanselectorwidget.py +2 -28
  281. tomwer/gui/control/selectorwidgetbase.py +17 -17
  282. tomwer/gui/control/series/__init__.py +0 -0
  283. tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
  284. tomwer/gui/control/series/serieswaiter.py +0 -0
  285. tomwer/gui/control/series/test/test_creator.py +424 -0
  286. tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
  287. tomwer/gui/control/singletomoobj.py +1 -1
  288. tomwer/gui/control/tests/__init__.py +0 -0
  289. tomwer/gui/control/tests/test_datalist.py +47 -0
  290. tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
  291. tomwer/gui/control/tests/test_datavalidator.py +27 -0
  292. tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
  293. tomwer/gui/control/tests/test_process_manager.py +38 -0
  294. tomwer/gui/control/tests/test_scan_observations.py +23 -0
  295. tomwer/gui/control/tests/test_scanselector.py +42 -0
  296. tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
  297. tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
  298. tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
  299. tomwer/gui/control/volumeselectorwidget.py +2 -30
  300. tomwer/gui/dataportal/__init__.py +2 -0
  301. tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
  302. tomwer/gui/dataportal/gallery.py +133 -0
  303. tomwer/gui/dataportal/outputformat.py +0 -0
  304. tomwer/gui/dataportal/publish.py +96 -0
  305. tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
  306. tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
  307. tomwer/gui/debugtools/__init__.py +2 -0
  308. tomwer/gui/debugtools/datasetgenerator.py +1 -30
  309. tomwer/gui/debugtools/objectinspector.py +1 -29
  310. tomwer/gui/dialog/QDataDialog.py +89 -0
  311. tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
  312. tomwer/gui/dialog/__init__.py +1 -0
  313. tomwer/gui/edit/__init__.py +2 -0
  314. tomwer/gui/edit/dkrfpatch.py +52 -87
  315. tomwer/gui/edit/imagekeyeditor.py +18 -54
  316. tomwer/gui/edit/nxtomoeditor.py +113 -300
  317. tomwer/gui/edit/nxtomowarmer.py +3 -2
  318. tomwer/gui/edit/tests/__init__.py +0 -0
  319. tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
  320. tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
  321. tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
  322. tomwer/gui/fonts.py +5 -0
  323. tomwer/gui/icons.py +28 -66
  324. tomwer/gui/illustrations.py +4 -34
  325. tomwer/gui/imagefromfile.py +5 -30
  326. tomwer/gui/metadataloader.py +36 -0
  327. tomwer/gui/qconfigfile.py +3 -0
  328. tomwer/gui/qlefilesystem.py +3 -0
  329. tomwer/gui/reconstruction/__init__.py +2 -0
  330. tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
  331. tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
  332. tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
  333. tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
  334. tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
  335. tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
  336. tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
  337. tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
  338. tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
  339. tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
  340. tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
  341. tomwer/gui/reconstruction/axis/__init__.py +2 -2
  342. tomwer/gui/reconstruction/darkref/__init__.py +0 -27
  343. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
  344. tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
  345. tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
  346. tomwer/gui/reconstruction/nabu/check.py +7 -33
  347. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
  348. tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
  349. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
  350. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
  351. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
  352. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
  353. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
  354. tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
  355. tomwer/gui/reconstruction/nabu/platform.py +94 -0
  356. tomwer/gui/reconstruction/nabu/slices.py +81 -45
  357. tomwer/gui/reconstruction/nabu/slurm.py +1 -27
  358. tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
  359. tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
  360. tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
  361. tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
  362. tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
  363. tomwer/gui/reconstruction/nabu/volume.py +62 -90
  364. tomwer/gui/reconstruction/normalization/intensity.py +5 -32
  365. tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
  366. tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
  367. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
  368. tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
  369. tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
  370. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
  371. tomwer/gui/reconstruction/scores/control.py +2 -30
  372. tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
  373. tomwer/gui/reconstruction/tests/__init__.py +0 -0
  374. tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
  375. tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
  376. tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
  377. tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
  378. tomwer/gui/samplemoved/__init__.py +2 -30
  379. tomwer/gui/samplemoved/selectiontable.py +3 -33
  380. tomwer/gui/settings.py +7 -0
  381. tomwer/gui/stackplot.py +33 -661
  382. tomwer/gui/stacks.py +261 -135
  383. tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
  384. tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
  385. tomwer/gui/stitching/StitchingWindow.py +586 -0
  386. tomwer/gui/stitching/__init__.py +2 -0
  387. tomwer/gui/stitching/alignment.py +90 -0
  388. tomwer/gui/stitching/axisorderedlist.py +44 -34
  389. tomwer/gui/stitching/config/axisparams.py +25 -11
  390. tomwer/gui/stitching/config/output.py +6 -5
  391. tomwer/gui/stitching/config/positionoveraxis.py +313 -51
  392. tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
  393. tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
  394. tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
  395. tomwer/gui/stitching/normalization.py +1 -0
  396. tomwer/gui/stitching/preview.py +59 -0
  397. tomwer/gui/stitching/singleaxis.py +57 -0
  398. tomwer/gui/stitching/stitchandbackground.py +3 -2
  399. tomwer/gui/stitching/stitching_preview.py +44 -36
  400. tomwer/gui/stitching/stitching_raw.py +5 -3
  401. tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
  402. tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
  403. tomwer/gui/stitching/tests/test_normalization.py +27 -0
  404. tomwer/gui/stitching/tests/test_preview.py +68 -0
  405. tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
  406. tomwer/gui/stitching/tests/utils.py +92 -0
  407. tomwer/gui/stitching/utils.py +14 -0
  408. tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
  409. tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
  410. tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
  411. tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
  412. tomwer/gui/tests/__init__.py +0 -0
  413. tomwer/gui/tests/test_axis_gui.py +43 -0
  414. tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
  415. tomwer/gui/utils/RangeWidget.py +44 -0
  416. tomwer/gui/utils/buttons.py +4 -3
  417. tomwer/gui/utils/completer.py +2 -33
  418. tomwer/gui/utils/flow.py +11 -40
  419. tomwer/gui/utils/gpu.py +60 -0
  420. tomwer/gui/utils/illustrations.py +1 -26
  421. tomwer/gui/utils/inputwidget.py +35 -73
  422. tomwer/gui/utils/lineselector/lineselector.py +9 -46
  423. tomwer/gui/utils/loadingmode.py +81 -0
  424. tomwer/gui/utils/qt_utils.py +9 -0
  425. tomwer/gui/utils/sandboxes.py +1 -26
  426. tomwer/gui/utils/scandescription.py +2 -31
  427. tomwer/gui/utils/scrollarea.py +6 -55
  428. tomwer/gui/utils/slider.py +4 -28
  429. tomwer/gui/utils/splashscreen.py +0 -28
  430. tomwer/gui/utils/step.py +14 -13
  431. tomwer/gui/utils/tests/test_completer.py +41 -0
  432. tomwer/gui/utils/tests/test_line_selector.py +21 -0
  433. tomwer/gui/utils/tests/test_splashscreen.py +8 -0
  434. tomwer/gui/utils/tests/test_vignettes.py +68 -0
  435. tomwer/gui/utils/unitsystem.py +15 -69
  436. tomwer/gui/utils/utils.py +4 -5
  437. tomwer/gui/utils/vignettes.py +10 -41
  438. tomwer/gui/utils/waiterthread.py +0 -26
  439. tomwer/gui/visualization/__init__.py +2 -0
  440. tomwer/gui/visualization/dataviewer.py +68 -421
  441. tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
  442. tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
  443. tomwer/gui/visualization/fullscreenplot.py +5 -5
  444. tomwer/gui/visualization/imagestack.py +403 -0
  445. tomwer/gui/visualization/nxtomometadata.py +0 -4
  446. tomwer/gui/visualization/reconstructionparameters.py +14 -32
  447. tomwer/gui/visualization/scanoverview.py +33 -66
  448. tomwer/gui/visualization/sinogramviewer.py +2 -28
  449. tomwer/gui/visualization/test/__init__.py +0 -28
  450. tomwer/gui/visualization/test/test_dataviewer.py +1 -28
  451. tomwer/gui/visualization/test/test_diffviewer.py +1 -28
  452. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
  453. tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
  454. tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
  455. tomwer/gui/visualization/test/test_stacks.py +184 -115
  456. tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
  457. tomwer/gui/visualization/tomoobjoverview.py +2 -2
  458. tomwer/gui/visualization/volumeoverview.py +3 -2
  459. tomwer/gui/visualization/volumeviewer.py +47 -43
  460. tomwer/io/__init__.py +2 -0
  461. tomwer/io/utils/h5pyutils.py +1 -27
  462. tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
  463. tomwer/io/utils/test/test_utils.py +67 -0
  464. tomwer/io/utils/utils.py +2 -31
  465. tomwer/resources/__init__.py +13 -33
  466. tomwer/resources/gui/icons/edit_downstream.svg +114 -0
  467. tomwer/resources/gui/icons/edit_upstream.svg +112 -0
  468. tomwer/resources/gui/icons/free_edition.svg +23 -0
  469. tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
  470. tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
  471. tomwer/resources/gui/icons/search.png +0 -0
  472. tomwer/resources/gui/icons/search.svg +23 -0
  473. tomwer/resources/gui/icons/warning.png +0 -0
  474. tomwer/synctools/__init__.py +2 -0
  475. tomwer/synctools/axis.py +1 -27
  476. tomwer/synctools/darkref.py +1 -26
  477. tomwer/synctools/datalistener.py +1 -27
  478. tomwer/synctools/datatransfert.py +2 -27
  479. tomwer/synctools/imageloaderthread.py +1 -28
  480. tomwer/synctools/rsyncmanager.py +1 -25
  481. tomwer/synctools/saaxis.py +1 -26
  482. tomwer/synctools/sadeltabeta.py +1 -26
  483. tomwer/synctools/stacks/control/datalistener.py +1 -26
  484. tomwer/synctools/stacks/processingstack.py +4 -33
  485. tomwer/synctools/stacks/reconstruction/axis.py +6 -53
  486. tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
  487. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
  488. tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
  489. tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
  490. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
  491. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
  492. tomwer/synctools/tests/__init__.py +0 -0
  493. tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
  494. tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
  495. tomwer/synctools/utils/scanstages.py +2 -31
  496. tomwer/tests/__init__.py +1 -0
  497. tomwer/tests/app/test_stitching.py +95 -0
  498. tomwer/tests/datasets.py +1 -5
  499. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
  500. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
  501. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
  502. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
  503. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
  504. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
  505. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
  506. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
  507. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
  508. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
  509. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
  510. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
  511. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
  512. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
  513. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
  514. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
  515. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
  516. orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
  517. tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
  518. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
  519. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
  520. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
  521. tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
  522. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
  523. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
  524. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
  525. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
  526. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
  527. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
  528. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
  529. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
  530. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
  531. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
  532. tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
  533. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
  534. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
  535. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
  536. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
  537. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
  538. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
  539. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
  540. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
  541. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
  542. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
  543. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
  544. tomwer/tests/test_ewoks/test_conversion.py +104 -0
  545. tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
  546. tomwer/tests/test_ewoks/test_workflows.py +138 -0
  547. tomwer/utils.py +11 -39
  548. tomwer/version.py +2 -2
  549. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
  550. tomwer-1.4.0.dist-info/METADATA +337 -0
  551. tomwer-1.4.0.dist-info/RECORD +912 -0
  552. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
  553. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
  554. orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
  555. orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
  556. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
  557. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
  558. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
  559. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
  560. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
  561. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  562. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
  563. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  564. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
  565. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
  566. orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
  567. orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
  568. tomwer/core/log/logger.py +0 -130
  569. tomwer/core/process/control/test/test_volume_link.py +0 -74
  570. tomwer/core/process/control/tomoobjserie.py +0 -12
  571. tomwer/core/process/control/volumesymlink.py +0 -200
  572. tomwer/core/process/icat/createscreenshots.py +0 -100
  573. tomwer/core/process/icat/gallery.py +0 -377
  574. tomwer/core/process/icat/icatbase.py +0 -36
  575. tomwer/core/process/icat/publish.py +0 -228
  576. tomwer/core/process/icat/screenshots.py +0 -27
  577. tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
  578. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
  579. tomwer/core/process/test/test_axis.py +0 -309
  580. tomwer/core/process/visualization/liveslice.py +0 -6
  581. tomwer/core/progress.py +0 -100
  582. tomwer/core/scan/test/test_edf.py +0 -53
  583. tomwer/core/scan/test/test_future_scan.py +0 -61
  584. tomwer/core/scan/test/test_h5.py +0 -96
  585. tomwer/core/scan/test/test_process_registration.py +0 -109
  586. tomwer/core/test/test_scanutils.py +0 -53
  587. tomwer/gui/control/emailnotifier.py +0 -174
  588. tomwer/gui/control/serie/seriewaiter.py +0 -28
  589. tomwer/gui/control/test/__init__.py +0 -28
  590. tomwer/gui/control/test/test_datalist.py +0 -96
  591. tomwer/gui/control/test/test_datavalidator.py +0 -54
  592. tomwer/gui/control/test/test_email.py +0 -35
  593. tomwer/gui/control/test/test_process_manager.py +0 -65
  594. tomwer/gui/control/test/test_scanselector.py +0 -67
  595. tomwer/gui/edit/test/__init__.py +0 -28
  596. tomwer/gui/icat/gallery.py +0 -214
  597. tomwer/gui/icat/publish.py +0 -187
  598. tomwer/gui/reconstruction/axis/axis.py +0 -733
  599. tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
  600. tomwer/gui/stitching/stitching.py +0 -1392
  601. tomwer/gui/test/__init__.py +0 -28
  602. tomwer/gui/test/test_axis_gui.py +0 -34
  603. tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
  604. tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
  605. tomwer/third_part/WaitingOverlay.py +0 -110
  606. tomwer-1.3.26-py3.11-nspkg.pth +0 -1
  607. tomwer-1.3.26.dist-info/METADATA +0 -292
  608. tomwer-1.3.26.dist-info/RECORD +0 -785
  609. tomwer-1.3.26.dist-info/namespace_packages.txt +0 -1
  610. /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
  611. {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
  612. {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
  613. /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
  614. {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
  615. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
  616. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
  617. {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
  618. {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
  619. {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
  620. {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
  621. {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
  622. {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
  623. {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
  624. /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
  625. /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
  626. /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
  627. /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
  628. /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
  629. /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
  630. /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
  631. /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
  632. /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
  633. /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
  634. /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
  635. /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
  636. /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
  637. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
  638. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
tomwer/gui/utils/flow.py CHANGED
@@ -1,35 +1,7 @@
1
- # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2016-2017 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "04/03/2019"
29
-
1
+ from __future__ import annotations
30
2
 
31
3
  import functools
32
- from typing import Union
4
+ from typing import Iterable
33
5
 
34
6
  from silx.gui import qt
35
7
  from silx.utils.enum import Enum as _Enum
@@ -194,7 +166,6 @@ class FlowCanvas(qt.QWidget):
194
166
  Widget to describe a flow of process - pipeline
195
167
 
196
168
  :param direction: direction can be vertical or horizontal
197
- :type direction: Union[str,FlowDirection]
198
169
  """
199
170
 
200
171
  sigWidgetActivated = qt.Signal()
@@ -204,7 +175,7 @@ class FlowCanvas(qt.QWidget):
204
175
  active process anymore)"""
205
176
 
206
177
  def __init__(
207
- self, parent, direction: Union[str, FlowDirection], show_lock_state=True
178
+ self, parent, direction: str | FlowDirection, show_lock_state=True
208
179
  ) -> None:
209
180
  qt.QWidget.__init__(self, parent=parent)
210
181
  self._direction = FlowDirection.from_value(direction)
@@ -251,7 +222,6 @@ class FlowCanvas(qt.QWidget):
251
222
  :param process_name: any object. Should implement the __str__ interface
252
223
  to define the name if no icon is given
253
224
  :return: process id in the process flow
254
- :rtype: int
255
225
  """
256
226
  if icon is None:
257
227
  assert hasattr(process, "__str__")
@@ -292,7 +262,7 @@ class FlowCanvas(qt.QWidget):
292
262
  def removeProcess(self, process_id: int) -> None:
293
263
  """
294
264
 
295
- :param int process_id: id of the process to remove from the flow
265
+ :param process_id: id of the process to remove from the flow
296
266
  """
297
267
  if process_id in self._dockers:
298
268
  dockWidget = self._dockers[process_id]
@@ -304,12 +274,14 @@ class FlowCanvas(qt.QWidget):
304
274
  for process_id in processes_id:
305
275
  self.removeProcess(process_id=process_id)
306
276
 
307
- def setProcesses(self, processes, icons, draggability) -> None:
277
+ def setProcesses(
278
+ self, processes: Iterable, icons: Iterable, draggability: Iterable
279
+ ) -> None:
308
280
  """
309
281
 
310
- :param Iterable processes: processes of the flow
311
- :param Iterable icons: icons associated to the flow
312
- :param Iterable draggability: is the process draggable or not
282
+ :param processes: processes of the flow
283
+ :param icons: icons associated to the flow
284
+ :param draggability: is the process draggable or not
313
285
  :return:
314
286
  """
315
287
  for process, icon, draggable in zip(processes, icons, draggability):
@@ -328,11 +300,10 @@ class FlowCanvas(qt.QWidget):
328
300
  """
329
301
 
330
302
  :return: True if the canvas has a process active / focus ...
331
- :rtype: bool
332
303
  """
333
304
  return self.getProcessFocused() is not None
334
305
 
335
- def getProcessFocused(self) -> Union[None, int]:
306
+ def getProcessFocused(self) -> int | None:
336
307
  """
337
308
 
338
309
  :return: id of the process focus or None if no process focus
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ from nabu.cuda.utils import collect_cuda_gpus
4
+ from silx.gui import qt
5
+
6
+
7
+ class SelectGPUGroupBox(qt.QGroupBox):
8
+ """Interface to select a (local) GPU"""
9
+
10
+ sigGPUChanged = qt.Signal()
11
+ """Emit when the selected GPU changed"""
12
+
13
+ def __init__(self, parent=None, title="select (local) GPU"):
14
+ super().__init__(parent=parent, title=title)
15
+ self.setCheckable(True)
16
+ self.setLayout(qt.QFormLayout())
17
+ self.__cuda_gpus = collect_cuda_gpus() or {}
18
+
19
+ # warn user if no gpu found: reconstruction will work but will take way more time
20
+ if len(self.__cuda_gpus) == 0:
21
+ style = qt.QApplication.style()
22
+ icon = style.standardIcon(qt.QStyle.SP_MessageBoxWarning)
23
+ self.__iconLabel = qt.QLabel(parent=self)
24
+ self.__iconLabel.setPixmap(icon.pixmap(80, 80))
25
+ self.__noGPULabel = qt.QLabel("No cuda GPU detected")
26
+ self.__noGPULabel.setToolTip(
27
+ "No cuda GPU device detected. Reconstruction will be done on CPU which is much more slower"
28
+ )
29
+ self.layout().addRow(self.__iconLabel, self.__noGPULabel)
30
+
31
+ self._gpusCB = qt.QComboBox(self)
32
+ for gpu_id, gpu_desc in self.__cuda_gpus.items():
33
+ name = gpu_desc.get("name", f"unknown gpu {gpu_id}")
34
+ self._gpusCB.addItem(f"{name} (id-{gpu_id})", gpu_id)
35
+ self.layout().addRow(self._gpusCB)
36
+
37
+ # connect signal / slot
38
+ self._gpusCB.currentIndexChanged.connect(self.__GPUChanged)
39
+
40
+ @property
41
+ def cuda_gpus(self) -> dict:
42
+ return self.__cudaGPUs
43
+
44
+ def getSelectedGPUId(self) -> int | None:
45
+ if self.isChecked():
46
+ selected_gpu = self._gpusCB.currentIndex()
47
+ if selected_gpu == -1:
48
+ return None
49
+ else:
50
+ return self._gpusCB.itemData(selected_gpu, qt.Qt.UserRole)
51
+ else:
52
+ return None
53
+
54
+ def setSelectedGPUId(self, value: int):
55
+ cb_index = self._gpusCB.findData(value, role=qt.Qt.UserRole)
56
+ if cb_index >= 0:
57
+ self._gpusCB.setCurrentIndex(cb_index)
58
+
59
+ def __GPUChanged(self, *args, **kwargs):
60
+ self.sigGPUChanged.emit()
@@ -1,35 +1,10 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- # Copyright (C) 2017 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
2
 
25
3
  """
26
4
  Some utils GUI associated to illustrations
27
5
  """
28
6
 
29
- __authors__ = ["H.Payno"]
30
- __license__ = "MIT"
31
- __date__ = "28/09/2018"
32
-
7
+ from __future__ import annotations
33
8
 
34
9
  from silx.gui import qt
35
10
 
@@ -1,34 +1,7 @@
1
- # coding: utf-8
2
- # /*##########################################################################
3
- # Copyright (C) 2017 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
- __authors__ = ["H.Payno"]
26
- __license__ = "MIT"
27
- __date__ = "16/08/2018"
1
+ from __future__ import annotations
28
2
 
29
3
  import logging
30
4
  import os
31
- from typing import Optional, Union
32
5
 
33
6
  import numpy
34
7
  from nxtomomill.io.config import TomoEDFConfig as EDFConfig
@@ -39,6 +12,7 @@ from tomoscan.identifier import BaseIdentifier
39
12
 
40
13
  from tomwer.gui import icons
41
14
  from tomwer.gui.qlefilesystem import QLFileSystem
15
+ from tomwer.gui.utils.qt_utils import block_signals
42
16
  from tomwer.io.utils import get_default_directory
43
17
  from tomwer.core.volume.volumefactory import VolumeFactory
44
18
  from tomwer.core.process.output import ProcessDataOutputDirMode
@@ -88,7 +62,7 @@ class SelectionLineEdit(qt.QWidget):
88
62
  self._button = SelectionModeButton(parent=self)
89
63
  self.layout().addWidget(self._button)
90
64
 
91
- # Qobject signal connections
65
+ # QObject signal connections
92
66
  self._qLineEdit.textChanged.connect(self._checkIfModeChanged)
93
67
  self._button.sigModeChanged.connect(self._modeChanged)
94
68
 
@@ -135,12 +109,11 @@ class SelectionLineEdit(qt.QWidget):
135
109
  return None
136
110
 
137
111
  def _checkIfModeChanged(self, _str):
138
- self._button.blockSignals(True)
139
- if _str.count(":") > 0:
140
- self._button.mode = self.RANGE_MODE
141
- else:
142
- self._button.mode = self.LIST_MODE
143
- self._button.blockSignals(False)
112
+ with block_signals(self._button):
113
+ if _str.count(":") > 0:
114
+ self._button.mode = self.RANGE_MODE
115
+ else:
116
+ self._button.mode = self.LIST_MODE
144
117
 
145
118
  def _modeChanged(self, mode):
146
119
  if mode == self.RANGE_MODE:
@@ -148,24 +121,24 @@ class SelectionLineEdit(qt.QWidget):
148
121
  elif mode == self.LIST_MODE:
149
122
  text = "val1; val2; ..."
150
123
  else:
151
- raise ValueError("unknow mode")
124
+ raise ValueError("unknown mode")
152
125
 
153
- self._qLineEdit.blockSignals(True)
154
- self._qLineEdit.setPlaceholderText(text)
155
- self._qLineEdit.blockSignals(False)
126
+ with block_signals(self._qLineEdit):
127
+ self._qLineEdit.setPlaceholderText(text)
156
128
 
157
129
 
158
130
  class SelectionModeButton(qt.QToolButton):
159
131
  """Base class for Selection QAction.
160
132
 
161
- :param str mode: the mode of selection of the action.
162
- :param str text: The name of this action to be used for menu label
163
- :param str tooltip: The text of the tooltip
133
+ :param mode: the mode of selection of the action.
134
+ :param text: The name of this action to be used for menu label
135
+ :param tooltip: The text of the tooltip
164
136
  :param triggered: The callback to connect to the action's triggered
165
137
  signal or None for no callback.
166
138
  """
167
139
 
168
140
  sigModeChanged = qt.Signal(str)
141
+ """signal emit when the mode is changed"""
169
142
 
170
143
  def __init__(self, parent=None, tooltip=None, triggered=None):
171
144
  qt.QToolButton.__init__(self, parent)
@@ -223,6 +196,7 @@ class SelectionAction(qt.QAction):
223
196
  """
224
197
 
225
198
  sigModeChanged = qt.Signal(str)
199
+ """emit when the mode change"""
226
200
 
227
201
  def __init__(self, mode, parent, text):
228
202
  icon = icons.getQIcon("_".join([mode, "selection"]))
@@ -272,7 +246,6 @@ class NXTomomillOutputDirSelector(qt.QWidget):
272
246
 
273
247
  tooltip = """Define the output directory of the nexus (.nx) file. Options are:
274
248
  \n - same folder as scan: create the NXtomos at the same level as the bliss input file or spec folder
275
- \n - 'RAW_DATA' folder: create NXtomos on the default 'RAW_DATA' folder (bliss default folder, nearby the 'raw' folder).
276
249
  \n - 'PROCESSED_DATA' folder: create NXtomos on the default 'PROCESSED_DATA' folder (bliss default folder, nearby the 'raw' folder).
277
250
  \n - user defined folder: users can provide their own folders using keywords for string formatting such as 'scan_dir_name', 'scan_basename' or 'scan_parent_dir_basename'
278
251
  """
@@ -287,11 +260,6 @@ class NXTomomillOutputDirSelector(qt.QWidget):
287
260
  self._processedDataFolderRB.setToolTip(tooltip)
288
261
  self.layout().addWidget(self._processedDataFolderRB, 1, 0, 1, 1)
289
262
  self.__buttonGroup.addButton(self._processedDataFolderRB)
290
- # output dir is the default 'reduced'folder
291
- self._rawDataFolderRB = qt.QRadioButton("'RAW_DATA' folder", self)
292
- self._rawDataFolderRB.setToolTip(tooltip)
293
- self.layout().addWidget(self._rawDataFolderRB, 2, 0, 1, 1)
294
- self.__buttonGroup.addButton(self._rawDataFolderRB)
295
263
  # manual
296
264
  self._manualRB = qt.QRadioButton("custom output directory", self)
297
265
  self._manualRB.setToolTip(tooltip)
@@ -311,7 +279,6 @@ class NXTomomillOutputDirSelector(qt.QWidget):
311
279
  self.__buttonGroup.buttonReleased.connect(self._updateVisiblity)
312
280
  self._inScanFolder.toggled.connect(self.sigChanged)
313
281
  self._processedDataFolderRB.toggled.connect(self.sigChanged)
314
- self._rawDataFolderRB.toggled.connect(self.sigChanged)
315
282
  self._manualRB.toggled.connect(self.sigChanged)
316
283
  self._outputFolderQLE.editingFinished.connect(self.sigChanged)
317
284
 
@@ -338,38 +305,33 @@ class NXTomomillOutputDirSelector(qt.QWidget):
338
305
  self._outputFolderQLE.setText(dialog.selectedFiles()[0])
339
306
  self.sigChanged.emit()
340
307
 
341
- def getOutputFolder(self) -> Union[str, ProcessDataOutputDirMode]:
308
+ def getOutputFolder(self) -> str | ProcessDataOutputDirMode:
342
309
  if self._manualRB.isChecked():
343
310
  return self._outputFolderQLE.text()
344
311
  elif self._processedDataFolderRB.isChecked():
345
312
  return ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER
346
313
  elif self._inScanFolder.isChecked():
347
314
  return ProcessDataOutputDirMode.IN_SCAN_FOLDER
348
- elif self._rawDataFolderRB.isChecked():
349
- return ProcessDataOutputDirMode.RAW_DATA_FOLDER
350
315
  else:
351
316
  raise RuntimeError("Use case - h52nx output dir - not handled")
352
317
 
353
318
  def setOutputFolder(self, output_folder: str):
354
- old = self.blockSignals(True)
355
- self._manualRB.setChecked(output_folder is not None)
356
- try:
357
- default_output = ProcessDataOutputDirMode.from_value(output_folder)
358
- except ValueError:
359
- self._outputFolderQLE.setText(output_folder)
360
- self._manualRB.setChecked(True)
361
- else:
362
- if default_output is ProcessDataOutputDirMode.IN_SCAN_FOLDER:
363
- self._inScanFolder.setChecked(True)
364
- elif default_output is ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER:
365
- self._processedDataFolderRB.setChecked(True)
366
- elif default_output is ProcessDataOutputDirMode.RAW_DATA_FOLDER:
367
- self._rawDataFolderRB.setChecked(True)
319
+ with block_signals(self):
320
+ self._manualRB.setChecked(output_folder is not None)
321
+ try:
322
+ default_output = ProcessDataOutputDirMode.from_value(output_folder)
323
+ except ValueError:
324
+ self._outputFolderQLE.setText(output_folder)
325
+ self._manualRB.setChecked(True)
368
326
  else:
369
- raise ValueError(f"default output not handled ({default_output})")
370
- finally:
371
- self._updateVisiblity()
372
- self.blockSignals(old)
327
+ if default_output is ProcessDataOutputDirMode.IN_SCAN_FOLDER:
328
+ self._inScanFolder.setChecked(True)
329
+ elif default_output is ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER:
330
+ self._processedDataFolderRB.setChecked(True)
331
+ else:
332
+ raise ValueError(f"default output not handled ({default_output})")
333
+ finally:
334
+ self._updateVisiblity()
373
335
 
374
336
 
375
337
  class _ConfigFileSelector(qt.QWidget):
@@ -381,7 +343,7 @@ class _ConfigFileSelector(qt.QWidget):
381
343
 
382
344
  def __init__(self, parent=None, try_load_cfg: bool = True):
383
345
  """
384
- :param bool try_load_cfg: If True then when a file path is provided will try to load the configuration using '_load_config' and display error if the file is malformed
346
+ :param try_load_cfg: If True then when a file path is provided will try to load the configuration using '_load_config' and display error if the file is malformed
385
347
  """
386
348
  super().__init__(parent)
387
349
  self._try_load_cfg = try_load_cfg
@@ -517,7 +479,7 @@ class OutputVolumeDefinition(qt.QWidget):
517
479
  else:
518
480
  return self.selectOutputFolder()
519
481
 
520
- def selectOutputFile(self, extensions) -> Optional[str]:
482
+ def selectOutputFile(self, extensions) -> str | None:
521
483
  dialog = qt.QFileDialog(self)
522
484
  dialog.setNameFilters(extensions)
523
485
  if os.environ.get("TOMWER_DEFAULT_INPUT_DIR", None) and os.path.exists(
@@ -538,7 +500,7 @@ class OutputVolumeDefinition(qt.QWidget):
538
500
  else:
539
501
  return dialog.selectedFiles()
540
502
 
541
- def selectOutputFolder(self) -> Optional[str]:
503
+ def selectOutputFolder(self) -> str | None:
542
504
  dialog = qt.QFileDialog(self)
543
505
  dialog.setFileMode(qt.QFileDialog.DirectoryOnly)
544
506
  if os.environ.get("TOMWER_DEFAULT_INPUT_DIR", None) and os.path.exists(
@@ -1,37 +1,8 @@
1
- # /*##########################################################################
2
- # Copyright (C) 20016-2017 European Synchrotron Radiation Facility
3
- #
4
- # This file is part of tomogui. Interface for tomography developed at
5
- # the ESRF by the Software group.
6
- #
7
- # Permission is hereby granted, free of charge, to any person obtaining a copy
8
- # of this software and associated documentation files (the "Software"), to deal
9
- # in the Software without restriction, including without limitation the rights
10
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- # copies of the Software, and to permit persons to whom the Software is
12
- # furnished to do so, subject to the following conditions:
13
- #
14
- # The above copyright notice and this permission notice shall be included in
15
- # all copies or substantial portions of the Software.
16
- #
17
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- # THE SOFTWARE.
24
- #
25
- #############################################################################*/
26
-
27
- __author__ = ["H. Payno"]
28
- __license__ = "MIT"
29
- __date__ = "15/09/2017"
1
+ from __future__ import annotations
30
2
 
31
3
  import logging
32
4
  from collections import OrderedDict
33
- from collections.abc import Iterable
34
- from typing import Optional, Union
5
+ from typing import Iterable
35
6
 
36
7
  import numpy
37
8
  from silx.gui import qt
@@ -45,11 +16,10 @@ class QSliceSelectorDialog(qt.QDialog):
45
16
  The dialog used to select some slice indexes from a radio
46
17
 
47
18
  :param QWidget parent: parent widget
48
- :param Union[int,None] n_required_slice: number of required slice we expect
49
- the user to select
19
+ :param n_required_slice: number of required slice we expect the user to select
50
20
  """
51
21
 
52
- def __init__(self, parent, n_required_slice=None):
22
+ def __init__(self, parent, n_required_slice: int | None = None):
53
23
  qt.QDialog.__init__(self, parent=parent)
54
24
  self.setLayout(qt.QVBoxLayout())
55
25
  self.setWindowTitle("select slices on radio")
@@ -73,7 +43,6 @@ class QSliceSelectorDialog(qt.QDialog):
73
43
  """
74
44
 
75
45
  :param rows: define the selection
76
- :type: Iterable
77
46
  """
78
47
  if self.nRequiredSlice() is not None and len(selection) > self.nRequiredSlice():
79
48
  raise ValueError(
@@ -94,7 +63,6 @@ class QSliceSelectorDialog(qt.QDialog):
94
63
  """
95
64
 
96
65
  :return: the selection of slices to use
97
- :rtype: tuple
98
66
  """
99
67
  return self.mainWidget.getSelection()
100
68
 
@@ -107,7 +75,7 @@ class QSliceSelectorDialog(qt.QDialog):
107
75
  else:
108
76
  return qt.QDialog.exec_(self)
109
77
 
110
- def nRequiredSlice(self) -> Optional[int]:
78
+ def nRequiredSlice(self) -> int | None:
111
79
  return self.mainWidget.nRequiredSlice()
112
80
 
113
81
 
@@ -129,7 +97,7 @@ class QLineSelector(qt.QWidget):
129
97
  # connect signal / slot
130
98
  self._plot.sigPlotSignal.connect(self._plotDrawEvent)
131
99
 
132
- def nRequiredSlice(self) -> Optional[int]:
100
+ def nRequiredSlice(self) -> int | None:
133
101
  return self._n_required_slice
134
102
 
135
103
  def setData(self, data: numpy.ndarray):
@@ -137,7 +105,6 @@ class QLineSelector(qt.QWidget):
137
105
  Define the data from which we can select slices
138
106
 
139
107
  :param data: data to plot
140
- :type: numpy.ndarray
141
108
  """
142
109
  self._has_data = True
143
110
  self._plot.addImage(data)
@@ -147,7 +114,6 @@ class QLineSelector(qt.QWidget):
147
114
  """
148
115
 
149
116
  :return: the selection of slices to use
150
- :rtype: tuple
151
117
  """
152
118
  res = []
153
119
  for _, marker in self.__selection.items():
@@ -167,7 +133,6 @@ class QLineSelector(qt.QWidget):
167
133
  """
168
134
 
169
135
  :param rows: define the selection
170
- :type: Iterable
171
136
  """
172
137
  assert type(rows) is not str
173
138
  self._clear()
@@ -175,12 +140,11 @@ class QLineSelector(qt.QWidget):
175
140
  for row in rows:
176
141
  self.addSlice(row)
177
142
 
178
- def addSlice(self, row: Union[float, int]) -> None:
143
+ def addSlice(self, row: float | int) -> None:
179
144
  """
180
145
  Add the requested slice to the selection
181
146
 
182
147
  :param row:
183
- :type; Union[float, int]
184
148
  """
185
149
  row_n = round(float(row))
186
150
 
@@ -210,12 +174,11 @@ class QLineSelector(qt.QWidget):
210
174
  def _getLegend(self, row_n) -> str:
211
175
  return str(round(float(row_n)))
212
176
 
213
- def removeSlice(self, row: Union[float, int]) -> None:
177
+ def removeSlice(self, row: float | int) -> None:
214
178
  """
215
179
  remove the requested slice from the selection
216
180
 
217
- :param row:
218
- :type; Union[float, int]
181
+ :param row: row containing the slice to be removed
219
182
  """
220
183
  legend = self._getLegend(row_n=row)
221
184
  if legend in self.__selection:
@@ -0,0 +1,81 @@
1
+ from __future__ import annotations
2
+ import functools
3
+ from silx.utils.enum import Enum as _Enum
4
+ from silx.gui import qt
5
+ from tomwer.gui import icons
6
+
7
+
8
+ class LoadingMode(_Enum):
9
+ ON_SHOW_LOADING = "load when show requested"
10
+ LAZY_LOADING = "lazy loading"
11
+ ASAP_LOADING = "load ASAP"
12
+
13
+ def icon(self):
14
+ if self is self.ON_SHOW_LOADING:
15
+ return icons.getQIcon("low_speed")
16
+ elif self is self.LAZY_LOADING:
17
+ return icons.getQIcon("medium_low_speed")
18
+ elif self is self.ASAP_LOADING:
19
+ return icons.getQIcon("high_speed")
20
+ else:
21
+ raise ValueError(f"loading mode {self} not handled")
22
+
23
+ def tooltip(self):
24
+ if self is self.ON_SHOW_LOADING:
25
+ return "will load data only when requiring"
26
+ return icons.getQIcon("medium_low_speed")
27
+ elif self is self.LAZY_LOADING:
28
+ return "load data with reduce prefetch"
29
+ elif self is self.ASAP_LOADING:
30
+ return "load data as soon as possible"
31
+ else:
32
+ raise ValueError(f"loading mode {self} not handled")
33
+
34
+
35
+ class LoadingModeToolButton(qt.QToolButton):
36
+ """Tool button to switch keep aspect ratio of a plot"""
37
+
38
+ sigLoadModeChanged = qt.Signal(str)
39
+
40
+ def __init__(self, parent=None):
41
+ super(LoadingModeToolButton, self).__init__(parent=parent)
42
+ menu = qt.QMenu(self)
43
+
44
+ action_lazy_loading = LazyLoadingAction(parent=self)
45
+ # by default icons are not visible from the menu. In this case we want to display it
46
+ action_lazy_loading.setIconVisibleInMenu(True)
47
+ fctLL = functools.partial(self.setLoadingMode, LoadingMode.LAZY_LOADING)
48
+ menu.addAction(action_lazy_loading)
49
+
50
+ action_asap_loading = ASAP_LoadingAction(parent=self)
51
+ action_asap_loading.setIconVisibleInMenu(True)
52
+ fctAL = functools.partial(self.setLoadingMode, LoadingMode.ASAP_LOADING)
53
+ menu.addAction(action_asap_loading)
54
+
55
+ self.setMenu(menu)
56
+ # connect signal / slot
57
+ action_lazy_loading.triggered.connect(fctLL)
58
+ action_asap_loading.triggered.connect(fctAL)
59
+
60
+ # set up
61
+ self.setPopupMode(qt.QToolButton.InstantPopup)
62
+ self.setLoadingMode(LoadingMode.LAZY_LOADING)
63
+
64
+ def setLoadingMode(self, loadingMode: LoadingMode | str):
65
+ loadingMode = LoadingMode(loadingMode)
66
+ assert loadingMode in LoadingMode
67
+ self.setIcon(loadingMode.icon())
68
+ self.setToolTip(loadingMode.tooltip())
69
+ self.sigLoadModeChanged.emit(loadingMode.value)
70
+
71
+
72
+ class LazyLoadingAction(qt.QAction):
73
+ def __init__(self, parent):
74
+ super().__init__("load data with small prefetch", parent=parent)
75
+ self.setIcon(LoadingMode.LAZY_LOADING.icon())
76
+
77
+
78
+ class ASAP_LoadingAction(qt.QAction):
79
+ def __init__(self, parent):
80
+ super().__init__("load data ASAP", parent=parent)
81
+ self.setIcon(LoadingMode.ASAP_LOADING.icon())
@@ -2,6 +2,15 @@ from contextlib import contextmanager
2
2
 
3
3
  from silx.gui import qt
4
4
 
5
+ if qt.BINDING == "PyQt5":
6
+ from PyQt5.QtTest import QSignalSpy # pylint: disable=E0401,E0611
7
+ elif qt.BINDING == "PySide6":
8
+ from PySide6.QtTest import QSignalSpy # pylint: disable=E0401,E0611
9
+ elif qt.BINDING == "PyQt6":
10
+ from PyQt6.QtTest import QSignalSpy # pylint: disable=E0401,E0611
11
+ else:
12
+ QSignalSpy = None
13
+
5
14
 
6
15
  @contextmanager
7
16
  def block_signals(w: qt.QWidget):