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,35 +1,8 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2016-2020 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "11/02/2020"
2
+ from __future__ import annotations
29
3
 
30
4
 
31
5
  import logging
32
- import typing
33
6
 
34
7
  from silx.gui import qt
35
8
  from silx.utils.enum import Enum as _Enum
@@ -40,6 +13,7 @@ from tomwer.gui.reconstruction.nabu.nabuconfig import base
40
13
  from tomwer.gui.reconstruction.nabu.nabuconfig.ctf import CTFConfig
41
14
  from tomwer.gui.utils.inputwidget import SelectionLineEdit
42
15
  from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel as QComboBox
16
+ from tomwer.gui import icons
43
17
  from tomwer.utils import docstring
44
18
 
45
19
  _logger = logging.getLogger(__name__)
@@ -63,7 +37,7 @@ class _NabuPhaseConfig(qt.QWidget, base._NabuStageConfigBase):
63
37
  modified
64
38
  """
65
39
 
66
- def __init__(self, parent, scrollArea):
40
+ def __init__(self, parent):
67
41
  qt.QWidget.__init__(self, parent, stage=_NabuStages.PHASE)
68
42
  base._NabuStageConfigBase.__init__(self, stage=_NabuStages.PHASE)
69
43
  self.setLayout(qt.QGridLayout())
@@ -71,19 +45,19 @@ class _NabuPhaseConfig(qt.QWidget, base._NabuStageConfigBase):
71
45
  # phase method
72
46
  self._methodLabel = qt.QLabel("method", self)
73
47
  self.layout().addWidget(self._methodLabel, 1, 0, 1, 1)
74
- self._methodCB = QComboBox(parent=self, scrollArea=scrollArea)
48
+ self._methodCB = QComboBox(parent=self)
75
49
  for method in _NabuPhaseMethod:
76
50
  self._methodCB.addItem(method.value)
77
51
  idx_ctf = self._methodCB.findText(_NabuPhaseMethod.CTF.value)
78
52
  self._methodCB.setItemData(
79
- idx_ctf, "Contrast Transfert Function", qt.Qt.ToolTipRole
53
+ idx_ctf, "Contrast Transfer Function", qt.Qt.ToolTipRole
80
54
  )
81
55
  self.layout().addWidget(self._methodCB, 1, 1, 1, 3)
82
56
  self.registerWidget(self._methodLabel, "required")
83
57
  self.registerWidget(self._methodCB, "required")
84
58
 
85
59
  # paganin & ctf options
86
- self._paganinOpts = NabuPaganinConfig(parent=self, scrollArea=scrollArea)
60
+ self._paganinOpts = NabuPaganinConfig(parent=self)
87
61
  self.layout().addWidget(self._paganinOpts, 2, 0, 3, 3)
88
62
 
89
63
  # unsharp options
@@ -118,6 +92,9 @@ class _NabuPhaseConfig(qt.QWidget, base._NabuStageConfigBase):
118
92
  def _methodChanged(self, *args, **kwargs):
119
93
  self._paganinOpts.setEnabled(self.getMethod() is not _NabuPhaseMethod.NONE)
120
94
  self._ctfOpts.setEnabled(self.getMethod() is _NabuPhaseMethod.CTF)
95
+ self._unsharpOpts.setDiscourageUnsharpMask(
96
+ self.getMethod() is _NabuPhaseMethod.NONE
97
+ )
121
98
  self.sigConfChanged.emit("method")
122
99
 
123
100
  def _signalConfChanged(self, param):
@@ -186,7 +163,7 @@ class NabuPaganinConfig(qt.QWidget, base._NabuStageConfigBase):
186
163
  modified
187
164
  """
188
165
 
189
- def __init__(self, parent, scrollArea):
166
+ def __init__(self, parent):
190
167
  qt.QWidget.__init__(self, parent=parent, stage=_NabuStages.PHASE)
191
168
  base._NabuStageConfigBase.__init__(self, stage=_NabuStages.PHASE)
192
169
  self.setLayout(qt.QGridLayout())
@@ -205,7 +182,7 @@ class NabuPaganinConfig(qt.QWidget, base._NabuStageConfigBase):
205
182
  # paganin padding_type
206
183
  self._paddingLabel = qt.QLabel("padding", self)
207
184
  self.layout().addWidget(self._paddingLabel, 2, 0, 1, 1)
208
- self._paddingTypeCB = QComboBox(self, scrollArea=scrollArea)
185
+ self._paddingTypeCB = QComboBox(self)
209
186
  self._paddingTypeCB.setToolTip(
210
187
  "Padding type for the filtering step " "in Paganin/CTR."
211
188
  )
@@ -275,8 +252,12 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
275
252
  def __init__(self, parent):
276
253
  qt.QWidget.__init__(self, parent=parent, stage=_NabuStages.PHASE)
277
254
  base._NabuStageConfigBase.__init__(self, stage=_NabuStages.PHASE)
255
+ self.__discourageUnSharpMask = False
278
256
  self.setLayout(qt.QGridLayout())
279
257
 
258
+ warning_icon = icons.getQIcon("warning")
259
+ warning_unsharp_no_phase = "Warning: applying unsharp mask without phase retrieval can lead to 'noisy' reconstruction"
260
+
280
261
  # unsharp coeff
281
262
  self._unsharpCoeffCB = qt.QCheckBox("unsharp coeff", self)
282
263
  self._unsharpCoeffCB.setToolTip(
@@ -293,6 +274,12 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
293
274
  self.layout().addWidget(self._unsharpCoeffQLE, 0, 1, 1, 1)
294
275
  self.registerWidget(self._unsharpCoeffCB, "optional")
295
276
  self._unsharpCoeffOpt = self.registerWidget(self._unsharpCoeffQLE, "optional")
277
+ # unsharp coeff warning
278
+ self._unSharpCoeffWarning = qt.QLabel("")
279
+ self._unSharpCoeffWarning.setToolTip(warning_unsharp_no_phase)
280
+ self._unSharpCoeffWarning.setPixmap(warning_icon.pixmap(20, state=qt.QIcon.On))
281
+ self.layout().addWidget(self._unSharpCoeffWarning, 0, 2, 1, 1)
282
+ self.registerWidget(self._unSharpCoeffWarning, "optional")
296
283
 
297
284
  # unsharp_sigma
298
285
  self._unsharpSigmaCB = qt.QCheckBox("unsharp sigma", self)
@@ -308,6 +295,12 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
308
295
  self.layout().addWidget(self._unsharpSigmaQLE, 1, 1, 1, 1)
309
296
  self.registerWidget(self._unsharpSigmaCB, "optional")
310
297
  self._unsharpSigmaOpt = self.registerWidget(self._unsharpSigmaQLE, "optional")
298
+ # unsharp coeff warning
299
+ self._unSharpSigmaWarning = qt.QLabel("")
300
+ self._unSharpSigmaWarning.setToolTip(warning_unsharp_no_phase)
301
+ self._unSharpSigmaWarning.setPixmap(warning_icon.pixmap(20, state=qt.QIcon.On))
302
+ self.layout().addWidget(self._unSharpSigmaWarning, 1, 2, 1, 1)
303
+ self.registerWidget(self._unSharpSigmaWarning, "optional")
311
304
 
312
305
  # set up
313
306
  self._unsharpCoeffCB.setChecked(False)
@@ -316,15 +309,18 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
316
309
  self._unsharpSigmaQLE.setText(str(0.8))
317
310
  self._showUnsharpCoeffQLE(False)
318
311
  self._showUnsharpSigmaQLE(False)
312
+ self._updateUnsharpMaskWarning()
319
313
 
320
314
  # signal / slot connection
321
315
  ## unsharp coeff
322
316
  self._unsharpCoeffCB.toggled.connect(self._showUnsharpCoeffQLE)
323
317
  self._unsharpCoeffCB.toggled.connect(self._unsharpCoeffChanged)
318
+ self._unsharpCoeffCB.toggled.connect(self._updateUnsharpMaskWarning)
324
319
  self._unsharpCoeffQLE.editingFinished.connect(self._unsharpCoeffChanged)
325
320
  ## unsharp sigma
326
321
  self._unsharpSigmaCB.toggled.connect(self._showUnsharpSigmaQLE)
327
322
  self._unsharpSigmaCB.toggled.connect(self._unsharpSigmaChanged)
323
+ self._unsharpSigmaCB.toggled.connect(self._updateUnsharpMaskWarning)
328
324
  self._unsharpSigmaQLE.editingFinished.connect(self._unsharpSigmaChanged)
329
325
 
330
326
  def _unsharpCoeffChanged(self, *args, **kwargs):
@@ -348,7 +344,7 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
348
344
  def _signalConfChanged(self, param):
349
345
  self.sigConfChanged.emit(param)
350
346
 
351
- def getUnsharpCoeff(self) -> typing.Union[float, int]:
347
+ def getUnsharpCoeff(self) -> float | int:
352
348
  if self.isUnsharpCoeffActive():
353
349
  return float(self._unsharpCoeffQLE.text())
354
350
  else:
@@ -361,7 +357,7 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
361
357
  self._unsharpCoeffCB.setChecked(True)
362
358
  self._unsharpCoeffQLE.setText(str(coeff))
363
359
 
364
- def getUnsharpSigma(self) -> typing.Union[float, int]:
360
+ def getUnsharpSigma(self) -> float | int:
365
361
  if self.isUnsharpSigmaActive():
366
362
  return float(self._unsharpSigmaQLE.text())
367
363
  else:
@@ -385,3 +381,25 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
385
381
  self.setUnsharpCoeff(float(conf["unsharp_coeff"]))
386
382
  if "unsharp_sigma" in conf:
387
383
  self.setUnsharpSigma(float(conf["unsharp_sigma"]))
384
+
385
+ def setDiscourageUnsharpMask(self, discourage: bool):
386
+ """Should we discourage the user to apply unsharp mask.
387
+ This is the case if he tries to apply an unsharp mask without phase retrieval.
388
+ """
389
+ self.__discourageUnSharpMask = discourage
390
+
391
+ def _updateUnsharpMaskWarning(self):
392
+ self._unSharpCoeffWarning.setVisible(
393
+ self.__discourageUnSharpMask and self._unsharpCoeffCB.isChecked()
394
+ )
395
+ self._unSharpSigmaWarning.setVisible(
396
+ self.__discourageUnSharpMask and self._unsharpSigmaCB.isChecked()
397
+ )
398
+
399
+ def setConfigurationLevel(self, level):
400
+ super().setConfigurationLevel(level)
401
+ # we also need to update the 'unsharp warning'
402
+ # note: at the moment if the basic configuration level is selected, without phase and some mask
403
+ # a warning will appear on bottom of the pahse GB. This is considered expected as this way we
404
+ # won't hide any warning.
405
+ self._updateUnsharpMaskWarning()
@@ -1,36 +1,8 @@
1
- # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2016-2020 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "06/12/2021"
29
-
1
+ from __future__ import annotations
30
2
 
31
3
  import logging
32
- from typing import Optional, Union
33
4
 
5
+ import sys
34
6
  from silx.gui import qt
35
7
 
36
8
  from tomwer.core.process.reconstruction.nabu.utils import (
@@ -56,7 +28,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
56
28
  modified
57
29
  """
58
30
 
59
- def __init__(self, parent, scrollArea):
31
+ def __init__(self, parent):
60
32
  _NabuStageConfigBase.__init__(self, stage=_NabuStages.PRE)
61
33
  qt.QWidget.__init__(self, parent)
62
34
  self.setLayout(qt.QGridLayout())
@@ -75,7 +47,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
75
47
  self._dffSigmaLabel = qt.QLabel("sigma:", self)
76
48
  self._dffSigmaLabel.setAlignment(qt.Qt.AlignRight)
77
49
  self.layout().addWidget(self._dffSigmaLabel, 1, 2, 1, 1)
78
- self._dffSigmaQDSB = QDoubleSpinBox(parent=self, scrollArea=scrollArea)
50
+ self._dffSigmaQDSB = QDoubleSpinBox(parent=self)
79
51
  self._dffSigmaQDSB.setMinimum(0.0)
80
52
  self._dffSigmaQDSB.setDecimals(2)
81
53
  self._dffSigmaQDSB.setSingleStep(0.1)
@@ -89,13 +61,13 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
89
61
  self.registerWidget(self._dffSigmaQDSB, "required"),
90
62
  ]
91
63
 
92
- ## sino ring corrcetion
64
+ ## sinogram ring correction
93
65
  self._sinoRingCorrectionCB = qt.QLabel("rings removal method", self)
94
66
  self._sinoRingCorrectionCB.setToolTip("Sinogram rings removal method")
95
67
  self.layout().addWidget(self._sinoRingCorrectionCB, 2, 0, 1, 2)
96
68
  self.registerWidget(self._sinoRingCorrectionCB, "required")
97
69
 
98
- self._sinoRingCorrectionMthd = QComboBox(parent=self, scrollArea=scrollArea)
70
+ self._sinoRingCorrectionMthd = QComboBox(parent=self)
99
71
  for method in RingCorrectionMethod:
100
72
  self._sinoRingCorrectionMthd.addItem(method.value)
101
73
  ## force method to be None by default
@@ -105,7 +77,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
105
77
  self.layout().addWidget(self._sinoRingCorrectionMthd, 2, 2, 1, 1)
106
78
  self.registerWidget(self._sinoRingCorrectionMthd, "required")
107
79
 
108
- self._sinoRingsOpts = SinoRingsOptions(parent=self, scrollArea=scrollArea)
80
+ self._sinoRingsOpts = SinoRingsOptions(parent=self)
109
81
  self.layout().addWidget(self._sinoRingsOpts, 3, 1, 1, 3)
110
82
 
111
83
  ## ccd filter
@@ -118,7 +90,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
118
90
  self._ccdHotspotLabel = qt.QLabel("threshold:", self)
119
91
  self._ccdHotspotLabel.setAlignment(qt.Qt.AlignRight)
120
92
  self.layout().addWidget(self._ccdHotspotLabel, 5, 2, 1, 1)
121
- self._ccdThreshold = QDoubleSpinBox(self, scrollArea)
93
+ self._ccdThreshold = QDoubleSpinBox(self)
122
94
  self._ccdThreshold.setMinimum(0.0)
123
95
  self._ccdThreshold.setMaximum(999999)
124
96
  self._ccdThreshold.setSingleStep(0.01)
@@ -137,7 +109,9 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
137
109
  ]
138
110
 
139
111
  ## sr current normalization
140
- self._normalizeCurrent = qt.QCheckBox("normalize with current", self)
112
+ self._normalizeCurrent = qt.QCheckBox(
113
+ "Normalize by machine electric current", self
114
+ )
141
115
  self._normalizeCurrent.setToolTip(
142
116
  "Whether to normalize frames with Synchrotron Current. This can correct the effect of a beam refill not taken into account by flats."
143
117
  )
@@ -153,7 +127,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
153
127
  self._clipMinLogValueLabel = qt.QLabel("log min clip value:", self)
154
128
  self._clipMinLogValueLabel.setAlignment(qt.Qt.AlignRight)
155
129
  self.layout().addWidget(self._clipMinLogValueLabel, 8, 2, 1, 1)
156
- self._clipMinLogValue = QDoubleSpinBox(self, scrollArea=scrollArea)
130
+ self._clipMinLogValue = QDoubleSpinBox(self)
157
131
  self._clipMinLogValue.setMinimum(0.0)
158
132
  self._clipMinLogValue.setMaximum(9999999)
159
133
  self._clipMinLogValue.setSingleStep(0.01)
@@ -168,7 +142,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
168
142
  self._clipMaxLogValueLabel = qt.QLabel("log max clip value:", self)
169
143
  self._clipMaxLogValueLabel.setAlignment(qt.Qt.AlignRight)
170
144
  self.layout().addWidget(self._clipMaxLogValueLabel, 9, 2, 1, 1)
171
- self._clipMaxLogValue = QDoubleSpinBox(self, scrollArea=scrollArea)
145
+ self._clipMaxLogValue = QDoubleSpinBox(self)
172
146
  self._clipMaxLogValue.setMinimum(0.0)
173
147
  self._clipMaxLogValue.setMaximum(9999999)
174
148
  self._clipMaxLogValue.setSingleStep(0.01)
@@ -375,6 +349,8 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
375
349
  "tilt_correction": tilt_correction,
376
350
  "autotilt_options": autotilt_opts,
377
351
  "normalize_srcurrent": int(self.getNormalizeCurrent()),
352
+ "rotate_projections_center": self._tiltCorrection.getRotateProjectionsCenter()
353
+ or "",
378
354
  }
379
355
 
380
356
  @docstring(_NabuStageConfigBase)
@@ -441,11 +417,16 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
441
417
  tilt_correction=tilt_correction, auto_tilt_options=autotilt_options
442
418
  )
443
419
 
420
+ rotate_projections_center = conf.get("rotate_projections_center")
421
+ if rotate_projections_center == "":
422
+ rotate_projections_center = None
423
+ self._tiltCorrection.setRotateProjectionsCenter(rotate_projections_center)
424
+
444
425
 
445
426
  class SinoRingsOptions(qt.QWidget):
446
427
  _VO_DIMS = ("horizontaly", "horizontaly and vertically")
447
428
 
448
- def __init__(self, parent=None, scrollArea=None, *args, **kwargs):
429
+ def __init__(self, parent=None, *args, **kwargs):
449
430
  super().__init__(parent, *args, **kwargs)
450
431
  self._method = None
451
432
  self.setLayout(qt.QFormLayout())
@@ -453,12 +434,12 @@ class SinoRingsOptions(qt.QWidget):
453
434
  self.layout().setSpacing(0)
454
435
  # munch parameters
455
436
  self._sigmaMunchLabel = qt.QLabel("sigma", self)
456
- self._sigmaMunch = QDoubleSpinBox(self, scrollArea=scrollArea)
437
+ self._sigmaMunch = QDoubleSpinBox(self)
457
438
  self._sigmaMunch.setRange(0.0, 2147483647)
458
439
  self.layout().addRow(self._sigmaMunchLabel, self._sigmaMunch)
459
440
 
460
441
  self._levelsMunchLabel = qt.QLabel("levels", self)
461
- self._levelsMunch = QSpinBox(self, scrollArea=scrollArea)
442
+ self._levelsMunch = QSpinBox(self)
462
443
  self._levelsMunch.setRange(0, 2147483647)
463
444
  self.layout().addRow(self._levelsMunchLabel, self._levelsMunch)
464
445
 
@@ -467,7 +448,7 @@ class SinoRingsOptions(qt.QWidget):
467
448
 
468
449
  # vo parameters
469
450
  self._snrVOLabel = qt.QLabel("snr", self)
470
- self._snrVO = QDoubleSpinBox(self, scrollArea=scrollArea)
451
+ self._snrVO = QDoubleSpinBox(self)
471
452
  self._snrVO.setMinimum(0.0)
472
453
  tooltip = "Ratio used to locate large stripes. Greater is less sensitive."
473
454
  self._snrVO.setToolTip(tooltip)
@@ -475,7 +456,7 @@ class SinoRingsOptions(qt.QWidget):
475
456
  self.layout().addRow(self._snrVOLabel, self._snrVO)
476
457
 
477
458
  self._laSizeVOLabel = qt.QLabel("la_size", self)
478
- self._laSizeVO = QSpinBox(self, scrollArea=scrollArea)
459
+ self._laSizeVO = QSpinBox(self)
479
460
  self._laSizeVO.setMinimum(0)
480
461
  tooltip = "Window size of the median filter to remove large stripes."
481
462
  self._laSizeVO.setToolTip(tooltip)
@@ -483,7 +464,7 @@ class SinoRingsOptions(qt.QWidget):
483
464
  self.layout().addRow(self._laSizeVOLabel, self._laSizeVO)
484
465
 
485
466
  self._smSizeVOLabel = qt.QLabel("sm_size", self)
486
- self._smSizeVO = QSpinBox(self, scrollArea=scrollArea)
467
+ self._smSizeVO = QSpinBox(self)
487
468
  self._smSizeVO.setMinimum(0)
488
469
  tooltip = "Window size of the median filter to remove small-to-medium stripes."
489
470
  self._laSizeVO.setToolTip(tooltip)
@@ -491,18 +472,18 @@ class SinoRingsOptions(qt.QWidget):
491
472
  self.layout().addRow(self._smSizeVOLabel, self._smSizeVO)
492
473
 
493
474
  self._dimVOLabel = qt.QLabel("dimension", self)
494
- self._dimVO = QComboBox(self, scrollArea=scrollArea)
475
+ self._dimVO = QComboBox(self)
495
476
  self._dimVO.addItems(self._VO_DIMS)
496
477
  self.layout().addRow(self._dimVOLabel, self._dimVO)
497
478
 
498
479
  # sino mean deringer
499
480
  self._sigmaLowLabel = qt.QLabel("signal low", self)
500
- self._sigmaLow = QDoubleSpinBox(self, scrollArea=scrollArea)
481
+ self._sigmaLow = QDoubleSpinBox(self)
501
482
  self._sigmaLow.setMinimum(0.0)
502
483
  self._sigmaHighLabel = qt.QLabel("signal high", self)
503
484
  self.layout().addRow(self._sigmaLowLabel, self._sigmaLow)
504
485
 
505
- self._sigmaHigh = QDoubleSpinBox(self, scrollArea=scrollArea)
486
+ self._sigmaHigh = QDoubleSpinBox(self)
506
487
  self._sigmaHigh.setMinimum(0.0)
507
488
  tooltip = (
508
489
  "sigma low and sigma high values are defining the standard deviation of "
@@ -536,7 +517,7 @@ class SinoRingsOptions(qt.QWidget):
536
517
  else:
537
518
  raise NotImplementedError
538
519
 
539
- def setVoDim(self, dim: Union[int, str]):
520
+ def setVoDim(self, dim: int | str):
540
521
  if dim in ("1", 1, self._VO_DIMS[0]):
541
522
  self._dimVO.setCurrentText(self._VO_DIMS[0])
542
523
  elif dim in ("2", 2, self._VO_DIMS[1]):
@@ -691,24 +672,35 @@ class TiltCorrection(qt.QGroupBox):
691
672
  """
692
673
  )
693
674
  self.layout().addRow(self._autotiltOptsLabel, self._autoTiltOptions)
675
+ ## `rotate_projections_center` option
676
+ self._rotateProjectionCenter = RotateProjectionCenterWidget(self)
677
+ self._rotateProjectionCenter.setToolTip(
678
+ "\n".join(
679
+ (
680
+ "Allows to correct detector tilt along beam orthogonal plan.",
681
+ "By default the center of rotation is the middle of each radio, i.e ((Nx-1)/2.0, (Ny-1)/2.0).",
682
+ )
683
+ )
684
+ )
685
+ self.layout().addRow(self._rotateProjectionCenter)
694
686
 
695
687
  # set up
696
688
  self._autoManualRB.setChecked(True)
697
689
 
698
690
  # connect signal / slot
699
- self._tiltManualRB.toggled.connect(self._updateVisiblity)
700
- self._autoManualRB.toggled.connect(self._updateVisiblity)
691
+ self._tiltManualRB.toggled.connect(self._updateVisibility)
692
+ self._autoManualRB.toggled.connect(self._updateVisibility)
701
693
 
702
694
  self._tiltManualRB.toggled.connect(self._changed)
703
695
  self._autoManualRB.toggled.connect(self._changed)
704
696
  self._angleValueSB.valueChanged.connect(self._changed)
705
697
 
706
- self._updateVisiblity()
698
+ self._updateVisibility()
707
699
 
708
700
  def _changed(self, *args, **kwargs):
709
701
  self.sigChanged.emit()
710
702
 
711
- def _updateVisiblity(self):
703
+ def _updateVisibility(self):
712
704
  self._angleValueSB.setEnabled(self._tiltManualRB.isChecked())
713
705
  self._autoModeCB.setEnabled(self._autoManualRB.isChecked())
714
706
  self._autotiltOptsLabel.setVisible(self._autoManualRB.isChecked())
@@ -726,7 +718,7 @@ class TiltCorrection(qt.QGroupBox):
726
718
  return self._autoModeCB.currentText(), self._autoTiltOptions.text()
727
719
 
728
720
  def setTiltCorrection(
729
- self, tilt_correction: str, auto_tilt_options: Optional[str] = None
721
+ self, tilt_correction: str, auto_tilt_options: str | None = None
730
722
  ) -> None:
731
723
  if tilt_correction in ("", None):
732
724
  self.setChecked(False)
@@ -741,3 +733,60 @@ class TiltCorrection(qt.QGroupBox):
741
733
  self._angleValueSB.setValue(float(tilt_correction))
742
734
  if auto_tilt_options is not None:
743
735
  self._autoTiltOptions.setText(auto_tilt_options)
736
+
737
+ def getRotateProjectionsCenter(self):
738
+ if self.isChecked():
739
+ return self._rotateProjectionCenter.getRotateProjectionsCenter()
740
+ else:
741
+ return None
742
+
743
+ def setRotateProjectionsCenter(self, values):
744
+ self._rotateProjectionCenter.setRotateProjectionsCenter(values=values)
745
+
746
+
747
+ class RotateProjectionCenterWidget(qt.QWidget):
748
+
749
+ RANGE_MIN_VALUE = -sys.float_info.max
750
+ RANGE_MAX_VALUE = sys.float_info.max
751
+
752
+ def __init__(self, parent: qt.QWidget | None = None) -> None:
753
+ super().__init__(parent)
754
+ self.setLayout(qt.QHBoxLayout())
755
+ self._label = qt.QLabel("rotate projections center")
756
+ self.layout().addWidget(self._label)
757
+
758
+ self._xQLE = qt.QDoubleSpinBox(self)
759
+ self._xQLE.setRange(
760
+ RotateProjectionCenterWidget.RANGE_MIN_VALUE,
761
+ RotateProjectionCenterWidget.RANGE_MAX_VALUE,
762
+ )
763
+ self._xQLE.setPrefix("x=")
764
+ self._xQLE.setToolTip("Value should be in [-radio width, radio width]")
765
+ self._xQLE.setSuffix("px")
766
+ self.layout().addWidget(self._xQLE)
767
+
768
+ self._yQLE = qt.QDoubleSpinBox(self)
769
+ self._yQLE.setRange(
770
+ RotateProjectionCenterWidget.RANGE_MIN_VALUE,
771
+ RotateProjectionCenterWidget.RANGE_MAX_VALUE,
772
+ )
773
+ self._yQLE.setPrefix("y=")
774
+ self._xQLE.setToolTip("Value should be in [-radio heigh, radio heigh]")
775
+ self._yQLE.setSuffix("px")
776
+ self.layout().addWidget(self._yQLE)
777
+
778
+ def getRotateProjectionsCenter(self) -> tuple | None:
779
+ if self._xQLE.value() == 0 and self._yQLE.value() == 0:
780
+ return None
781
+ else:
782
+ return (self._xQLE.value(), self._yQLE.value())
783
+
784
+ def setRotateProjectionsCenter(self, values: tuple[float] | None):
785
+ if values is None:
786
+ self._xQLE.setValue(0.0)
787
+ self._yQLE.setValue(0.0)
788
+ elif not isinstance(values, (tuple, list)) and len(values) != 2:
789
+ raise TypeError("values should be a tuple of two elements")
790
+ else:
791
+ self._xQLE.setValue(values[0])
792
+ self._yQLE.setValue(values[1])