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,34 +1,6 @@
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/08/2020"
29
-
30
-
31
- import typing
2
+ from __future__ import annotations
3
+
32
4
  from asyncio.log import logger
33
5
 
34
6
  from silx.gui import qt
@@ -36,6 +8,7 @@ from silx.gui import qt
36
8
  from tomwer.core.process.reconstruction.nabu.utils import (
37
9
  _NabuStages,
38
10
  )
11
+ from tomwer.core.utils.dictutils import concatenate_dict
39
12
  from tomwer.gui import icons
40
13
  from tomwer.gui.configuration.action import (
41
14
  BasicConfigurationAction,
@@ -48,6 +21,11 @@ from tomwer.gui.reconstruction.nabu.nabuconfig.output import (
48
21
  NabuOutputLocationWidget,
49
22
  QNabuFileFormatComboBox,
50
23
  )
24
+ from tomwer.gui.reconstruction.nabu.platform import NabuPlatformSettings
25
+ from tomwer.gui.settings import (
26
+ TAB_LABEL_RECONSTRUCTION_SETTINGS,
27
+ TAB_LABEL_PLATFORM_SETTINGS,
28
+ )
51
29
 
52
30
 
53
31
  class SliceSelector(qt.QWidget):
@@ -57,6 +35,7 @@ class SliceSelector(qt.QWidget):
57
35
  """
58
36
 
59
37
  valueChanged = qt.Signal()
38
+ """emit when the slice value change"""
60
39
 
61
40
  def __init__(
62
41
  self, label, auto_alias, is_end, grid_layout, index_layout, parent=None
@@ -184,10 +163,10 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
184
163
  )
185
164
  self._redefineNabuFileFormat.setCheckable(True)
186
165
  self._redefineNabuFileFormat.setLayout(qt.QVBoxLayout())
187
- self._fileformatCB = QNabuFileFormatComboBox(self._redefineNabuFileFormat)
188
- self._redefineNabuFileFormat.layout().addWidget(self._fileformatCB)
166
+ self._fileFormatCB = QNabuFileFormatComboBox(self._redefineNabuFileFormat)
167
+ self._redefineNabuFileFormat.layout().addWidget(self._fileFormatCB)
189
168
  self.layout().addWidget(self._redefineNabuFileFormat, 4, 0, 1, 2)
190
- self.registerWidget(self._fileformatCB, "advanced")
169
+ self.registerWidget(self._fileFormatCB, "advanced")
191
170
  self.registerWidget(self._redefineNabuFileFormat, "advanced")
192
171
 
193
172
  # redefine output location
@@ -202,35 +181,9 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
202
181
  self.registerWidget(self._redefineNabuOutputLocation, "advanced")
203
182
  self.registerWidget(self._outputLocationWidget, "advanced")
204
183
 
205
- # gpu percentage
206
- self._labelGPUFract = qt.QLabel("GPU percentage usage", self)
207
- self.layout().addWidget(self._labelGPUFract, 50, 0, 1, 1)
208
- self.registerWidget(self._labelGPUFract, "advanced")
209
- self._spbGPUFract = qt.QSpinBox(self)
210
- self._spbGPUFract.setSingleStep(10)
211
- self._spbGPUFract.setSuffix("%")
212
- self._spbGPUFract.setMinimum(1)
213
- self._spbGPUFract.setMaximum(100)
214
- self.layout().addWidget(self._spbGPUFract, 50, 1, 1, 1)
215
- self._spbGPUFract.setToolTip("Which fraction of GPU memory to use.")
216
- self.registerWidget(self._spbGPUFract, "advanced")
217
-
218
- # cpu percentage
219
- self._labelCPUFract = qt.QLabel("CPU percentage usage", self)
220
- self.layout().addWidget(self._labelCPUFract, 51, 0, 1, 1)
221
- self.registerWidget(self._labelCPUFract, "advanced")
222
- self._spbCPUFract = qt.QSpinBox(self)
223
- self._spbCPUFract.setSingleStep(10)
224
- self._spbCPUFract.setSuffix("%")
225
- self._spbCPUFract.setMinimum(1)
226
- self._spbCPUFract.setMaximum(100)
227
- self.layout().addWidget(self._spbCPUFract, 52, 1, 1, 1)
228
- self._spbCPUFract.setToolTip("Which fraction of CPU memory to use.")
229
- self.registerWidget(self._spbCPUFract, "advanced")
230
-
231
- # opt use phase paganin
232
- self._usePhaseQCB = qt.QCheckBox("Use phase paganin")
233
- self.layout().addWidget(self._usePhaseQCB, 53, 0, 1, 2)
184
+ # opt use phase Paganin
185
+ self._usePhaseQCB = qt.QCheckBox("Use phase Paganin")
186
+ self.layout().addWidget(self._usePhaseQCB, 52, 0, 1, 2)
234
187
  self.registerWidget(self._usePhaseQCB, "advanced")
235
188
  self._usePhaseQCB.setToolTip(
236
189
  "Whether to use a margin when " "performing phase retrieval."
@@ -243,8 +196,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
243
196
 
244
197
  # set up
245
198
  self._histogramCB.setChecked(True)
246
- self._spbGPUFract.setValue(90)
247
- self._spbCPUFract.setValue(90)
248
199
  self._usePhaseQCB.setChecked(True)
249
200
  self._redefineNabuFileFormat.setChecked(False)
250
201
  self._redefineNabuOutputLocation.setChecked(False)
@@ -253,8 +204,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
253
204
  # connect signal / slot
254
205
  self._fromSlice.valueChanged.connect(self._triggerSigConfChanged)
255
206
  self._toSlice.valueChanged.connect(self._triggerSigConfChanged)
256
- self._spbGPUFract.valueChanged.connect(self._triggerSigConfChanged)
257
- self._spbCPUFract.valueChanged.connect(self._triggerSigConfChanged)
258
207
  self._usePhaseQCB.toggled.connect(self._triggerSigConfChanged)
259
208
  self._outputLocationWidget._outputDirQLE.editingFinished.connect(
260
209
  self._triggerSigConfChanged
@@ -274,7 +223,7 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
274
223
  else:
275
224
  return None
276
225
 
277
- def setNabuOutputLocation(self, location: typing.Optional[str]):
226
+ def setNabuOutputLocation(self, location: str | None):
278
227
  if location is None:
279
228
  self._redefineNabuOutputLocation.setChecked(False)
280
229
  else:
@@ -287,37 +236,25 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
287
236
 
288
237
  def getNabuFileFormat(self):
289
238
  if self.redefineNabuFileFormat():
290
- return self._fileformatCB.currentText()
239
+ return self._fileFormatCB.currentText()
291
240
  else:
292
241
  return None
293
242
 
294
- def setNabuFileFormat(self, file_format: typing.Optional[str]):
243
+ def setNabuFileFormat(self, file_format: str | None):
295
244
  if file_format is None:
296
245
  self._redefineNabuFileFormat.setChecked(False)
297
246
  else:
298
247
  assert isinstance(file_format, str)
299
248
  self._redefineNabuFileFormat.setChecked(True)
300
- idx = self._fileformatCB.findText(file_format)
249
+ idx = self._fileFormatCB.findText(file_format)
301
250
  if idx < 0:
302
251
  logger.error(f"unable to find file format {file_format}")
303
252
  else:
304
- self._fileformatCB.setCurrentIndex(idx)
253
+ self._fileFormatCB.setCurrentIndex(idx)
305
254
 
306
255
  def _triggerSigConfChanged(self, *args, **kwargs):
307
256
  self.sigConfigChanged.emit()
308
257
 
309
- def getCPUFract(self):
310
- return self._spbCPUFract.value() / 100.0
311
-
312
- def setCPUFract(self, value):
313
- return self._spbCPUFract.setValue(int(value * 100.0))
314
-
315
- def getGPUFract(self):
316
- return self._spbGPUFract.value() / 100.0
317
-
318
- def setGPUFract(self, value):
319
- return self._spbGPUFract.setValue(int(value * 100.0))
320
-
321
258
  def getStartZ(self):
322
259
  return self._fromSlice.value()
323
260
 
@@ -352,8 +289,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
352
289
  return {
353
290
  "start_z": self.getStartZ(),
354
291
  "end_z": self.getEndZ(),
355
- "gpu_mem_fraction": self.getGPUFract(),
356
- "cpu_mem_fraction": self.getCPUFract(),
357
292
  "use_phase_margin": self.phasePaganinRequested(),
358
293
  "postproc": {
359
294
  "output_histogram": int(self.isHistogramRequested()),
@@ -369,10 +304,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
369
304
  self.setStartZ(config["start_z"])
370
305
  if "end_z" in config:
371
306
  self.setEndZ(config["end_z"])
372
- if "gpu_mem_fraction" in config:
373
- self.setGPUFract(config["gpu_mem_fraction"])
374
- if "cpu_mem_fraction" in config:
375
- self.setCPUFract(config["cpu_mem_fraction"])
376
307
  if "use_phase_margin" in config:
377
308
  self.setPhasePaganinRequested(config["use_phase_margin"])
378
309
  if "postproc" in config:
@@ -406,6 +337,47 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
406
337
  return self._configuration_level
407
338
 
408
339
 
340
+ class NabuVolumeTabWidget(qt.QTabWidget):
341
+ """
342
+ Widget that integrate the reconstruction settings and the platform (local) settings
343
+ """
344
+
345
+ sigConfigChanged = qt.Signal()
346
+
347
+ def __init__(self, parent: qt.QWidget | None = ...) -> None:
348
+ super().__init__(parent)
349
+ self._configurationLevel = ConfigurationLevel.OPTIONAL
350
+ self._nabuSettingsWidget = NabuVolumeWidget(parent=self)
351
+ self.addTab(self._nabuSettingsWidget, TAB_LABEL_RECONSTRUCTION_SETTINGS)
352
+
353
+ self._platformSettingsWidget = NabuPlatformSettings(parent=self)
354
+ self.addTab(self._platformSettingsWidget, TAB_LABEL_PLATFORM_SETTINGS)
355
+
356
+ # connect signal / slot
357
+ self._nabuSettingsWidget.sigConfigChanged.connect(self.sigConfigChanged)
358
+ self._platformSettingsWidget.sigConfigChanged.connect(self.sigConfigChanged)
359
+
360
+ def getConfiguration(self) -> dict:
361
+ return concatenate_dict(
362
+ self._nabuSettingsWidget.getConfiguration(),
363
+ self._platformSettingsWidget.getConfiguration(),
364
+ )
365
+
366
+ def setConfiguration(self, config: dict) -> None:
367
+ self._nabuSettingsWidget.setConfiguration(config=config)
368
+ self._platformSettingsWidget.setConfiguration(config=config)
369
+
370
+ def setConfigurationLevel(self, level):
371
+ self._configurationLevel = ConfigurationLevel(level)
372
+ self._nabuSettingsWidget.setConfigurationLevel(level=self._configurationLevel)
373
+ self._platformSettingsWidget.setConfigurationLevel(
374
+ level=self._configurationLevel
375
+ )
376
+
377
+ def getConfigurationLevel(self):
378
+ return self._configuration_level
379
+
380
+
409
381
  class NabuVolumeWindow(qt.QMainWindow):
410
382
  """
411
383
  Widget to define settings for a volume reconstruction
@@ -419,7 +391,7 @@ class NabuVolumeWindow(qt.QMainWindow):
419
391
 
420
392
  self.setWindowFlags(qt.Qt.Widget)
421
393
 
422
- self._mainWidget = NabuVolumeWidget(parent=self)
394
+ self._mainWidget = NabuVolumeTabWidget(parent=self)
423
395
  self.setCentralWidget(self._mainWidget)
424
396
 
425
397
  # add toolbar
@@ -1,40 +1,11 @@
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
2
  """
26
3
  contains gui relative to intensity normalization
27
4
  """
28
5
 
6
+ from __future__ import annotations
29
7
 
30
- __authors__ = [
31
- "H. Payno",
32
- ]
33
- __license__ = "MIT"
34
- __date__ = "23/06/2021"
35
8
 
36
-
37
- import typing
38
9
  import weakref
39
10
 
40
11
  from silx.gui import qt
@@ -155,7 +126,7 @@ class SinoNormWindow(qt.QMainWindow):
155
126
  else:
156
127
  return None
157
128
 
158
- def setScan(self, scan: typing.Union[None, TomwerScanBase]):
129
+ def setScan(self, scan: TomwerScanBase | None):
159
130
  self._scan = weakref.ref(scan)
160
131
  self._centralWidget.setScan(scan=scan)
161
132
  self._optsWidget.setScan(scan=scan)
@@ -199,7 +170,7 @@ class _Viewer(qt.QTabWidget):
199
170
  self._sinoView.sigSinoLoadEnded.connect(self._updateSinogramROI)
200
171
  self._projView.sigROIChanged.connect(self._updateSinogramROI)
201
172
 
202
- def setScan(self, scan: typing.Union[None, TomwerScanBase]):
173
+ def setScan(self, scan: TomwerScanBase | None):
203
174
  """
204
175
 
205
176
  :param scan: scan to handle
@@ -685,6 +656,7 @@ class _NormIntensityControl(ControlWidget):
685
656
 
686
657
  class _NormIntensityScalarValue(qt.QWidget):
687
658
  sigValueChanged = qt.Signal(float)
659
+ """emit when the scalar value to norm intensity change"""
688
660
 
689
661
  def __init__(self, parent=None):
690
662
  qt.QWidget.__init__(self, parent=parent)
@@ -711,6 +683,7 @@ class _NormIntensityDatasetWidget(qt.QWidget):
711
683
  _FILE_PATH_LOCAL_VALUE = "scan master file"
712
684
 
713
685
  sigConfigurationChanged = qt.Signal()
686
+ """emit when configuration change"""
714
687
 
715
688
  def __init__(self, parent=None):
716
689
  qt.QWidget.__init__(self, parent)
@@ -0,0 +1,89 @@
1
+ # coding: utf-8
2
+ from __future__ import annotations
3
+
4
+ import os
5
+ import shutil
6
+ import tempfile
7
+
8
+ from silx.gui import qt
9
+ from silx.gui.utils.testutils import TestCaseQt
10
+
11
+ from tomwer.core.process.reconstruction.normalization.params import (
12
+ Method as NormalizationMethod,
13
+ )
14
+ from tomwer.core.process.reconstruction.normalization.params import (
15
+ _ValueSource as NormalizationSource,
16
+ )
17
+ from tomwer.core.utils.scanutils import MockNXtomo
18
+ from tomwer.gui.reconstruction.normalization.intensity import SinoNormWindow
19
+
20
+
21
+ class TestNormIntensityWindow(TestCaseQt):
22
+ def setUp(self):
23
+ super(TestNormIntensityWindow, self).setUp()
24
+ self._widget = SinoNormWindow(parent=None)
25
+ self._tmp_dir = tempfile.mkdtemp()
26
+ scan_path = os.path.join(self._tmp_dir, "my_scan_2")
27
+ self.scan = MockNXtomo(
28
+ scan_path=scan_path,
29
+ n_ini_proj=10,
30
+ n_proj=10,
31
+ n_alignement_proj=2,
32
+ create_final_flat=False,
33
+ create_ini_dark=True,
34
+ create_ini_flat=True,
35
+ n_refs=1,
36
+ ).scan
37
+
38
+ def tearDown(self):
39
+ self._widget.setAttribute(qt.Qt.WA_DeleteOnClose)
40
+ self._widget.close()
41
+ self.qapp.processEvents()
42
+ self._widget = None
43
+ shutil.rmtree(self._tmp_dir)
44
+ super(TestNormIntensityWindow, self).tearDown()
45
+
46
+ def test(self):
47
+ self._widget.setScan(self.scan)
48
+ self._widget.show()
49
+ self.qWaitForWindowExposed(self._widget)
50
+ self._widget.setCurrentMethod(NormalizationMethod.NONE)
51
+ self.qapp.processEvents()
52
+ assert self._widget.getConfiguration() == {"source": "none", "method": "none"}
53
+
54
+ self._widget.setCurrentMethod(NormalizationMethod.CHEBYSHEV)
55
+ self.qapp.processEvents()
56
+ assert self._widget.getConfiguration() == {
57
+ "method": "chebyshev",
58
+ "source": "none",
59
+ }
60
+
61
+ self._widget.setCurrentMethod(NormalizationMethod.SUBTRACTION)
62
+ self.qapp.processEvents()
63
+ self._widget.setCurrentSource(NormalizationSource.MANUAL_ROI)
64
+ self.qapp.processEvents()
65
+ output_configuration = self._widget.getConfiguration()
66
+ assert output_configuration["method"] == "subtraction"
67
+ assert output_configuration["source"] == "manual ROI"
68
+ assert "start_x" in output_configuration
69
+ assert "end_x" in output_configuration
70
+ assert "start_y" in output_configuration
71
+ assert "end_y" in output_configuration
72
+ assert "calc_fct" in output_configuration
73
+ self._widget.setCurrentMethod(NormalizationMethod.DIVISION)
74
+ self.qapp.processEvents()
75
+ self._widget.setCurrentSource(NormalizationSource.DATASET)
76
+ self.qapp.processEvents()
77
+ output_configuration = self._widget.getConfiguration()
78
+ assert output_configuration["method"] == "division"
79
+ assert output_configuration["source"] == "from dataset"
80
+ assert "dataset_url" in output_configuration
81
+
82
+ self._widget.setCurrentMethod(NormalizationMethod.DIVISION)
83
+ self.qapp.processEvents()
84
+ self._widget.setCurrentSource(NormalizationSource.MANUAL_SCALAR)
85
+ self.qapp.processEvents()
86
+ output_configuration = self._widget.getConfiguration()
87
+ assert output_configuration["method"] == "division"
88
+ assert output_configuration["source"] == "scalar"
89
+ assert "value" in output_configuration
@@ -1,43 +1,12 @@
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
1
  """
26
2
  contains gui relative to semi-automatic axis calculation
27
3
  """
28
4
 
29
-
30
- __authors__ = [
31
- "H. Payno",
32
- ]
33
- __license__ = "MIT"
34
- __date__ = "26/02/2021"
35
-
5
+ from __future__ import annotations
36
6
 
37
7
  import functools
38
8
  import logging
39
9
  import weakref
40
- from typing import Union
41
10
 
42
11
  import numpy
43
12
  from silx.gui import icons as silxicons
@@ -47,6 +16,10 @@ from silx.gui.plot import items
47
16
  from silx.utils.enum import Enum as _Enum
48
17
  from tomoscan.esrf.scan.utils import get_data
49
18
 
19
+ from tomwer.core.process.reconstruction.utils.cor import (
20
+ absolute_pos_to_relative,
21
+ relative_pos_to_absolute,
22
+ )
50
23
  from tomwer.core.process.reconstruction.saaxis.saaxis import ReconstructionMode
51
24
  from tomwer.core.scan.scanbase import TomwerScanBase
52
25
  from tomwer.gui import icons
@@ -54,6 +27,7 @@ from tomwer.gui.reconstruction.saaxis.sliceselector import SliceSelector
54
27
  from tomwer.gui.utils.lineselector import QSliceSelectorDialog
55
28
  from tomwer.gui.utils.slider import LogSlider
56
29
  from tomwer.gui.visualization.sinogramviewer import SinogramViewer as _SinogramViewer
30
+ from tomwer.gui.fonts import FONT_MEDIUM, FONT_IMPORTANT
57
31
 
58
32
  _logger = logging.getLogger(__name__)
59
33
 
@@ -137,10 +111,10 @@ class SinogramViewer(_SinogramViewer):
137
111
  """
138
112
  For now we can only modify the estimated cor
139
113
 
140
- :param float min:
141
- :param float max:
142
- :param float estimated_cor:
143
- :param int display_n_recons: the grid created by all cor observe
114
+ :param min:
115
+ :param max:
116
+ :param estimated_cor:
117
+ :param display_n_recons: the grid created by all cor observe
144
118
  :return:
145
119
  """
146
120
  self._min = cor_min
@@ -333,7 +307,7 @@ class _ReconstructionModeGB(qt.QGroupBox):
333
307
  else:
334
308
  raise ValueError("No reconstruction mode selected")
335
309
 
336
- def setReconstructionMode(self, mode: Union[str, ReconstructionMode]) -> None:
310
+ def setReconstructionMode(self, mode: ReconstructionMode | str) -> None:
337
311
  mode = ReconstructionMode.from_value(mode)
338
312
  if mode is ReconstructionMode.TILT_CORRECTION:
339
313
  self._tiltCorrectionRB.setChecked(True)
@@ -354,7 +328,7 @@ class _ReconstructionModeGB(qt.QGroupBox):
354
328
  else:
355
329
  raise ValueError(f"mode {mode} is not handled")
356
330
 
357
- def setReconstructionSlices(self, slice_: Union[dict, int, str]):
331
+ def setReconstructionSlices(self, slice_: dict | int | str):
358
332
  slice_name = None
359
333
  if slice_ == "middle" or isinstance(slice_, int) or len(slice_) == 1:
360
334
  self.setReconstructionMode(ReconstructionMode.VERTICAL)
@@ -450,7 +424,7 @@ class _DetectionAccuracyGB(qt.QGroupBox):
450
424
  def setResearchWidth(self, width: float):
451
425
  """set research width
452
426
 
453
- :param float width: center of rotation research width
427
+ :param width: center of rotation research width
454
428
  """
455
429
  return self._accuracySlider.setValue(width)
456
430
 
@@ -524,7 +498,9 @@ class _EstimatedCorWidget(qt.QGroupBox):
524
498
  return 0.0
525
499
  elif mode in ("abs", "absolute"):
526
500
  if self._frameWidth is not None:
527
- return self._frameWidth / 2.0
501
+ return relative_pos_to_absolute(
502
+ relative_pos=0.0, det_width=self._frameWidth
503
+ )
528
504
  else:
529
505
  return self._MIDDLE_COR_TXT
530
506
  else:
@@ -550,7 +526,9 @@ class _EstimatedCorWidget(qt.QGroupBox):
550
526
  old = self.blockSignals(True)
551
527
  old_mcor = self._manualCORAbs.blockSignals(True)
552
528
  self._manualCORAbs.setValue(
553
- self._manualCORRel.value() + self._frameWidth / 2.0
529
+ relative_pos_to_absolute(
530
+ relative_pos=self._manualCORRel.value(), det_width=self._frameWidth
531
+ )
554
532
  )
555
533
  self._manualCORAbs.blockSignals(old_mcor)
556
534
  self.blockSignals(old)
@@ -560,26 +538,27 @@ class _EstimatedCorWidget(qt.QGroupBox):
560
538
  old = self.blockSignals(True)
561
539
  old_mcor = self._manualCORRel.blockSignals(True)
562
540
  self._manualCORRel.setValue(
563
- self._manualCORAbs.value() - self._frameWidth / 2.0
541
+ absolute_pos_to_relative(
542
+ absolute_pos=self._manualCORAbs.value(),
543
+ det_width=self._frameWidth,
544
+ )
564
545
  )
565
546
  self._manualCORRel.blockSignals(old_mcor)
566
547
  self.blockSignals(old)
567
548
 
568
- def setFrameWidth(self, width):
549
+ def setFrameWidth(self, width: float):
569
550
  self._frameWidth = width
570
551
  # if necessary auto reset of the absolute value
571
552
  if self._manualCORAbs.value() == self._manualCORRel.value():
572
553
  self._relativePositionChanged()
573
554
 
574
- def getFrameWidth(self):
555
+ def getFrameWidth(self) -> float:
575
556
  return self._frameWidth
576
557
 
577
- def setCorValue(self, value):
558
+ def setCorValue(self, value: str | float) -> None:
578
559
  """
579
560
 
580
- :param Union[str,float] value: if a float expected to be given as the
581
- relative value
582
- :return:
561
+ :param value: if a float expected to be given as the relative value
583
562
  """
584
563
  if value is None:
585
564
  pass
@@ -590,7 +569,7 @@ class _EstimatedCorWidget(qt.QGroupBox):
590
569
  self._manualCORRel.setValue(float(value))
591
570
  self._manualCORRel.editingFinished.emit()
592
571
 
593
- def setAbsoluteCorValue(self, value):
572
+ def setAbsoluteCorValue(self, value: str | float):
594
573
  if value is None:
595
574
  pass
596
575
  elif value == self._MIDDLE_COR_TXT:
@@ -615,15 +594,12 @@ class SAAxisOptions(qt.QWidget):
615
594
  sigConfigurationChanged = qt.Signal()
616
595
  """signal emitted when the configuration change"""
617
596
 
618
- _FONT_IMPORTANT = qt.QFont("Arial", 12)
619
- _FONT_MEDIUM = qt.QFont("Arial", 10)
620
-
621
597
  def __init__(self, parent=None):
622
598
  qt.QWidget.__init__(self, parent)
623
599
  self.setLayout(qt.QVBoxLayout())
624
600
  # reconstruction mode
625
601
  self._reconstructionMode = _ReconstructionModeGB(parent=self)
626
- self._reconstructionMode.setFont(self._FONT_MEDIUM)
602
+ self._reconstructionMode.setFont(FONT_MEDIUM)
627
603
  self.layout().addWidget(self._reconstructionMode)
628
604
 
629
605
  # estimated cor
@@ -631,12 +607,12 @@ class SAAxisOptions(qt.QWidget):
631
607
  self,
632
608
  title="Estimated cor position (x axis)",
633
609
  )
634
- self._estimatedCorWidget.setFont(self._FONT_IMPORTANT)
610
+ self._estimatedCorWidget.setFont(FONT_IMPORTANT)
635
611
  self.layout().addWidget(self._estimatedCorWidget)
636
612
 
637
613
  # detection accuracy
638
614
  self._detectionAccuracy = _DetectionAccuracyGB(parent=self)
639
- self._detectionAccuracy.setFont(self._FONT_MEDIUM)
615
+ self._detectionAccuracy.setFont(FONT_MEDIUM)
640
616
  self.layout().addWidget(self._detectionAccuracy)
641
617
 
642
618
  # number of reconstructions eq volume size
@@ -646,7 +622,7 @@ class SAAxisOptions(qt.QWidget):
646
622
  self._nReconsSB = qt.QSpinBox(self._nReconsWidget)
647
623
  self._nReconsSB.setRange(0, 2000)
648
624
  self._nReconsSB.setValue(30)
649
- self._nReconsWidget.setFont(self._FONT_IMPORTANT)
625
+ self._nReconsWidget.setFont(FONT_IMPORTANT)
650
626
  self._nReconsWidget.layout().addRow("Number of reconstruction", self._nReconsSB)
651
627
  self.layout().addWidget(self._nReconsWidget)
652
628