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
@@ -0,0 +1,218 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+
5
+ from silx.gui import qt
6
+
7
+ from tomwer.core.scan.scanbase import TomwerScanBase
8
+ from tomwer.core.process.reconstruction.axis import mode as axis_mode
9
+ from tomwer.gui.utils.buttons import PadlockButton
10
+ from tomwer.gui.utils.qt_utils import block_signals
11
+ from tomwer.synctools.axis import QAxisRP
12
+ from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel
13
+ from tomwer.gui.reconstruction.axis.EstimatedCORWidget import EstimatedCORWidget
14
+
15
+ _logger = logging.getLogger(__name__)
16
+
17
+
18
+ class CalculationWidget(qt.QWidget):
19
+ """
20
+ Main widget to select the algorithm to use for COR calculation
21
+ Used as a tab of the AxisSettingsTabWidget
22
+ """
23
+
24
+ sigModeChanged = qt.Signal(str)
25
+ """signal emitted when the algorithm for computing COR changed"""
26
+
27
+ sigLockModeChanged = qt.Signal(bool)
28
+ """signal emitted when the mode has been lock or unlock"""
29
+ sigUpdateXRotAxisPixelPosOnNewScan = qt.Signal()
30
+ sigYAxisInvertedChanged = qt.Signal(bool)
31
+
32
+ def __init__(self, parent, axis_params):
33
+ assert isinstance(axis_params, QAxisRP)
34
+ qt.QWidget.__init__(self, parent)
35
+ self._axis_params = None
36
+ self.setLayout(qt.QVBoxLayout())
37
+
38
+ # algorithm
39
+ self._modeWidget = qt.QWidget(parent=self)
40
+ self._modeWidget.setLayout(qt.QHBoxLayout())
41
+ self.layout().addWidget(self._modeWidget)
42
+
43
+ self.__rotAxisSelLabel = qt.QLabel("algorithm to compute cor")
44
+ self._modeWidget.layout().addWidget(self.__rotAxisSelLabel)
45
+ self._qcbPosition = QComboBoxIgnoreWheel(self)
46
+
47
+ algorithm_groups = (
48
+ # radio group
49
+ (
50
+ axis_mode.AxisMode.centered,
51
+ axis_mode.AxisMode.global_,
52
+ axis_mode.AxisMode.growing_window_radios,
53
+ axis_mode.AxisMode.sliding_window_radios,
54
+ axis_mode.AxisMode.octave_accurate_radios,
55
+ ),
56
+ # sino group
57
+ (
58
+ axis_mode.AxisMode.growing_window_sinogram,
59
+ axis_mode.AxisMode.sino_coarse_to_fine,
60
+ axis_mode.AxisMode.sliding_window_sinogram,
61
+ axis_mode.AxisMode.fourier_angles,
62
+ ),
63
+ # composite coarse to fine
64
+ (
65
+ axis_mode.AxisMode.composite_coarse_to_fine,
66
+ axis_mode.AxisMode.near,
67
+ ),
68
+ # read
69
+ (axis_mode.AxisMode.read,),
70
+ # manual
71
+ (axis_mode.AxisMode.manual,),
72
+ )
73
+ current_pos = 0
74
+ for i_grp, algorithm_group in enumerate(algorithm_groups):
75
+ if i_grp != 0:
76
+ self._qcbPosition.insertSeparator(current_pos)
77
+ current_pos += 1
78
+ for cor_algorithm in algorithm_group:
79
+ self._qcbPosition.addItem(cor_algorithm.value)
80
+ idx = self._qcbPosition.findText(cor_algorithm.value)
81
+ self._qcbPosition.setItemData(
82
+ idx,
83
+ axis_mode.AXIS_MODE_METADATAS[cor_algorithm].tooltip,
84
+ qt.Qt.ToolTipRole,
85
+ )
86
+ current_pos += 1
87
+
88
+ self._modeWidget.layout().addWidget(self._qcbPosition)
89
+
90
+ # method lock button
91
+ self._lockMethodPB = PadlockButton(parent=self._modeWidget)
92
+ self._lockMethodPB.setToolTip(
93
+ "Lock the method to compute the cor. \n"
94
+ "This will automatically call the "
95
+ "defined algorithm each time a scan is received."
96
+ )
97
+ self._modeWidget.layout().addWidget(self._lockMethodPB)
98
+
99
+ # estimated cor
100
+ self._estimatedCorWidget = EstimatedCORWidget(self, axis_params=axis_params)
101
+ self.layout().addWidget(self._estimatedCorWidget)
102
+
103
+ # connect signal / slot
104
+ self._qcbPosition.currentIndexChanged.connect(self._modeChanged)
105
+ self._lockMethodPB.sigLockChanged.connect(self.lockMode)
106
+ self._estimatedCorWidget.sigUpdateXRotAxisPixelPosOnNewScan.connect(
107
+ self.sigUpdateXRotAxisPixelPosOnNewScan
108
+ )
109
+ self._estimatedCorWidget.sigYAxisInvertedChanged.connect(
110
+ self.sigYAxisInvertedChanged
111
+ )
112
+
113
+ # set up interface
114
+ self._estimatedCorWidget._updateVisibleSides(mode=self.getMode())
115
+ self.setAxisParams(axis_params)
116
+
117
+ def getMethodLockPB(self) -> qt.QPushButton:
118
+ return self._lockMethodPB
119
+
120
+ def setEstimatedCorValue(self, value):
121
+ self._estimatedCorWidget.setEstimatedCor(value=value)
122
+ # note: force to update the side values.
123
+ self._estimatedCorWidget._updateVisibleSides(mode=self.getMode())
124
+
125
+ def getEstimatedCor(self):
126
+ return self._estimatedCorWidget.getEstimatedCor()
127
+
128
+ def updateXRotationAxisPixelPositionOnNewScan(self) -> bool:
129
+ return self._estimatedCorWidget.updateXRotationAxisPixelPositionOnNewScan()
130
+
131
+ def setUpdateXRotationAxisPixelPositionOnNewScan(self, update: bool):
132
+ self._estimatedCorWidget.setUpdateXRotationAxisPixelPositionOnNewScan(
133
+ update=update
134
+ )
135
+
136
+ def _modeChanged(self, *args, **kwargs):
137
+ mode = self.getMode()
138
+ with block_signals(self._qcbPosition):
139
+ with block_signals(self._axis_params):
140
+ self._estimatedCorWidget._updateVisibleSides(mode)
141
+ self._axis_params.mode = mode.value
142
+ self._axis_params.changed()
143
+ self.sigModeChanged.emit(mode.value)
144
+
145
+ def isModeLock(self):
146
+ return self._lockMethodPB.isLocked()
147
+
148
+ def setModeLock(self, mode=None):
149
+ """set a specific mode and lock it.
150
+
151
+ :param mode: mode to lock. If None then keep the current mode
152
+ """
153
+ if mode is not None:
154
+ mode = axis_mode.AxisMode.from_value(mode)
155
+ if mode is None and axis_mode.AXIS_MODE_METADATAS[self.getMode()].is_lockable():
156
+ raise ValueError(
157
+ "Unable to lock the current mode is not an automatic algorithm"
158
+ )
159
+ elif (
160
+ mode != self.getMode() and axis_mode.AXIS_MODE_METADATAS[mode].is_lockable()
161
+ ):
162
+ raise ValueError("Unable to lock %s this is not a lockable mode")
163
+
164
+ if mode is not None:
165
+ self.setMode(mode)
166
+ if not self._lockMethodPB.isLocked():
167
+ with block_signals(self._lockMethodPB):
168
+ self._lockMethodPB.setLock(True)
169
+ self.lockMode(True)
170
+
171
+ def lockMode(self, lock):
172
+ with block_signals(self._lockMethodPB):
173
+ self._lockMethodPB.setLock(lock)
174
+ self._qcbPosition.setEnabled(not lock)
175
+
176
+ self.sigLockModeChanged.emit(lock)
177
+
178
+ def getMode(self):
179
+ """Return algorithm to use for axis calculation"""
180
+ return axis_mode.AxisMode.from_value(self._qcbPosition.currentText())
181
+
182
+ def setMode(self, mode: axis_mode.AxisMode):
183
+ if mode == self.getMode():
184
+ # when set mode the estimated cor might changed.
185
+ # that we want to avoid.
186
+ return
187
+ with block_signals(self._qcbPosition):
188
+ index = self._qcbPosition.findText(mode.value)
189
+ if index >= 0:
190
+ self._qcbPosition.setCurrentIndex(index)
191
+ else:
192
+ raise ValueError("Unable to find mode", mode)
193
+ self._lockMethodPB.setVisible(mode not in (axis_mode.AxisMode.manual,))
194
+ mode_metadata = axis_mode.AXIS_MODE_METADATAS[mode]
195
+ estimated_cor_widget_visible = (
196
+ mode_metadata.allows_estimated_cor_as_numerical_value
197
+ or len(mode_metadata.valid_sides) > 0
198
+ )
199
+ self._estimatedCorWidget.setVisible(estimated_cor_widget_visible)
200
+ self._estimatedCorWidget._updateVisibleSides(mode=mode)
201
+
202
+ def setAxisParams(self, axis):
203
+ with block_signals(self):
204
+ if self._axis_params is not None:
205
+ self._axis_params.sigChanged.disconnect(self._axis_params_changed)
206
+ self._axis_params = axis
207
+ if self._axis_params.mode in (axis_mode.AxisMode.manual,):
208
+ # those mode cannot be handled by the auto calculation dialog
209
+ self._axis_params.mode = axis_mode.AxisMode.growing_window_radios
210
+ self._axis_params.sigChanged.connect(self._axis_params_changed)
211
+ self._axis_params_changed()
212
+
213
+ def _axis_params_changed(self, *args, **kwargs):
214
+ self.setMode(self._axis_params.mode)
215
+
216
+ def setScan(self, scan: TomwerScanBase | None):
217
+ self._estimatedCorWidget.setPixelSize(pixel_size_m=scan.x_pixel_size)
218
+ self._estimatedCorWidget.setImageWidth(image_width=scan.dim_1)
@@ -1,31 +1,5 @@
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__ = ["v. Valls", "H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "26/02/2019"
2
+ from __future__ import annotations
29
3
 
30
4
  import logging
31
5
  import weakref
@@ -100,7 +74,7 @@ class CompareImagesStatusBar(qt.QStatusBar):
100
74
  Use :meth:`setCompareWidget` to connect this toolbar to a specific
101
75
  :class:`CompareImages` widget.
102
76
 
103
- :param Union[qt.QWidget,None] parent: Parent of this widget.
77
+ :param parent: Parent of this widget.
104
78
  """
105
79
 
106
80
  def __init__(self, parent=None):
@@ -127,7 +101,7 @@ class CompareImagesStatusBar(qt.QStatusBar):
127
101
  """
128
102
  Connect this tool bar to a specific :class:`CompareImages` widget.
129
103
 
130
- :param Union[None,CompareImages] widget: The widget to connect with.
104
+ :param widget: The widget to connect with.
131
105
  """
132
106
  compareWidget = self.getCompareWidget()
133
107
  if compareWidget is not None:
@@ -142,11 +116,8 @@ class CompareImagesStatusBar(qt.QStatusBar):
142
116
  compareWidget.getPlot().sigPlotSignal.connect(self.__plotSignalReceived)
143
117
  compareWidget.sigConfigurationChanged.connect(self.__dataChanged)
144
118
 
145
- def getCompareWidget(self):
146
- """Returns the connected widget.
147
-
148
- :rtype: CompareImages
149
- """
119
+ def getCompareWidget(self) -> CompareImages:
120
+ """Returns the connected widget."""
150
121
  if self.__compareWidget is None:
151
122
  return None
152
123
  else:
@@ -167,13 +138,12 @@ class CompareImagesStatusBar(qt.QStatusBar):
167
138
  """Called when internal data from the connected widget changes."""
168
139
  self._updateStatusBar()
169
140
 
170
- def _formatData(self, data):
141
+ def _formatData(self, data: int | float | None) -> str:
171
142
  """Format pixel of an image.
172
143
 
173
144
  It supports intensity, RGB, and RGBA.
174
145
 
175
- :param Union[int,float,numpy.ndarray,str]: Value of a pixel
176
- :rtype: str
146
+ :param data: Value of a pixel
177
147
  """
178
148
  if data is None:
179
149
  return "-"
@@ -287,11 +257,11 @@ class CompareImagesToolBar(qt.QToolBar):
287
257
  if widget is not None:
288
258
  widget.setVisualizationMode(mode)
289
259
 
290
- def setCompareWidget(self, widget):
260
+ def setCompareWidget(self, widget: None | CompareImages):
291
261
  """
292
262
  Connect this tool bar to a specific :class:`CompareImages` widget.
293
263
 
294
- :param Union[None,CompareImages] widget: The widget to connect with.
264
+ :param widget: The widget to connect the toolbar with.
295
265
  """
296
266
  compareWidget = self.getCompareWidget()
297
267
  if compareWidget is not None:
@@ -308,11 +278,8 @@ class CompareImagesToolBar(qt.QToolBar):
308
278
  widget.sigConfigurationChanged.connect(self.__updateSelectedActions)
309
279
  self.__updateSelectedActions()
310
280
 
311
- def getCompareWidget(self):
312
- """Returns the connected widget.
313
-
314
- :rtype: CompareImages
315
- """
281
+ def getCompareWidget(self) -> CompareImages:
282
+ """Returns the connected widget."""
316
283
  if self.__compareWidget is None:
317
284
  return None
318
285
  else:
@@ -0,0 +1,285 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import numpy
5
+
6
+ from silx.gui import qt
7
+
8
+ from tomwer.core.process.reconstruction.utils.cor import (
9
+ absolute_pos_to_relative,
10
+ relative_pos_to_absolute,
11
+ )
12
+ from tomwer.gui.utils.buttons import PadlockButton
13
+ from tomwer.gui.settings import EDITING_BACKGROUND_COLOR
14
+ from tomwer.synctools.axis import QAxisRP
15
+
16
+ _logger = logging.getLogger(__file__)
17
+
18
+
19
+ class ControlWidget(qt.QWidget):
20
+ """
21
+ Widget to lock, compute or validate the cor position and display it value as absolute or relative
22
+ This is the widget displayed at the bottom of the AxisOW
23
+ """
24
+
25
+ sigComputationRequest = qt.Signal()
26
+ """Signal emitted when user request a computation from the settings"""
27
+
28
+ sigValidateRequest = qt.Signal()
29
+ """Signal emitted when user validate the current settings"""
30
+
31
+ sigLockCORValueChanged = qt.Signal(bool)
32
+ """Signal emitted when the user lock the cor value. Param: True if lock"""
33
+
34
+ def __init__(self, parent):
35
+ qt.QWidget.__init__(self, parent)
36
+ self.setLayout(qt.QVBoxLayout())
37
+
38
+ # display 'center' information
39
+ self._positionInfo = _PositionInfoWidget(parent=self)
40
+ self.layout().addWidget(self._positionInfo)
41
+
42
+ self._buttons = qt.QWidget(parent=self)
43
+ self._buttons.setLayout(qt.QHBoxLayout())
44
+ self.layout().addWidget(self._buttons)
45
+
46
+ self._lockBut = PadlockButton(parent=self)
47
+ self._lockBut.setAutoDefault(False)
48
+ self._lockBut.setDefault(False)
49
+
50
+ self._buttons.layout().addWidget(self._lockBut)
51
+ self._lockLabel = qt.QLabel("lock cor value", parent=self)
52
+ self._buttons.layout().addWidget(self._lockLabel)
53
+
54
+ spacer = qt.QWidget(self)
55
+ spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum)
56
+ self._buttons.layout().addWidget(spacer)
57
+
58
+ self._computeBut = qt.QPushButton("compute", parent=self)
59
+ self._buttons.layout().addWidget(self._computeBut)
60
+ style = qt.QApplication.style()
61
+ applyIcon = style.standardIcon(qt.QStyle.SP_DialogApplyButton)
62
+ self._applyBut = qt.QPushButton(applyIcon, "validate", parent=self)
63
+ self._buttons.layout().addWidget(self._applyBut)
64
+ self.layout().addWidget(self._buttons)
65
+
66
+ # set up
67
+ self._positionInfo.setPosition(None, None)
68
+
69
+ # make connection
70
+ self._computeBut.pressed.connect(self._needComputation)
71
+ self._applyBut.pressed.connect(self._validate)
72
+ self._lockBut.sigLockChanged.connect(self._lockValueChanged)
73
+
74
+ def hideLockButton(self) -> None:
75
+ self._lockLabel.hide()
76
+ self._lockBut.hide()
77
+
78
+ def hideApplyButton(self) -> None:
79
+ self._applyBut.hide()
80
+
81
+ def _lockValueChanged(self):
82
+ self.sigLockCORValueChanged.emit(self._lockBut.isLocked())
83
+ self._computeBut.setEnabled(not self._lockBut.isLocked())
84
+
85
+ def _needComputation(self, *arg, **kwargs):
86
+ """callback when the radio line changed"""
87
+ self.sigComputationRequest.emit()
88
+
89
+ def _validate(self):
90
+ self.sigValidateRequest.emit()
91
+
92
+ def setPosition(self, relative_cor, abs_cor):
93
+ self._positionInfo.setPosition(relative_cor=relative_cor, abs_cor=abs_cor)
94
+
95
+ def _updateAbsolutePosition(self, width):
96
+ self._positionInfo._updateAbsolutePosition(width=width)
97
+
98
+ def _updateRelativePosition(self, width):
99
+ self._positionInfo._updateRelativePosition(width=width)
100
+
101
+ def isValueLock(self):
102
+ return self._lockBut.isLocked()
103
+
104
+ def setValueLock(self, lock):
105
+ self._lockBut.setLock(lock)
106
+
107
+
108
+ class _PositionInfoValidator(qt.QDoubleValidator):
109
+ def validate(self, a0: str, a1: int):
110
+ if "..." in a0 or a0 == "?":
111
+ return (qt.QDoubleValidator.Acceptable, a0, a1)
112
+ else:
113
+ return super().validate(a0, a1)
114
+
115
+
116
+ class _PositionInfoWidget(qt.QWidget):
117
+ """Widget used to display information relative to the current position"""
118
+
119
+ sigRelativeValueSet = qt.Signal(float)
120
+ """Emit when the user define manually the relative value"""
121
+ sigAbsolueValueSet = qt.Signal(float)
122
+ """Emit when the user define manually the absolute value"""
123
+
124
+ def __init__(self, parent, axis=None):
125
+ self._axis_params = None
126
+ self._defaultBackgroundColor = None
127
+ qt.QWidget.__init__(self, parent)
128
+ self.setLayout(qt.QGridLayout())
129
+ centerLabel = qt.QLabel("center", parent=self)
130
+ centerLabel.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum)
131
+ font = centerLabel.font()
132
+ font.setBold(True)
133
+ centerLabel.setFont(font)
134
+
135
+ self.layout().addWidget(centerLabel, 0, 0, 1, 1)
136
+ self.layout().addWidget(qt.QLabel(" (relative):"), 0, 1, 1, 1)
137
+
138
+ self._relativePositionQLE = qt.QLineEdit("", parent=self)
139
+ self._positionValidator = _PositionInfoValidator(self)
140
+ self._relativePositionQLE.setValidator(self._positionValidator)
141
+ self._relativePositionQLE.setSizePolicy(
142
+ qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
143
+ )
144
+ self._relativePositionQLE.setStyleSheet("color: red")
145
+ self.layout().addWidget(self._relativePositionQLE, 0, 2, 1, 1)
146
+
147
+ centerLabel = qt.QLabel("center", parent=self)
148
+ centerLabel.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum)
149
+ font = centerLabel.font()
150
+ font.setBold(False)
151
+ centerLabel.setFont(font)
152
+
153
+ self.layout().addWidget(centerLabel, 1, 0, 1, 1)
154
+ self.layout().addWidget(qt.QLabel(" (absolute):"), 1, 1, 1, 1)
155
+ self._absolutePositionQLE = qt.QLineEdit("", parent=self)
156
+ self._absolutePositionQLE.setValidator(self._positionValidator)
157
+ self._absolutePositionQLE.setSizePolicy(
158
+ qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
159
+ )
160
+ self._absolutePositionQLE.setStyleSheet("color: #ff8c00")
161
+ self.layout().addWidget(self._absolutePositionQLE, 1, 2, 1, 1)
162
+
163
+ if axis:
164
+ self.setAxisParams(axis)
165
+
166
+ # connect signal / slot
167
+ self._relativePositionQLE.textEdited.connect(
168
+ self._userStartEditingRelativePosition
169
+ )
170
+ self._relativePositionQLE.editingFinished.connect(
171
+ self._userUpdatedRelativePosition
172
+ )
173
+ self._absolutePositionQLE.textEdited.connect(
174
+ self._userStartEditingAbsolutePosition
175
+ )
176
+
177
+ self._absolutePositionQLE.editingFinished.connect(
178
+ self._userUpdatedAbsolutePosition
179
+ )
180
+
181
+ def _getDefaultBackgroundColor(self):
182
+ if self._defaultBackgroundColor is None:
183
+ self._defaultBackgroundColor = self.palette().color(
184
+ self._absolutePositionQLE.backgroundRole()
185
+ )
186
+ return self._defaultBackgroundColor
187
+
188
+ def _userStartEditingRelativePosition(self, *args, **kwargs):
189
+ palette = self.palette()
190
+ palette.setColor(
191
+ self._relativePositionQLE.backgroundRole(), EDITING_BACKGROUND_COLOR
192
+ )
193
+ self._relativePositionQLE.setPalette(palette)
194
+
195
+ def _userStartEditingAbsolutePosition(self, *args, **kwargs):
196
+ palette = self.palette()
197
+ palette.setColor(
198
+ self._absolutePositionQLE.backgroundRole(), EDITING_BACKGROUND_COLOR
199
+ )
200
+ self._absolutePositionQLE.setPalette(palette)
201
+
202
+ def _userUpdatedRelativePosition(self, *args, **kwargs):
203
+ palette = self.palette()
204
+ palette.setColor(
205
+ self._relativePositionQLE.backgroundRole(),
206
+ self._getDefaultBackgroundColor(),
207
+ )
208
+ self._relativePositionQLE.setPalette(palette)
209
+ if self._relativePositionQLE.text().startswith((".", "?")):
210
+ return
211
+ else:
212
+ value = float(self._relativePositionQLE.text())
213
+ # make sure we only emit the signal if the value changed (and when the Qline has been edited).
214
+ if self._axis_params.relative_cor_value is None or (
215
+ self._axis_params is not None
216
+ and not numpy.isclose(
217
+ value, self._axis_params.relative_cor_value, atol=1e-3
218
+ )
219
+ ):
220
+ self.sigRelativeValueSet.emit(value)
221
+
222
+ def _userUpdatedAbsolutePosition(self, *args, **kwargs):
223
+ palette = self.palette()
224
+ palette.setColor(
225
+ self._absolutePositionQLE.backgroundRole(),
226
+ self._getDefaultBackgroundColor(),
227
+ )
228
+ self._absolutePositionQLE.setPalette(palette)
229
+ if self._absolutePositionQLE.text().startswith((".", "?")):
230
+ return
231
+ else:
232
+ value = float(self._absolutePositionQLE.text())
233
+ # make sure we only emit the signal if the value changed (and when the Qline has been edited).
234
+ if self._axis_params.absolute_cor_value is None or (
235
+ self._axis_params is not None
236
+ and not numpy.isclose(
237
+ value, self._axis_params.absolute_cor_value, atol=1e-3
238
+ )
239
+ ):
240
+ self.sigAbsolueValueSet.emit(value)
241
+
242
+ def setAxisParams(self, axis):
243
+ assert isinstance(axis, QAxisRP)
244
+ if axis == self._axis_params:
245
+ return
246
+ self._axis_params = axis
247
+
248
+ def getPosition(self):
249
+ return float(self._relativePositionQLE.text())
250
+
251
+ def setPosition(self, relative_cor: float | None, abs_cor: float | None):
252
+ if relative_cor is None:
253
+ self._relativePositionQLE.setText("?")
254
+ elif isinstance(relative_cor, str):
255
+ self._relativePositionQLE.setText(relative_cor)
256
+ else:
257
+ self._relativePositionQLE.setText(f"{relative_cor:.3f}")
258
+ if abs_cor is None:
259
+ self._absolutePositionQLE.setText("?")
260
+ else:
261
+ self._absolutePositionQLE.setText(f"{abs_cor:.3f}")
262
+
263
+ def _updateAbsolutePosition(self, width):
264
+ if width is not None:
265
+ try:
266
+ rel_value = float(self._relativePositionQLE.text())
267
+ except Exception:
268
+ return
269
+ else:
270
+ abs_value = relative_pos_to_absolute(
271
+ relative_pos=float(rel_value), det_width=width
272
+ )
273
+ self._absolutePositionQLE.setText(str(abs_value))
274
+
275
+ def _updateRelativePosition(self, width):
276
+ if width is not None:
277
+ try:
278
+ abs_value = float(self._absolutePositionQLE.text())
279
+ except Exception:
280
+ return
281
+ else:
282
+ rel_value = absolute_pos_to_relative(
283
+ absolute_pos=float(abs_value), det_width=width
284
+ )
285
+ self._relativePositionQLE.setText(str(rel_value))