tomwer 1.3.27__py3-none-any.whl → 1.4.0rc0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) hide show
  1. orangecontrib/tomwer/orange/managedprocess.py +1 -29
  2. orangecontrib/tomwer/orange/settings.py +2 -28
  3. orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
  4. orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
  5. orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
  6. orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
  7. orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
  8. orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
  9. orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
  10. orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
  11. orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
  12. orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
  13. orangecontrib/tomwer/widgets/__init__.py +3 -5
  14. orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
  15. orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
  16. orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
  17. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
  18. orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
  19. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
  20. orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
  21. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
  22. orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
  23. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
  24. orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
  25. orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
  26. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
  27. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
  28. orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
  29. orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
  30. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
  31. orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
  32. orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
  33. orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
  34. orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
  35. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
  36. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
  37. orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
  38. orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
  39. orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
  40. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
  41. orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
  42. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
  43. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
  44. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
  45. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
  46. orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
  47. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +48 -49
  48. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
  49. orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
  50. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
  51. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
  52. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +40 -85
  53. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
  54. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
  55. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
  56. orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
  57. orangecontrib/tomwer/widgets/utils.py +2 -29
  58. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
  59. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
  60. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
  61. orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
  62. orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
  63. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
  64. orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
  65. tomwer/__init__.py +3 -28
  66. tomwer/__main__.py +8 -4
  67. tomwer/app/__init__.py +2 -0
  68. tomwer/app/axis.py +8 -7
  69. tomwer/app/canvas.py +23 -29
  70. tomwer/app/canvas_launcher/config.py +14 -102
  71. tomwer/app/canvas_launcher/environ.py +5 -8
  72. tomwer/app/canvas_launcher/mainwindow.py +175 -69
  73. tomwer/app/canvas_launcher/splash.py +1 -3
  74. tomwer/app/canvas_launcher/utils.py +47 -0
  75. tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
  76. tomwer/app/diffframe.py +2 -0
  77. tomwer/app/imagekeyeditor.py +2 -1
  78. tomwer/app/imagekeyupgrader.py +2 -0
  79. tomwer/app/multicor.py +5 -2
  80. tomwer/app/multipag.py +7 -4
  81. tomwer/app/nabuapp.py +2 -1
  82. tomwer/app/nxtomoeditor.py +17 -12
  83. tomwer/app/patchrawdarkflat.py +2 -0
  84. tomwer/app/radiostack.py +3 -2
  85. tomwer/app/reducedarkflat.py +3 -0
  86. tomwer/app/samplemoved.py +2 -0
  87. tomwer/app/scanviewer.py +2 -0
  88. tomwer/app/sinogramviewer.py +2 -0
  89. tomwer/app/slicestack.py +11 -13
  90. tomwer/app/stitching/common.py +431 -0
  91. tomwer/app/stopdatalistener.py +3 -0
  92. tomwer/app/ystitching.py +26 -0
  93. tomwer/app/zstitching.py +8 -363
  94. tomwer/core/__init__.py +2 -28
  95. tomwer/core/cluster/__init__.py +3 -0
  96. tomwer/core/cluster/cluster.py +10 -26
  97. tomwer/core/futureobject.py +17 -43
  98. tomwer/core/log/__init__.py +2 -0
  99. tomwer/core/log/processlog.py +0 -28
  100. tomwer/core/process/cluster/supervisor.py +52 -34
  101. tomwer/core/process/conditions/filters.py +3 -28
  102. tomwer/core/process/control/datalistener/datalistener.py +7 -75
  103. tomwer/core/process/control/datalistener/rpcserver.py +8 -38
  104. tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
  105. tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
  106. tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
  107. tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
  108. tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
  109. tomwer/core/process/control/datawatcher/status.py +1 -26
  110. tomwer/core/process/control/emailnotifier.py +11 -23
  111. tomwer/core/process/control/nxtomoconcatenate.py +20 -18
  112. tomwer/core/process/control/nxtomomill.py +9 -44
  113. tomwer/core/process/control/scanlist.py +0 -27
  114. tomwer/core/process/control/scantransfer.py +15 -13
  115. tomwer/core/process/control/scanvalidator.py +4 -30
  116. tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
  117. tomwer/core/process/control/timer.py +1 -27
  118. tomwer/core/process/control/tomoobjseries.py +12 -0
  119. tomwer/core/process/drac/binning.py +37 -0
  120. tomwer/core/process/drac/dracbase.py +170 -0
  121. tomwer/core/process/drac/gallery.py +109 -0
  122. tomwer/core/process/drac/output.py +12 -0
  123. tomwer/core/process/drac/processeddataset.py +147 -0
  124. tomwer/core/process/drac/publish.py +118 -0
  125. tomwer/core/process/drac/rawdataset.py +142 -0
  126. tomwer/core/process/drac/tests/test_gallery.py +71 -0
  127. tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
  128. tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
  129. tomwer/core/process/edit/darkflatpatch.py +1 -28
  130. tomwer/core/process/edit/imagekeyeditor.py +4 -32
  131. tomwer/core/process/edit/nxtomoeditor.py +307 -0
  132. tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
  133. tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
  134. tomwer/core/process/output.py +9 -2
  135. tomwer/core/process/reconstruction/__init__.py +0 -26
  136. tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
  137. tomwer/core/process/reconstruction/axis/axis.py +63 -111
  138. tomwer/core/process/reconstruction/axis/mode.py +5 -3
  139. tomwer/core/process/reconstruction/axis/params.py +5 -146
  140. tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
  141. tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
  142. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
  143. tomwer/core/process/reconstruction/darkref/params.py +1 -28
  144. tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
  145. tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
  146. tomwer/core/process/reconstruction/nabu/nabuscores.py +47 -48
  147. tomwer/core/process/reconstruction/nabu/nabuslices.py +59 -105
  148. tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
  149. tomwer/core/process/reconstruction/nabu/plane.py +10 -0
  150. tomwer/core/process/reconstruction/nabu/settings.py +1 -28
  151. tomwer/core/process/reconstruction/nabu/target.py +0 -28
  152. tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
  153. tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
  154. tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
  155. tomwer/core/process/reconstruction/nabu/utils.py +11 -60
  156. tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
  157. tomwer/core/process/reconstruction/normalization/params.py +3 -35
  158. tomwer/core/process/reconstruction/output.py +14 -19
  159. tomwer/core/process/reconstruction/paramsbase.py +4 -33
  160. tomwer/core/process/reconstruction/saaxis/params.py +5 -33
  161. tomwer/core/process/reconstruction/saaxis/saaxis.py +18 -47
  162. tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
  163. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +16 -44
  164. tomwer/core/process/reconstruction/scores/params.py +9 -39
  165. tomwer/core/process/reconstruction/scores/scores.py +10 -42
  166. tomwer/core/process/reconstruction/tests/__init__.py +0 -0
  167. tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
  168. tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
  169. tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
  170. tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
  171. tomwer/core/process/script/python.py +1 -27
  172. tomwer/core/process/script/tests/test_script.py +41 -0
  173. tomwer/core/process/stitching/metadataholder.py +5 -4
  174. tomwer/core/process/stitching/nabustitcher.py +35 -5
  175. tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
  176. tomwer/core/process/task.py +20 -63
  177. tomwer/core/process/tests/__init__.py +0 -0
  178. tomwer/core/process/{test → tests}/test_axis.py +1 -79
  179. tomwer/core/process/{test → tests}/test_conditions.py +1 -28
  180. tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
  181. tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
  182. tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
  183. tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
  184. tomwer/core/process/{test → tests}/test_nabu.py +4 -33
  185. tomwer/core/process/{test → tests}/test_normalization.py +1 -26
  186. tomwer/core/process/{test → tests}/test_timer.py +1 -27
  187. tomwer/core/process/utils.py +2 -31
  188. tomwer/core/process/visualization/dataviewer.py +1 -26
  189. tomwer/core/process/visualization/diffviewer.py +1 -26
  190. tomwer/core/process/visualization/imagestackviewer.py +0 -26
  191. tomwer/core/process/visualization/radiostack.py +0 -26
  192. tomwer/core/process/visualization/samplemoved.py +0 -28
  193. tomwer/core/process/visualization/sinogramviewer.py +0 -27
  194. tomwer/core/process/visualization/slicestack.py +0 -28
  195. tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
  196. tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
  197. tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
  198. tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
  199. tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
  200. tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
  201. tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
  202. tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
  203. tomwer/core/process/visualization/volumeviewer.py +0 -29
  204. tomwer/core/scan/__init__.py +3 -27
  205. tomwer/core/scan/blissscan.py +5 -34
  206. tomwer/core/scan/edfscan.py +19 -53
  207. tomwer/core/scan/hdf5scan.py +2 -2
  208. tomwer/core/scan/nxtomoscan.py +46 -54
  209. tomwer/core/scan/scanbase.py +104 -200
  210. tomwer/core/scan/scanfactory.py +11 -41
  211. tomwer/core/scan/tests/__init__.py +0 -0
  212. tomwer/core/scan/tests/test_edf.py +25 -0
  213. tomwer/core/scan/tests/test_future_scan.py +35 -0
  214. tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
  215. tomwer/core/scan/{test → tests}/test_process_registration.py +1 -28
  216. tomwer/core/settings.py +18 -40
  217. tomwer/core/tests/__init__.py +0 -0
  218. tomwer/core/tests/test_scanutils.py +26 -0
  219. tomwer/core/{test → tests}/test_utils.py +1 -28
  220. tomwer/core/tomwer_object.py +4 -0
  221. tomwer/core/utils/__init__.py +2 -0
  222. tomwer/core/utils/char.py +0 -28
  223. tomwer/core/utils/deprecation.py +12 -38
  224. tomwer/core/utils/dictutils.py +1 -3
  225. tomwer/core/utils/ftseriesutils.py +1 -27
  226. tomwer/core/utils/gpu.py +0 -28
  227. tomwer/core/utils/image.py +8 -39
  228. tomwer/core/utils/locker.py +1 -28
  229. tomwer/core/utils/logconfig.py +0 -27
  230. tomwer/core/utils/normalization.py +4 -31
  231. tomwer/core/utils/nxtomoutils.py +8 -38
  232. tomwer/core/utils/resource.py +0 -26
  233. tomwer/core/utils/scanutils.py +23 -52
  234. tomwer/core/utils/slurm.py +7 -30
  235. tomwer/core/utils/spec.py +6 -6
  236. tomwer/core/utils/tests/__init__.py +0 -0
  237. tomwer/core/utils/tests/test_image.py +30 -0
  238. tomwer/core/utils/tests/test_nxtomo.py +38 -0
  239. tomwer/core/utils/tests/test_scan_utils.py +46 -0
  240. tomwer/core/utils/tests/test_time.py +6 -0
  241. tomwer/core/utils/threads.py +0 -26
  242. tomwer/core/utils/time.py +0 -27
  243. tomwer/core/volume/__init__.py +4 -0
  244. tomwer/core/volume/edfvolume.py +1 -28
  245. tomwer/core/volume/hdf5volume.py +1 -28
  246. tomwer/core/volume/jp2kvolume.py +1 -27
  247. tomwer/core/volume/rawvolume.py +1 -28
  248. tomwer/core/volume/tests/test_volumes.py +21 -0
  249. tomwer/core/volume/tiffvolume.py +1 -28
  250. tomwer/core/volume/volumebase.py +5 -0
  251. tomwer/core/volume/volumefactory.py +7 -33
  252. tomwer/gui/__init__.py +0 -28
  253. tomwer/gui/cluster/__init__.py +2 -0
  254. tomwer/gui/cluster/slurm.py +297 -95
  255. tomwer/gui/cluster/supervisor.py +1 -27
  256. tomwer/gui/cluster/tests/__init__.py +0 -0
  257. tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
  258. tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
  259. tomwer/gui/conditions/__init__.py +2 -0
  260. tomwer/gui/conditions/filter.py +1 -26
  261. tomwer/gui/configuration/__init__.py +2 -0
  262. tomwer/gui/control/__init__.py +2 -0
  263. tomwer/gui/control/actions.py +2 -28
  264. tomwer/gui/control/datadiscovery.py +4 -3
  265. tomwer/gui/control/datalist.py +64 -69
  266. tomwer/gui/control/datalistener.py +1 -39
  267. tomwer/gui/control/datareacheractions.py +1 -28
  268. tomwer/gui/control/datatransfert.py +2 -29
  269. tomwer/gui/control/datavalidator.py +3 -37
  270. tomwer/gui/control/datawatcher/__init__.py +0 -28
  271. tomwer/gui/control/datawatcher/configuration.py +1 -28
  272. tomwer/gui/control/datawatcher/datawatcher.py +3 -32
  273. tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
  274. tomwer/gui/control/history.py +5 -35
  275. tomwer/gui/control/nxtomomill.py +3 -30
  276. tomwer/gui/control/observations.py +61 -55
  277. tomwer/gui/control/reducedarkflatselector.py +24 -20
  278. tomwer/gui/control/scanselectorwidget.py +2 -28
  279. tomwer/gui/control/selectorwidgetbase.py +17 -17
  280. tomwer/gui/control/series/__init__.py +0 -0
  281. tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
  282. tomwer/gui/control/series/serieswaiter.py +0 -0
  283. tomwer/gui/control/series/test/test_creator.py +424 -0
  284. tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
  285. tomwer/gui/control/singletomoobj.py +1 -1
  286. tomwer/gui/control/tests/__init__.py +0 -0
  287. tomwer/gui/control/tests/test_datalist.py +47 -0
  288. tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
  289. tomwer/gui/control/tests/test_datavalidator.py +27 -0
  290. tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
  291. tomwer/gui/control/tests/test_process_manager.py +38 -0
  292. tomwer/gui/control/tests/test_scan_observations.py +23 -0
  293. tomwer/gui/control/tests/test_scanselector.py +42 -0
  294. tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
  295. tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
  296. tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
  297. tomwer/gui/control/volumeselectorwidget.py +2 -30
  298. tomwer/gui/dataportal/__init__.py +2 -0
  299. tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
  300. tomwer/gui/dataportal/gallery.py +133 -0
  301. tomwer/gui/dataportal/outputformat.py +0 -0
  302. tomwer/gui/dataportal/publish.py +96 -0
  303. tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
  304. tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
  305. tomwer/gui/debugtools/__init__.py +2 -0
  306. tomwer/gui/debugtools/datasetgenerator.py +1 -30
  307. tomwer/gui/debugtools/objectinspector.py +1 -29
  308. tomwer/gui/dialog/QDataDialog.py +89 -0
  309. tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
  310. tomwer/gui/dialog/__init__.py +1 -0
  311. tomwer/gui/edit/__init__.py +2 -0
  312. tomwer/gui/edit/dkrfpatch.py +52 -87
  313. tomwer/gui/edit/imagekeyeditor.py +18 -54
  314. tomwer/gui/edit/nxtomoeditor.py +113 -300
  315. tomwer/gui/edit/nxtomowarmer.py +3 -2
  316. tomwer/gui/edit/tests/__init__.py +0 -0
  317. tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
  318. tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
  319. tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
  320. tomwer/gui/icons.py +28 -66
  321. tomwer/gui/illustrations.py +4 -34
  322. tomwer/gui/imagefromfile.py +5 -30
  323. tomwer/gui/metadataloader.py +36 -0
  324. tomwer/gui/qconfigfile.py +3 -0
  325. tomwer/gui/qlefilesystem.py +3 -0
  326. tomwer/gui/reconstruction/__init__.py +2 -0
  327. tomwer/gui/reconstruction/axis/AxisMainWindow.py +264 -0
  328. tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +153 -0
  329. tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +776 -0
  330. tomwer/gui/reconstruction/axis/AxisWidget.py +526 -0
  331. tomwer/gui/reconstruction/axis/CalculationWidget.py +374 -0
  332. tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
  333. tomwer/gui/reconstruction/axis/ControlWidget.py +277 -0
  334. tomwer/gui/reconstruction/axis/InputWidget.py +491 -0
  335. tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
  336. tomwer/gui/reconstruction/axis/__init__.py +2 -2
  337. tomwer/gui/reconstruction/darkref/__init__.py +0 -27
  338. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
  339. tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
  340. tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
  341. tomwer/gui/reconstruction/nabu/check.py +7 -33
  342. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
  343. tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
  344. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
  345. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
  346. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
  347. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
  348. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
  349. tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
  350. tomwer/gui/reconstruction/nabu/platform.py +94 -0
  351. tomwer/gui/reconstruction/nabu/slices.py +81 -45
  352. tomwer/gui/reconstruction/nabu/slurm.py +1 -27
  353. tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
  354. tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
  355. tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
  356. tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
  357. tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
  358. tomwer/gui/reconstruction/nabu/volume.py +62 -90
  359. tomwer/gui/reconstruction/normalization/intensity.py +5 -32
  360. tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
  361. tomwer/gui/reconstruction/saaxis/corrangeselector.py +16 -49
  362. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
  363. tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
  364. tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
  365. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
  366. tomwer/gui/reconstruction/scores/control.py +2 -30
  367. tomwer/gui/reconstruction/scores/scoreplot.py +19 -48
  368. tomwer/gui/reconstruction/tests/__init__.py +0 -0
  369. tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
  370. tomwer/gui/reconstruction/{test → tests}/test_nabu.py +8 -31
  371. tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
  372. tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
  373. tomwer/gui/samplemoved/__init__.py +2 -30
  374. tomwer/gui/samplemoved/selectiontable.py +3 -33
  375. tomwer/gui/settings.py +7 -0
  376. tomwer/gui/stackplot.py +33 -661
  377. tomwer/gui/stacks.py +261 -135
  378. tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
  379. tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
  380. tomwer/gui/stitching/StitchingWindow.py +586 -0
  381. tomwer/gui/stitching/__init__.py +2 -0
  382. tomwer/gui/stitching/alignment.py +90 -0
  383. tomwer/gui/stitching/axisorderedlist.py +44 -34
  384. tomwer/gui/stitching/config/axisparams.py +23 -11
  385. tomwer/gui/stitching/config/output.py +6 -5
  386. tomwer/gui/stitching/config/positionoveraxis.py +313 -51
  387. tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
  388. tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
  389. tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
  390. tomwer/gui/stitching/normalization.py +1 -0
  391. tomwer/gui/stitching/preview.py +59 -0
  392. tomwer/gui/stitching/singleaxis.py +57 -0
  393. tomwer/gui/stitching/stitchandbackground.py +3 -2
  394. tomwer/gui/stitching/stitching_preview.py +44 -36
  395. tomwer/gui/stitching/stitching_raw.py +5 -3
  396. tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
  397. tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
  398. tomwer/gui/stitching/tests/test_normalization.py +27 -0
  399. tomwer/gui/stitching/tests/test_preview.py +68 -0
  400. tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
  401. tomwer/gui/stitching/tests/utils.py +92 -0
  402. tomwer/gui/stitching/utils.py +14 -0
  403. tomwer/gui/stitching/z_stitching/fineestimation.py +4 -32
  404. tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
  405. tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
  406. tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
  407. tomwer/gui/tests/__init__.py +0 -0
  408. tomwer/gui/tests/test_axis_gui.py +27 -0
  409. tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
  410. tomwer/gui/utils/RangeWidget.py +44 -0
  411. tomwer/gui/utils/buttons.py +4 -3
  412. tomwer/gui/utils/completer.py +2 -33
  413. tomwer/gui/utils/flow.py +11 -40
  414. tomwer/gui/utils/gpu.py +60 -0
  415. tomwer/gui/utils/illustrations.py +1 -26
  416. tomwer/gui/utils/inputwidget.py +35 -73
  417. tomwer/gui/utils/lineselector/lineselector.py +9 -46
  418. tomwer/gui/utils/loadingmode.py +81 -0
  419. tomwer/gui/utils/qt_utils.py +9 -0
  420. tomwer/gui/utils/sandboxes.py +1 -26
  421. tomwer/gui/utils/scandescription.py +2 -31
  422. tomwer/gui/utils/scrollarea.py +6 -55
  423. tomwer/gui/utils/slider.py +4 -28
  424. tomwer/gui/utils/splashscreen.py +0 -28
  425. tomwer/gui/utils/step.py +14 -13
  426. tomwer/gui/utils/tests/test_completer.py +41 -0
  427. tomwer/gui/utils/tests/test_line_selector.py +21 -0
  428. tomwer/gui/utils/tests/test_splashscreen.py +8 -0
  429. tomwer/gui/utils/tests/test_vignettes.py +68 -0
  430. tomwer/gui/utils/unitsystem.py +15 -69
  431. tomwer/gui/utils/utils.py +4 -5
  432. tomwer/gui/utils/vignettes.py +10 -41
  433. tomwer/gui/utils/waiterthread.py +0 -26
  434. tomwer/gui/visualization/__init__.py +2 -0
  435. tomwer/gui/visualization/dataviewer.py +68 -421
  436. tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
  437. tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
  438. tomwer/gui/visualization/fullscreenplot.py +5 -5
  439. tomwer/gui/visualization/imagestack.py +403 -0
  440. tomwer/gui/visualization/nxtomometadata.py +0 -4
  441. tomwer/gui/visualization/reconstructionparameters.py +14 -32
  442. tomwer/gui/visualization/scanoverview.py +33 -66
  443. tomwer/gui/visualization/sinogramviewer.py +2 -28
  444. tomwer/gui/visualization/test/__init__.py +0 -28
  445. tomwer/gui/visualization/test/test_dataviewer.py +1 -28
  446. tomwer/gui/visualization/test/test_diffviewer.py +1 -28
  447. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
  448. tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
  449. tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
  450. tomwer/gui/visualization/test/test_stacks.py +184 -115
  451. tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
  452. tomwer/gui/visualization/tomoobjoverview.py +2 -2
  453. tomwer/gui/visualization/volumeoverview.py +3 -2
  454. tomwer/gui/visualization/volumeviewer.py +47 -43
  455. tomwer/io/__init__.py +2 -0
  456. tomwer/io/utils/h5pyutils.py +1 -27
  457. tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
  458. tomwer/io/utils/test/test_utils.py +67 -0
  459. tomwer/io/utils/utils.py +2 -31
  460. tomwer/resources/__init__.py +13 -33
  461. tomwer/resources/gui/icons/edit_downstream.svg +114 -0
  462. tomwer/resources/gui/icons/edit_upstream.svg +112 -0
  463. tomwer/resources/gui/icons/free_edition.svg +23 -0
  464. tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
  465. tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
  466. tomwer/resources/gui/icons/search.png +0 -0
  467. tomwer/resources/gui/icons/search.svg +23 -0
  468. tomwer/resources/gui/icons/warning.png +0 -0
  469. tomwer/synctools/__init__.py +2 -0
  470. tomwer/synctools/axis.py +1 -27
  471. tomwer/synctools/darkref.py +1 -26
  472. tomwer/synctools/datalistener.py +1 -27
  473. tomwer/synctools/datatransfert.py +2 -27
  474. tomwer/synctools/imageloaderthread.py +1 -28
  475. tomwer/synctools/rsyncmanager.py +1 -25
  476. tomwer/synctools/saaxis.py +1 -26
  477. tomwer/synctools/sadeltabeta.py +1 -26
  478. tomwer/synctools/stacks/control/datalistener.py +1 -26
  479. tomwer/synctools/stacks/processingstack.py +4 -33
  480. tomwer/synctools/stacks/reconstruction/axis.py +2 -31
  481. tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
  482. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +3 -26
  483. tomwer/synctools/stacks/reconstruction/nabu.py +1 -26
  484. tomwer/synctools/stacks/reconstruction/normalization.py +1 -26
  485. tomwer/synctools/stacks/reconstruction/saaxis.py +1 -26
  486. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +1 -26
  487. tomwer/synctools/tests/__init__.py +0 -0
  488. tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
  489. tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
  490. tomwer/synctools/utils/scanstages.py +2 -31
  491. tomwer/tests/__init__.py +1 -0
  492. tomwer/tests/app/test_stitching.py +95 -0
  493. tomwer/tests/datasets.py +1 -5
  494. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
  495. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
  496. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
  497. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
  498. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
  499. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
  500. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
  501. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
  502. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
  503. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
  504. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
  505. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
  506. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
  507. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
  508. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
  509. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
  510. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
  511. orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
  512. tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
  513. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
  514. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
  515. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
  516. tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
  517. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +215 -0
  518. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
  519. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
  520. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
  521. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
  522. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
  523. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
  524. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
  525. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
  526. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
  527. tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
  528. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
  529. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
  530. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
  531. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
  532. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
  533. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
  534. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
  535. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
  536. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
  537. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
  538. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
  539. tomwer/tests/test_ewoks/test_conversion.py +104 -0
  540. tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
  541. tomwer/tests/test_ewoks/test_workflows.py +138 -0
  542. tomwer/utils.py +11 -39
  543. tomwer/version.py +3 -3
  544. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/LICENSE +3 -3
  545. tomwer-1.4.0rc0.dist-info/METADATA +337 -0
  546. tomwer-1.4.0rc0.dist-info/RECORD +909 -0
  547. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/WHEEL +1 -1
  548. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/entry_points.txt +1 -0
  549. orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
  550. orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
  551. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
  552. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
  553. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
  554. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
  555. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
  556. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  557. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
  558. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  559. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
  560. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
  561. orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
  562. orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
  563. tomwer/core/log/logger.py +0 -130
  564. tomwer/core/process/control/test/test_volume_link.py +0 -74
  565. tomwer/core/process/control/tomoobjserie.py +0 -12
  566. tomwer/core/process/control/volumesymlink.py +0 -200
  567. tomwer/core/process/icat/createscreenshots.py +0 -100
  568. tomwer/core/process/icat/gallery.py +0 -377
  569. tomwer/core/process/icat/icatbase.py +0 -36
  570. tomwer/core/process/icat/publish.py +0 -228
  571. tomwer/core/process/icat/screenshots.py +0 -27
  572. tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
  573. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
  574. tomwer/core/process/visualization/liveslice.py +0 -6
  575. tomwer/core/progress.py +0 -100
  576. tomwer/core/scan/test/test_edf.py +0 -53
  577. tomwer/core/scan/test/test_future_scan.py +0 -61
  578. tomwer/core/scan/test/test_h5.py +0 -96
  579. tomwer/core/test/test_scanutils.py +0 -53
  580. tomwer/gui/control/emailnotifier.py +0 -174
  581. tomwer/gui/control/serie/seriewaiter.py +0 -28
  582. tomwer/gui/control/test/__init__.py +0 -28
  583. tomwer/gui/control/test/test_datalist.py +0 -96
  584. tomwer/gui/control/test/test_datavalidator.py +0 -54
  585. tomwer/gui/control/test/test_email.py +0 -35
  586. tomwer/gui/control/test/test_process_manager.py +0 -65
  587. tomwer/gui/control/test/test_scanselector.py +0 -67
  588. tomwer/gui/edit/test/__init__.py +0 -28
  589. tomwer/gui/icat/gallery.py +0 -214
  590. tomwer/gui/icat/publish.py +0 -187
  591. tomwer/gui/reconstruction/axis/axis.py +0 -733
  592. tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
  593. tomwer/gui/stitching/stitching.py +0 -1388
  594. tomwer/gui/test/__init__.py +0 -28
  595. tomwer/gui/test/test_axis_gui.py +0 -34
  596. tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
  597. tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
  598. tomwer/third_part/WaitingOverlay.py +0 -110
  599. tomwer-1.3.27-py3.11-nspkg.pth +0 -1
  600. tomwer-1.3.27.dist-info/METADATA +0 -292
  601. tomwer-1.3.27.dist-info/RECORD +0 -785
  602. tomwer-1.3.27.dist-info/namespace_packages.txt +0 -1
  603. /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
  604. {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
  605. {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
  606. /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
  607. {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
  608. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
  609. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
  610. {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
  611. {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
  612. {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
  613. {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
  614. {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
  615. {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
  616. {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
  617. /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
  618. /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
  619. /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
  620. /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
  621. /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
  622. /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
  623. /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
  624. /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
  625. /tomwer/core/process/reconstruction/{test → tests}/test_utils.py +0 -0
  626. /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
  627. /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
  628. /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
  629. /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
  630. /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
  631. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
  632. {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/top_level.txt +0 -0
@@ -1,42 +1,11 @@
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
1
  """
26
2
  contains gui to select a slice in a volume
27
3
  """
28
4
 
29
-
30
- __authors__ = [
31
- "H. Payno",
32
- ]
33
-
34
- __license__ = "MIT"
35
- __date__ = "26/02/2021"
36
-
5
+ from __future__ import annotations
37
6
 
38
7
  import logging
39
- from typing import Iterable, Union, Optional
8
+ from typing import Iterable
40
9
 
41
10
  import numpy
42
11
  from silx.gui import qt
@@ -128,7 +97,7 @@ class VignettesQDialog(qt.QDialog):
128
97
  (2D numpy.array, score) as value.
129
98
  Where the 2D numpy.array is the frame to display and the score if the
130
99
  "indicator" score to display with the frame.
131
- :param dict scores: with score as key and a tuple (url|numpy array, ComputedScore) as value
100
+ :param scores: with score as key and a tuple (url|numpy array, ComputedScore) as value
132
101
  :param ScoreMethod score_method: score kind to be display
133
102
  """
134
103
  self._vignettesWidget.setScores(scores=scores, score_method=score_method)
@@ -149,14 +118,14 @@ class VignettesQDialog(qt.QDialog):
149
118
  self._vignettesWidget.close()
150
119
  super().reject()
151
120
 
152
- def getNColumn(self) -> Optional[int]:
121
+ def getNColumn(self) -> int | None:
153
122
  n_column = self._nbColumnCB.currentText()
154
123
  if n_column == self.AUTO_NB_COLUMN:
155
124
  return None
156
125
  else:
157
126
  return int(n_column)
158
127
 
159
- def setNbColumn(self, value: Union[int, str]):
128
+ def setNbColumn(self, value: int | str):
160
129
  if value not in self.COLUMN_VALUES:
161
130
  raise ValueError(
162
131
  f"Unhandled number of column requested ({value}). Valid values are {self.COLUMN_VALUES}"
@@ -203,10 +172,10 @@ class VignettesWidget(qt.QWidget):
203
172
  """
204
173
  Widget to display all the frames.
205
174
 
206
- :param QWidget parent:
207
- :param str value_name: name of the values for which we are looking for the
175
+ :param parent:
176
+ :param value_name: name of the values for which we are looking for the
208
177
  best one
209
- :param str score_name: name of the score computed
178
+ :param score_name: name of the score computed
210
179
  :param score_format: None or str that can be formatted to display the
211
180
  score
212
181
  :param value_format: None or str that can be formatted to display the
@@ -317,7 +286,7 @@ class VignettesWidget(qt.QWidget):
317
286
  (2D numpy.array, score) as value.
318
287
  Where the 2D numpy.array is the frame to display and the score if the
319
288
  "indicator" score to display with the frame.
320
- :param dict scores: with score as key and a tuple (url|numpy array, ComputedScore) as value
289
+ :param scores: with score as key and a tuple (url|numpy array, ComputedScore) as value
321
290
  :param ScoreMethod score_method: score kind to be display
322
291
  """
323
292
  if len(scores) < 1:
@@ -437,7 +406,7 @@ class Vignette(qt.QToolButton):
437
406
  value,
438
407
  value_name: str,
439
408
  score_name: str,
440
- data: Union[DataUrl, numpy.array],
409
+ data: DataUrl | numpy.array,
441
410
  score: float,
442
411
  frame_color: qt.QColor,
443
412
  score_format=None,
@@ -1,26 +1,4 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- # Copyright (C) 2016 European Synchrotron Radiation Facility
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
- #
23
- #############################################################################*/
24
2
 
25
3
  """
26
4
  This module is used to manage observations. Initially on files.
@@ -28,10 +6,6 @@ Observations are runned on a thread and run each n seconds.
28
6
  They are manage by thread and signals
29
7
  """
30
8
 
31
- __authors__ = ["H.Payno"]
32
- __license__ = "MIT"
33
- __date__ = "09/02/2017"
34
-
35
9
 
36
10
  import time
37
11
 
@@ -0,0 +1,2 @@
1
+ """Widgets for displaying data (sinogram, browsing scans, display reconstructed volumes...)
2
+ """
@@ -1,66 +1,13 @@
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__ = "13/08/2021"
29
-
30
- import logging
31
1
  import weakref
32
2
 
33
3
  from silx.gui import qt
34
- from silx.gui.dialog.ColormapDialog import DisplayMode
35
- from silx.gui.plot.ImageStack import ImageStack as _ImageStack
36
- from silx.gui.plot.ImageStack import UrlLoader
37
- from silx.io.url import DataUrl
38
4
  from silx.utils.enum import Enum as _Enum
39
5
 
40
6
  from tomwer.core.scan.scanbase import TomwerScanBase
41
- from tomwer.core.utils.ftseriesutils import get_vol_file_shape
42
7
  from tomwer.core.volume.volumebase import TomwerVolumeBase
43
8
  from tomwer.core.volume.volumefactory import VolumeFactory
44
- from tomwer.gui import icons
45
9
  from tomwer.gui.settings import Y_AXIS_DOWNWARD
46
- from tomwer.gui.visualization.fullscreenplot import FullScreenPlot2D
47
- from tomwer.gui.visualization.reconstructionparameters import ReconstructionParameters
48
- from tomwer.gui.visualization.scanoverview import ScanOverviewWidget
49
- from tomwer.io.utils.utils import get_slice_data
50
-
51
- try:
52
- from PIL import Image
53
- except ImportError: # pragma: no cover
54
- has_PIL = False # pragma: no cover
55
- else:
56
- has_PIL = True
57
- import os
58
- import time
59
-
60
- import numpy
61
- import numpy.lib.npyio
62
-
63
- _logger = logging.getLogger(__name__)
10
+ from tomwer.gui.visualization.imagestack import ImageStack
64
11
 
65
12
 
66
13
  class DataViewer(qt.QMainWindow):
@@ -109,6 +56,7 @@ class DataViewer(qt.QMainWindow):
109
56
  but in our case we cannot afford it as it will take too much memory.
110
57
  So we will disconnect the callback (self._viewer.setCurrentUrlIndex) until the slider is active
111
58
  and reactivate it afterwards
59
+
112
60
  """
113
61
  self._viewer._slider.sigCurrentUrlIndexChanged.disconnect(
114
62
  self._viewer.setCurrentUrlIndex
@@ -186,7 +134,6 @@ class DataViewer(qt.QMainWindow):
186
134
 
187
135
  def _updateDisplay(self):
188
136
  """Update display of the viewer"""
189
- # TODO: add a param visible for frames
190
137
  self._viewer.setSliceReconsParamsVisible(
191
138
  self.getDisplayMode() is _DisplayMode.SLICES
192
139
  )
@@ -195,74 +142,75 @@ class DataViewer(qt.QMainWindow):
195
142
  )
196
143
  if self._scan is None or self._scan() is None:
197
144
  self._viewer.reset()
198
- else:
199
- assert isinstance(self._scan(), TomwerScanBase)
200
- slices_metadata = {}
201
- if self.getDisplayMode() is _DisplayMode.RADIOS:
202
- # update the normalization function from the viewer if needed
203
- if self.getRadioOption() is _RadioMode.NORMALIZED:
204
- url_to_index = {
205
- v.path(): k for k, v in self._scan().projections.items()
206
- }
207
- self._viewer.setNormalizationFct(
208
- self._scan().data_flat_field_correction,
209
- url_indexes=url_to_index,
210
- )
211
- else:
212
- self._viewer.setNormalizationFct(None)
145
+ return
213
146
 
214
- slices = self._scan().projections
215
- elif self.getDisplayMode() is _DisplayMode.SLICES:
216
- self._viewer.setNormalizationFct(None)
217
- if self.getSliceOption() is _SliceMode.LATEST:
218
- slices = self._scan().latest_reconstructions
219
- else:
220
- slices = self._scan().get_reconstructions_urls()
221
- # convert volumes identifiers to DataUrl
222
- slices_urls = []
223
- for identifier in slices:
224
- if isinstance(identifier, TomwerVolumeBase):
225
- volume = identifier
226
- else:
227
- volume = VolumeFactory.create_tomo_object_from_identifier(
228
- identifier=identifier
229
- )
230
- urls = list(volume.browse_data_urls())
231
- try:
232
- metadata = volume.metadata or volume.load_metadata()
233
- except Exception:
234
- metadata = None
235
- slices_urls.extend(urls)
236
- slices_metadata.update({url.path(): metadata for url in urls})
237
-
238
- slices = slices_urls
239
-
240
- elif self.getDisplayMode() is _DisplayMode.DARKS:
241
- self._viewer.setNormalizationFct(None)
242
- slices = self._scan().darks
243
- elif self.getDisplayMode() is _DisplayMode.FLATS:
244
- self._viewer.setNormalizationFct(None)
245
- slices = self._scan().flats
246
- elif self.getDisplayMode() is _DisplayMode.REDUCED_DARKS:
247
- self._viewer.setNormalizationFct(None)
248
- slices = self._scan().load_reduced_darks(return_as_url=True)
249
- elif self.getDisplayMode() is _DisplayMode.REDUCED_FLATS:
250
- self._viewer.setNormalizationFct(None)
251
- slices = self._scan().load_reduced_flats(return_as_url=True)
147
+ assert isinstance(self._scan(), TomwerScanBase)
148
+ slices_metadata = {}
149
+ if self.getDisplayMode() is _DisplayMode.RADIOS:
150
+ # update the normalization function from the viewer if needed
151
+ if self.getRadioOption() is _RadioMode.NORMALIZED:
152
+ url_to_index = {
153
+ v.path(): k for k, v in self._scan().projections.items()
154
+ }
155
+ self._viewer.setNormalizationFct(
156
+ self._scan().data_flat_field_correction,
157
+ url_indexes=url_to_index,
158
+ )
252
159
  else:
253
- raise ValueError("DisplayMode should be RADIOS or SLICES")
254
-
255
- if isinstance(slices, dict):
256
- slices = [
257
- value
258
- for key, value in sorted(slices.items(), key=lambda item: item[0])
259
- ]
260
- if slices is not None and len(slices) > 0:
261
- # TODO: set metadata as well ??? For each url get the metadata as a dict ???
262
- self._viewer.setMetadatas(slices_metadata)
263
- self._viewer.setUrls(slices)
160
+ self._viewer.setNormalizationFct(None)
161
+
162
+ slices = self._scan().projections
163
+ elif self.getDisplayMode() is _DisplayMode.SLICES:
164
+ self._viewer.setNormalizationFct(None)
165
+ if self.getSliceOption() is _SliceMode.LATEST:
166
+ slices = self._scan().latest_reconstructions
264
167
  else:
265
- self._viewer.reset()
168
+ slices = self._scan().get_reconstructed_slices()
169
+ # convert volumes identifiers to DataUrl
170
+ slices_urls = []
171
+ for identifier in slices:
172
+ if isinstance(identifier, TomwerVolumeBase):
173
+ volume = identifier
174
+ else:
175
+ volume = VolumeFactory.create_tomo_object_from_identifier(
176
+ identifier=identifier
177
+ )
178
+ urls = list(volume.browse_data_urls())
179
+ try:
180
+ metadata = volume.metadata or volume.load_metadata()
181
+ except Exception:
182
+ metadata = None
183
+ slices_urls.extend(urls)
184
+ slices_metadata.update({url.path(): metadata for url in urls})
185
+
186
+ slices = slices_urls
187
+
188
+ elif self.getDisplayMode() is _DisplayMode.DARKS:
189
+ self._viewer.setNormalizationFct(None)
190
+ slices = self._scan().darks
191
+ elif self.getDisplayMode() is _DisplayMode.FLATS:
192
+ self._viewer.setNormalizationFct(None)
193
+ slices = self._scan().flats
194
+ elif self.getDisplayMode() is _DisplayMode.REDUCED_DARKS:
195
+ self._viewer.setNormalizationFct(None)
196
+ slices = self._scan().load_reduced_darks(return_as_url=True)
197
+ elif self.getDisplayMode() is _DisplayMode.REDUCED_FLATS:
198
+ self._viewer.setNormalizationFct(None)
199
+ slices = self._scan().load_reduced_flats(return_as_url=True)
200
+ else:
201
+ raise ValueError("DisplayMode should be RADIOS or SLICES")
202
+
203
+ if isinstance(slices, dict):
204
+ slices = [
205
+ value for key, value in sorted(slices.items(), key=lambda item: item[0])
206
+ ]
207
+ if slices is not None and len(slices) > 0:
208
+ # warning: 'setUrls' will clean metadata so we need to first set the urls
209
+ self._viewer.setUrls(slices)
210
+ self._viewer.setSliceMetadata(slices_metadata)
211
+ else:
212
+ self._viewer.reset()
213
+ self._viewer._filterUrlList()
266
214
 
267
215
  def clear(self):
268
216
  self._scan = None
@@ -420,304 +368,3 @@ class DisplayControl(qt.QWidget):
420
368
 
421
369
  def clear(self):
422
370
  self._scanQLE.clear()
423
-
424
-
425
- class ImageStack(_ImageStack):
426
- """
427
- Image stack dedicated to data display.
428
-
429
- It deal for example with data normalization...
430
- """
431
-
432
- def __init__(self, parent, show_overview=True, backend=None):
433
- self._normFct = None
434
- self._url_indexes = None
435
- super().__init__(parent)
436
- self.getPlotWidget().setBackend(backend)
437
-
438
- # tune colormap dialog to have histogram by default
439
- colormapAction = self.getPlotWidget().getColormapAction()
440
- colormapDialog = colormapAction.getColormapDialog()
441
- colormapDialog.getHistogramWidget().setDisplayMode(DisplayMode.HISTOGRAM)
442
- colormapAction.setColormapDialog(colormapDialog)
443
-
444
- self.setUrlLoaderClass(_TomwerUrlLoader)
445
- # hide axis to be display
446
- self._plot.setAxesDisplayed(False)
447
- self._loadSliceParams = False
448
- self._resetZoom = True
449
-
450
- # add dock widget for reconstruction parameters
451
- self._reconsInfoDockWidget = qt.QDockWidget(parent=self)
452
- self._reconsWidgetScrollArea = qt.QScrollArea(self)
453
- self._reconsWidgetScrollArea.setWidgetResizable(True)
454
- self._reconsWidget = ReconstructionParameters(self)
455
- self._reconsWidgetScrollArea.setWidget(self._reconsWidget)
456
- self._reconsInfoDockWidget.setWidget(self._reconsWidgetScrollArea)
457
- self._reconsInfoDockWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
458
- self.addDockWidget(qt.Qt.RightDockWidgetArea, self._reconsInfoDockWidget)
459
-
460
- # add scan overview dock widget
461
- if show_overview:
462
- self._scanOverviewDockerWidget = qt.QDockWidget(parent=self)
463
- self._scanOverviewDockerWidget.setMaximumHeight(300)
464
- self._scanOverviewWidget = ScanOverviewWidget(self)
465
- self._scanOverviewDockerWidget.setWidget(self._scanOverviewWidget)
466
- self._scanOverviewDockerWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
467
- self.addDockWidget(
468
- qt.Qt.RightDockWidgetArea, self._scanOverviewDockerWidget
469
- )
470
- else:
471
- self._scanOverviewWidget = None
472
- self._scanOverviewDockerWidget = None
473
-
474
- # for now hide the "control"
475
- self._urlsTable._toggleButton.hide()
476
-
477
- # add an action to plot the url-image 'full size'
478
- fullScreenIcon = icons.getQIcon("full_screen")
479
- self._fullScreenAction = qt.QAction(fullScreenIcon, "pop up full screen")
480
- self.getPlotWidget().toolBar().addAction(self._fullScreenAction)
481
- self._fullScreenAction.triggered.connect(self._popCurrentImageFullScreen)
482
-
483
- # set up
484
- self.setAutoResetZoom(False)
485
-
486
- def _popCurrentImageFullScreen(self, *args, **kwargs):
487
- new_plot = FullScreenPlot2D()
488
- active_image = self.getPlotWidget().getActiveImage()
489
- if active_image is None or active_image.getData(copy=False) is None:
490
- return
491
- url = self.getCurrentUrl()
492
- window_title = f"Plot of {url.path()}" if url is not None else "Image Plot"
493
-
494
- new_plot.setWindowTitle(window_title)
495
- # reuse the same colormap for conveniance (user modification on it will be applied everywhere)
496
- new_plot.setDefaultColormap(self.getPlotWidget().getDefaultColormap())
497
-
498
- # add the current image
499
- new_plot.addImage(active_image.getData(copy=True))
500
-
501
- new_plot.showFullScreen()
502
-
503
- def setScan(self, scan):
504
- if self._scanOverviewWidget is not None:
505
- self._scanOverviewWidget.setScan(scan=scan)
506
-
507
- def getUrlListDockWidget(self):
508
- return self._tableDockWidget
509
-
510
- def resetZoom(self):
511
- self._plot.resetZoom()
512
-
513
- def setLimits(self, x_min, x_max, y_min, y_max):
514
- self._plot.setLimits(xmin=x_min, ymin=y_min, xmax=x_max, ymax=y_max)
515
-
516
- def getLimits(self):
517
- limits = []
518
- limits.extend(self._plot.getGraphXLimits())
519
- limits.extend(self._plot.getGraphYLimits())
520
- return tuple(limits)
521
-
522
- def setSliceReconsParamsVisible(self, visible):
523
- """show or not information regarding the slice reconstructed"""
524
- self._reconsInfoDockWidget.setVisible(visible)
525
- self._loadSliceParams = visible
526
-
527
- def setScanOverviewVisible(self, visible):
528
- """show or not overview of the scan"""
529
- if self._scanOverviewDockerWidget is not None:
530
- self._scanOverviewDockerWidget.setVisible(visible)
531
-
532
- def setNormalizationFct(self, fct, url_indexes=None):
533
- self._normFct = fct
534
- self._url_indexes = url_indexes
535
-
536
- def _urlLoaded(self) -> None:
537
- """
538
-
539
- :param url: result of DataUrl.path() function
540
- :return:
541
- """
542
- sender = self.sender()
543
- url = sender.url.path()
544
- if self._urlIndexes is not None and url in self._urlIndexes:
545
- data = sender.data
546
- if data is None:
547
- _logger.warning("no data found (is the url valid ?) " + url)
548
- return
549
-
550
- if data.ndim != 2:
551
- if data.ndim == 3:
552
- if data.shape[0] == 1:
553
- # if reconstruction along z
554
- data = data.reshape((data.shape[1], data.shape[2]))
555
- elif data.shape[1] == 1:
556
- # if reconstruction along y
557
- data = data.reshape((data.shape[0], data.shape[2]))
558
- elif data.shape[2] == 1:
559
- # if reconstruction along z
560
- data = data.reshape((data.shape[0], data.shape[1]))
561
- else:
562
- _logger.warning(f"Image Stack only manage 2D data. Url: {url}")
563
- return
564
- else:
565
- _logger.warning(f"Image Stack only manage 2D data. Url: {url}")
566
- return
567
- if self._normFct is None:
568
- self._urlData[url] = data
569
- else:
570
- norm_data = self._normFct(data, index=self._urlIndexes[url])
571
- self._urlData[url] = norm_data
572
-
573
- if self.getCurrentUrl().path() == url:
574
- self._plot.addImage(self._urlData[url])
575
- if hasattr(self, "getWaiterOverlay"):
576
- self.getWaiterOverlay().hide()
577
- else:
578
- self._waitingOverlay.hide()
579
- if self._resetZoom:
580
- self._resetZoom = False
581
- self._plot.resetZoom()
582
-
583
- if sender in self._loadingThreads:
584
- self._loadingThreads.remove(sender)
585
- self.sigLoaded.emit(url)
586
-
587
- def setResetZoomOnNextIteration(self, reset):
588
- self._resetZoom = reset
589
-
590
- def setCurrentUrl(self, url: DataUrl):
591
- if url in ("", None):
592
- url = None
593
- elif isinstance(url, str):
594
- url = DataUrl(path=url)
595
- elif not isinstance(url, DataUrl):
596
- raise TypeError
597
- if url is None:
598
- pass
599
- # FIXME: add a function to clear the metadata widget
600
- elif self._loadSliceParams:
601
- try:
602
- self._reconsWidget.setVolumeMetadata(
603
- self._metadatas.get(url.path(), None)
604
- )
605
- except Exception:
606
- _logger.info(f"Failed to find any metadata for {url.path()}.")
607
- super().setCurrentUrl(url)
608
-
609
- def setUrls(self, urls: list):
610
- _ImageStack.setUrls(self, urls)
611
- listWidget = self._urlsTable._urlsTable
612
- items = []
613
- for i in range(listWidget.count()):
614
- # TODO: do this on the fly
615
- item = listWidget.item(i)
616
- try:
617
- url = DataUrl(path=item.text())
618
- except Exception:
619
- _logger.info(
620
- f"fail to deduce data of last modification for {item.text()}"
621
- )
622
- else:
623
- if os.path.exists(url.file_path()):
624
- lst_m = time.ctime(os.path.getmtime(url.file_path()))
625
- item.setToolTip(f"last modification : {lst_m}")
626
- items.append(listWidget.item(i))
627
-
628
- def setMetadatas(self, metadatas: dict):
629
- """
630
- :param dict metadata: for each url define a dict of the metadata
631
- """
632
- self._metadatas = metadatas
633
-
634
-
635
- class _TomwerUrlLoader(UrlLoader):
636
- """
637
- Thread use to load DataUrl
638
- """
639
-
640
- def run(self):
641
- if self.url.file_path().endswith(".vol"):
642
- self.data = self._load_vol()
643
- elif self.url.scheme() == "tomwer":
644
- if has_PIL:
645
- self.data = numpy.array(Image.open(self.url.file_path()))
646
- if self.url.data_slice() is not None:
647
- self.data = self.data[self.url.data_slice()]
648
- else:
649
- _logger.warning(
650
- "need to install Pillow to read file " + self.url.file_path()
651
- )
652
- self.data = None
653
- else:
654
- try:
655
- self.data = get_slice_data(self.url)
656
- except IOError:
657
- self.data = None
658
- except ValueError:
659
- self.data = None
660
- _logger.warning(
661
- f"Fail to open {self.url.path()}. Maybe the reconstruction failed."
662
- )
663
-
664
- def _load_vol(self):
665
- """
666
- load a .vol file
667
- """
668
- if self.url.file_path().lower().endswith(".vol.info"):
669
- info_file = self.url.file_path()
670
- raw_file = self.url.file_path().replace(".vol.info", ".vol")
671
- else:
672
- assert self.url.file_path().lower().endswith(".vol")
673
- raw_file = self.url.file_path()
674
- info_file = self.url.file_path().replace(".vol", ".vol.info")
675
-
676
- if not os.path.exists(raw_file):
677
- data = None
678
- mess = f"Can't find raw data file {raw_file} associated with {info_file}"
679
- _logger.warning(mess)
680
- elif not os.path.exists(info_file):
681
- mess = f"Can't find info file {info_file} associated with {raw_file}"
682
- _logger.warning(mess)
683
- data = None
684
- else:
685
- shape = get_vol_file_shape(info_file)
686
- if None in shape:
687
- _logger.warning(f"Fail to retrieve data shape for {info_file}.")
688
- data = None
689
- else:
690
- try:
691
- numpy.zeros(shape)
692
- except MemoryError:
693
- data = None
694
- _logger.warning(
695
- f"Raw file %s is too large for being read {raw_file}"
696
- )
697
- else:
698
- data = numpy.fromfile(
699
- raw_file, dtype=numpy.float32, count=-1, sep=""
700
- )
701
- try:
702
- data = data.reshape(shape)
703
- except ValueError:
704
- _logger.warning(
705
- f"unable to fix shape for raw file {raw_file}. Look for information in {info_file}"
706
- )
707
- try:
708
- sqr = int(numpy.sqrt(len(data)))
709
- shape = (1, sqr, sqr)
710
- data = data.reshape(shape)
711
- except ValueError:
712
- _logger.info(
713
- f"deduction of shape size for {raw_file} failed"
714
- )
715
- data = None
716
- else:
717
- _logger.warning(
718
- f"try deducing shape size for {raw_file} might be an incorrect interpretation"
719
- )
720
- if self.url.data_slice() is None:
721
- return data
722
- else:
723
- return data[self.url.data_slice()]