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,347 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+
5
+ from silx.gui import qt
6
+
7
+ from tomwer.core.process.reconstruction.axis import mode as axis_mode
8
+ from tomwer.core.process.reconstruction.axis.anglemode import CorAngleMode
9
+ from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel
10
+ from tomwer.core.scan.scanbase import TomwerScanBase
11
+ from tomwer.gui.utils.qt_utils import block_signals
12
+ from tomwer.synctools.axis import QAxisRP
13
+ from .ManualFramesSelection import ManualFramesSelection
14
+
15
+ _logger = logging.getLogger(__name__)
16
+
17
+
18
+ class InputWidget(qt.QWidget):
19
+ """
20
+ Widget used to define the radios or the sinogram to be used for computing the cor
21
+ Used as a tab of the AxisSettingsTabWidget
22
+ """
23
+
24
+ sigChanged = qt.Signal()
25
+ """Signal emitted when input changed"""
26
+
27
+ _sigUrlChanged = qt.Signal()
28
+ """Signal emit when url to be used changed"""
29
+
30
+ def __init__(self, parent=None, axis_params=None):
31
+ assert isinstance(axis_params, QAxisRP)
32
+ self._blockUpdateAxisParams = False
33
+ super().__init__(parent)
34
+ self.setLayout(qt.QVBoxLayout())
35
+
36
+ # radio input
37
+ self._radioGB = qt.QGroupBox(self)
38
+ self._radioGB.setTitle("radios")
39
+ self._radioGB.setLayout(qt.QVBoxLayout())
40
+ self._radioGB.setCheckable(True)
41
+ self.layout().addWidget(self._radioGB)
42
+ ## angle mode
43
+ self._angleModeWidget = _AngleSelectionWidget(
44
+ parent=self, axis_params=axis_params
45
+ )
46
+ self._radioGB.layout().addWidget(self._angleModeWidget)
47
+ self._axis_params = axis_params
48
+
49
+ # sinogram input
50
+ self._sinogramGB = qt.QGroupBox(self)
51
+ self._sinogramGB.setLayout(qt.QFormLayout())
52
+
53
+ self._sinogramGB.setTitle("sinogram")
54
+ self._sinogramGB.setCheckable(True)
55
+ self.layout().addWidget(self._sinogramGB)
56
+ ## sinogram line
57
+ self._sinogramLineSB = _SliceSelector(self)
58
+ self._sinogramGB.layout().addRow("line", self._sinogramLineSB)
59
+ ## sinogram subsampling
60
+ self._sinogramSubsampling = qt.QSpinBox(self)
61
+ self._sinogramSubsampling.setRange(1, 1000)
62
+ self._sinogramSubsampling.setValue(10)
63
+ self._sinogramGB.layout().addRow("subsampling", self._sinogramSubsampling)
64
+
65
+ self._spacer = qt.QWidget(self)
66
+ self._spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
67
+ self.layout().addWidget(self._spacer)
68
+
69
+ # set up
70
+ self._sinogramGB.setChecked(False)
71
+
72
+ # connect signal / slot
73
+ self._sinogramGB.toggled.connect(self._sinogramChecked)
74
+ self._radioGB.toggled.connect(self._radiosChecked)
75
+ self._sinogramSubsampling.valueChanged.connect(self._changed)
76
+ self._sinogramLineSB.sigChanged.connect(self._changed)
77
+ self._angleModeWidget.sigChanged.connect(self._sigUrlChanged)
78
+
79
+ def setScan(self, scan: TomwerScanBase):
80
+ if scan is not None:
81
+ self._angleModeWidget.setScan(scan)
82
+ self._angleModeWidget.setScanRange(scan.scan_range)
83
+
84
+ def setAxisParams(self, axis_params):
85
+ with block_signals(axis_params):
86
+ with block_signals(self._axis_params):
87
+ self._blockUpdateAxisParams = True
88
+
89
+ if axis_params is not None:
90
+ assert isinstance(axis_params, QAxisRP)
91
+ with block_signals(self._sinogramGB):
92
+ self._sinogramChecked(
93
+ axis_params.mode.requires_sinogram_index(), on_load=True
94
+ )
95
+ self._sinogramLineSB.setSlice(axis_params.sinogram_line)
96
+ self._sinogramSubsampling.setValue(axis_params.sinogram_subsampling)
97
+ self._angleModeWidget.setAxisParams(axis_params)
98
+ self._axis_params = axis_params
99
+
100
+ self._blockUpdateAxisParams = False
101
+
102
+ def getSinogramLine(self) -> str | int:
103
+ return self._sinogramLineSB.getSlice()
104
+
105
+ def getSinogramSubsampling(self) -> int:
106
+ return self._sinogramSubsampling.value()
107
+
108
+ def _sinogramChecked(self, checked, on_load=False):
109
+ with block_signals(self._radioGB):
110
+ with block_signals(self._sinogramGB):
111
+ if checked:
112
+ self._radioGB.setChecked(False)
113
+ self._sinogramGB.setChecked(True)
114
+ elif self._radioGB.isEnabled():
115
+ self._radioGB.setChecked(not checked)
116
+ elif on_load:
117
+ self._sinogramGB.setChecked(checked)
118
+ else:
119
+ # ignore it if radio disabled
120
+ self._sinogramGB.setChecked(True)
121
+ self._changed()
122
+
123
+ def _radiosChecked(self, checked, on_load=False):
124
+ with block_signals(self._radioGB):
125
+ with block_signals(self._sinogramGB):
126
+ if checked:
127
+ self._sinogramGB.setChecked(False)
128
+ self._radioGB.setChecked(True)
129
+ elif self._sinogramGB.isEnabled():
130
+ self._sinogramGB.setChecked(not checked)
131
+ elif on_load:
132
+ self._radioGB.setChecked(checked)
133
+ else:
134
+ # ignore it if sinogram disabled
135
+ self._radioGB.setChecked(True)
136
+ self._changed()
137
+
138
+ def _changed(self, *args, **kwargs):
139
+ self._updateAxisParams()
140
+ self.sigChanged.emit()
141
+
142
+ def _updateAxisParams(self):
143
+ if not self._blockUpdateAxisParams:
144
+ self._axis_params.sinogram_line = self.getSinogramLine()
145
+ self._axis_params.sinogram_subsampling = self.getSinogramSubsampling()
146
+
147
+ def setValidInputs(self, modes: list | tuple):
148
+ """
149
+ Define possible inputs.
150
+
151
+ :raises: ValueError if modes are invalid
152
+ """
153
+ modes = set(modes)
154
+ for mode in modes:
155
+ try:
156
+ axis_mode._InputType.from_value(mode)
157
+ except Exception:
158
+ raise ValueError(
159
+ f"mode {mode} should be an instance of {axis_mode._InputType}"
160
+ )
161
+ if len(modes) == 2:
162
+ self._sinogramGB.setEnabled(True)
163
+ self._radioGB.setEnabled(True)
164
+ elif len(modes) > 2:
165
+ raise ValueError(f"invalid input {modes}")
166
+ elif len(modes) < 0:
167
+ raise ValueError("modes is empty")
168
+ else:
169
+ mode = axis_mode._InputType.from_value(modes.pop())
170
+ if mode is axis_mode._InputType.SINOGRAM:
171
+ self._sinogramGB.setEnabled(True)
172
+ self._radioGB.setEnabled(False)
173
+ self._sinogramGB.setChecked(True)
174
+ elif mode is axis_mode._InputType.RADIOS_X2:
175
+ self._radioGB.setEnabled(True)
176
+ self._sinogramGB.setEnabled(False)
177
+ self._radioGB.setChecked(True)
178
+ elif mode is axis_mode._InputType.COMPOSITE:
179
+ # those mode are neither sinogram neither radio. Now one of the two will be checked but without any much meaning
180
+ self._radioGB.setEnabled(False)
181
+ self._sinogramGB.setEnabled(False)
182
+ else:
183
+ raise ValueError(f"Nothing implemented for {mode.value}")
184
+
185
+
186
+ class _AngleSelectionWidget(qt.QWidget):
187
+ """Group box to select the angle to used for cor calculation
188
+ (0-180, 90-270 or manual)"""
189
+
190
+ sigChanged = qt.Signal()
191
+ """signal emitted when the selected angle changed"""
192
+
193
+ def __init__(self, parent=None, axis_params=None):
194
+ assert isinstance(axis_params, QAxisRP)
195
+ qt.QWidget.__init__(
196
+ self,
197
+ parent=parent,
198
+ )
199
+ self.setLayout(qt.QVBoxLayout())
200
+ self._groupBoxMode = qt.QGroupBox(
201
+ self, title="Angles to use for axis calculation"
202
+ )
203
+ self._groupBoxMode.setLayout(qt.QHBoxLayout())
204
+ self.layout().addWidget(self._groupBoxMode)
205
+
206
+ self._corButtonsGps = qt.QButtonGroup(parent=self)
207
+ self._corButtonsGps.setExclusive(True)
208
+ self._qrbCOR_0_180 = qt.QRadioButton("0-180", parent=self)
209
+ self._groupBoxMode.layout().addWidget(self._qrbCOR_0_180)
210
+ self._qrbCOR_90_270 = qt.QRadioButton("90-270", parent=self)
211
+ self._qrbCOR_90_270.setToolTip(
212
+ "pick radio closest to angles 90° and "
213
+ "270°. If disable mean that the scan "
214
+ "range is 180°"
215
+ )
216
+ self._groupBoxMode.layout().addWidget(self._qrbCOR_90_270)
217
+ self._qrbCOR_manual = qt.QRadioButton("other", parent=self)
218
+ self._qrbCOR_manual.setVisible(True)
219
+ self._groupBoxMode.layout().addWidget(self._qrbCOR_manual)
220
+ # add all button to the button group
221
+ for b in (self._qrbCOR_0_180, self._qrbCOR_90_270, self._qrbCOR_manual):
222
+ self._corButtonsGps.addButton(b)
223
+
224
+ self.setAxisParams(axis_params)
225
+
226
+ self._manualFrameSelection = ManualFramesSelection(self)
227
+ self.layout().addWidget(self._manualFrameSelection)
228
+ self._manualFrameSelection.setVisible(False)
229
+
230
+ # connect signal / Slot
231
+ self._corButtonsGps.buttonClicked.connect(self._angleModeChanged)
232
+ self._manualFrameSelection.sigChanged.connect(self._changed)
233
+
234
+ def setScan(self, scan: TomwerScanBase):
235
+ if scan is not None:
236
+ self.setScanRange(scan.scan_range)
237
+ self._manualFrameSelection.setScan(scan=scan)
238
+
239
+ def setScanRange(self, scanRange):
240
+ if scanRange == 180:
241
+ self._qrbCOR_90_270.setEnabled(False)
242
+ # force using 0-180 if was using 90-270
243
+ if self._qrbCOR_90_270.isChecked():
244
+ self._qrbCOR_0_180.setChecked(True)
245
+ self._axis_params.angle_mode = CorAngleMode.use_0_180
246
+ else:
247
+ self._qrbCOR_90_270.setEnabled(True)
248
+
249
+ def setAngleMode(self, mode):
250
+ """
251
+
252
+ :param mode: mode to use (can be manual , 90-270 or 0-180)
253
+ """
254
+ assert isinstance(mode, CorAngleMode)
255
+ if mode == CorAngleMode.use_0_180:
256
+ self._qrbCOR_0_180.setChecked(True)
257
+ elif mode == CorAngleMode.use_90_270:
258
+ self._qrbCOR_90_270.setChecked(True)
259
+ else:
260
+ self._qrbCOR_manual.setChecked(True)
261
+
262
+ def getAngleMode(self) -> CorAngleMode:
263
+ """
264
+
265
+ :return: the angle to use for the axis calculation
266
+ """
267
+ if self._qrbCOR_90_270.isChecked():
268
+ return CorAngleMode.use_90_270
269
+ elif self._qrbCOR_0_180.isChecked():
270
+ return CorAngleMode.use_0_180
271
+ else:
272
+ return CorAngleMode.manual_selection
273
+
274
+ def setAxisParams(self, axis_params):
275
+ with block_signals(self):
276
+ self._axis_params = axis_params
277
+ # set up
278
+ self.setAngleMode(axis_params.angle_mode)
279
+
280
+ def _angleModeChanged(self, *args, **kwargs):
281
+ self._axis_params.angle_mode = self.getAngleMode()
282
+ if self.getAngleMode() is CorAngleMode.manual_selection:
283
+ self._axis_params.angle_mode_extra = (
284
+ self._manualFrameSelection.getFramesUrl()
285
+ )
286
+ else:
287
+ self._axis_params.angle_mode_extra = None
288
+ self._manualFrameSelection.setVisible(
289
+ self.getAngleMode() is CorAngleMode.manual_selection
290
+ )
291
+ self._changed()
292
+
293
+ def _changed(self):
294
+ self.sigChanged.emit()
295
+
296
+
297
+ class _SliceSelector(qt.QWidget):
298
+ sigChanged = qt.Signal()
299
+ """signal emit when the selected slice change"""
300
+
301
+ def __init__(self, parent):
302
+ qt.QWidget.__init__(self, parent)
303
+ self.setLayout(qt.QHBoxLayout())
304
+ self.setContentsMargins(0, 0, 0, 0)
305
+ self.layout().setContentsMargins(0, 0, 0, 0)
306
+ self._modeCB = QComboBoxIgnoreWheel(self)
307
+ self._modeCB.addItem("middle")
308
+ self._modeCB.addItem("other")
309
+ self.layout().addWidget(self._modeCB)
310
+ self._otherSB = qt.QSpinBox(self)
311
+ self._otherSB.setRange(0, 10000)
312
+ self.layout().addWidget(self._otherSB)
313
+
314
+ # connect signal / slot
315
+ self._otherSB.valueChanged.connect(self._valueChanged)
316
+ self._modeCB.currentIndexChanged.connect(self._modeChanged)
317
+ # set up
318
+ self._modeChanged()
319
+
320
+ def getSlice(self) -> int | str:
321
+ "return a specific slice index or 'middle'"
322
+ if self.getMode() == "middle":
323
+ return "middle"
324
+ else:
325
+ return self._otherSB.value()
326
+
327
+ def setSlice(self, slice_):
328
+ if slice_ is None:
329
+ return
330
+ if slice_ == "middle":
331
+ idx = self._modeCB.findText("middle")
332
+ self._modeCB.setCurrentIndex(idx)
333
+ else:
334
+ idx = self._modeCB.findText("other")
335
+ self._modeCB.setCurrentIndex(idx)
336
+ self._otherSB.setValue(slice_)
337
+ self.sigChanged.emit()
338
+
339
+ def getMode(self):
340
+ return self._modeCB.currentText()
341
+
342
+ def _valueChanged(self):
343
+ self.sigChanged.emit()
344
+
345
+ def _modeChanged(self, *args, **kwargs):
346
+ self._otherSB.setVisible(self.getMode() == "other")
347
+ self._valueChanged()
@@ -0,0 +1,168 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from bisect import bisect_left
5
+
6
+ from silx.gui import qt
7
+ from silx.io.url import DataUrl
8
+
9
+ from tomwer.core.scan.scanbase import TomwerScanBase
10
+
11
+ _logger = logging.getLogger(__name__)
12
+
13
+
14
+ class ManualFramesSelection(qt.QWidget):
15
+ """Allows to select frame - angle to be used."""
16
+
17
+ sigChanged = qt.Signal()
18
+ """Signal emit when the frame selection changes"""
19
+
20
+ def __init__(self, parent=None) -> None:
21
+ super().__init__(parent)
22
+ self._anglesAvailable = []
23
+ # cache of the angles available from the current defined frames. Must be sorted !!!
24
+ self.setLayout(qt.QGridLayout())
25
+ self.layout().addWidget(qt.QLabel("frame 1", self), 0, 0, 1, 1)
26
+ self._frame1CB = qt.QComboBox(self)
27
+ self._frame1CB.setEditable(True)
28
+ self.layout().addWidget(self._frame1CB, 0, 1, 1, 1)
29
+
30
+ self.layout().addWidget(qt.QLabel("frame 2", self), 1, 0, 1, 1)
31
+ self._frame2CB = qt.QComboBox(self)
32
+ self._frame2CB.setEditable(True)
33
+ self.layout().addWidget(self._frame2CB, 1, 1, 1, 1)
34
+ self._findAssociatedAnglePB = qt.QPushButton("+180°", self)
35
+ button_180_font = self.font()
36
+ button_180_font.setPixelSize(10)
37
+ self._findAssociatedAnglePB.setFont(button_180_font)
38
+ self._findAssociatedAnglePB.setFixedWidth(30)
39
+ self._findAssociatedAnglePB.setSizePolicy(
40
+ qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum
41
+ )
42
+ self.layout().addWidget(self._findAssociatedAnglePB, 1, 2, 1, 1)
43
+ self._flipLRCB = qt.QCheckBox("flip L-R")
44
+ self._flipLRCB.setChecked(True)
45
+ self.layout().addWidget(self._flipLRCB, 1, 3, 1, 1)
46
+
47
+ self._flipLRCB.toggled.connect(self._changed)
48
+ self._frame1CB.currentIndexChanged.connect(self._changed)
49
+ self._frame2CB.currentIndexChanged.connect(self._changed)
50
+ self._findAssociatedAnglePB.released.connect(self._findAssociatedAngle)
51
+
52
+ def _findAssociatedAngle(self):
53
+ if self._frame1CB.count() == 0 or len(self._anglesAvailable) == 0:
54
+ _logger.warning("no angles available, unable to get '+180°' frame")
55
+ else:
56
+ angle = float(self._frame1CB.currentText())
57
+ # look for the closest 'associated' angle.
58
+ # as the angles are not limited to [0-360] we need to check for any value.
59
+ # if the angle is on the first part of the acquisition we expect to find it near angle +180
60
+ # if it is on the second part (for 360 degree) we expect to find it on the first part (0-180)
61
+ closest_pls_180_angle = self._getClosestAssociatedAngle(
62
+ angle + 180.0, self._anglesAvailable
63
+ )
64
+ score_add = abs(closest_pls_180_angle - angle)
65
+ closest_minus_180_angle = self._getClosestAssociatedAngle(
66
+ angle - 180.0, self._anglesAvailable
67
+ )
68
+ score_sub = abs(closest_minus_180_angle - angle)
69
+ if score_add >= score_sub:
70
+ closest_180_angle = closest_pls_180_angle
71
+ else:
72
+ closest_180_angle = closest_minus_180_angle
73
+ item_idx = self._frame2CB.findText(self._angleToStr(closest_180_angle))
74
+ if item_idx < 0:
75
+ _logger.error(f"Unable to find item for angle {closest_180_angle}")
76
+ else:
77
+ self._frame2CB.setCurrentIndex(item_idx)
78
+
79
+ @staticmethod
80
+ def _getClosestAssociatedAngle(angle: float, angles: tuple) -> float:
81
+ """
82
+ return the angle closest angle to 'angle' from 'angles'
83
+
84
+ :warning: angles should be already sorted !!!
85
+ """
86
+ if angles is None or len(angles) == 0:
87
+ return None
88
+ if angle in angles:
89
+ return angle
90
+ pos = bisect_left(angles, angle)
91
+ if pos == 0:
92
+ return angles[0]
93
+ elif pos > len(angles) - 1:
94
+ return angles[-1]
95
+ else:
96
+ left_angle = angles[pos - 1]
97
+ right_angle = angles[pos]
98
+ if abs(right_angle - angle) > abs(left_angle - angle):
99
+ return left_angle
100
+ else:
101
+ return right_angle
102
+
103
+ def _changed(self):
104
+ self.sigChanged.emit()
105
+
106
+ @staticmethod
107
+ def _angleToStr(angle: float) -> str:
108
+ return f"{float(angle):0.3f}"
109
+
110
+ def setScan(self, scan: TomwerScanBase | None) -> None:
111
+ self._anglesAvailable.clear()
112
+ self._frame1CB.clear()
113
+ self._frame2CB.clear()
114
+ if scan is None:
115
+ return
116
+ current_angle1 = self._getFrame1Angle()
117
+ current_angle2 = self._getFrame2Angle()
118
+ for proj_angle, proj_url in scan.get_proj_angle_url().items():
119
+ try:
120
+ angle = self._angleToStr(proj_angle)
121
+ except Exception:
122
+ angle = proj_angle
123
+ else:
124
+ self._anglesAvailable.append(float(proj_angle))
125
+ self._frame1CB.addItem(angle, proj_url)
126
+ self._frame2CB.addItem(angle, proj_url)
127
+
128
+ self._anglesAvailable.sort()
129
+
130
+ idx = self._frame1CB.findText(current_angle1)
131
+ if idx >= 0:
132
+ self._frame1CB.setCurrentIndex(idx)
133
+ if current_angle1 == current_angle2:
134
+ # if the two current angle are close then we consider it is better to look for angleX - angleX + 180 angles
135
+ # instead of finding back angles
136
+ self._findAssociatedAngle()
137
+ else:
138
+ idx = self._frame1CB.findText(current_angle1)
139
+ if idx >= 0:
140
+ self._frame1CB.setCurrentIndex(idx)
141
+
142
+ idx = self._frame2CB.findText(current_angle2)
143
+ if idx >= 0:
144
+ self._frame2CB.setCurrentIndex(idx)
145
+
146
+ def getFramesUrl(self, as_txt=False) -> tuple:
147
+ """
148
+ Return a tuple of (frame 1 url, frame 2 url). Url can be None
149
+ """
150
+ if as_txt:
151
+ return self.getFrame1Url().path(), self.getFrame2Url().path()
152
+ else:
153
+ return self.getFrame1Url(), self.getFrame2Url()
154
+
155
+ def getFrame1Url(self) -> DataUrl | None:
156
+ return self._frame1CB.currentData()
157
+
158
+ def getFrame2Url(self) -> DataUrl | None:
159
+ return self._frame2CB.currentData()
160
+
161
+ def _getFrame1Angle(self) -> str | None:
162
+ return self._frame1CB.currentText()
163
+
164
+ def _getFrame2Angle(self) -> str | None:
165
+ return self._frame2CB.currentText()
166
+
167
+ def isFrame2LRFLip(self):
168
+ return self._flipLRCB.isChecked()
@@ -1,2 +1,2 @@
1
- from .axis import AxisWindow # noqa F401
2
- from .radioaxis import RadioAxisWindow # noqa F401
1
+ from .AxisMainWindow import AxisMainWindow # noqa F401
2
+ from .AxisWidget import AxisWidget # noqa F401
@@ -1,27 +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
- __authors__ = ["H. Payno"]
26
- __license__ = "MIT"
27
- __date__ = "09/02/2018"
@@ -1,36 +1,7 @@
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__ = ["C. Nemoz", "H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "13/08/2021"
29
-
1
+ from __future__ import annotations
30
2
 
31
3
  import logging
32
4
  import shutil
33
- from typing import Union
34
5
 
35
6
  from silx.gui import qt
36
7
  from silx.gui.dialog.DataFileDialog import DataFileDialog
@@ -169,7 +140,7 @@ class RefCopyWidget(qt.QGroupBox):
169
140
  """
170
141
 
171
142
  :param parent: Qt parent
172
- :param str save_dir: where the dark and flats 'references' are stored
143
+ :param save_dir: where the dark and flats 'references' are stored
173
144
  """
174
145
  qt.QGroupBox.__init__(self, "activate", parent)
175
146
  self.__save_dir = save_dir
@@ -180,7 +151,7 @@ class RefCopyWidget(qt.QGroupBox):
180
151
  """
181
152
  The copy action happen after the reduced (computed) darks and flats. It can be activate or not. \n\n
182
153
  Reduced darks and / or flats can be registered and then copy to scan without darks or flat. \n
183
- You can set manually Darks and flat (button displayed when the mode auto is unchcked.) \n
154
+ You can set manually Darks and flat (button displayed when the mode auto is unchecked.) \n
184
155
  Otherwise if the mode 'auto' is activated then each time he meets scan with dark and / or flat it will register those as the one to be copied. \n
185
156
 
186
157
  Then each time the copy action meets scan without reduced dark and / or flat it will copy them. \n
@@ -306,8 +277,8 @@ class RefCopyWidget(qt.QGroupBox):
306
277
  """
307
278
  return self.isChecked()
308
279
 
309
- def save_darks_to_be_copied(self, darks: Union[DataUrl, dict]):
280
+ def save_darks_to_be_copied(self, darks: DataUrl | dict):
310
281
  DarkRefsCopy.save_darks_to_be_copied(data=darks, save_dir=self.__save_dir)
311
282
 
312
- def save_flats_to_be_copied(self, flats: Union[DataUrl, dict]):
283
+ def save_flats_to_be_copied(self, flats: DataUrl | dict):
313
284
  DarkRefsCopy.save_flats_to_be_copied(data=flats, save_dir=self.__save_dir)
@@ -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__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "10/01/2018"
2
+ from __future__ import annotations
29
3
 
30
4
 
31
5
  import logging