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,28 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+
1
4
  import functools
2
5
  import numpy
3
6
  from silx.gui import qt
7
+ from silx.utils.enum import Enum as _Enum
4
8
 
9
+ from tomwer.core.tomwer_object import TomwerObject
10
+ from tomwer.gui import icons
5
11
  from tomwer.gui.stitching.axisorderedlist import AxisOrderedTomoObjsModel
6
12
  from tomwer.gui.utils.step import StepSizeSelectorWidget
13
+ from tomwer.gui.utils.qt_utils import block_signals
7
14
 
8
15
 
9
16
  class PosEditorOverOneAxis(qt.QWidget):
10
17
  """keep it ordered along one axis"""
11
18
 
12
- DEFAULT_VALUE_WHEM_MISSING = 0
13
-
14
19
  def __init__(
15
20
  self, parent, axis_edited: int, axis_order=None, *args, **kwargs
16
21
  ) -> None:
17
22
  assert axis_edited in (0, 1, 2)
18
23
  super().__init__(parent, *args, **kwargs)
19
24
  self._axisEdited = axis_edited
20
- # the axis the spin boxes are editing
25
+ # the axis we are editing
21
26
  self._axisOrder = axis_order if axis_order is not None else axis_edited
22
27
  # the axis along which the tomo obj are ordered
23
- self._tomoObjtoSpinBoxes = {}
24
- # list of spin box to edit the position over the axis. Key is the tomo object, value is the spin box
25
- self.__spinBoxescallback = {}
28
+ self._tomoObjtoTomoObjPosWidget = {}
29
+ # list of `_TomoObjPosition` to edit the position over the axis. Key is the tomo object, value is the `_TomoObjPosition`
30
+ self.__tomoObjPosWidgetCallbacks = {}
26
31
  self.setLayout(qt.QVBoxLayout())
27
32
  # widget to define step size
28
33
  self._stepSizeWidget = StepSizeSelectorWidget(
@@ -34,19 +39,24 @@ class PosEditorOverOneAxis(qt.QWidget):
34
39
  )
35
40
  self.layout().addWidget(self._stepSizeWidget)
36
41
 
42
+ # widget to define edition mode and reset
43
+ self._editionOptionsWidget = _EditionOptions()
44
+ self.layout().addWidget(self._editionOptionsWidget)
45
+
37
46
  # table with the different Tomo objects
38
47
  self._tomoObjsTableView = qt.QTableView(parent=self)
39
- model = EditableAxisOrderedTomoObjsModel(axis=self._axisOrder)
48
+ model = EditableAxisOrderedTomoObjsModel(axis=axis_edited)
40
49
  self._tomoObjsTableView.setModel(model)
41
50
 
42
51
  self.layout().addWidget(self._tomoObjsTableView)
43
52
 
44
53
  # connect signal / slot
45
54
  self._stepSizeWidget.valueChanged.connect(self._updateStepSize)
55
+ self._editionOptionsWidget.sigReset.connect(self._resetPositions)
46
56
 
47
57
  # tune table view
48
- self._tomoObjsTableView.setColumnWidth(0, 15)
49
- self._tomoObjsTableView.setColumnWidth(2, 120)
58
+ self._tomoObjsTableView.setColumnWidth(0, 45)
59
+ self._tomoObjsTableView.setColumnWidth(2, _TomoObjPosition.WIDGET_WIDTH)
50
60
  self._tomoObjsTableView.horizontalHeader().setSectionResizeMode(
51
61
  1, qt.QHeaderView.Stretch
52
62
  )
@@ -54,7 +64,7 @@ class PosEditorOverOneAxis(qt.QWidget):
54
64
 
55
65
  def _updateStepSize(self):
56
66
  step_size = self.getStepSize()
57
- for sb in self._tomoObjtoSpinBoxes.values():
67
+ for sb in self._tomoObjtoTomoObjPosWidget.values():
58
68
  sb.setSingleStep(step_size)
59
69
 
60
70
  def setStepSize(self, step_size: int):
@@ -64,6 +74,9 @@ class PosEditorOverOneAxis(qt.QWidget):
64
74
  def getStepSize(self) -> int:
65
75
  return self._stepSizeWidget.getStepSize()
66
76
 
77
+ def getTomoObjs(self) -> tuple[TomwerObject]:
78
+ return self._tomoObjsTableView.model().getTomoObjs()
79
+
67
80
  def addTomoObj(self, tomo_obj):
68
81
  if tomo_obj is None:
69
82
  return
@@ -71,43 +84,92 @@ class PosEditorOverOneAxis(qt.QWidget):
71
84
  self._tomoObjsTableView.model().addTomoObj(tomo_obj)
72
85
  # register tomo obj metadata modification to make sure we keel the z ordered list up to data
73
86
  tomo_obj.stitching_metadata.sigChanged.connect(
74
- self._orderedMightHavechanged
87
+ self._orderedMightHaveChanged
75
88
  )
76
- self._createSpinBox(tomo_obj=tomo_obj)
77
- self._orderedMightHavechanged()
78
-
79
- def _createSpinBox(self, tomo_obj):
80
- spinBox = qt.QSpinBox(parent=self)
81
- spinBox.setRange(numpy.iinfo(numpy.int32).min, numpy.iinfo(numpy.int32).max)
82
- spinBox.setSuffix("px")
83
- spinBox.setSingleStep(self.getStepSize())
84
- spinBox.setValue(
85
- tomo_obj.stitching_metadata.get_abs_position_px(axis=self._axisEdited)
86
- or self.DEFAULT_VALUE_WHEM_MISSING
89
+ self._createTomoObjPosition(tomo_obj=tomo_obj)
90
+ self._orderedMightHaveChanged()
91
+
92
+ def _createTomoObjPosition(self, tomo_obj, original_value: float | None = None):
93
+ """
94
+ :param original_value: original_value of the tomo_obj along the edited axis. Used when the widget is delete and recreate
95
+ """
96
+ widget = _TomoObjPosition(
97
+ tomo_obj=tomo_obj,
98
+ axis_edited=self._axisEdited,
99
+ original_value=original_value,
100
+ parent=self,
87
101
  )
102
+ widget.setSingleStep(self.getStepSize())
103
+
88
104
  identifier_as_str = tomo_obj.get_identifier().to_str()
89
- self._tomoObjtoSpinBoxes[identifier_as_str] = spinBox
105
+ self._tomoObjtoTomoObjPosWidget[identifier_as_str] = widget
90
106
  # connect signal / slot
91
107
  callback = functools.partial(
92
- self._spinBoxValueChanged, spin_box=spinBox, tomo_obj=tomo_obj
108
+ self._tomoObjPosChanged, spin_box=widget, tomo_obj_to_update=tomo_obj
93
109
  )
94
- self.__spinBoxescallback[identifier_as_str] = callback
95
- spinBox.editingFinished.connect(callback)
96
- return spinBox
110
+ self.__tomoObjPosWidgetCallbacks[identifier_as_str] = callback
111
+ widget.sigValueChanged.connect(callback)
112
+ return widget
97
113
 
98
114
  def _deleteSpinBox(self, tomo_obj):
99
115
  identifier_as_str = tomo_obj.get_identifier().to_str()
100
- if identifier_as_str in self._tomoObjtoSpinBoxes:
101
- del self._tomoObjtoSpinBoxes[identifier_as_str]
102
- del self.__spinBoxescallback[identifier_as_str]
116
+ if identifier_as_str in self._tomoObjtoTomoObjPosWidget:
117
+ spinBox = self._tomoObjtoTomoObjPosWidget.pop(identifier_as_str)
118
+ spinBox.deleteLater()
119
+ if identifier_as_str in self.__tomoObjPosWidgetCallbacks:
120
+ del self.__tomoObjPosWidgetCallbacks[identifier_as_str]
103
121
 
104
122
  def removeTomoObj(self, tomo_obj):
105
123
  self._deleteSpinBox(tomo_obj)
106
124
  self._tomoObjsTableView.model().removeTomoObj(tomo_obj)
107
- tomo_obj.stitching_metadata.sigChanged.disconnect(self._orderedMightHavechanged)
125
+ tomo_obj.stitching_metadata.sigChanged.disconnect(self._orderedMightHaveChanged)
108
126
 
109
- def _spinBoxValueChanged(self, spin_box, tomo_obj, *args, **kwargs):
110
- tomo_obj.stitching_metadata.setPxPos(spin_box.value(), axis=self._axisEdited)
127
+ def _tomoObjPosChanged(
128
+ self,
129
+ old_pos_value: int,
130
+ new_pos_value: int,
131
+ tomo_obj_to_update,
132
+ *args,
133
+ **kwargs,
134
+ ):
135
+ tomo_obj_to_update.stitching_metadata.setPxPos(
136
+ new_pos_value, axis=self._axisEdited
137
+ )
138
+ # edit upstream or downstream nodes according to the edit mode
139
+ shift = new_pos_value - old_pos_value
140
+ if shift == 0:
141
+ return
142
+
143
+ edition_mode = self._editionOptionsWidget.getEditionMode()
144
+ if edition_mode is _EditionMode.FREE:
145
+ tomo_objs_to_update = ()
146
+ elif edition_mode is _EditionMode.DOWNSTREAM:
147
+ tomo_objs_to_update = self._get_downstream_tomo_obj(
148
+ position=old_pos_value, tomo_obj_to_filter=tomo_obj_to_update
149
+ )
150
+ elif edition_mode is _EditionMode.UPSTREAM:
151
+ tomo_objs_to_update = self._get_upstream_tomo_obj_pos_widgets(
152
+ position=old_pos_value, tomo_obj_to_filter=tomo_obj_to_update
153
+ )
154
+ else:
155
+ raise NotImplementedError(f"edition mode ({edition_mode}) is not handled")
156
+ with block_signals(self):
157
+ for tomo_obj_to_update in tomo_objs_to_update:
158
+ associated_widget = self._tomoObjtoTomoObjPosWidget[
159
+ tomo_obj_to_update.get_identifier().to_str()
160
+ ]
161
+ current_value = associated_widget.getValue()
162
+ assert (
163
+ current_value == associated_widget.getValue()
164
+ ), "incoherent value between tomo object and widget"
165
+ new_value = current_value + shift
166
+ with block_signals(associated_widget):
167
+ associated_widget.setValue(new_value)
168
+ with block_signals(tomo_obj_to_update.stitching_metadata):
169
+ tomo_obj_to_update.stitching_metadata.setPxPos(
170
+ value=new_value, axis=self._axisEdited
171
+ )
172
+ self._orderedMightHaveChanged()
111
173
 
112
174
  def setTomoObjs(self, tomo_objs: tuple) -> None:
113
175
  """
@@ -122,47 +184,247 @@ class PosEditorOverOneAxis(qt.QWidget):
122
184
  for tomo_obj in tomo_objs:
123
185
  self.removeTomoObj(tomo_obj=tomo_obj)
124
186
 
125
- def reorderAlongAxis(self):
126
- pass
127
-
128
- def setSerie(self):
187
+ def setSeries(self):
129
188
  raise NotImplementedError
130
189
 
131
- def _orderedMightHavechanged(self, force_sb_update=False):
190
+ def _resetPositions(self):
191
+ tomo_objs = self.getTomoObjs()
192
+
193
+ with block_signals(self):
194
+ for tomo_obj in tomo_objs:
195
+ widget = self._tomoObjtoTomoObjPosWidget[
196
+ tomo_obj.get_identifier().to_str()
197
+ ]
198
+ with block_signals(widget):
199
+ widget.resetOriginalValue()
200
+ tomo_obj.stitching_metadata.setPxPos(
201
+ value=widget.getOriginalValue(), axis=self._axisEdited
202
+ )
203
+ self._orderedMightHaveChanged()
204
+
205
+ def _get_upstream_tomo_obj_pos_widgets(
206
+ self, position: float, tomo_obj_to_filter: TomwerObject | None = None
207
+ ) -> tuple[TomwerObject]:
208
+ return tuple(
209
+ filter(
210
+ lambda tomo_obj: (
211
+ tomo_obj.stitching_metadata.get_abs_position_px(
212
+ axis=self._axisEdited
213
+ )
214
+ >= position
215
+ )
216
+ and (tomo_obj is not tomo_obj_to_filter),
217
+ self.getTomoObjs(),
218
+ )
219
+ )
220
+
221
+ def _get_downstream_tomo_obj(
222
+ self, position: float, tomo_obj_to_filter: TomwerObject | None = None
223
+ ) -> tuple[TomwerObject]:
224
+ return tuple(
225
+ filter(
226
+ lambda tomo_obj: (
227
+ tomo_obj.stitching_metadata.get_abs_position_px(
228
+ axis=self._axisEdited
229
+ )
230
+ <= position
231
+ )
232
+ and (tomo_obj is not tomo_obj_to_filter),
233
+ self.getTomoObjs(),
234
+ )
235
+ )
236
+
237
+ def _orderedMightHaveChanged(self, force_sb_update=False):
132
238
  # add index widget
133
239
  self._tomoObjsTableView.model().reorder_objs()
134
240
  self._tomoObjsTableView.model().layoutChanged.emit()
135
241
 
136
242
  ordered_objs = self._tomoObjsTableView.model()._axis_decreasing_ordered_objs
137
243
 
138
- # start update spin box positions
244
+ # start update position widgets
139
245
  # check if we need to update one widget. Has this is designed if we need to update one then we need to update them all...
140
246
  needs_to_update_widget = force_sb_update
141
247
  for i_pos, tomo_obj in enumerate(ordered_objs):
142
248
  identifier_as_str = tomo_obj.get_identifier().to_str()
143
- spinBox = self._tomoObjtoSpinBoxes[identifier_as_str]
249
+ widget = self._tomoObjtoTomoObjPosWidget[identifier_as_str]
144
250
  model_index = self._tomoObjsTableView.model().createIndex(i_pos, 2)
145
- needs_to_update_widget = (
146
- needs_to_update_widget
147
- or self._tomoObjsTableView.indexWidget(model_index)
148
- not in (None, spinBox)
149
- )
251
+ if self._tomoObjsTableView.indexWidget(model_index) not in (None, widget):
252
+ needs_to_update_widget = True
253
+ break
150
254
 
151
255
  for i_pos, tomo_obj in enumerate(ordered_objs):
152
256
  identifier_as_str = tomo_obj.get_identifier().to_str()
153
- spinBox = self._tomoObjtoSpinBoxes[identifier_as_str]
257
+ widget = self._tomoObjtoTomoObjPosWidget[identifier_as_str]
154
258
  model_index = self._tomoObjsTableView.model().createIndex(i_pos, 2)
155
259
  if needs_to_update_widget:
156
- # if items have been reordered then we must recreated SpinBoxes otherwise if we try
260
+ # if items have been reordered then we must recreated `TomoObjPosWidget` otherwise if we try
157
261
  # to change order then Qt will end up with a seg fault which seems to come from
158
- # otherwirtting the cell and trying to reuse them
262
+ # overwriting the cell and trying to reuse them
263
+ original_value = widget.getOriginalValue()
159
264
  self._deleteSpinBox(tomo_obj=tomo_obj)
160
- spinBox = self._createSpinBox(tomo_obj=tomo_obj)
161
- self._tomoObjsTableView.setIndexWidget(model_index, spinBox)
162
- # end update spin box positions
265
+ widget = self._createTomoObjPosition(
266
+ tomo_obj=tomo_obj, original_value=original_value
267
+ )
268
+ self._tomoObjsTableView.setIndexWidget(model_index, widget)
269
+
270
+ # expose API
271
+ def getEditionMode(self) -> _EditionMode:
272
+ return self._editionOptionsWidget.getEditionMode()
273
+
274
+ def setEditionMode(self, edition_mode: _EditionMode) -> _EditionMode:
275
+ self._editionOptionsWidget.setEditionMode(edition_mode=edition_mode)
163
276
 
164
277
 
165
278
  class EditableAxisOrderedTomoObjsModel(AxisOrderedTomoObjsModel):
166
279
  def __init__(self, axis: int, parent=None) -> None:
167
280
  super().__init__(axis, parent)
168
281
  self._headers = ["index", "tomo obj", f"axis {axis} pos (px)"]
282
+
283
+
284
+ class _TomoObjPosition(qt.QWidget):
285
+ """
286
+ Widget used to define tomo object position over one axis (and reset if needed)
287
+
288
+ :param original_value: original_value of the tomo_obj along the edited axis. Used when the widget is delete and recreate
289
+ """
290
+
291
+ WIDGET_WIDTH = 120
292
+
293
+ RESET_BUTTON_WIDTH = 25
294
+
295
+ DEFAULT_VALUE_WHEN_MISSING = 0
296
+
297
+ sigValueChanged = qt.Signal(int, int)
298
+ """emit when the value is changed. Parameters are (old value, new value)"""
299
+
300
+ def __init__(
301
+ self,
302
+ tomo_obj,
303
+ axis_edited: int,
304
+ parent: qt.QWidget | None = None,
305
+ original_value: float | None = None,
306
+ ) -> None:
307
+ super().__init__(parent)
308
+ self.setLayout(qt.QHBoxLayout())
309
+ self.layout().setContentsMargins(0, 0, 0, 0)
310
+ self.layout().setSpacing(0)
311
+ # create spin box object
312
+ self._spinBox = qt.QSpinBox(self)
313
+ self._spinBox.setRange(
314
+ numpy.iinfo(numpy.int32).min, numpy.iinfo(numpy.int32).max
315
+ )
316
+ self._spinBox.setSuffix("px")
317
+ currentPos = (
318
+ tomo_obj.stitching_metadata.get_abs_position_px(axis=axis_edited)
319
+ or self.DEFAULT_VALUE_WHEN_MISSING
320
+ )
321
+ self.__originalValue = original_value or currentPos
322
+ self.__lastValue = self.__originalValue
323
+ self._spinBox.setValue(currentPos)
324
+ self._spinBox.setFixedWidth(self.WIDGET_WIDTH - self.RESET_BUTTON_WIDTH)
325
+ self.layout().addWidget(self._spinBox)
326
+
327
+ # create option to reset value
328
+ self._resetValueQPB = qt.QPushButton(parent=self)
329
+ self._resetValueQPB.setFixedWidth(self.RESET_BUTTON_WIDTH)
330
+ style = qt.QApplication.style()
331
+ resetIcon = style.standardIcon(qt.QStyle.SP_DialogResetButton)
332
+ self._resetValueQPB.setIcon(resetIcon)
333
+ self.layout().addWidget(self._resetValueQPB)
334
+
335
+ # connect signal / slot
336
+ self._spinBox.valueChanged.connect(self._valueChanged)
337
+ self._resetValueQPB.clicked.connect(self.resetOriginalValue)
338
+
339
+ def _valueChanged(self, new_value):
340
+ self.sigValueChanged.emit(
341
+ self.__lastValue,
342
+ new_value,
343
+ )
344
+ self.__lastValue = new_value
345
+
346
+ def getOriginalValue(self) -> float:
347
+ return self.__originalValue
348
+
349
+ def setOriginalValue(self, value: float) -> None:
350
+ self.__originalValue = value
351
+
352
+ def resetOriginalValue(self) -> None:
353
+ self._spinBox.setValue(self.getOriginalValue())
354
+ self._positionChanged()
355
+
356
+ def _positionChanged(self):
357
+ self._valueChanged(new_value=self._spinBox.value())
358
+
359
+ def setValue(self, value: float) -> None:
360
+ self._spinBox.setValue(value)
361
+ self.__lastValue = value
362
+
363
+ def getValue(self) -> float:
364
+ return self._spinBox.value()
365
+
366
+ # expose API
367
+ def setSingleStep(self, val: int):
368
+ self._spinBox.setSingleStep(val)
369
+
370
+
371
+ class _EditionMode(_Enum):
372
+ FREE = "free"
373
+ UPSTREAM = "upstream"
374
+ DOWNSTREAM = "downstream"
375
+
376
+ @staticmethod
377
+ def get_icon(cls):
378
+ if cls == cls.UPSTREAM:
379
+ return icons.getQIcon("edit_upstream")
380
+ elif cls == cls.DOWNSTREAM:
381
+ return icons.getQIcon("edit_downstream")
382
+ elif cls == cls.FREE:
383
+ return icons.getQIcon("free_edition")
384
+ else:
385
+ raise ValueError()
386
+
387
+
388
+ class _EditionOptions(qt.QWidget):
389
+
390
+ sigReset = qt.Signal()
391
+ sigModeChanged = qt.Signal()
392
+
393
+ def __init__(self, parent=None):
394
+ super().__init__(parent)
395
+ self.setLayout(qt.QHBoxLayout())
396
+
397
+ self._editionModeLabel = qt.QLabel("edition mode", self)
398
+ self.layout().addWidget(self._editionModeLabel)
399
+
400
+ self._editionModeCB = qt.QComboBox(self)
401
+ for mode in _EditionMode:
402
+ self._editionModeCB.addItem(
403
+ _EditionMode.get_icon(mode),
404
+ mode.value,
405
+ )
406
+ self.layout().addWidget(self._editionModeCB)
407
+ self._editionModeCB.setFixedHeight(30)
408
+
409
+ self._spacer = qt.QSpacerItem(
410
+ 20, 40, qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
411
+ )
412
+ self.layout().addItem(self._spacer)
413
+
414
+ style = qt.QApplication.style()
415
+ reset_icon = style.standardIcon(qt.QStyle.SP_DialogResetButton)
416
+ self._resetButton = qt.QPushButton(
417
+ parent=self, text="reset all positions", icon=reset_icon
418
+ )
419
+ self._resetButton.setToolTip("reset all position to initial positions")
420
+ self.layout().addWidget(self._resetButton)
421
+
422
+ # connect signal / slot
423
+ self._editionModeCB.currentIndexChanged.connect(self.sigModeChanged)
424
+ self._resetButton.released.connect(self.sigReset)
425
+
426
+ def getEditionMode(self) -> _EditionMode:
427
+ return _EditionMode(self._editionModeCB.currentText())
428
+
429
+ def setEditionMode(self, edition_mode: _EditionMode | str):
430
+ self._editionModeCB.setCurrentText(_EditionMode(edition_mode).value)
@@ -1,38 +1,43 @@
1
- from typing import Union, Optional
1
+ from __future__ import annotations
2
+
2
3
  from tomwer.io.utils.utils import str_to_dict
3
4
 
4
5
  from nabu.stitching import config as stitching_config
5
6
  from nabu.stitching.overlap import OverlapStitchingStrategy
6
7
  from silx.gui import qt
8
+ from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel as QComboBox
9
+ from tomwer.gui.utils.scrollarea import QSpinBoxIgnoreWheel as QSpinBox
10
+ from ..singleaxis import _SingleAxisMixIn
7
11
 
8
12
 
9
- class _StithcingHeightSpinBox(qt.QWidget):
13
+ class _StitchingHeightSpinBox(qt.QWidget):
10
14
  def __init__(self, parent=None) -> None:
11
15
  super().__init__(parent)
12
16
  self.setLayout(qt.QHBoxLayout())
13
17
  self._autoCB = qt.QCheckBox("max", self)
14
18
  self.layout().addWidget(self._autoCB)
15
- self._stitchingHeight = qt.QSpinBox(self)
19
+ self._stitchingHeight = QSpinBox(self)
16
20
  self._stitchingHeight.setMinimum(3)
17
21
  self._stitchingHeight.setMaximum(999999)
18
- self._stitchingHeight.setValue(200)
22
+ self._stitchingHeight.setValue(40)
23
+ self._stitchingHeight.setSuffix("px")
19
24
  self.layout().addWidget(self._stitchingHeight)
20
25
 
21
26
  self._autoCB.toggled.connect(self._stitchingHeight.setDisabled)
22
27
 
23
- def getStitchingHeight(self) -> Optional[int]:
28
+ def getStitchingHeight(self) -> int | None:
24
29
  if self._autoCB.isChecked():
25
30
  return None
26
31
  else:
27
32
  return self._stitchingHeight.value()
28
33
 
29
- def setStitchingHeight(self, height: Optional[int]) -> None:
34
+ def setStitchingHeight(self, height: int | None) -> None:
30
35
  self._autoCB.setChecked(height is None)
31
36
  if height is not None:
32
37
  self._stitchingHeight.setValue(int(height))
33
38
 
34
39
 
35
- class StitchingStrategies(qt.QWidget):
40
+ class StitchingStrategies(qt.QWidget, _SingleAxisMixIn):
36
41
  """
37
42
  Defines algorithm and strategies to be used
38
43
  """
@@ -40,20 +45,21 @@ class StitchingStrategies(qt.QWidget):
40
45
  DEFAULT_STITCHING_HEIGHT = None # max value is the default
41
46
 
42
47
  sigChanged = qt.Signal()
48
+ """emit when strategy change"""
43
49
 
44
- def __init__(self, parent=None, axis=0) -> None:
50
+ def __init__(self, axis: int, parent=None) -> None:
45
51
  super().__init__(parent)
46
52
  self.setLayout(qt.QFormLayout())
47
- self._stitchingStrategyCG = qt.QComboBox(parent=self)
53
+ self._stitchingStrategyCG = QComboBox(parent=self)
48
54
  for strategy in OverlapStitchingStrategy.values():
49
55
  self._stitchingStrategyCG.addItem(strategy)
50
56
  self._stitchingStrategyCG.setToolTip(
51
- "stitcher behavior is also know as stitching strategy. It define the behavor to have on overlaping areas"
57
+ "stitcher behavior is also know as stitching strategy. It define the behavior to have on overlaping areas"
52
58
  )
53
59
  self.layout().addRow("stitcher behavior", self._stitchingStrategyCG)
54
- self._axis = axis
60
+ self._axis = axis # needed to implement the _SingleAxisMixIn interface
55
61
 
56
- self._stitchingHeight = _StithcingHeightSpinBox(parent=self)
62
+ self._stitchingHeight = _StitchingHeightSpinBox(parent=self)
57
63
  self._stitchingHeight.setStitchingHeight(self.DEFAULT_STITCHING_HEIGHT)
58
64
  self.layout().addRow("stitching height", self._stitchingHeight)
59
65
 
@@ -74,7 +80,7 @@ class StitchingStrategies(qt.QWidget):
74
80
  self._stitchingStrategyCG.currentText()
75
81
  )
76
82
 
77
- def setStitchingStrategy(self, strategy: Union[OverlapStitchingStrategy, str]):
83
+ def setStitchingStrategy(self, strategy: OverlapStitchingStrategy | str):
78
84
  strategy = OverlapStitchingStrategy.from_value(strategy)
79
85
  idx = self._stitchingStrategyCG.findText(strategy.value)
80
86
  if idx >= 0:
@@ -87,7 +93,7 @@ class StitchingStrategies(qt.QWidget):
87
93
  return {
88
94
  stitching_config.STITCHING_SECTION: {
89
95
  stitching_config.STITCHING_STRATEGY_FIELD: self.getStitchingStrategy().value,
90
- f"axis_{self._axis}_params": f"overlap_size={overlap_size}",
96
+ f"axis_{self.first_axis}_params": f"overlap_size={overlap_size}",
91
97
  }
92
98
  }
93
99
 
@@ -98,12 +104,12 @@ class StitchingStrategies(qt.QWidget):
98
104
  if strategy is not None:
99
105
  self.setStitchingStrategy(strategy=strategy)
100
106
 
101
- axis_0_params_dict = str_to_dict(
107
+ first_axis_params_dict = str_to_dict(
102
108
  config.get(stitching_config.STITCHING_SECTION, {}).get(
103
109
  f"axis_{self._axis}_params", ""
104
110
  )
105
111
  )
106
- stitching_height = axis_0_params_dict.get(
112
+ stitching_height = first_axis_params_dict.get(
107
113
  stitching_config.KEY_OVERLAP_SIZE, "unknown"
108
114
  )
109
115
  if stitching_height in ("None", "", None):
@@ -0,0 +1,25 @@
1
+ import pytest
2
+
3
+ from tomwer.gui.stitching.config.axisparams import StitcherAxisParams
4
+ from tomwer.tests.conftest import qtapp # noqa F401
5
+
6
+
7
+ def test_StitcherAxisParams(
8
+ qtapp, # noqa F811
9
+ ):
10
+ """test the StitcherAxisParams widget"""
11
+ with pytest.raises(TypeError):
12
+ widget = StitcherAxisParams(axis="toto")
13
+ widget = StitcherAxisParams(axis=0)
14
+ assert widget.getConfiguration() == {
15
+ "stitching": {
16
+ "axis_0_params": "img_reg_method=nabu-fft;window_size=400",
17
+ }
18
+ }
19
+ new_config = {
20
+ "stitching": {
21
+ "axis_0_params": "img_reg_method=skimage;window_size=50",
22
+ },
23
+ }
24
+ widget.setConfiguration(new_config)
25
+ assert widget.getConfiguration() == new_config
@@ -1,4 +1,4 @@
1
- from typing import Optional
1
+ from __future__ import annotations
2
2
 
3
3
  from nabu.stitching.config import StitchingType
4
4
  from silx.gui import qt
@@ -165,7 +165,7 @@ class _AxisPositionGroup(qt.QGroupBox):
165
165
  else:
166
166
  return self._pixelSizeRaw.getValue()
167
167
 
168
- def setStitchingMetadata(self, stitching_metadata: Optional[QStitchingMetadata]):
168
+ def setStitchingMetadata(self, stitching_metadata: QStitchingMetadata | None):
169
169
  """
170
170
  load used metadata from tomo_obj
171
171
  """
@@ -335,9 +335,7 @@ class TomoObjectPositionInfos(qt.QWidget):
335
335
  self.reset()
336
336
  self._stitching_metadata = None
337
337
 
338
- def setStitchingMetadata(
339
- self, stitching_metadata: Optional[StitchingMetadata] = None
340
- ):
338
+ def setStitchingMetadata(self, stitching_metadata: StitchingMetadata | None = None):
341
339
  if stitching_metadata is not None and not isinstance(
342
340
  stitching_metadata, StitchingMetadata
343
341
  ):
@@ -38,6 +38,7 @@ class NormalizationBySampleGroupBox(qt.QGroupBox):
38
38
  self._widthSB.setRange(1, 9999999)
39
39
  self._widthSB.setValue(30)
40
40
  self._widthSB.setSingleStep(10)
41
+ self._widthSB.setSuffix("px")
41
42
  self.layout().addRow("sampling width", self._widthSB)
42
43
 
43
44
  # margin