tomwer 1.3.27__py3-none-any.whl → 1.4.0rc0__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 (632) 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 +48 -49
  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 +40 -85
  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 -7
  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 +7 -4
  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 +63 -111
  138. tomwer/core/process/reconstruction/axis/mode.py +5 -3
  139. tomwer/core/process/reconstruction/axis/params.py +5 -146
  140. tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
  141. tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
  142. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
  143. tomwer/core/process/reconstruction/darkref/params.py +1 -28
  144. tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
  145. tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
  146. tomwer/core/process/reconstruction/nabu/nabuscores.py +47 -48
  147. tomwer/core/process/reconstruction/nabu/nabuslices.py +59 -105
  148. tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
  149. tomwer/core/process/reconstruction/nabu/plane.py +10 -0
  150. tomwer/core/process/reconstruction/nabu/settings.py +1 -28
  151. tomwer/core/process/reconstruction/nabu/target.py +0 -28
  152. tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
  153. tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
  154. tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
  155. tomwer/core/process/reconstruction/nabu/utils.py +11 -60
  156. tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
  157. tomwer/core/process/reconstruction/normalization/params.py +3 -35
  158. tomwer/core/process/reconstruction/output.py +14 -19
  159. tomwer/core/process/reconstruction/paramsbase.py +4 -33
  160. tomwer/core/process/reconstruction/saaxis/params.py +5 -33
  161. tomwer/core/process/reconstruction/saaxis/saaxis.py +18 -47
  162. tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
  163. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +16 -44
  164. tomwer/core/process/reconstruction/scores/params.py +9 -39
  165. tomwer/core/process/reconstruction/scores/scores.py +10 -42
  166. tomwer/core/process/reconstruction/tests/__init__.py +0 -0
  167. tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
  168. tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
  169. tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
  170. tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
  171. tomwer/core/process/script/python.py +1 -27
  172. tomwer/core/process/script/tests/test_script.py +41 -0
  173. tomwer/core/process/stitching/metadataholder.py +5 -4
  174. tomwer/core/process/stitching/nabustitcher.py +35 -5
  175. tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
  176. tomwer/core/process/task.py +20 -63
  177. tomwer/core/process/tests/__init__.py +0 -0
  178. tomwer/core/process/{test → tests}/test_axis.py +1 -79
  179. tomwer/core/process/{test → tests}/test_conditions.py +1 -28
  180. tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
  181. tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
  182. tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
  183. tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
  184. tomwer/core/process/{test → tests}/test_nabu.py +4 -33
  185. tomwer/core/process/{test → tests}/test_normalization.py +1 -26
  186. tomwer/core/process/{test → tests}/test_timer.py +1 -27
  187. tomwer/core/process/utils.py +2 -31
  188. tomwer/core/process/visualization/dataviewer.py +1 -26
  189. tomwer/core/process/visualization/diffviewer.py +1 -26
  190. tomwer/core/process/visualization/imagestackviewer.py +0 -26
  191. tomwer/core/process/visualization/radiostack.py +0 -26
  192. tomwer/core/process/visualization/samplemoved.py +0 -28
  193. tomwer/core/process/visualization/sinogramviewer.py +0 -27
  194. tomwer/core/process/visualization/slicestack.py +0 -28
  195. tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
  196. tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
  197. tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
  198. tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
  199. tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
  200. tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
  201. tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
  202. tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
  203. tomwer/core/process/visualization/volumeviewer.py +0 -29
  204. tomwer/core/scan/__init__.py +3 -27
  205. tomwer/core/scan/blissscan.py +5 -34
  206. tomwer/core/scan/edfscan.py +19 -53
  207. tomwer/core/scan/hdf5scan.py +2 -2
  208. tomwer/core/scan/nxtomoscan.py +46 -54
  209. tomwer/core/scan/scanbase.py +104 -200
  210. tomwer/core/scan/scanfactory.py +11 -41
  211. tomwer/core/scan/tests/__init__.py +0 -0
  212. tomwer/core/scan/tests/test_edf.py +25 -0
  213. tomwer/core/scan/tests/test_future_scan.py +35 -0
  214. tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
  215. tomwer/core/scan/{test → tests}/test_process_registration.py +1 -28
  216. tomwer/core/settings.py +18 -40
  217. tomwer/core/tests/__init__.py +0 -0
  218. tomwer/core/tests/test_scanutils.py +26 -0
  219. tomwer/core/{test → tests}/test_utils.py +1 -28
  220. tomwer/core/tomwer_object.py +4 -0
  221. tomwer/core/utils/__init__.py +2 -0
  222. tomwer/core/utils/char.py +0 -28
  223. tomwer/core/utils/deprecation.py +12 -38
  224. tomwer/core/utils/dictutils.py +1 -3
  225. tomwer/core/utils/ftseriesutils.py +1 -27
  226. tomwer/core/utils/gpu.py +0 -28
  227. tomwer/core/utils/image.py +8 -39
  228. tomwer/core/utils/locker.py +1 -28
  229. tomwer/core/utils/logconfig.py +0 -27
  230. tomwer/core/utils/normalization.py +4 -31
  231. tomwer/core/utils/nxtomoutils.py +8 -38
  232. tomwer/core/utils/resource.py +0 -26
  233. tomwer/core/utils/scanutils.py +23 -52
  234. tomwer/core/utils/slurm.py +7 -30
  235. tomwer/core/utils/spec.py +6 -6
  236. tomwer/core/utils/tests/__init__.py +0 -0
  237. tomwer/core/utils/tests/test_image.py +30 -0
  238. tomwer/core/utils/tests/test_nxtomo.py +38 -0
  239. tomwer/core/utils/tests/test_scan_utils.py +46 -0
  240. tomwer/core/utils/tests/test_time.py +6 -0
  241. tomwer/core/utils/threads.py +0 -26
  242. tomwer/core/utils/time.py +0 -27
  243. tomwer/core/volume/__init__.py +4 -0
  244. tomwer/core/volume/edfvolume.py +1 -28
  245. tomwer/core/volume/hdf5volume.py +1 -28
  246. tomwer/core/volume/jp2kvolume.py +1 -27
  247. tomwer/core/volume/rawvolume.py +1 -28
  248. tomwer/core/volume/tests/test_volumes.py +21 -0
  249. tomwer/core/volume/tiffvolume.py +1 -28
  250. tomwer/core/volume/volumebase.py +5 -0
  251. tomwer/core/volume/volumefactory.py +7 -33
  252. tomwer/gui/__init__.py +0 -28
  253. tomwer/gui/cluster/__init__.py +2 -0
  254. tomwer/gui/cluster/slurm.py +297 -95
  255. tomwer/gui/cluster/supervisor.py +1 -27
  256. tomwer/gui/cluster/tests/__init__.py +0 -0
  257. tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
  258. tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
  259. tomwer/gui/conditions/__init__.py +2 -0
  260. tomwer/gui/conditions/filter.py +1 -26
  261. tomwer/gui/configuration/__init__.py +2 -0
  262. tomwer/gui/control/__init__.py +2 -0
  263. tomwer/gui/control/actions.py +2 -28
  264. tomwer/gui/control/datadiscovery.py +4 -3
  265. tomwer/gui/control/datalist.py +64 -69
  266. tomwer/gui/control/datalistener.py +1 -39
  267. tomwer/gui/control/datareacheractions.py +1 -28
  268. tomwer/gui/control/datatransfert.py +2 -29
  269. tomwer/gui/control/datavalidator.py +3 -37
  270. tomwer/gui/control/datawatcher/__init__.py +0 -28
  271. tomwer/gui/control/datawatcher/configuration.py +1 -28
  272. tomwer/gui/control/datawatcher/datawatcher.py +3 -32
  273. tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
  274. tomwer/gui/control/history.py +5 -35
  275. tomwer/gui/control/nxtomomill.py +3 -30
  276. tomwer/gui/control/observations.py +61 -55
  277. tomwer/gui/control/reducedarkflatselector.py +24 -20
  278. tomwer/gui/control/scanselectorwidget.py +2 -28
  279. tomwer/gui/control/selectorwidgetbase.py +17 -17
  280. tomwer/gui/control/series/__init__.py +0 -0
  281. tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
  282. tomwer/gui/control/series/serieswaiter.py +0 -0
  283. tomwer/gui/control/series/test/test_creator.py +424 -0
  284. tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
  285. tomwer/gui/control/singletomoobj.py +1 -1
  286. tomwer/gui/control/tests/__init__.py +0 -0
  287. tomwer/gui/control/tests/test_datalist.py +47 -0
  288. tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
  289. tomwer/gui/control/tests/test_datavalidator.py +27 -0
  290. tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
  291. tomwer/gui/control/tests/test_process_manager.py +38 -0
  292. tomwer/gui/control/tests/test_scan_observations.py +23 -0
  293. tomwer/gui/control/tests/test_scanselector.py +42 -0
  294. tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
  295. tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
  296. tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
  297. tomwer/gui/control/volumeselectorwidget.py +2 -30
  298. tomwer/gui/dataportal/__init__.py +2 -0
  299. tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
  300. tomwer/gui/dataportal/gallery.py +133 -0
  301. tomwer/gui/dataportal/outputformat.py +0 -0
  302. tomwer/gui/dataportal/publish.py +96 -0
  303. tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
  304. tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
  305. tomwer/gui/debugtools/__init__.py +2 -0
  306. tomwer/gui/debugtools/datasetgenerator.py +1 -30
  307. tomwer/gui/debugtools/objectinspector.py +1 -29
  308. tomwer/gui/dialog/QDataDialog.py +89 -0
  309. tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
  310. tomwer/gui/dialog/__init__.py +1 -0
  311. tomwer/gui/edit/__init__.py +2 -0
  312. tomwer/gui/edit/dkrfpatch.py +52 -87
  313. tomwer/gui/edit/imagekeyeditor.py +18 -54
  314. tomwer/gui/edit/nxtomoeditor.py +113 -300
  315. tomwer/gui/edit/nxtomowarmer.py +3 -2
  316. tomwer/gui/edit/tests/__init__.py +0 -0
  317. tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
  318. tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
  319. tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
  320. tomwer/gui/icons.py +28 -66
  321. tomwer/gui/illustrations.py +4 -34
  322. tomwer/gui/imagefromfile.py +5 -30
  323. tomwer/gui/metadataloader.py +36 -0
  324. tomwer/gui/qconfigfile.py +3 -0
  325. tomwer/gui/qlefilesystem.py +3 -0
  326. tomwer/gui/reconstruction/__init__.py +2 -0
  327. tomwer/gui/reconstruction/axis/AxisMainWindow.py +264 -0
  328. tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +153 -0
  329. tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +776 -0
  330. tomwer/gui/reconstruction/axis/AxisWidget.py +526 -0
  331. tomwer/gui/reconstruction/axis/CalculationWidget.py +374 -0
  332. tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
  333. tomwer/gui/reconstruction/axis/ControlWidget.py +277 -0
  334. tomwer/gui/reconstruction/axis/InputWidget.py +491 -0
  335. tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
  336. tomwer/gui/reconstruction/axis/__init__.py +2 -2
  337. tomwer/gui/reconstruction/darkref/__init__.py +0 -27
  338. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
  339. tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
  340. tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
  341. tomwer/gui/reconstruction/nabu/check.py +7 -33
  342. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
  343. tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
  344. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
  345. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
  346. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
  347. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
  348. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
  349. tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
  350. tomwer/gui/reconstruction/nabu/platform.py +94 -0
  351. tomwer/gui/reconstruction/nabu/slices.py +81 -45
  352. tomwer/gui/reconstruction/nabu/slurm.py +1 -27
  353. tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
  354. tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
  355. tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
  356. tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
  357. tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
  358. tomwer/gui/reconstruction/nabu/volume.py +62 -90
  359. tomwer/gui/reconstruction/normalization/intensity.py +5 -32
  360. tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
  361. tomwer/gui/reconstruction/saaxis/corrangeselector.py +16 -49
  362. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
  363. tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
  364. tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
  365. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
  366. tomwer/gui/reconstruction/scores/control.py +2 -30
  367. tomwer/gui/reconstruction/scores/scoreplot.py +19 -48
  368. tomwer/gui/reconstruction/tests/__init__.py +0 -0
  369. tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
  370. tomwer/gui/reconstruction/{test → tests}/test_nabu.py +8 -31
  371. tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
  372. tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
  373. tomwer/gui/samplemoved/__init__.py +2 -30
  374. tomwer/gui/samplemoved/selectiontable.py +3 -33
  375. tomwer/gui/settings.py +7 -0
  376. tomwer/gui/stackplot.py +33 -661
  377. tomwer/gui/stacks.py +261 -135
  378. tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
  379. tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
  380. tomwer/gui/stitching/StitchingWindow.py +586 -0
  381. tomwer/gui/stitching/__init__.py +2 -0
  382. tomwer/gui/stitching/alignment.py +90 -0
  383. tomwer/gui/stitching/axisorderedlist.py +44 -34
  384. tomwer/gui/stitching/config/axisparams.py +23 -11
  385. tomwer/gui/stitching/config/output.py +6 -5
  386. tomwer/gui/stitching/config/positionoveraxis.py +313 -51
  387. tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
  388. tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
  389. tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
  390. tomwer/gui/stitching/normalization.py +1 -0
  391. tomwer/gui/stitching/preview.py +59 -0
  392. tomwer/gui/stitching/singleaxis.py +57 -0
  393. tomwer/gui/stitching/stitchandbackground.py +3 -2
  394. tomwer/gui/stitching/stitching_preview.py +44 -36
  395. tomwer/gui/stitching/stitching_raw.py +5 -3
  396. tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
  397. tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
  398. tomwer/gui/stitching/tests/test_normalization.py +27 -0
  399. tomwer/gui/stitching/tests/test_preview.py +68 -0
  400. tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
  401. tomwer/gui/stitching/tests/utils.py +92 -0
  402. tomwer/gui/stitching/utils.py +14 -0
  403. tomwer/gui/stitching/z_stitching/fineestimation.py +4 -32
  404. tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
  405. tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
  406. tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
  407. tomwer/gui/tests/__init__.py +0 -0
  408. tomwer/gui/tests/test_axis_gui.py +27 -0
  409. tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
  410. tomwer/gui/utils/RangeWidget.py +44 -0
  411. tomwer/gui/utils/buttons.py +4 -3
  412. tomwer/gui/utils/completer.py +2 -33
  413. tomwer/gui/utils/flow.py +11 -40
  414. tomwer/gui/utils/gpu.py +60 -0
  415. tomwer/gui/utils/illustrations.py +1 -26
  416. tomwer/gui/utils/inputwidget.py +35 -73
  417. tomwer/gui/utils/lineselector/lineselector.py +9 -46
  418. tomwer/gui/utils/loadingmode.py +81 -0
  419. tomwer/gui/utils/qt_utils.py +9 -0
  420. tomwer/gui/utils/sandboxes.py +1 -26
  421. tomwer/gui/utils/scandescription.py +2 -31
  422. tomwer/gui/utils/scrollarea.py +6 -55
  423. tomwer/gui/utils/slider.py +4 -28
  424. tomwer/gui/utils/splashscreen.py +0 -28
  425. tomwer/gui/utils/step.py +14 -13
  426. tomwer/gui/utils/tests/test_completer.py +41 -0
  427. tomwer/gui/utils/tests/test_line_selector.py +21 -0
  428. tomwer/gui/utils/tests/test_splashscreen.py +8 -0
  429. tomwer/gui/utils/tests/test_vignettes.py +68 -0
  430. tomwer/gui/utils/unitsystem.py +15 -69
  431. tomwer/gui/utils/utils.py +4 -5
  432. tomwer/gui/utils/vignettes.py +10 -41
  433. tomwer/gui/utils/waiterthread.py +0 -26
  434. tomwer/gui/visualization/__init__.py +2 -0
  435. tomwer/gui/visualization/dataviewer.py +68 -421
  436. tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
  437. tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
  438. tomwer/gui/visualization/fullscreenplot.py +5 -5
  439. tomwer/gui/visualization/imagestack.py +403 -0
  440. tomwer/gui/visualization/nxtomometadata.py +0 -4
  441. tomwer/gui/visualization/reconstructionparameters.py +14 -32
  442. tomwer/gui/visualization/scanoverview.py +33 -66
  443. tomwer/gui/visualization/sinogramviewer.py +2 -28
  444. tomwer/gui/visualization/test/__init__.py +0 -28
  445. tomwer/gui/visualization/test/test_dataviewer.py +1 -28
  446. tomwer/gui/visualization/test/test_diffviewer.py +1 -28
  447. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
  448. tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
  449. tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
  450. tomwer/gui/visualization/test/test_stacks.py +184 -115
  451. tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
  452. tomwer/gui/visualization/tomoobjoverview.py +2 -2
  453. tomwer/gui/visualization/volumeoverview.py +3 -2
  454. tomwer/gui/visualization/volumeviewer.py +47 -43
  455. tomwer/io/__init__.py +2 -0
  456. tomwer/io/utils/h5pyutils.py +1 -27
  457. tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
  458. tomwer/io/utils/test/test_utils.py +67 -0
  459. tomwer/io/utils/utils.py +2 -31
  460. tomwer/resources/__init__.py +13 -33
  461. tomwer/resources/gui/icons/edit_downstream.svg +114 -0
  462. tomwer/resources/gui/icons/edit_upstream.svg +112 -0
  463. tomwer/resources/gui/icons/free_edition.svg +23 -0
  464. tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
  465. tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
  466. tomwer/resources/gui/icons/search.png +0 -0
  467. tomwer/resources/gui/icons/search.svg +23 -0
  468. tomwer/resources/gui/icons/warning.png +0 -0
  469. tomwer/synctools/__init__.py +2 -0
  470. tomwer/synctools/axis.py +1 -27
  471. tomwer/synctools/darkref.py +1 -26
  472. tomwer/synctools/datalistener.py +1 -27
  473. tomwer/synctools/datatransfert.py +2 -27
  474. tomwer/synctools/imageloaderthread.py +1 -28
  475. tomwer/synctools/rsyncmanager.py +1 -25
  476. tomwer/synctools/saaxis.py +1 -26
  477. tomwer/synctools/sadeltabeta.py +1 -26
  478. tomwer/synctools/stacks/control/datalistener.py +1 -26
  479. tomwer/synctools/stacks/processingstack.py +4 -33
  480. tomwer/synctools/stacks/reconstruction/axis.py +2 -31
  481. tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
  482. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +3 -26
  483. tomwer/synctools/stacks/reconstruction/nabu.py +1 -26
  484. tomwer/synctools/stacks/reconstruction/normalization.py +1 -26
  485. tomwer/synctools/stacks/reconstruction/saaxis.py +1 -26
  486. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +1 -26
  487. tomwer/synctools/tests/__init__.py +0 -0
  488. tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
  489. tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
  490. tomwer/synctools/utils/scanstages.py +2 -31
  491. tomwer/tests/__init__.py +1 -0
  492. tomwer/tests/app/test_stitching.py +95 -0
  493. tomwer/tests/datasets.py +1 -5
  494. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
  495. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
  496. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
  497. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
  498. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
  499. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
  500. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
  501. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
  502. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
  503. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
  504. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
  505. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
  506. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
  507. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
  508. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
  509. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
  510. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
  511. orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
  512. tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
  513. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
  514. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
  515. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
  516. tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
  517. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +215 -0
  518. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
  519. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
  520. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
  521. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
  522. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
  523. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
  524. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
  525. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
  526. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
  527. tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
  528. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
  529. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
  530. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
  531. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
  532. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
  533. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
  534. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
  535. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
  536. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
  537. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
  538. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
  539. tomwer/tests/test_ewoks/test_conversion.py +104 -0
  540. tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
  541. tomwer/tests/test_ewoks/test_workflows.py +138 -0
  542. tomwer/utils.py +11 -39
  543. tomwer/version.py +3 -3
  544. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/LICENSE +3 -3
  545. tomwer-1.4.0rc0.dist-info/METADATA +337 -0
  546. tomwer-1.4.0rc0.dist-info/RECORD +909 -0
  547. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/WHEEL +1 -1
  548. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/entry_points.txt +1 -0
  549. orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
  550. orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
  551. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
  552. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
  553. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
  554. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
  555. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
  556. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  557. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
  558. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  559. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
  560. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
  561. orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
  562. orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
  563. tomwer/core/log/logger.py +0 -130
  564. tomwer/core/process/control/test/test_volume_link.py +0 -74
  565. tomwer/core/process/control/tomoobjserie.py +0 -12
  566. tomwer/core/process/control/volumesymlink.py +0 -200
  567. tomwer/core/process/icat/createscreenshots.py +0 -100
  568. tomwer/core/process/icat/gallery.py +0 -377
  569. tomwer/core/process/icat/icatbase.py +0 -36
  570. tomwer/core/process/icat/publish.py +0 -228
  571. tomwer/core/process/icat/screenshots.py +0 -27
  572. tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
  573. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
  574. tomwer/core/process/visualization/liveslice.py +0 -6
  575. tomwer/core/progress.py +0 -100
  576. tomwer/core/scan/test/test_edf.py +0 -53
  577. tomwer/core/scan/test/test_future_scan.py +0 -61
  578. tomwer/core/scan/test/test_h5.py +0 -96
  579. tomwer/core/test/test_scanutils.py +0 -53
  580. tomwer/gui/control/emailnotifier.py +0 -174
  581. tomwer/gui/control/serie/seriewaiter.py +0 -28
  582. tomwer/gui/control/test/__init__.py +0 -28
  583. tomwer/gui/control/test/test_datalist.py +0 -96
  584. tomwer/gui/control/test/test_datavalidator.py +0 -54
  585. tomwer/gui/control/test/test_email.py +0 -35
  586. tomwer/gui/control/test/test_process_manager.py +0 -65
  587. tomwer/gui/control/test/test_scanselector.py +0 -67
  588. tomwer/gui/edit/test/__init__.py +0 -28
  589. tomwer/gui/icat/gallery.py +0 -214
  590. tomwer/gui/icat/publish.py +0 -187
  591. tomwer/gui/reconstruction/axis/axis.py +0 -733
  592. tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
  593. tomwer/gui/stitching/stitching.py +0 -1388
  594. tomwer/gui/test/__init__.py +0 -28
  595. tomwer/gui/test/test_axis_gui.py +0 -34
  596. tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
  597. tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
  598. tomwer/third_part/WaitingOverlay.py +0 -110
  599. tomwer-1.3.27-py3.11-nspkg.pth +0 -1
  600. tomwer-1.3.27.dist-info/METADATA +0 -292
  601. tomwer-1.3.27.dist-info/RECORD +0 -785
  602. tomwer-1.3.27.dist-info/namespace_packages.txt +0 -1
  603. /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
  604. {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
  605. {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
  606. /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
  607. {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
  608. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
  609. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
  610. {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
  611. {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
  612. {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
  613. {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
  614. {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
  615. {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
  616. {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
  617. /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
  618. /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
  619. /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
  620. /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
  621. /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
  622. /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
  623. /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
  624. /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
  625. /tomwer/core/process/reconstruction/{test → tests}/test_utils.py +0 -0
  626. /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
  627. /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
  628. /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
  629. /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
  630. /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
  631. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
  632. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/top_level.txt +0 -0
@@ -1,733 +0,0 @@
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
- contains gui relative to axis calculation using sinogram
27
- """
28
-
29
- __authors__ = ["H. Payno"]
30
- __license__ = "MIT"
31
- __date__ = "14/10/2019"
32
-
33
-
34
- import numpy
35
- import logging
36
- from typing import Optional
37
-
38
- from silx.gui import qt
39
- from silx.utils.deprecation import deprecated
40
-
41
- from tomwer.core.process.reconstruction.axis.mode import AxisMode
42
- from tomwer.core.scan.scanbase import TomwerScanBase
43
- from tomwer.gui.utils.buttons import PadlockButton
44
- from tomwer.gui.settings import EDITING_BACKGROUND_COLOR
45
- from tomwer.synctools.axis import QAxisRP
46
-
47
- from ...utils.scandescription import ScanNameLabelAndShape
48
- from .radioaxis import RadioAxisWindow
49
-
50
- _logger = logging.getLogger(__file__)
51
-
52
-
53
- class _AxisTypeSelection(qt.QGroupBox):
54
- sigSelectionChanged = qt.Signal(str)
55
- """Signal emitted when the selection changed. Value can be `sinogram` or
56
- `radio`"""
57
-
58
- def __init__(self, parent):
59
- qt.QGroupBox.__init__(self, parent=parent)
60
- self.setTitle("compute center of rotation from")
61
- self.setLayout(qt.QHBoxLayout())
62
- self._radioRB = qt.QRadioButton("radios", parent=self)
63
- self.layout().addWidget(self._radioRB)
64
-
65
- self._sinogramRB = qt.QRadioButton("sinogram", parent=self)
66
- self.layout().addWidget(self._sinogramRB)
67
-
68
- # Signal / Slot connections
69
- self._radioRB.toggled.connect(self._selectionChanged)
70
- self._sinogramRB.toggled.connect(self._selectionChanged)
71
-
72
- def getSelection(self):
73
- if self._radioRB.isChecked():
74
- return "radio"
75
- else:
76
- return "sinogram"
77
-
78
- def setSelection(self, selection):
79
- if selection == "radio":
80
- self._radioRB.setChecked(True)
81
- elif selection == "sinogram":
82
- self._sinogramRB.setChecked(True)
83
- else:
84
- raise ValueError("invalid selection given")
85
-
86
- def _selectionChanged(self, *args, **kwargs):
87
- self.sigSelectionChanged.emit(self.getSelection())
88
-
89
-
90
- class AxisWindow(qt.QMainWindow):
91
- """Main widget for the axis calculation"""
92
-
93
- sigComputationRequested = qt.Signal()
94
- """signal emitted when a computation is requested"""
95
-
96
- sigApply = qt.Signal()
97
- """signal emitted when the axis reconstruction parameters are validated"""
98
-
99
- sigAxisEditionLocked = qt.Signal(bool)
100
- """Signal emitted when the status of the reconstruction parameters edition
101
- change"""
102
-
103
- sigLockModeChanged = qt.Signal()
104
- """Signal emitted when the lock on the method change"""
105
-
106
- def __init__(self, axis_params, parent=None, backend=None):
107
- super().__init__(parent=parent)
108
- self._mainWidget = qt.QWidget(self)
109
- self._mainWidget.setLayout(qt.QVBoxLayout())
110
- self.setCentralWidget(self._mainWidget)
111
-
112
- self._axis_params = axis_params
113
-
114
- # add scan name
115
- self._scan_label = ScanNameLabelAndShape(parent=self)
116
- self._mainWidget.layout().addWidget(self._scan_label)
117
-
118
- # add selection
119
- self._selectionGB = _AxisTypeSelection(parent=self)
120
- self._mainWidget.layout().addWidget(self._selectionGB)
121
- self._selectionGB.hide()
122
-
123
- # add widget for radio and sinogram axis
124
- self._axisWidget = _AxisWidget(
125
- parent=self, axis_params=axis_params, backend=backend
126
- )
127
- self._mainWidget.layout().addWidget(self._axisWidget)
128
-
129
- self.setCentralWidget(self._mainWidget)
130
-
131
- # set up configuration
132
- if axis_params.use_sinogram:
133
- selection = "sinogram"
134
- else:
135
- selection = "radio"
136
- self._selectionGB.setSelection(selection=selection)
137
- self._selectionGB._selectionChanged(self._selectionGB.getSelection())
138
-
139
- # connect signal / slots
140
- self._axisWidget.sigValidateRequest.connect(self.sigApply)
141
- self._axisWidget.sigComputationRequested.connect(self._computationRequested)
142
- self._axisWidget.sigLockModeChanged.connect(self._lockModeChanged)
143
- self._selectionGB.sigSelectionChanged.connect(self._axisWidget._axisTypeChanged)
144
- self._axisWidget.sigSinogramReady.connect(self._computationReady)
145
-
146
- # expose API
147
- self.setSelection = self._selectionGB.setSelection
148
- self.getSelection = self._selectionGB.getSelection
149
- self.hideLockButton = self._axisWidget.hideLockButton
150
- self.hideApplyButton = self._axisWidget.hideApplyButton
151
- self.setReconsParams = self._axisWidget.setReconsParams
152
- self.getPlotWidget = self._axisWidget.getPlotWidget
153
- self.setMode = self._axisWidget.setMode
154
- self.manual_uses_full_image = self._axisWidget.manual_uses_full_image
155
- self.setModeLock = self._axisWidget.setModeLock
156
- self.getAxis = self._axisWidget.getAxis
157
- self.isModeLock = self._axisWidget.isModeLock
158
- self.isValueLock = self._axisWidget.isValueLock
159
- self.setValueLock = self._axisWidget.setValueLock
160
- self._setValueLockFrmSettings = self._axisWidget._setValueLockFrmSettings
161
- self._setModeLockFrmSettings = self._axisWidget._setModeLockFrmSettings
162
- self.getRadioMode = self._axisWidget.getRadioMode
163
- self.getEstimatedCor = self._axisWidget.getEstimatedCor
164
- self.setEstimatedCor = self._axisWidget.setEstimatedCor
165
- self.sigMethodChanged = self._axisWidget.sigModeChanged
166
-
167
- def setAutoUpdateEstimatedCor(self, value: bool):
168
- assert isinstance(value, bool)
169
- self._axisWidget.setAutoUpdateEstimatedCor(value)
170
-
171
- def _disableForProcessing(self, *args, **kwargs):
172
- self._mainWidget.setEnabled(False)
173
- self._axisWidget.setEnabled(False)
174
-
175
- def _enableForProcessing(self, *args, **kwargs):
176
- self._mainWidget.setEnabled(True)
177
- self._axisWidget.setEnabled(True)
178
-
179
- def _lockModeChanged(self):
180
- self.sigLockModeChanged.emit()
181
-
182
- def setScan(self, scan, set_position=True):
183
- """
184
- set the gui for this scan
185
-
186
- :param TomoBase scan:
187
- """
188
- self._scan_label.setScan(scan=scan)
189
- self._axisWidget.setScan(scan=scan, set_position=set_position)
190
- self._enableSinogramOpt(scan.scan_range == 360)
191
-
192
- def _enableSinogramOpt(self, b):
193
- if self._selectionGB.getSelection() == "sinogram" and not b:
194
- change_selection_to_radio = True
195
- else:
196
- change_selection_to_radio = False
197
- self._selectionGB._sinogramRB.setEnabled(b)
198
- if change_selection_to_radio:
199
- self._selectionGB.setSelection("radio")
200
-
201
- def _computationRequested(self):
202
- self._computationReady()
203
-
204
- def _computationReady(self):
205
- self.sigComputationRequested.emit()
206
-
207
- def setPosition(self, frm: float, value: float):
208
- self._axisWidget.setPosition(relative_value=value)
209
-
210
-
211
- class _AxisWidget(qt.QMainWindow):
212
- """
213
- Control which plot and which settings widget is displayed
214
- """
215
-
216
- sigComputationRequested = qt.Signal()
217
-
218
- sigValidateRequest = qt.Signal()
219
-
220
- sigLockCORValueChanged = qt.Signal(bool)
221
- """bool: True if locked"""
222
-
223
- sigLockModeChanged = qt.Signal()
224
- """Signal emitted when the lock mode on the mode change"""
225
-
226
- sigModeChanged = qt.Signal(str)
227
-
228
- sigSinogramReady = qt.Signal()
229
-
230
- def __init__(self, parent, axis_params, backend=None):
231
- super().__init__(parent)
232
- self._settingsWidget = None
233
- self.setDockOptions(qt.QMainWindow.AnimatedDocks)
234
-
235
- self._settingsDockWidget = qt.QDockWidget(parent=self)
236
- self._settingsDockWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
237
- self._settingsDockWidget.layout().setContentsMargins(0, 0, 0, 0)
238
- self._settingsDockWidget.layout().setSpacing(0)
239
- self.addDockWidget(qt.Qt.RightDockWidgetArea, self._settingsDockWidget)
240
-
241
- self._controlWidget = _ControlWidget(parent=self)
242
- self._controlWidget.setSizePolicy(
243
- qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum
244
- )
245
- self._controlDockWidget = qt.QDockWidget(parent=self)
246
- self._controlDockWidget.setSizePolicy(
247
- qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum
248
- )
249
- self._controlDockWidget.layout().setContentsMargins(0, 0, 0, 0)
250
- self._controlDockWidget.layout().setSpacing(0)
251
- self._controlDockWidget.setMaximumHeight(150)
252
- self._controlDockWidget.setWidget(self._controlWidget)
253
- self._controlDockWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
254
- self.addDockWidget(qt.Qt.RightDockWidgetArea, self._controlDockWidget)
255
-
256
- self._axis_params = axis_params
257
- self._radioAxis = RadioAxisWindow(
258
- parent=self, axis=axis_params, backend=backend
259
- )
260
- self._plotWidgets = qt.QWidget(self)
261
- self._plotWidgets.setLayout(qt.QVBoxLayout())
262
- self.setCentralWidget(self._plotWidgets)
263
- self._radioAxis.removeDockWidget(self._radioAxis.getSettingsWidgetDocker())
264
-
265
- # expose API
266
- self.getRadioMode = self._radioAxis.getMode
267
- self.getEstimatedCor = self._radioAxis.getEstimatedCor
268
- self.setEstimatedCor = self._radioAxis.setEstimatedCor
269
-
270
- # set up
271
- if self._axis_params.mode is AxisMode.manual:
272
- self._controlWidget.setPosition(
273
- self._axis_params.relative_cor_value,
274
- self._axis_params.absolute_cor_value,
275
- )
276
- self._controlWidget._positionInfo.setAxis(self._axis_params)
277
-
278
- # connect signal / slots
279
- self._controlWidget.sigComputationRequest.connect(self.sigComputationRequested)
280
- self._controlWidget.sigValidateRequest.connect(self.sigValidateRequest)
281
- self._controlWidget.sigLockCORValueChanged.connect(self._CORValueLocked)
282
- self._radioAxis.sigLockModeChanged.connect(self.sigLockModeChanged)
283
- self._radioAxis.sigPositionChanged.connect(self._setPositionFrmTuple)
284
- self._controlWidget._positionInfo.sigRelativeValueSet.connect(
285
- self._forceRelativePosition
286
- )
287
- self._controlWidget._positionInfo.sigAbsolueValueSet.connect(
288
- self._forceAbsolutePosition
289
- )
290
-
291
- # set up
292
- self.addPlot(self._radioAxis)
293
- self.setActiveWidget(self._radioAxis)
294
-
295
- def _forceRelativePosition(self, value: float):
296
- self.setMode(AxisMode.manual)
297
- self.setPosition(
298
- relative_value=value,
299
- absolute_value=None,
300
- )
301
-
302
- def _forceAbsolutePosition(self, value: float):
303
- self.setMode(AxisMode.manual)
304
- self.setPosition(
305
- relative_value=None,
306
- absolute_value=value,
307
- )
308
-
309
- def setAutoUpdateEstimatedCor(self, value):
310
- self._radioAxis.setUpdateAutomaticallyEstimatedCor(value)
311
-
312
- def getAutoUpdateEstimatedCor(self):
313
- return self._radioAxis.updateAutomaticallyEstimatedCor()
314
-
315
- @deprecated(replacement="getRadioMode")
316
- def getMode(self):
317
- return self._radioAxis.getMode()
318
-
319
- def manual_uses_full_image(self, value):
320
- self._radioAxis.manual_uses_full_image(value)
321
-
322
- def _modeChanged(self):
323
- self.getAxis().mode = self.getMode()
324
- self.getAxis().use_sinogram = self.useSinogram()
325
-
326
- def setMode(self, mode):
327
- mode = AxisMode.from_value(mode)
328
- self.setActiveWidget(self._radioAxis)
329
- self._radioAxis.setMode(mode)
330
- self._axis_params.mode = mode
331
- self.sigModeChanged.emit(mode.value)
332
-
333
- def _CORValueLocked(self, lock):
334
- if lock:
335
- self.setMode(AxisMode.manual)
336
- self.setModeLock(lock)
337
- self.sigLockCORValueChanged.emit(lock)
338
-
339
- def setActiveWidget(self, widget):
340
- for iPlotWidget in range(self._plotWidgets.layout().count()):
341
- plotWidget = self._plotWidgets.layout().itemAt(iPlotWidget).widget()
342
- plotWidget.setVisible(widget == plotWidget)
343
- self.setSettingsWidget(widget.getSettingsWidget())
344
-
345
- def addPlot(self, plot):
346
- self._plotWidgets.layout().addWidget(plot)
347
-
348
- def setPlotWidget(self, plot):
349
- self.setCentralWidget(plot)
350
-
351
- def getPlotWidget(self):
352
- return self.centralWidget()
353
-
354
- def setSettingsWidget(self, widget):
355
- self._settingsDockWidget.setWidget(widget)
356
-
357
- def _setPositionFrmTuple(self, value):
358
- self.setPosition(relative_value=value[0])
359
-
360
- def setPosition(self, relative_value: float, absolute_value: float = None) -> None:
361
- """
362
-
363
- :param float value_ref_tomwer: center of rotation value on tomwer
364
- reference
365
- :param float value_ref_nabu: center of rotation value on the nabu
366
- reference
367
- :raises: ValueError if the frm parameter is not recognized
368
- """
369
- if (
370
- absolute_value is None
371
- and self._axis_params.frame_width is not None
372
- and relative_value is not None
373
- ):
374
- try:
375
- absolute_value = relative_value + self._axis_params.frame_width / 2.0
376
- except TypeError:
377
- absolute_value = None
378
- if (
379
- relative_value is None
380
- and self._axis_params.frame_width is not None
381
- and absolute_value is not None
382
- ):
383
- try:
384
- relative_value = absolute_value - self._axis_params.frame_width / 2.0
385
- except TypeError:
386
- relative_value = None
387
- self._controlWidget.setPosition(
388
- value_ref_tomwer=relative_value, value_ref_nabu=absolute_value
389
- )
390
- if relative_value is not None:
391
- self._radioAxis.setXShift(relative_value)
392
- else:
393
- self._radioAxis.resetShift()
394
-
395
- def getAxis(self):
396
- return self._axis_params
397
-
398
- def _axisTypeChanged(self, selection):
399
- self._axis_params.use_sinogram = False
400
- self.setActiveWidget(self._radioAxis)
401
-
402
- def setScan(self, scan: TomwerScanBase, set_position):
403
- """
404
- set the gui for this scan
405
-
406
- :param TomoBase scan:
407
- """
408
- self._radioAxis.setScan(scan=scan)
409
- if set_position is True and scan.axis_params is not None:
410
- self.setPosition(
411
- scan.axis_params.relative_cor_value, scan.axis_params.relative_cor_value
412
- )
413
- elif set_position is False:
414
- if scan.dim_1 is not None:
415
- # if absolute position is know and relative position not (in the case the user already define absolute position only):
416
- has_absolute_val_already = not self._controlWidget._positionInfo._absolutePositionQLE.text().startswith(
417
- (".", "?")
418
- )
419
- has_relative_val_already = not self._controlWidget._positionInfo._relativePositionQLE.text().startswith(
420
- (".", "?")
421
- )
422
- if (
423
- self.getMode() is AxisMode.manual
424
- and has_absolute_val_already
425
- and not has_relative_val_already
426
- ):
427
- self._controlWidget._updateRelativePosition(width=scan.dim_1)
428
- else:
429
- self._controlWidget._updateAbsolutePosition(width=scan.dim_1)
430
-
431
- def _computationRequested(self) -> None:
432
- self.sigComputationRequested.emit()
433
-
434
- def hideLockButton(self) -> None:
435
- self._controlWidget.hideLockButton()
436
-
437
- def hideApplyButton(self) -> None:
438
- self._controlWidget.hideApplyButton()
439
-
440
- def _setModeLockFrmSettings(self, lock):
441
- old = self.blockSignals(True)
442
- self._radioAxis._setModeLockFrmSettings(lock)
443
- self.blockSignals(old)
444
-
445
- def _setValueLockFrmSettings(self, lock):
446
- old = self.blockSignals(True)
447
- self.setValueLock(lock)
448
- self.blockSignals(old)
449
-
450
- def setModeLock(self, lock):
451
- assert type(lock) is bool
452
- self._radioAxis.setLocked(lock)
453
-
454
- def isModeLock(self):
455
- return self._radioAxis.isModeLock()
456
-
457
- def isValueLock(self):
458
- return self._controlWidget.isValueLock()
459
-
460
- def setValueLock(self, lock):
461
- self._controlWidget.setValueLock(lock)
462
-
463
- def setReconsParams(self, recons_params):
464
- self._axis_params = recons_params
465
- self._radioAxis.setReconsParams(axis=recons_params)
466
- if recons_params.mode is AxisMode.manual:
467
- self._controlWidget.setPosition(
468
- self._axis_params.relative_cor_value,
469
- self._axis_params.absolute_cor_value,
470
- )
471
-
472
-
473
- class _ControlWidget(qt.QWidget):
474
- """
475
- Widget to lock cor position or compute it or validate it and to
476
- display the cor value
477
- """
478
-
479
- sigComputationRequest = qt.Signal()
480
- """Signal emitted when user request a computation from the settings"""
481
-
482
- sigValidateRequest = qt.Signal()
483
- """Signal emitted when user validate the current settings"""
484
-
485
- sigLockCORValueChanged = qt.Signal(bool)
486
- """Signal emitted when the user lock the cor value. Param: True if lock"""
487
-
488
- def __init__(self, parent):
489
- qt.QWidget.__init__(self, parent)
490
- self.setLayout(qt.QVBoxLayout())
491
-
492
- # display 'center' information
493
- self._positionInfo = _PositionInfoWidget(parent=self)
494
- self.layout().addWidget(self._positionInfo)
495
-
496
- self._buttons = qt.QWidget(parent=self)
497
- self._buttons.setLayout(qt.QHBoxLayout())
498
- self.layout().addWidget(self._buttons)
499
-
500
- self._lockBut = PadlockButton(parent=self)
501
- self._lockBut.setAutoDefault(False)
502
- self._lockBut.setDefault(False)
503
-
504
- self._buttons.layout().addWidget(self._lockBut)
505
- self._lockLabel = qt.QLabel("lock cor value", parent=self)
506
- self._buttons.layout().addWidget(self._lockLabel)
507
-
508
- spacer = qt.QWidget(self)
509
- spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum)
510
- self._buttons.layout().addWidget(spacer)
511
-
512
- self._computeBut = qt.QPushButton("compute", parent=self)
513
- self._buttons.layout().addWidget(self._computeBut)
514
- style = qt.QApplication.style()
515
- applyIcon = style.standardIcon(qt.QStyle.SP_DialogApplyButton)
516
- self._applyBut = qt.QPushButton(applyIcon, "validate", parent=self)
517
- self._buttons.layout().addWidget(self._applyBut)
518
- self.layout().addWidget(self._buttons)
519
-
520
- # set up
521
- self._positionInfo.setPosition(None, None)
522
-
523
- # make connection
524
- self._computeBut.pressed.connect(self._needComputation)
525
- self._applyBut.pressed.connect(self._validate)
526
- self._lockBut.sigLockChanged.connect(self._lockValueChanged)
527
-
528
- def hideLockButton(self) -> None:
529
- self._lockLabel.hide()
530
- self._lockBut.hide()
531
-
532
- def hideApplyButton(self) -> None:
533
- self._applyBut.hide()
534
-
535
- def _lockValueChanged(self):
536
- self.sigLockCORValueChanged.emit(self._lockBut.isLocked())
537
- self._computeBut.setEnabled(not self._lockBut.isLocked())
538
-
539
- def _needComputation(self, *arg, **kwargs):
540
- """callback when the radio line changed"""
541
- self.sigComputationRequest.emit()
542
-
543
- def _validate(self):
544
- self.sigValidateRequest.emit()
545
-
546
- def setPosition(self, value_ref_tomwer, value_ref_nabu):
547
- self._positionInfo.setPosition(
548
- relative_cor=value_ref_tomwer, abs_cor=value_ref_nabu
549
- )
550
-
551
- def _updateAbsolutePosition(self, width):
552
- self._positionInfo._updateAbsolutePosition(width=width)
553
-
554
- def _updateRelativePosition(self, width):
555
- self._positionInfo._updateRelativePosition(width=width)
556
-
557
- def isValueLock(self):
558
- return self._lockBut.isLocked()
559
-
560
- def setValueLock(self, lock):
561
- self._lockBut.setLock(lock)
562
-
563
-
564
- class _PositionInfoValidator(qt.QDoubleValidator):
565
- def validate(self, a0: str, a1: int):
566
- if "..." in a0 or a0 == "?":
567
- return (qt.QDoubleValidator.Acceptable, a0, a1)
568
- else:
569
- return super().validate(a0, a1)
570
-
571
-
572
- class _PositionInfoWidget(qt.QWidget):
573
- """Widget used to display information relative to the current position"""
574
-
575
- sigRelativeValueSet = qt.Signal(float)
576
- """Emit when the user define manually the relative value"""
577
- sigAbsolueValueSet = qt.Signal(float)
578
- """Emit when the user define manually the absolute value"""
579
-
580
- def __init__(self, parent, axis=None):
581
- self._axis = None
582
- self._defaultBackgroundColor = None
583
- qt.QWidget.__init__(self, parent)
584
- self.setLayout(qt.QGridLayout())
585
- centerLabel = qt.QLabel("center", parent=self)
586
- centerLabel.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum)
587
- font = centerLabel.font()
588
- font.setBold(True)
589
- centerLabel.setFont(font)
590
-
591
- self.layout().addWidget(centerLabel, 0, 0, 1, 1)
592
- self.layout().addWidget(qt.QLabel(" (relative):"), 0, 1, 1, 1)
593
-
594
- self._relativePositionQLE = qt.QLineEdit("", parent=self)
595
- self._positionValidator = _PositionInfoValidator(self)
596
- self._relativePositionQLE.setValidator(self._positionValidator)
597
- self._relativePositionQLE.setSizePolicy(
598
- qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
599
- )
600
- self._relativePositionQLE.setStyleSheet("color: red")
601
- self.layout().addWidget(self._relativePositionQLE, 0, 2, 1, 1)
602
-
603
- centerLabel = qt.QLabel("center", parent=self)
604
- centerLabel.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum)
605
- font = centerLabel.font()
606
- font.setBold(False)
607
- centerLabel.setFont(font)
608
-
609
- self.layout().addWidget(centerLabel, 1, 0, 1, 1)
610
- self.layout().addWidget(qt.QLabel(" (absolute):"), 1, 1, 1, 1)
611
- self._absolutePositionQLE = qt.QLineEdit("", parent=self)
612
- self._absolutePositionQLE.setValidator(self._positionValidator)
613
- self._absolutePositionQLE.setSizePolicy(
614
- qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
615
- )
616
- self._absolutePositionQLE.setStyleSheet("color: #ff8c00")
617
- self.layout().addWidget(self._absolutePositionQLE, 1, 2, 1, 1)
618
-
619
- if axis:
620
- self.setAxis(axis)
621
-
622
- # connect signal / slot
623
- self._relativePositionQLE.textEdited.connect(
624
- self._userStartEditingRelativePosition
625
- )
626
- self._relativePositionQLE.editingFinished.connect(
627
- self._userUpdatedRelativePosition
628
- )
629
- self._absolutePositionQLE.textEdited.connect(
630
- self._userStartEditingAbsolutePosition
631
- )
632
-
633
- self._absolutePositionQLE.editingFinished.connect(
634
- self._userUpdatedAbsolutePosition
635
- )
636
-
637
- def _getDefaultBackgroundColor(self):
638
- if self._defaultBackgroundColor is None:
639
- self._defaultBackgroundColor = self.palette().color(
640
- self._absolutePositionQLE.backgroundRole()
641
- )
642
- return self._defaultBackgroundColor
643
-
644
- def _userStartEditingRelativePosition(self, *args, **kwargs):
645
- palette = self.palette()
646
- palette.setColor(
647
- self._relativePositionQLE.backgroundRole(), EDITING_BACKGROUND_COLOR
648
- )
649
- self._relativePositionQLE.setPalette(palette)
650
-
651
- def _userStartEditingAbsolutePosition(self, *args, **kwargs):
652
- palette = self.palette()
653
- palette.setColor(
654
- self._absolutePositionQLE.backgroundRole(), EDITING_BACKGROUND_COLOR
655
- )
656
- self._absolutePositionQLE.setPalette(palette)
657
-
658
- def _userUpdatedRelativePosition(self, *args, **kwargs):
659
- palette = self.palette()
660
- palette.setColor(
661
- self._relativePositionQLE.backgroundRole(),
662
- self._getDefaultBackgroundColor(),
663
- )
664
- self._relativePositionQLE.setPalette(palette)
665
- if self._relativePositionQLE.text().startswith((".", "?")):
666
- return
667
- else:
668
- value = float(self._relativePositionQLE.text())
669
- # make sure we only emit the signal if the value changed (and when the Qline has been edited).
670
- if self._axis.relative_cor_value is None or (
671
- self._axis is not None
672
- and not numpy.isclose(value, self._axis.relative_cor_value, atol=1e-3)
673
- ):
674
- self.sigRelativeValueSet.emit(value)
675
-
676
- def _userUpdatedAbsolutePosition(self, *args, **kwargs):
677
- palette = self.palette()
678
- palette.setColor(
679
- self._absolutePositionQLE.backgroundRole(),
680
- self._getDefaultBackgroundColor(),
681
- )
682
- self._absolutePositionQLE.setPalette(palette)
683
- if self._absolutePositionQLE.text().startswith((".", "?")):
684
- return
685
- else:
686
- value = float(self._absolutePositionQLE.text())
687
- # make sure we only emit the signal if the value changed (and when the Qline has been edited).
688
- if self._axis.absolute_cor_value is None or (
689
- self._axis is not None
690
- and not numpy.isclose(value, self._axis.absolute_cor_value, atol=1e-3)
691
- ):
692
- self.sigAbsolueValueSet.emit(value)
693
-
694
- def setAxis(self, axis):
695
- assert isinstance(axis, QAxisRP)
696
- if axis == self._axis:
697
- return
698
- self._axis = axis
699
-
700
- def getPosition(self):
701
- return float(self._relativePositionQLE.text())
702
-
703
- def setPosition(self, relative_cor: Optional[float], abs_cor: Optional[float]):
704
- if relative_cor is None:
705
- self._relativePositionQLE.setText("?")
706
- elif isinstance(relative_cor, str):
707
- self._relativePositionQLE.setText(relative_cor)
708
- else:
709
- self._relativePositionQLE.setText(f"{relative_cor:.3f}")
710
- if abs_cor is None:
711
- self._absolutePositionQLE.setText("?")
712
- else:
713
- self._absolutePositionQLE.setText(f"{abs_cor:.3f}")
714
-
715
- def _updateAbsolutePosition(self, width):
716
- if width is not None:
717
- try:
718
- rel_value = float(self._relativePositionQLE.text())
719
- except Exception:
720
- return
721
- else:
722
- abs_value = float(rel_value) + width / 2.0
723
- self._absolutePositionQLE.setText(str(abs_value))
724
-
725
- def _updateRelativePosition(self, width):
726
- if width is not None:
727
- try:
728
- abs_value = float(self._absolutePositionQLE.text())
729
- except Exception:
730
- return
731
- else:
732
- rel_value = float(abs_value) - width / 2.0
733
- self._relativePositionQLE.setText(str(rel_value))