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
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ from silx.gui import qt
4
+ from nabu.stitching.config import dict_to_config_obj
5
+ from nabu.stitching.stitcher.z_stitcher import (
6
+ PreProcessingZStitcher,
7
+ PostProcessingZStitcher,
8
+ )
9
+ from nabu.stitching.stitcher.y_stitcher import PreProcessingYStitcher
10
+
11
+
12
+ class PreviewThread(qt.QThread):
13
+ """
14
+ Thread to compute an overview of the stitching
15
+ """
16
+
17
+ def __init__(self, stitching_config: dict, *args, **kwargs) -> None:
18
+ super().__init__(*args, **kwargs)
19
+ self._stitching_config = dict_to_config_obj(stitching_config)
20
+ self._output_identifier = None
21
+ self._frame_composition = None
22
+ self._final_tomo_objs_positions = None
23
+ # store position of all the tomo objects (scan, volumes) used for the final stitching (after shift refinement)
24
+
25
+ @property
26
+ def stitching_config(self):
27
+ return self._stitching_config
28
+
29
+ @property
30
+ def output_identifier(self):
31
+ return self._output_identifier
32
+
33
+ @property
34
+ def frame_composition(self):
35
+ return self._frame_composition
36
+
37
+ @property
38
+ def final_tomo_objs_positions(self) -> dict:
39
+ """
40
+ :return: dict with tomo object identifier (str) as key and a tuple of position in pixel (axis_0_pos, axis_1_pos, axis_2_pos)
41
+ """
42
+ return self._final_tomo_objs_positions
43
+
44
+ def run(self):
45
+ stitching_type = self.stitching_config.stitching_type
46
+ if stitching_type.value == "z-preproc":
47
+ stitcher = PreProcessingZStitcher(configuration=self.stitching_config)
48
+ elif stitching_type.value == "z-postproc":
49
+ stitcher = PostProcessingZStitcher(configuration=self.stitching_config)
50
+ elif stitching_type.value == "y-preproc":
51
+ stitcher = PreProcessingYStitcher(configuration=self.stitching_config)
52
+ else:
53
+ raise NotImplementedError
54
+ self._output_identifier = stitcher.stitch()
55
+ if self._output_identifier is not None:
56
+ self._output_identifier = self._output_identifier.to_str()
57
+ # store in cache the frame composition to be able to provide them to the PreviewPlot
58
+ self._frame_composition = stitcher.frame_composition
59
+ self._final_tomo_objs_positions = stitcher.get_final_axis_positions_in_px()
@@ -0,0 +1,57 @@
1
+ """Define Interface for widget handling stitching over one axis"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from silx.gui import qt
6
+
7
+
8
+ class _SingleAxisMixIn:
9
+ """Common API for widget able to handle stitching over one axis (no matter if it is 0, 1, 2 (aka z, y, x))"""
10
+
11
+ @property
12
+ def first_axis(self) -> int:
13
+ """
14
+ Axis along which stitching is done. For stitching along z will return 0...
15
+ """
16
+ return self._axis
17
+
18
+ @property
19
+ def second_axis(self) -> int:
20
+ """
21
+ second axis involved in the stitching. In case of stitching along axis 0 the axis 1can also be involved (axis present in the camera reference)
22
+ """
23
+ if self._axis == 0:
24
+ return 1
25
+ elif self._axis == 1:
26
+ return 0
27
+ else:
28
+ raise NotImplementedError
29
+
30
+ @property
31
+ def third_axis(self):
32
+ all_axis = {(0, 1, 2)}
33
+ all_axis.remove(self.first_axis)
34
+ all_axis.remove(self.second_axis)
35
+ return all_axis.pop()
36
+
37
+ @staticmethod
38
+ def axis_alias(axis: int):
39
+ if axis == 0:
40
+ return "z"
41
+ elif axis == 1:
42
+ return "y"
43
+ elif axis == 2:
44
+ return "z"
45
+ else:
46
+ raise ValueError(f"axis should be in (0, 1, 2). {axis} given")
47
+
48
+
49
+ class SingleAxisMetaClass(type(qt.QMainWindow), type(_SingleAxisMixIn)):
50
+ """
51
+ Metaclass for single axis stitcher in order to aggregate dumper class and axis
52
+ """
53
+
54
+ def __new__(mcls, name, bases, attrs, axis: int | None = None):
55
+ mcls = super().__new__(mcls, name, bases, attrs)
56
+ mcls._axis = axis # used from _SingleAxisMixIn interface
57
+ return mcls
@@ -1,4 +1,5 @@
1
- from typing import Optional
1
+ from __future__ import annotations
2
+
2
3
  from silx.gui import qt
3
4
  from silx.gui.colors import Colormap
4
5
  from tomwer.gui import icons as tomwer_icons
@@ -89,7 +90,7 @@ class StitchAndBackgroundAlphaMixIn:
89
90
  else:
90
91
  return 1.0
91
92
 
92
- def getBackgroundImgAlpha(self) -> Optional[float]:
93
+ def getBackgroundImgAlpha(self) -> float | None:
93
94
  """return 0.0 if there is no background image"""
94
95
  if self._backGroundAction.isChecked():
95
96
  return self._alphaChannelWidget.getAlphaBackgroundImg()
@@ -1,8 +1,14 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
- from typing import Union
3
4
 
4
5
  import numpy
5
- from nabu.stitching.frame_composition import ZFrameComposition
6
+
7
+ try:
8
+ # nabu 2024
9
+ from nabu.stitching.frame_composition import ZFrameComposition as FrameComposition
10
+ except ImportError:
11
+ from nabu.stitching.frame_composition import FrameComposition
6
12
  from silx.gui import qt
7
13
  from tomwer.gui.utils.buttons import TapeMeasureToolButton
8
14
  from tomoscan.esrf.scan.utils import get_data
@@ -61,12 +67,13 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
61
67
  DEFAULT_STITCHED_IMG_ALPHA = 0.95
62
68
  DEFAULT_BACKGROUND_IMG_ALPHA = 0.20
63
69
 
64
- def __init__(self, parent=None) -> None:
70
+ def __init__(self, axis: int, parent=None) -> None:
65
71
  super().__init__(parent=parent) # pylint: disable=E1123
66
72
  self._waitingOverlay = WaitingOverlay(self)
67
73
  self._waitingOverlay.setIconSize(qt.QSize(30, 30))
68
74
  self._stitched_image = None
69
75
  self._composition_background = None
76
+ self._axis = axis
70
77
 
71
78
  # tune plot
72
79
  self.setYAxisInverted(settings.Y_AXIS_DOWNWARD)
@@ -82,7 +89,7 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
82
89
  self.setKeepDataAspectRatio(True)
83
90
  self.getColorBarWidget().hide()
84
91
 
85
- # tape mesure action
92
+ # tape measure action
86
93
  self._tapeMeasureButton = TapeMeasureToolButton(parent=self, plot=self)
87
94
  self._tapeMeasureButton.setCheckable(True)
88
95
  self.toolBar().addWidget(self._tapeMeasureButton)
@@ -107,6 +114,10 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
107
114
  # connect signal / slot
108
115
  self._backGroundAction.toggled.connect(self._update)
109
116
 
117
+ @property
118
+ def axis(self) -> int:
119
+ return self._axis
120
+
110
121
  def _popCurrentImageFullScreen(self):
111
122
  from tomwer.gui.visualization.fullscreenplot import FullScreenStitching
112
123
 
@@ -119,40 +130,39 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
119
130
  new_plot.setAlphaStitchedImg(self.getStitchedImgAlpha())
120
131
  new_plot.setWindowTitle("Stitching")
121
132
 
122
- # reuse the same colormap for conveniance (user modification on it will be applied everywhere)
133
+ # reuse the same colormap for convenience (user modification on it will be applied everywhere)
123
134
  new_plot.setDefaultColormap(self.getDefaultColormap())
124
135
  new_plot.showFullScreen()
125
136
 
126
- def setComposition(self, composition: dict, frame_width: int, update=True):
137
+ def setComposition(self, composition: dict, shape: tuple, update=True):
127
138
  self._composition_background = self.buildCompositionBackground(
128
- composition, frame_width=frame_width
139
+ composition,
140
+ shape=shape,
141
+ axis=self.axis,
129
142
  )
130
143
  if update:
131
144
  self._updatePlot()
132
145
 
133
146
  @staticmethod
134
- def buildCompositionBackground(composition, frame_width):
135
- if "raw_compositon" not in composition:
147
+ def buildCompositionBackground(composition, shape: tuple, axis: int):
148
+ assert axis in (0, 1, 2)
149
+ if "raw_composition" not in composition:
136
150
  raise KeyError(
137
- "composition is expected to have a 'raw_compositon' key with {ZFrameComposition} describing raw composition as key"
151
+ "composition is expected to have a 'raw_composition' key with {FrameComposition} describing raw composition as key"
138
152
  )
139
153
  else:
140
- raw_compositon = composition["raw_compositon"]
141
- assert isinstance(raw_compositon, ZFrameComposition)
142
- if "overlap_compositon" not in composition:
154
+ raw_composition = composition["raw_composition"]
155
+ assert isinstance(raw_composition, FrameComposition)
156
+ if "overlap_composition" not in composition:
143
157
  raise KeyError(
144
- "composition is expected to have a 'overlap_compositon' key with {ZFrameComposition} describing overlap composition as key"
158
+ "composition is expected to have a 'overlap_composition' key with {FrameComposition} describing overlap composition as key"
145
159
  )
146
160
  else:
147
- overlap_compositon = composition["overlap_compositon"]
148
- assert isinstance(overlap_compositon, ZFrameComposition)
161
+ overlap_composition = composition["overlap_composition"]
162
+ assert isinstance(overlap_composition, FrameComposition)
149
163
 
150
164
  background = numpy.zeros(
151
- shape=(
152
- (raw_compositon.global_end_y[-1] - raw_compositon.global_start_y[0]),
153
- frame_width,
154
- 4,
155
- ),
165
+ shape=shape,
156
166
  )
157
167
  assert background.ndim == 3
158
168
 
@@ -165,30 +175,26 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
165
175
  yield magenta.red(), magenta.green(), magenta.blue(), 255
166
176
  yield blue.red(), blue.green(), blue.blue(), 255
167
177
 
178
+ # composition is always done along y (in image space). So for stitching along y (in nxtomo space) we need to flip the two axis to apply the composition
179
+ print("shape is", shape)
168
180
  colors_raw_frames = []
169
- for _, color in zip(raw_compositon.local_end_y, get_next_color()):
181
+ for _, color in zip(raw_composition.local_end, get_next_color()):
170
182
  colored_frame = numpy.full(
171
- shape=(
172
- raw_compositon.global_end_y[-1] - raw_compositon.global_start_y[0],
173
- frame_width,
174
- 4,
175
- ),
183
+ shape=shape,
176
184
  fill_value=color,
177
185
  )
178
186
  colors_raw_frames.append(colored_frame)
179
187
 
180
- overlap_compositon.compose(
188
+ overlap_composition.compose(
181
189
  background,
182
190
  colors_raw_frames,
183
191
  )
184
192
  return background
185
193
 
186
- def setStitchedTomoObj(
187
- self, tomo_obj_id: Union[BaseIdentifier, str], composition: dict
188
- ):
194
+ def setStitchedTomoObj(self, tomo_obj_id: BaseIdentifier | str, composition: dict):
189
195
  """
190
- :param BaseIdentifier tomo_obj_id: identifier of the stitched object (scan of volume)
191
- :param dict composition: composition used to create the stitched object
196
+ :param tomo_obj_id: identifier of the stitched object (scan of volume)
197
+ :param composition: composition used to create the stitched object
192
198
  """
193
199
  if not isinstance(tomo_obj_id, (BaseIdentifier, str)):
194
200
  raise TypeError(
@@ -207,7 +213,7 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
207
213
  pass
208
214
 
209
215
  if scan is not None:
210
- if len(scan.projections) == 0:
216
+ if scan.projections is None or len(scan.projections) == 0:
211
217
  _logger.error(
212
218
  f"stitched scan {tomo_obj_id} doesn't contains any projections"
213
219
  )
@@ -229,7 +235,9 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
229
235
 
230
236
  assert self._stitched_image.ndim == 2
231
237
  self._composition_background = self.buildCompositionBackground(
232
- composition=composition, frame_width=self._stitched_image.shape[1]
238
+ composition=composition,
239
+ shape=(self._stitched_image.shape[0], self._stitched_image.shape[1], 4),
240
+ axis=self.axis,
233
241
  )
234
242
  self._update()
235
243
 
@@ -241,6 +249,6 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
241
249
  def stitched_image(self):
242
250
  return self._stitched_image
243
251
 
244
- def setPixelSize(self, pixel_size: Union[tuple, float]):
252
+ def setPixelSize(self, pixel_size: tuple | float):
245
253
  """set the pixel size to be used by the ruler"""
246
254
  self._tapeMeasureButton.setPixelSize(pixel_size_m=pixel_size)
@@ -1,7 +1,9 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  import weakref
3
5
  import numpy
4
- from typing import Any, Union, Optional
6
+ from typing import Any
5
7
  from contextlib import AbstractContextManager
6
8
 
7
9
  from silx.gui import qt
@@ -109,7 +111,7 @@ class RawStitchingPlot(PlotWindow):
109
111
  self._flipudFrames = flip
110
112
  self._updateImages()
111
113
 
112
- def setSliceForPreview(self, slice_for_preview: Union[str, int]):
114
+ def setSliceForPreview(self, slice_for_preview: str | int):
113
115
  if self._slice_for_preview != slice_for_preview:
114
116
  self._slice_for_preview = slice_for_preview
115
117
  self._updateImages()
@@ -127,7 +129,7 @@ class RawStitchingPlot(PlotWindow):
127
129
  return self._activated
128
130
 
129
131
  @staticmethod
130
- def getMinAxisPosition(tomo_obj: Optional[TomwerObject], axis):
132
+ def getMinAxisPosition(tomo_obj: TomwerObject | None, axis):
131
133
  if tomo_obj is None or tomo_obj.stitching_metadata is None:
132
134
  return 0
133
135
  else:
@@ -0,0 +1,88 @@
1
+ import os
2
+ import tempfile
3
+
4
+ from tomoscan.series import Series
5
+
6
+ from tomwer.gui.stitching.StitchingWindow import ZStitchingWindow
7
+ from tomwer.gui.stitching.tests.utils import create_scans_z_series
8
+ from tomwer.tests.conftest import qtapp # noqa F401
9
+
10
+
11
+ def test_ZStitchingWindow(
12
+ qtapp, # noqa F811
13
+ tmp_path,
14
+ ):
15
+ """
16
+ Test ZStitchingWindow
17
+
18
+ * adding tom objects
19
+ * saving and loading settings (nabu-stitching configuration)
20
+ * editing tomo objects positions over stitching axis
21
+ * reset tomo objects positions
22
+ """
23
+
24
+ window = ZStitchingWindow()
25
+
26
+ axis_0_positions = (90, 0.0, -90.0)
27
+ axis_2_positions = (0.0, 0.0, 0.0)
28
+ pixel_size = 1.0
29
+
30
+ input_dir = os.path.join(tmp_path, "input")
31
+
32
+ scans = create_scans_z_series(
33
+ output_dir=input_dir,
34
+ z_positions_m=axis_0_positions,
35
+ x_positions_m=axis_2_positions,
36
+ shifts=((0.0, 0.0), (-90.0, 0.0), (-180.0, 0.0)),
37
+ pixel_size=pixel_size,
38
+ raw_frame_width=280,
39
+ final_frame_width=100,
40
+ )
41
+ series = Series("z-series", scans)
42
+
43
+ window.show()
44
+ for scan in scans:
45
+ window.addTomoObj(scan)
46
+ window.clean()
47
+ window.setSeries(series)
48
+
49
+ # test dumping and loading configuration to a file
50
+ with tempfile.TemporaryDirectory() as dump_dir:
51
+ config_file = os.path.join(dump_dir, "configuration.cfg")
52
+ window._saveSettings(file_path=config_file)
53
+ assert os.path.exists(config_file)
54
+ window._loadSettings(config_file)
55
+ # remove configuration
56
+ window.clean()
57
+ assert len(window._widget._mainWidget.getTomoObjs()) == 0
58
+ # reload it
59
+ window._loadSettings(file_path=config_file)
60
+ assert len(window._widget._mainWidget.getTomoObjs()) == len(series)
61
+
62
+ assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [90, 0, -90]
63
+
64
+ # test editing axis position
65
+ widget_tomo_obj_0 = (
66
+ window._editTomoObjFirstAxisPositionsWidget._tomoObjtoTomoObjPosWidget[
67
+ scans[0].get_identifier().to_str()
68
+ ]
69
+ )
70
+
71
+ window._editTomoObjFirstAxisPositionsWidget.setEditionMode("free")
72
+ widget_tomo_obj_0.setValue(10)
73
+ assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [10, 0, -90]
74
+ window._editTomoObjFirstAxisPositionsWidget.setEditionMode("downstream")
75
+ widget_tomo_obj_0.setValue(30)
76
+ assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [30, 20, -70]
77
+ window._editTomoObjFirstAxisPositionsWidget.setEditionMode("upstream")
78
+ widget_tomo_obj_2 = (
79
+ window._editTomoObjFirstAxisPositionsWidget._tomoObjtoTomoObjPosWidget[
80
+ scans[2].get_identifier().to_str()
81
+ ]
82
+ )
83
+ widget_tomo_obj_2.setValue(-120)
84
+ assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [-20, -30, -120]
85
+
86
+ # test reset positions to initial positions
87
+ window._editTomoObjFirstAxisPositionsWidget._resetPositions()
88
+ assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [90, 0, -90]
@@ -0,0 +1,21 @@
1
+ from tomwer.tests.conftest import qtapp # noqa F401
2
+ from tomwer.core.volume.hdf5volume import HDF5Volume
3
+ from tomwer.gui.stitching.axisorderedlist import EditableOrderedTomoObjWidget
4
+
5
+
6
+ def test_axis_ordered_list_widget(
7
+ qtapp, # noqa F811
8
+ ):
9
+ widget = EditableOrderedTomoObjWidget(axis=0)
10
+ volumes = tuple(
11
+ HDF5Volume(
12
+ file_path=f"my_volume{i}.hdf5",
13
+ data_path="my_volume",
14
+ )
15
+ for i in range(5)
16
+ )
17
+ [widget.addTomoObj(volume) for volume in volumes]
18
+
19
+ widget.setSelectedTomoObjs([volumes[1], volumes[-1]])
20
+ widget._callbackRemoveSelectedTomoObj()
21
+ assert widget.getTomoObjsAxisOrdered() == (volumes[0], volumes[2], volumes[3])
@@ -0,0 +1,27 @@
1
+ from tomwer.gui.stitching.normalization import NormalizationBySampleGroupBox
2
+
3
+ from tomwer.tests.conftest import qtapp # noqa F401
4
+
5
+
6
+ def test_FrameNormalizationWidget(
7
+ qtapp, # noqa F811
8
+ ):
9
+ widget = NormalizationBySampleGroupBox()
10
+ assert widget.getConfiguration() == {
11
+ "active": True,
12
+ "side": "left",
13
+ "method": "median",
14
+ "width": 30,
15
+ "margin": 0,
16
+ }
17
+
18
+ new_config = {
19
+ "active": False,
20
+ "side": "left",
21
+ "method": "median",
22
+ "width": 30,
23
+ "margin": 0,
24
+ }
25
+
26
+ widget.setConfiguration(new_config)
27
+ assert widget.getConfiguration() == new_config
@@ -0,0 +1,68 @@
1
+ import os
2
+
3
+ import numpy
4
+ import pytest
5
+ from nabu.stitching.config import PreProcessedZStitchingConfiguration
6
+ from nabu.stitching.z_stitching import PreProcessZStitcher
7
+ from tomwer.tests.conftest import qtapp # noqa F401
8
+
9
+ from silx.image.phantomgenerator import PhantomGenerator
10
+
11
+ from tomwer.gui.stitching.stitching_preview import PreviewStitchingPlot
12
+ from tomwer.gui.stitching.tests.utils import create_scans_z_series
13
+
14
+
15
+ @pytest.mark.parametrize("flip_lr", (True, False))
16
+ @pytest.mark.parametrize("flip_ud", (True, False))
17
+ def test_preview(tmp_path, flip_lr, flip_ud, qtapp): # noqa F401
18
+ axis_0_positions = (90, 0.0, -90.0)
19
+ axis_2_positions = (0.0, 0.0, 0.0)
20
+ pixel_size = 1.0
21
+
22
+ output_file_path = os.path.join(str(tmp_path), "output", "stitched.nx")
23
+ input_dir = os.path.join(tmp_path, "input")
24
+
25
+ scans = create_scans_z_series(
26
+ output_dir=input_dir,
27
+ z_positions_m=axis_0_positions,
28
+ x_positions_m=axis_2_positions,
29
+ shifts=((0.0, 0.0), (-90.0, 0.0), (-180.0, 0.0)),
30
+ pixel_size=pixel_size,
31
+ raw_frame_width=280,
32
+ final_frame_width=100,
33
+ flip_lr=flip_lr,
34
+ flip_ud=flip_ud,
35
+ )
36
+ stitching_config = PreProcessedZStitchingConfiguration(
37
+ output_file_path=output_file_path,
38
+ output_data_path="entry_stitched",
39
+ overwrite_results=True,
40
+ slurm_config=None,
41
+ axis_0_pos_mm=numpy.array(axis_0_positions) / 1000,
42
+ axis_2_pos_mm=numpy.array(axis_2_positions) / 1000,
43
+ axis_0_pos_px=None,
44
+ axis_1_pos_px=None,
45
+ axis_2_pos_px=None,
46
+ input_scans=scans,
47
+ pixel_size=pixel_size,
48
+ )
49
+ widget = PreviewStitchingPlot(axis=0)
50
+
51
+ widget._backGroundAction.toggle()
52
+
53
+ stitcher = PreProcessZStitcher(configuration=stitching_config)
54
+ stitched_id = stitcher.stitch(store_composition=True)
55
+ assert stitched_id is not None
56
+ composition = stitcher.frame_composition
57
+ assert composition is not None
58
+
59
+ widget.setStitchedTomoObj(tomo_obj_id=stitched_id.to_str(), composition=composition)
60
+ assert widget.stitched_image is not None
61
+ assert widget.composition_background is not None
62
+
63
+ numpy.testing.assert_almost_equal(
64
+ widget.stitched_image,
65
+ PhantomGenerator.get2DPhantomSheppLogan(n=280).astype(numpy.float32) * 256.0,
66
+ )
67
+
68
+ widget._backGroundAction.toggle()
@@ -0,0 +1,110 @@
1
+ import os
2
+ import shutil
3
+ import tempfile
4
+
5
+ import numpy
6
+
7
+ from silx.gui import qt
8
+ from silx.gui.utils.testutils import TestCaseQt
9
+ from tomwer.core.utils.scanutils import MockNXtomo
10
+ from tomwer.core.volume.hdf5volume import HDF5Volume
11
+ from tomwer.gui.stitching.metadataholder import QStitchingMetadata
12
+ from tomwer.gui.stitching.stitching_raw import RawStitchingPlot, AlphaValuesTableWidget
13
+
14
+
15
+ def _createVolumes(axis_0_positions: tuple, root_dir: str):
16
+ volumes = []
17
+ for i_volume, axis_0_position in enumerate(axis_0_positions):
18
+ data = numpy.random.random(20 * 20).reshape(1, 20, 20)
19
+ volume = HDF5Volume(
20
+ file_path=os.path.join(root_dir, f"volume_{i_volume}.hdf5"),
21
+ data_path=f"entry_{i_volume}",
22
+ data=data,
23
+ )
24
+ volume.stitching_metadata = QStitchingMetadata(tomo_obj=volume)
25
+ volume.stitching_metadata.setPxPos(axis=0, value=axis_0_position)
26
+ volumes.append(volume)
27
+ return volumes
28
+
29
+
30
+ def _createScans(axis_0_positions: tuple, root_dir: str):
31
+ scans = []
32
+ for i_scan, axis_0_position in enumerate(axis_0_positions):
33
+ scan = MockNXtomo(
34
+ scan_path=os.path.join(root_dir, f"scan_{i_scan}"),
35
+ n_proj=20,
36
+ n_ini_proj=20,
37
+ dim=10,
38
+ ).scan
39
+ scan.stitching_metadata = QStitchingMetadata(tomo_obj=scan)
40
+ scan.stitching_metadata.setPxPos(axis=0, value=axis_0_position)
41
+ scans.append(scan)
42
+ return scans
43
+
44
+
45
+ class TestPlotRawStitching(TestCaseQt):
46
+ """Test RawStitchingPlot widget"""
47
+
48
+ def setUp(self):
49
+ super().setUp()
50
+ self._tmp_path = tempfile.mkdtemp()
51
+ self.widget = RawStitchingPlot(alpha_values=True)
52
+
53
+ def tearDown(self):
54
+ self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
55
+ self.widget.close()
56
+ self.widget = None
57
+ shutil.rmtree(self._tmp_path)
58
+
59
+ def testWithVolumes(self):
60
+ axis_0_positions = (0, 12, 50)
61
+ volumes = _createVolumes(
62
+ axis_0_positions=axis_0_positions, root_dir=self._tmp_path
63
+ )
64
+ assert len(volumes) == 3
65
+ self.widget.addTomoObj(volumes[0])
66
+ images = self.widget.getAllImages()
67
+ assert len(images) == 1
68
+
69
+ self.widget.setTomoObjs(volumes)
70
+ images = self.widget.getAllImages()
71
+ assert len(images) == len(volumes)
72
+ # silx is storing origins as x, y
73
+ origins = tuple([image.getOrigin()[1] for image in images])
74
+ assert tuple(sorted(origins)) == axis_0_positions
75
+
76
+ def testWithScans(self):
77
+ axis_0_positions = (0, 10, 20, 34)
78
+ scans = _createScans(axis_0_positions=axis_0_positions, root_dir=self._tmp_path)
79
+ self.widget.setActive(False)
80
+ self.widget.setTomoObjs(scans)
81
+ assert len(self.widget.getAllImages()) == 0
82
+ self.widget.setActive(True)
83
+ self.qapp.processEvents()
84
+ assert len(self.widget.getAllImages()) == len(scans)
85
+
86
+
87
+ class TestAlphaValuesTableWidget(TestCaseQt):
88
+ """test AlphaValuesTableWidget"""
89
+
90
+ def setUp(self):
91
+ super().setUp()
92
+ self._tmp_path = tempfile.mkdtemp()
93
+ self.widget = AlphaValuesTableWidget()
94
+
95
+ def tearDown(self):
96
+ self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
97
+ self.widget.close()
98
+ self.widget = None
99
+ shutil.rmtree(self._tmp_path)
100
+
101
+ def testSettingTomoObj(self):
102
+ self.widget.setTomoObjs(
103
+ _createVolumes(axis_0_positions=(0, 12, 50), root_dir=self._tmp_path),
104
+ )
105
+
106
+ assert len(self.widget._sliders) == 3
107
+ self.widget.setTomoObjs(
108
+ _createScans(axis_0_positions=(89, 78), root_dir=self._tmp_path)
109
+ )
110
+ assert len(self.widget._sliders) == 2