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
@@ -1,40 +1,15 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2016-2020 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__ = "12/02/2020"
2
+ from __future__ import annotations
3
+
29
4
 
30
5
  import functools
31
6
  import logging
32
- import typing
33
7
 
34
8
  from silx.gui import qt
35
9
  from silx.gui.dialog.DataFileDialog import DataFileDialog
36
10
  from silx.utils.enum import Enum as _Enum
37
11
 
12
+ from nxtomomill.io.utils import convert_str_to_tuple
38
13
  from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
39
14
  from tomwer.core.process.reconstruction.nabu.nabuslices import NabuSliceMode
40
15
  from tomwer.core.process.reconstruction.nabu.utils import (
@@ -50,6 +25,8 @@ from tomwer.gui.utils.scrollarea import (
50
25
  QDoubleSpinBoxIgnoreWheel,
51
26
  QSpinBoxIgnoreWheel,
52
27
  )
28
+ from tomwer.gui.utils.RangeWidget import RangeWidget
29
+ from tomwer.gui import icons
53
30
  from tomwer.utils import docstring
54
31
 
55
32
  _logger = logging.getLogger(__name__)
@@ -61,20 +38,31 @@ class SliceGroupBox(qt.QGroupBox):
61
38
  sigSlicesChanged = qt.Signal()
62
39
  """Signal emitted when the selected slices change"""
63
40
 
64
- def __init__(self, parent, scrollArea):
41
+ def __init__(self, parent):
65
42
  qt.QGroupBox.__init__(self, "slices", parent)
66
43
  self.setCheckable(True)
67
-
68
44
  self.setLayout(qt.QHBoxLayout())
69
- self._modeCB = QComboBoxIgnoreWheel(parent=self, scrollArea=scrollArea)
45
+ # mode
46
+ self._modeCB = QComboBoxIgnoreWheel(parent=self)
70
47
  for mode in NabuSliceMode:
71
48
  self._modeCB.addItem(mode.value)
72
49
  self.layout().addWidget(self._modeCB)
73
50
  self._modeCB.setFocusPolicy(qt.Qt.FocusPolicy.NoFocus)
74
51
 
52
+ # slice line edit
75
53
  self._sliceQLE = SelectionLineEdit(parent=self, allow_negative_indices=True)
76
54
  self.layout().addWidget(self._sliceQLE)
77
55
 
56
+ # warning icon
57
+ warningIcon = icons.getQIcon("warning")
58
+ self._noSliceWarning = qt.QLabel("")
59
+ self._noSliceWarning.setPixmap(warningIcon.pixmap(20, state=qt.QIcon.On))
60
+ self._noSliceWarning.setToolTip(
61
+ "no slice defined, No slice reconstruction will be done"
62
+ )
63
+ self.layout().addWidget(self._noSliceWarning)
64
+
65
+ # spacer
78
66
  spacer = qt.QWidget(parent=self)
79
67
  spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
80
68
  self.layout().addWidget(spacer)
@@ -83,22 +71,36 @@ class SliceGroupBox(qt.QGroupBox):
83
71
  self.setChecked(True)
84
72
  self.setMode(NabuSliceMode.MIDDLE)
85
73
  self._sliceQLE.setVisible(False)
74
+ self._noSliceWarning.setVisible(False)
86
75
 
87
76
  # connect signal / slot
88
- self._modeCB.currentIndexChanged.connect(self._updateSliceQLEVisibilty)
77
+ self._modeCB.currentIndexChanged.connect(self._updateSliceQLEVisibility)
89
78
  self._modeCB.currentIndexChanged.connect(self.sigSlicesChanged)
90
79
  self._sliceQLE.editingFinished.connect(self.sigSlicesChanged)
80
+ self._sliceQLE.textChanged.connect(self._updateNoSliceWarningVisibility)
91
81
  self.toggled.connect(self.sigSlicesChanged)
92
82
 
93
- def _updateSliceQLEVisibilty(self, *args, **kwargs):
83
+ def _updateSliceQLEVisibility(self, *args, **kwargs):
94
84
  self._sliceQLE.setVisible(self.getMode() == NabuSliceMode.OTHER)
85
+ self._updateNoSliceWarningVisibility()
86
+
87
+ def _updateNoSliceWarningVisibility(self):
88
+ def no_other_slice_defined() -> bool:
89
+ slices_defined = self._sliceQLE.text().replace(" ", "")
90
+ slices_defined = self._sliceQLE.text().replace(",", "")
91
+ slices_defined = self._sliceQLE.text().replace(";", "")
92
+ return slices_defined == ""
93
+
94
+ self._noSliceWarning.setVisible(
95
+ self.getMode() is NabuSliceMode.OTHER and no_other_slice_defined()
96
+ )
95
97
 
96
98
  def setMode(self, mode: NabuSliceMode):
97
99
  mode = NabuSliceMode.from_value(mode)
98
100
  item_index = self._modeCB.findText(mode.value)
99
101
  self._modeCB.setCurrentIndex(item_index)
100
102
  old = self.blockSignals(True)
101
- self._updateSliceQLEVisibilty()
103
+ self._updateSliceQLEVisibility()
102
104
  self.blockSignals(old)
103
105
 
104
106
  def getMode(self) -> NabuSliceMode:
@@ -279,7 +281,8 @@ class AnglesFileWidget(qt.QWidget):
279
281
 
280
282
  class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
281
283
  """
282
- Widget to define the configuration of nabu reconstruction processing
284
+ Widget to define the configuration of nabu reconstruction processing and dataset configuration.
285
+ At the gui side the "dataset" section as no real reason to be on its own. So we melt the two there.
283
286
  """
284
287
 
285
288
  sigConfChanged = qt.Signal(str)
@@ -287,7 +290,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
287
290
  modified
288
291
  """
289
292
 
290
- def __init__(self, parent, scrollArea):
293
+ def __init__(self, parent):
291
294
  qt.QWidget.__init__(self, parent, stage=_NabuStages.PRE)
292
295
  _NabuStageConfigBase.__init__(self, stage=_NabuStages.PRE)
293
296
  self.setLayout(qt.QGridLayout())
@@ -295,7 +298,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
295
298
  self.__optimizationIteAlgo = "chambolle-pock"
296
299
 
297
300
  # slices to be reconstructed online
298
- self._slicesWidget = SliceGroupBox(parent=self, scrollArea=scrollArea)
301
+ self._slicesWidget = SliceGroupBox(parent=self)
299
302
  self.layout().addWidget(self._slicesWidget, 0, 0, 1, 2)
300
303
  # ignore listener of the mouse for the slice widget, can
301
304
  # come with an issue as we are on a scroll area
@@ -305,7 +308,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
305
308
  self._axisLabel = qt.QLabel("reconstruction plane", self)
306
309
  self._axisLabel.setToolTip("Over which axis the slice must be picked")
307
310
  self.layout().addWidget(self._axisLabel)
308
- self._axisQCB = qt.QComboBox(self)
311
+ self._axisQCB = QComboBoxIgnoreWheel(self)
309
312
  axis_tooltips = {
310
313
  NabuPlane.YZ.value: "along axis x (aka axis 2 - expected to be slow)",
311
314
  NabuPlane.XZ.value: "along axis y (aka axis 1 - expected to be slow)",
@@ -323,7 +326,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
323
326
  # method
324
327
  self._methodLabel = qt.QLabel("method", self)
325
328
  self.layout().addWidget(self._methodLabel, 2, 0, 1, 1)
326
- self._methodQCB = QComboBoxIgnoreWheel(parent=self, scrollArea=scrollArea)
329
+ self._methodQCB = QComboBoxIgnoreWheel(parent=self)
327
330
  for method in _NabuReconstructionMethods:
328
331
  self._methodQCB.addItem(method.value)
329
332
  self.layout().addWidget(self._methodQCB, 2, 1, 1, 1)
@@ -333,7 +336,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
333
336
  # angle_offset
334
337
  self._labelOffsetLabel = qt.QLabel("angle offset (in degree)", self)
335
338
  self.layout().addWidget(self._labelOffsetLabel, 3, 0, 1, 1)
336
- self._angleOffsetQDSB = QDoubleSpinBoxIgnoreWheel(self, scrollArea)
339
+ self._angleOffsetQDSB = QDoubleSpinBoxIgnoreWheel(self)
337
340
  self._angleOffsetQDSB.setMaximum(-180)
338
341
  self._angleOffsetQDSB.setMaximum(180)
339
342
  self.layout().addWidget(self._angleOffsetQDSB, 3, 1, 1, 1)
@@ -343,7 +346,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
343
346
  # fbp filter type
344
347
  self._fbpFilterCB = qt.QCheckBox("fbp filter", self)
345
348
  self.layout().addWidget(self._fbpFilterCB, 4, 0, 1, 1)
346
- self._fbpFilterType = QComboBoxIgnoreWheel(self, scrollArea)
349
+ self._fbpFilterType = QComboBoxIgnoreWheel(self)
347
350
  for filter_type in _NabuFBPFilterType:
348
351
  self._fbpFilterType.addItem(filter_type.value)
349
352
  self.layout().addWidget(self._fbpFilterType, 4, 1, 1, 1)
@@ -353,7 +356,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
353
356
  # padding type
354
357
  self._paddingTypeLabel = qt.QLabel("padding type", self)
355
358
  self.layout().addWidget(self._paddingTypeLabel, 5, 0, 1, 1)
356
- self._paddingType = QComboBoxIgnoreWheel(self, scrollArea)
359
+ self._paddingType = QComboBoxIgnoreWheel(self)
357
360
  for fbp_padding_type in _NabuPaddingType:
358
361
  self._paddingType.addItem(fbp_padding_type.value)
359
362
  self.layout().addWidget(self._paddingType, 5, 1, 1, 1)
@@ -377,7 +380,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
377
380
 
378
381
  # binning - subsampling
379
382
  self._binSubSamplingGB = _BinSubSampling(
380
- "binning and subsampling", parent=self, scrollArea=scrollArea
383
+ "binning and sub-sampling", parent=self
381
384
  )
382
385
  self.layout().addWidget(self._binSubSamplingGB, 9, 0, 1, 2)
383
386
 
@@ -445,6 +448,19 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
445
448
  self.registerWidget(self._angleFileLabel, "advanced")
446
449
  self.registerWidget(self._anglesFileWidget, "advanced")
447
450
 
451
+ # exclude projections: [A, B] (if user want's to skip projection from degree A to degree B (included))
452
+ self._excludeProjectionsQCB = qt.QCheckBox("exclude projections angles", self)
453
+ self.layout().addWidget(self._excludeProjectionsQCB, 24, 0, 1, 1)
454
+ self._excludeProjectionsWidget = RangeWidget(self)
455
+ self._excludeProjectionsWidget.setRange(0.0, 360.0)
456
+ self._excludeProjectionsWidget.setSuffix("º")
457
+ self._excludeProjectionsWidget.setToolTip(
458
+ "Projections with a rotation in [a, b] range will be ignored."
459
+ )
460
+ self.layout().addWidget(self._excludeProjectionsWidget, 24, 1, 1, 1)
461
+ self.registerWidget(self._excludeProjectionsQCB, "advanced")
462
+ self.registerWidget(self._excludeProjectionsWidget, "advanced")
463
+
448
464
  # spacer for style
449
465
  spacer = qt.QWidget(self)
450
466
  spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
@@ -466,6 +482,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
466
482
  self._positivityConstraintCB.setChecked(True)
467
483
  self._clipOuterCircleCB.setChecked(False)
468
484
  self._centeredAxisCB.setChecked(False)
485
+ self._excludeProjectionsWidget.setEnabled(False)
469
486
 
470
487
  # connect signal / slot
471
488
  self._axisQCB.currentIndexChanged.connect(self._slicesChanged)
@@ -485,6 +502,13 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
485
502
  self._anglesFileWidget._qle.textChanged.connect(self._anglesFilechanged)
486
503
  self._clipOuterCircleCB.toggled.connect(self._clipOuterCircleChanged)
487
504
  self._centeredAxisCB.toggled.connect(self._centeredAxisChanged)
505
+ self._excludeProjectionsQCB.toggled.connect(self._excludeProjectionsChanged)
506
+ self._excludeProjectionsQCB.toggled.connect(
507
+ self._excludeProjectionsWidget.setEnabled
508
+ )
509
+ self._excludeProjectionsWidget.sigChanged.connect(
510
+ self._excludeProjectionsChanged
511
+ )
488
512
 
489
513
  def getSlices(self):
490
514
  return self._slicesWidget.getSlices()
@@ -542,6 +566,9 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
542
566
  def _anglesFilechanged(self, *args, **kwargs):
543
567
  self._signalConfChanged("angles_file")
544
568
 
569
+ def _excludeProjectionsChanged(self):
570
+ self._signalConfChanged("exclude_projections")
571
+
545
572
  def setScan(self, scan):
546
573
  raise NotImplementedError()
547
574
 
@@ -556,10 +583,10 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
556
583
  def getAngleOffset(self) -> float:
557
584
  return self._angleOffsetQDSB.value()
558
585
 
559
- def setAngleOffset(self, value: typing.Union[str, float]):
586
+ def setAngleOffset(self, value: str | float):
560
587
  self._angleOffsetQDSB.setValue(float(value))
561
588
 
562
- def getFBPFilterType(self) -> typing.Union[_NabuFBPFilterType, None]:
589
+ def getFBPFilterType(self) -> _NabuFBPFilterType | None:
563
590
  if self._fbpFilterCB.isChecked():
564
591
  return _NabuFBPFilterType.from_value(self._fbpFilterType.currentText())
565
592
  else:
@@ -599,13 +626,13 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
599
626
  def isPreconditioningFilterEnable(self):
600
627
  return self._preconditioningFilter.isChecked()
601
628
 
602
- def setPreconditioningFilterEnable(self, enable: typing.Union[bool, int]):
629
+ def setPreconditioningFilterEnable(self, enable: bool | int):
603
630
  self._preconditioningFilter.setChecked(bool(enable))
604
631
 
605
632
  def isPositivityConstraintEnable(self):
606
633
  return self._positivityConstraintCB.isChecked()
607
634
 
608
- def setPositivityConstraintEnable(self, enable: typing.Union[bool, int]):
635
+ def setPositivityConstraintEnable(self, enable: bool | int):
609
636
  self._positivityConstraintCB.setChecked(bool(enable))
610
637
 
611
638
  def getTranslationMvtFile(self):
@@ -654,10 +681,27 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
654
681
  """return over which axis we expect to do the reconstruction"""
655
682
  return NabuPlane.from_value(self._axisQCB.currentText())
656
683
 
657
- def setNabuPlane(self, axis: typing.Union[str, NabuPlane]):
684
+ def setNabuPlane(self, axis: str | NabuPlane):
658
685
  axis = NabuPlane.from_value(axis)
659
686
  self._axisQCB.setCurrentText(axis.value)
660
687
 
688
+ def getExcludeProjections(self) -> tuple:
689
+ if self._excludeProjectionsQCB.isChecked():
690
+ return self._excludeProjectionsWidget.getRange()
691
+ else:
692
+ return tuple()
693
+
694
+ def setExcludeProjections(self, projections: tuple):
695
+ if not isinstance(projections, tuple):
696
+ raise TypeError(
697
+ f"projections should be an instance of tuple. Got {type(projections)}"
698
+ )
699
+ if len(projections) == 0:
700
+ self._excludeProjectionsQCB.setChecked(False)
701
+ else:
702
+ self._excludeProjectionsQCB.setChecked(True)
703
+ self._excludeProjectionsWidget.setRange(*projections)
704
+
661
705
  @docstring(_NabuStageConfigBase)
662
706
  def getConfiguration(self) -> dict:
663
707
  fbp_filter_type = self.getFBPFilterType()
@@ -687,9 +731,22 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
687
731
  return config
688
732
 
689
733
  def getDatasetConfiguration(self) -> dict:
690
- return self._binSubSamplingGB.getConfiguration()
734
+ exclude_projections = self.getExcludeProjections()
735
+ if len(exclude_projections) == 0:
736
+ exclude_projections = ""
737
+ else:
738
+ exclude_projections = f"angular_range={str(list(exclude_projections))}"
739
+ config = self._binSubSamplingGB.getConfiguration()
740
+ config["exclude_projections"] = exclude_projections
741
+ return config
691
742
 
692
743
  def setDatasetConfiguration(self, config):
744
+ exclude_proj = config.pop("exclude_projections", None)
745
+ if exclude_proj is not None:
746
+ if isinstance(exclude_proj, str):
747
+ exclude_proj = exclude_proj.replace("angular_range=", "")
748
+ exclude_proj = convert_str_to_tuple(exclude_proj)
749
+ self.setExcludeProjections(exclude_proj)
693
750
  return self._binSubSamplingGB.setConfiguration(config)
694
751
 
695
752
  @docstring(_NabuStageConfigBase)
@@ -791,7 +848,7 @@ class _SubRegionEditor(qt.QObject):
791
848
  def layout(self):
792
849
  return self._layout
793
850
 
794
- def getSubRegionMin(self) -> typing.Union[None, int]:
851
+ def getSubRegionMin(self) -> int | None:
795
852
  """
796
853
 
797
854
  :return: None if region is unbounded else the value of the bound
@@ -801,7 +858,7 @@ class _SubRegionEditor(qt.QObject):
801
858
  else:
802
859
  return None
803
860
 
804
- def getSubRegionMax(self) -> typing.Union[None, int]:
861
+ def getSubRegionMax(self) -> int | None:
805
862
  """
806
863
 
807
864
  :return: None if region is unbounded else the value of the bound
@@ -811,7 +868,7 @@ class _SubRegionEditor(qt.QObject):
811
868
  else:
812
869
  return None
813
870
 
814
- def setSubRegionMin(self, sub_region_min: typing.Union[None, int]) -> None:
871
+ def setSubRegionMin(self, sub_region_min: int | None) -> None:
815
872
  """
816
873
 
817
874
  :param min: if min is None or -1 wr will expand it to - infinity
@@ -843,20 +900,14 @@ class _SubRegionEditor(qt.QObject):
843
900
  """
844
901
 
845
902
  :return: min, max
846
- :rtype: tuple
847
903
  """
848
904
  return self.getSubRegionMin(), self.getSubRegionMax()
849
905
 
850
906
  def setSubRegion(
851
907
  self,
852
- sub_region_min: typing.Union[None, int],
853
- sub_region_max: typing.Union[None, int],
908
+ sub_region_min: int | None,
909
+ sub_region_max: int | None,
854
910
  ):
855
- """
856
-
857
- :param tuple min:
858
- :param tuple max:
859
- """
860
911
  self.setSubRegionMin(sub_region_min)
861
912
  self.setSubRegionMax(sub_region_max)
862
913
 
@@ -957,11 +1008,11 @@ class _BinSubSampling(qt.QGroupBox):
957
1008
  binningChanged = qt.Signal()
958
1009
  """signal emitted when binning change"""
959
1010
 
960
- def __init__(self, text, parent, scrollArea):
1011
+ def __init__(self, text, parent):
961
1012
  qt.QGroupBox.__init__(self, text)
962
1013
  self.setLayout(qt.QFormLayout())
963
1014
  # horizontal binning
964
- self._hBinningSB = QSpinBoxIgnoreWheel(self, scrollArea=scrollArea)
1015
+ self._hBinningSB = QSpinBoxIgnoreWheel(self)
965
1016
  self._hBinningSB.setMinimum(1)
966
1017
  self._hBinningSB.setMaximum(3)
967
1018
  self.layout().addRow("horizontal binning", self._hBinningSB)
@@ -971,11 +1022,11 @@ class _BinSubSampling(qt.QGroupBox):
971
1022
  self._vBinningSB.setMaximum(100)
972
1023
  # self.layout().addRow('vertical binning', self._vBinningSB)
973
1024
  self._vBinningSB.setVisible(False)
974
- # projection subsampling
975
- self._projSubsamplingSB = QSpinBoxIgnoreWheel(self, scrollArea=scrollArea)
1025
+ # projection sub-sampling
1026
+ self._projSubsamplingSB = QSpinBoxIgnoreWheel(self)
976
1027
  self._projSubsamplingSB.setMinimum(1)
977
1028
  self._projSubsamplingSB.setMaximum(100)
978
- self.layout().addRow("projection subsampling", self._projSubsamplingSB)
1029
+ self.layout().addRow("projection sub-sampling", self._projSubsamplingSB)
979
1030
 
980
1031
  # connect signal / slot
981
1032
  self._vBinningSB.valueChanged.connect(self._valueUpdated)
@@ -1,34 +1,9 @@
1
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"
2
+ from __future__ import annotations
3
+
29
4
 
30
5
  import functools
31
- import typing
6
+ from typing import Iterable
32
7
 
33
8
  from silx.gui import qt
34
9
 
@@ -168,7 +143,7 @@ class NabuFlowControl(qt.QWidget):
168
143
  """
169
144
  change visibility of the widgets relative to initialization process
170
145
 
171
- :param bool visible:
146
+ :param visible:
172
147
  """
173
148
  self._iniProcessWidgets.setVisible(visible)
174
149
 
@@ -176,40 +151,34 @@ class NabuFlowControl(qt.QWidget):
176
151
  """
177
152
  change visibility of the widgets relative to pre processing process
178
153
 
179
- :param bool visible:
154
+ :param visible:
180
155
  """
181
156
  self._preProcessWidgets.setVisible(visible)
182
157
 
183
- def setPhaseVisible(self, visible):
158
+ def setPhaseVisible(self, visible: bool):
184
159
  """
185
160
  change visibility of the widgets relative to pre processing process
186
-
187
- :param bool visible:
188
161
  """
189
162
  self._phaseProcessWidgets.setVisible(visible)
190
163
 
191
- def setProcVisible(self, visible):
164
+ def setProcVisible(self, visible: bool):
192
165
  """
193
166
  change visibility of the widgets relative to processing process
194
-
195
- :param bool visible:
196
167
  """
197
168
  self._processWidgets.setVisible(visible)
198
169
 
199
- def setPostVisible(self, visible):
170
+ def setPostVisible(self, visible: bool):
200
171
  """
201
172
  change visibility of the widgets relative to post processing process
202
-
203
- :param bool visible:
204
173
  """
205
174
  self._postProcessWidgets.setVisible(visible)
206
175
 
207
- def setIniProcessing(self, processes: typing.Iterable, icons: typing.Iterable):
176
+ def setIniProcessing(self, processes: Iterable, icons: Iterable):
208
177
  """
209
178
  Defines the processing to execute for initialization
210
179
 
211
- :param Iterable processes: processes to display
212
- :param Iterable icons: icons associated to the processes if any
180
+ :param processes: processes to display
181
+ :param icons: icons associated to the processes if any
213
182
  """
214
183
  draggability = [False] * len(processes)
215
184
  self._iniProcessWidgets.setProcesses(
@@ -217,11 +186,11 @@ class NabuFlowControl(qt.QWidget):
217
186
  )
218
187
  self.setIniprocVisible(len(processes) != 0)
219
188
 
220
- def setPreProcessing(self, processes: typing.Iterable, icons: typing.Iterable):
189
+ def setPreProcessing(self, processes: Iterable, icons: Iterable):
221
190
  """
222
191
 
223
- :param Iterable processes: processes to display
224
- :param Iterable icons: icons associated to the processes if any
192
+ :param processes: processes to display
193
+ :param icons: icons associated to the processes if any
225
194
  """
226
195
  draggability = [False] * len(processes)
227
196
  self._preProcessWidgets.setProcesses(
@@ -229,11 +198,11 @@ class NabuFlowControl(qt.QWidget):
229
198
  )
230
199
  self.setPreProcVisible(len(processes) != 0)
231
200
 
232
- def setPhaseProcessing(self, processes: typing.Iterable, icons: typing.Iterable):
201
+ def setPhaseProcessing(self, processes: Iterable, icons: Iterable):
233
202
  """
234
203
 
235
- :param Iterable processes: processes to display
236
- :param Iterable icons: icons associated to the processes if any
204
+ :param processes: processes to display
205
+ :param icons: icons associated to the processes if any
237
206
  """
238
207
  draggability = [False] * len(processes)
239
208
  self._phaseProcessWidgets.setProcesses(
@@ -241,11 +210,11 @@ class NabuFlowControl(qt.QWidget):
241
210
  )
242
211
  self.setPhaseVisible(len(processes) != 0)
243
212
 
244
- def setProcessing(self, processes: typing.Iterable, icons: typing.Iterable):
213
+ def setProcessing(self, processes: Iterable, icons: Iterable):
245
214
  """
246
215
 
247
- :param Iterable processes: processes to display
248
- :param Iterable icons: icons associated to the processes if any
216
+ :param processes: processes to display
217
+ :param icons: icons associated to the processes if any
249
218
  """
250
219
  draggability = [False] * len(processes)
251
220
  self._processWidgets.setProcesses(
@@ -253,11 +222,11 @@ class NabuFlowControl(qt.QWidget):
253
222
  )
254
223
  self.setProcVisible(len(processes) != 0)
255
224
 
256
- def setPostProcessing(self, processes: typing.Iterable, icons: typing.Iterable):
225
+ def setPostProcessing(self, processes: Iterable, icons: Iterable):
257
226
  """
258
227
 
259
- :param Iterable processes: processes to display
260
- :param Iterable icons: icons associated to the processes if any
228
+ :param processes: processes to display
229
+ :param icons: icons associated to the processes if any
261
230
  """
262
231
  draggability = [False] * len(processes)
263
232
  self._postProcessWidgets.setProcesses(
@@ -293,13 +262,15 @@ class NabuFlowControl(qt.QWidget):
293
262
  """
294
263
  return self._postProcessWidgets.getFlow()
295
264
 
296
- def getFlow(self):
265
+ def getFlow(self) -> dict:
297
266
  """
267
+ Returns the concatenation of pre-processing, processing, and post-processing flows.
268
+
269
+ :return: Dictionary where the keys are Nabu stages, and the values are lists of flows for each stage.
270
+ :rtype: dict
298
271
 
299
- :return: Return the concatenation of pre processing, processing and
300
- post processing
301
- :rtype: dict. keys are nabu stage, values are list of flow for each
302
- stage.
272
+ This method fetches the processing flows for all stages and returns them
273
+ as a dictionary, allowing easy access to the current configuration.
303
274
  """
304
275
  return {
305
276
  _NabuStages.INI: self._iniProcessWidget.getFlow(),
@@ -309,11 +280,10 @@ class NabuFlowControl(qt.QWidget):
309
280
  _NabuStages.POST: self._processWidgets.getFlow(),
310
281
  }
311
282
 
312
- def getProcessFocused(self):
283
+ def getProcessFocused(self) -> tuple:
313
284
  """
314
285
 
315
286
  :return: the process under focus
316
- :rtype: tuple (stage or None, None or process_id (str or class))
317
287
  """
318
288
  stages = (
319
289
  _NabuStages.INI,