tomwer 1.3.26__py3-none-any.whl → 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. orangecontrib/tomwer/orange/managedprocess.py +1 -29
  2. orangecontrib/tomwer/orange/settings.py +2 -28
  3. orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
  4. orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
  5. orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
  6. orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
  7. orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
  8. orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
  9. orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
  10. orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
  11. orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
  12. orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
  13. orangecontrib/tomwer/widgets/__init__.py +3 -5
  14. orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
  15. orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
  16. orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
  17. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
  18. orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
  19. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
  20. orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
  21. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
  22. orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
  23. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
  24. orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
  25. orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
  26. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
  27. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
  28. orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
  29. orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
  30. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
  31. orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
  32. orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
  33. orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
  34. orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
  35. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
  36. orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
  37. orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
  38. orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
  39. orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
  40. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
  41. orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
  42. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
  43. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
  44. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
  45. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
  46. orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
  47. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
  48. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
  49. orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
  50. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
  51. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
  52. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
  53. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
  54. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
  55. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
  56. orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
  57. orangecontrib/tomwer/widgets/utils.py +2 -29
  58. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
  59. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
  60. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
  61. orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
  62. orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
  63. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
  64. orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
  65. tomwer/__init__.py +3 -28
  66. tomwer/__main__.py +8 -4
  67. tomwer/app/__init__.py +2 -0
  68. tomwer/app/axis.py +8 -10
  69. tomwer/app/canvas.py +23 -29
  70. tomwer/app/canvas_launcher/config.py +14 -102
  71. tomwer/app/canvas_launcher/environ.py +5 -8
  72. tomwer/app/canvas_launcher/mainwindow.py +175 -69
  73. tomwer/app/canvas_launcher/splash.py +1 -3
  74. tomwer/app/canvas_launcher/utils.py +47 -0
  75. tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
  76. tomwer/app/diffframe.py +2 -0
  77. tomwer/app/imagekeyeditor.py +2 -1
  78. tomwer/app/imagekeyupgrader.py +2 -0
  79. tomwer/app/multicor.py +5 -2
  80. tomwer/app/multipag.py +16 -5
  81. tomwer/app/nabuapp.py +2 -1
  82. tomwer/app/nxtomoeditor.py +17 -12
  83. tomwer/app/patchrawdarkflat.py +2 -0
  84. tomwer/app/radiostack.py +3 -2
  85. tomwer/app/reducedarkflat.py +3 -0
  86. tomwer/app/samplemoved.py +2 -0
  87. tomwer/app/scanviewer.py +2 -0
  88. tomwer/app/sinogramviewer.py +2 -0
  89. tomwer/app/slicestack.py +11 -13
  90. tomwer/app/stitching/common.py +431 -0
  91. tomwer/app/stopdatalistener.py +3 -0
  92. tomwer/app/ystitching.py +26 -0
  93. tomwer/app/zstitching.py +8 -363
  94. tomwer/core/__init__.py +2 -28
  95. tomwer/core/cluster/__init__.py +3 -0
  96. tomwer/core/cluster/cluster.py +10 -26
  97. tomwer/core/futureobject.py +17 -43
  98. tomwer/core/log/__init__.py +2 -0
  99. tomwer/core/log/processlog.py +0 -28
  100. tomwer/core/process/cluster/supervisor.py +52 -34
  101. tomwer/core/process/conditions/filters.py +3 -28
  102. tomwer/core/process/control/datalistener/datalistener.py +7 -75
  103. tomwer/core/process/control/datalistener/rpcserver.py +8 -38
  104. tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
  105. tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
  106. tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
  107. tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
  108. tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
  109. tomwer/core/process/control/datawatcher/status.py +1 -26
  110. tomwer/core/process/control/emailnotifier.py +11 -23
  111. tomwer/core/process/control/nxtomoconcatenate.py +20 -18
  112. tomwer/core/process/control/nxtomomill.py +9 -44
  113. tomwer/core/process/control/scanlist.py +0 -27
  114. tomwer/core/process/control/scantransfer.py +15 -13
  115. tomwer/core/process/control/scanvalidator.py +4 -30
  116. tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
  117. tomwer/core/process/control/timer.py +1 -27
  118. tomwer/core/process/control/tomoobjseries.py +12 -0
  119. tomwer/core/process/drac/binning.py +37 -0
  120. tomwer/core/process/drac/dracbase.py +170 -0
  121. tomwer/core/process/drac/gallery.py +109 -0
  122. tomwer/core/process/drac/output.py +12 -0
  123. tomwer/core/process/drac/processeddataset.py +147 -0
  124. tomwer/core/process/drac/publish.py +118 -0
  125. tomwer/core/process/drac/rawdataset.py +142 -0
  126. tomwer/core/process/drac/tests/test_gallery.py +71 -0
  127. tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
  128. tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
  129. tomwer/core/process/edit/darkflatpatch.py +1 -28
  130. tomwer/core/process/edit/imagekeyeditor.py +4 -32
  131. tomwer/core/process/edit/nxtomoeditor.py +307 -0
  132. tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
  133. tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
  134. tomwer/core/process/output.py +9 -2
  135. tomwer/core/process/reconstruction/__init__.py +0 -26
  136. tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
  137. tomwer/core/process/reconstruction/axis/axis.py +47 -804
  138. tomwer/core/process/reconstruction/axis/mode.py +89 -25
  139. tomwer/core/process/reconstruction/axis/params.py +131 -283
  140. tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
  141. tomwer/core/process/reconstruction/axis/side.py +8 -0
  142. tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
  143. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
  144. tomwer/core/process/reconstruction/darkref/params.py +1 -28
  145. tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
  146. tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
  147. tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
  148. tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
  149. tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
  150. tomwer/core/process/reconstruction/nabu/plane.py +10 -0
  151. tomwer/core/process/reconstruction/nabu/settings.py +1 -28
  152. tomwer/core/process/reconstruction/nabu/target.py +0 -28
  153. tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
  154. tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
  155. tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
  156. tomwer/core/process/reconstruction/nabu/utils.py +11 -60
  157. tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
  158. tomwer/core/process/reconstruction/normalization/params.py +3 -35
  159. tomwer/core/process/reconstruction/output.py +14 -19
  160. tomwer/core/process/reconstruction/paramsbase.py +4 -33
  161. tomwer/core/process/reconstruction/saaxis/params.py +5 -33
  162. tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
  163. tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
  164. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
  165. tomwer/core/process/reconstruction/scores/params.py +9 -39
  166. tomwer/core/process/reconstruction/scores/scores.py +10 -42
  167. tomwer/core/process/reconstruction/tests/__init__.py +0 -0
  168. tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
  169. tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
  170. tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
  171. tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
  172. tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
  173. tomwer/core/process/reconstruction/utils/cor.py +8 -4
  174. tomwer/core/process/script/python.py +1 -27
  175. tomwer/core/process/script/tests/test_script.py +41 -0
  176. tomwer/core/process/stitching/metadataholder.py +5 -4
  177. tomwer/core/process/stitching/nabustitcher.py +35 -5
  178. tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
  179. tomwer/core/process/task.py +20 -63
  180. tomwer/core/process/tests/__init__.py +0 -0
  181. tomwer/core/process/{test → tests}/test_conditions.py +1 -28
  182. tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
  183. tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
  184. tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
  185. tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
  186. tomwer/core/process/{test → tests}/test_nabu.py +2 -33
  187. tomwer/core/process/{test → tests}/test_normalization.py +1 -26
  188. tomwer/core/process/{test → tests}/test_timer.py +1 -27
  189. tomwer/core/process/utils.py +2 -31
  190. tomwer/core/process/visualization/dataviewer.py +1 -26
  191. tomwer/core/process/visualization/diffviewer.py +1 -26
  192. tomwer/core/process/visualization/imagestackviewer.py +0 -26
  193. tomwer/core/process/visualization/radiostack.py +0 -26
  194. tomwer/core/process/visualization/samplemoved.py +0 -28
  195. tomwer/core/process/visualization/sinogramviewer.py +0 -27
  196. tomwer/core/process/visualization/slicestack.py +0 -28
  197. tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
  198. tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
  199. tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
  200. tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
  201. tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
  202. tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
  203. tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
  204. tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
  205. tomwer/core/process/visualization/volumeviewer.py +0 -29
  206. tomwer/core/scan/__init__.py +3 -27
  207. tomwer/core/scan/blissscan.py +5 -34
  208. tomwer/core/scan/edfscan.py +19 -53
  209. tomwer/core/scan/hdf5scan.py +2 -2
  210. tomwer/core/scan/nxtomoscan.py +48 -54
  211. tomwer/core/scan/scanbase.py +107 -203
  212. tomwer/core/scan/scanfactory.py +11 -41
  213. tomwer/core/scan/tests/__init__.py +0 -0
  214. tomwer/core/scan/tests/test_edf.py +25 -0
  215. tomwer/core/scan/tests/test_future_scan.py +35 -0
  216. tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
  217. tomwer/core/scan/tests/test_process_registration.py +64 -0
  218. tomwer/core/settings.py +18 -40
  219. tomwer/core/tests/__init__.py +0 -0
  220. tomwer/core/tests/test_scanutils.py +26 -0
  221. tomwer/core/{test → tests}/test_utils.py +1 -28
  222. tomwer/core/tomwer_object.py +4 -0
  223. tomwer/core/utils/__init__.py +2 -0
  224. tomwer/core/utils/char.py +0 -28
  225. tomwer/core/utils/deprecation.py +12 -38
  226. tomwer/core/utils/dictutils.py +1 -3
  227. tomwer/core/utils/ftseriesutils.py +1 -27
  228. tomwer/core/utils/gpu.py +0 -28
  229. tomwer/core/utils/image.py +8 -39
  230. tomwer/core/utils/locker.py +1 -28
  231. tomwer/core/utils/logconfig.py +0 -27
  232. tomwer/core/utils/normalization.py +4 -31
  233. tomwer/core/utils/nxtomoutils.py +8 -38
  234. tomwer/core/utils/resource.py +0 -26
  235. tomwer/core/utils/scanutils.py +23 -52
  236. tomwer/core/utils/slurm.py +7 -30
  237. tomwer/core/utils/spec.py +6 -6
  238. tomwer/core/utils/tests/__init__.py +0 -0
  239. tomwer/core/utils/tests/test_image.py +30 -0
  240. tomwer/core/utils/tests/test_nxtomo.py +38 -0
  241. tomwer/core/utils/tests/test_scan_utils.py +46 -0
  242. tomwer/core/utils/tests/test_time.py +6 -0
  243. tomwer/core/utils/threads.py +0 -26
  244. tomwer/core/utils/time.py +0 -27
  245. tomwer/core/volume/__init__.py +4 -0
  246. tomwer/core/volume/edfvolume.py +1 -28
  247. tomwer/core/volume/hdf5volume.py +1 -28
  248. tomwer/core/volume/jp2kvolume.py +1 -27
  249. tomwer/core/volume/rawvolume.py +1 -28
  250. tomwer/core/volume/tests/test_volumes.py +21 -0
  251. tomwer/core/volume/tiffvolume.py +1 -28
  252. tomwer/core/volume/volumebase.py +5 -0
  253. tomwer/core/volume/volumefactory.py +7 -33
  254. tomwer/gui/__init__.py +0 -28
  255. tomwer/gui/cluster/__init__.py +2 -0
  256. tomwer/gui/cluster/slurm.py +297 -95
  257. tomwer/gui/cluster/supervisor.py +1 -27
  258. tomwer/gui/cluster/tests/__init__.py +0 -0
  259. tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
  260. tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
  261. tomwer/gui/conditions/__init__.py +2 -0
  262. tomwer/gui/conditions/filter.py +1 -26
  263. tomwer/gui/configuration/__init__.py +2 -0
  264. tomwer/gui/control/__init__.py +2 -0
  265. tomwer/gui/control/actions.py +2 -28
  266. tomwer/gui/control/datadiscovery.py +4 -3
  267. tomwer/gui/control/datalist.py +64 -69
  268. tomwer/gui/control/datalistener.py +1 -39
  269. tomwer/gui/control/datareacheractions.py +1 -28
  270. tomwer/gui/control/datatransfert.py +2 -29
  271. tomwer/gui/control/datavalidator.py +3 -37
  272. tomwer/gui/control/datawatcher/__init__.py +0 -28
  273. tomwer/gui/control/datawatcher/configuration.py +1 -28
  274. tomwer/gui/control/datawatcher/datawatcher.py +3 -32
  275. tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
  276. tomwer/gui/control/history.py +5 -35
  277. tomwer/gui/control/nxtomomill.py +3 -30
  278. tomwer/gui/control/observations.py +61 -55
  279. tomwer/gui/control/reducedarkflatselector.py +24 -20
  280. tomwer/gui/control/scanselectorwidget.py +2 -28
  281. tomwer/gui/control/selectorwidgetbase.py +17 -17
  282. tomwer/gui/control/series/__init__.py +0 -0
  283. tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
  284. tomwer/gui/control/series/serieswaiter.py +0 -0
  285. tomwer/gui/control/series/test/test_creator.py +424 -0
  286. tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
  287. tomwer/gui/control/singletomoobj.py +1 -1
  288. tomwer/gui/control/tests/__init__.py +0 -0
  289. tomwer/gui/control/tests/test_datalist.py +47 -0
  290. tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
  291. tomwer/gui/control/tests/test_datavalidator.py +27 -0
  292. tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
  293. tomwer/gui/control/tests/test_process_manager.py +38 -0
  294. tomwer/gui/control/tests/test_scan_observations.py +23 -0
  295. tomwer/gui/control/tests/test_scanselector.py +42 -0
  296. tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
  297. tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
  298. tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
  299. tomwer/gui/control/volumeselectorwidget.py +2 -30
  300. tomwer/gui/dataportal/__init__.py +2 -0
  301. tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
  302. tomwer/gui/dataportal/gallery.py +133 -0
  303. tomwer/gui/dataportal/outputformat.py +0 -0
  304. tomwer/gui/dataportal/publish.py +96 -0
  305. tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
  306. tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
  307. tomwer/gui/debugtools/__init__.py +2 -0
  308. tomwer/gui/debugtools/datasetgenerator.py +1 -30
  309. tomwer/gui/debugtools/objectinspector.py +1 -29
  310. tomwer/gui/dialog/QDataDialog.py +89 -0
  311. tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
  312. tomwer/gui/dialog/__init__.py +1 -0
  313. tomwer/gui/edit/__init__.py +2 -0
  314. tomwer/gui/edit/dkrfpatch.py +52 -87
  315. tomwer/gui/edit/imagekeyeditor.py +18 -54
  316. tomwer/gui/edit/nxtomoeditor.py +113 -300
  317. tomwer/gui/edit/nxtomowarmer.py +3 -2
  318. tomwer/gui/edit/tests/__init__.py +0 -0
  319. tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
  320. tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
  321. tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
  322. tomwer/gui/fonts.py +5 -0
  323. tomwer/gui/icons.py +28 -66
  324. tomwer/gui/illustrations.py +4 -34
  325. tomwer/gui/imagefromfile.py +5 -30
  326. tomwer/gui/metadataloader.py +36 -0
  327. tomwer/gui/qconfigfile.py +3 -0
  328. tomwer/gui/qlefilesystem.py +3 -0
  329. tomwer/gui/reconstruction/__init__.py +2 -0
  330. tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
  331. tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
  332. tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
  333. tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
  334. tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
  335. tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
  336. tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
  337. tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
  338. tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
  339. tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
  340. tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
  341. tomwer/gui/reconstruction/axis/__init__.py +2 -2
  342. tomwer/gui/reconstruction/darkref/__init__.py +0 -27
  343. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
  344. tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
  345. tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
  346. tomwer/gui/reconstruction/nabu/check.py +7 -33
  347. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
  348. tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
  349. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
  350. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
  351. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
  352. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
  353. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
  354. tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
  355. tomwer/gui/reconstruction/nabu/platform.py +94 -0
  356. tomwer/gui/reconstruction/nabu/slices.py +81 -45
  357. tomwer/gui/reconstruction/nabu/slurm.py +1 -27
  358. tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
  359. tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
  360. tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
  361. tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
  362. tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
  363. tomwer/gui/reconstruction/nabu/volume.py +62 -90
  364. tomwer/gui/reconstruction/normalization/intensity.py +5 -32
  365. tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
  366. tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
  367. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
  368. tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
  369. tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
  370. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
  371. tomwer/gui/reconstruction/scores/control.py +2 -30
  372. tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
  373. tomwer/gui/reconstruction/tests/__init__.py +0 -0
  374. tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
  375. tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
  376. tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
  377. tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
  378. tomwer/gui/samplemoved/__init__.py +2 -30
  379. tomwer/gui/samplemoved/selectiontable.py +3 -33
  380. tomwer/gui/settings.py +7 -0
  381. tomwer/gui/stackplot.py +33 -661
  382. tomwer/gui/stacks.py +261 -135
  383. tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
  384. tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
  385. tomwer/gui/stitching/StitchingWindow.py +586 -0
  386. tomwer/gui/stitching/__init__.py +2 -0
  387. tomwer/gui/stitching/alignment.py +90 -0
  388. tomwer/gui/stitching/axisorderedlist.py +44 -34
  389. tomwer/gui/stitching/config/axisparams.py +25 -11
  390. tomwer/gui/stitching/config/output.py +6 -5
  391. tomwer/gui/stitching/config/positionoveraxis.py +313 -51
  392. tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
  393. tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
  394. tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
  395. tomwer/gui/stitching/normalization.py +1 -0
  396. tomwer/gui/stitching/preview.py +59 -0
  397. tomwer/gui/stitching/singleaxis.py +57 -0
  398. tomwer/gui/stitching/stitchandbackground.py +3 -2
  399. tomwer/gui/stitching/stitching_preview.py +44 -36
  400. tomwer/gui/stitching/stitching_raw.py +5 -3
  401. tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
  402. tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
  403. tomwer/gui/stitching/tests/test_normalization.py +27 -0
  404. tomwer/gui/stitching/tests/test_preview.py +68 -0
  405. tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
  406. tomwer/gui/stitching/tests/utils.py +92 -0
  407. tomwer/gui/stitching/utils.py +14 -0
  408. tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
  409. tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
  410. tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
  411. tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
  412. tomwer/gui/tests/__init__.py +0 -0
  413. tomwer/gui/tests/test_axis_gui.py +43 -0
  414. tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
  415. tomwer/gui/utils/RangeWidget.py +44 -0
  416. tomwer/gui/utils/buttons.py +4 -3
  417. tomwer/gui/utils/completer.py +2 -33
  418. tomwer/gui/utils/flow.py +11 -40
  419. tomwer/gui/utils/gpu.py +60 -0
  420. tomwer/gui/utils/illustrations.py +1 -26
  421. tomwer/gui/utils/inputwidget.py +35 -73
  422. tomwer/gui/utils/lineselector/lineselector.py +9 -46
  423. tomwer/gui/utils/loadingmode.py +81 -0
  424. tomwer/gui/utils/qt_utils.py +9 -0
  425. tomwer/gui/utils/sandboxes.py +1 -26
  426. tomwer/gui/utils/scandescription.py +2 -31
  427. tomwer/gui/utils/scrollarea.py +6 -55
  428. tomwer/gui/utils/slider.py +4 -28
  429. tomwer/gui/utils/splashscreen.py +0 -28
  430. tomwer/gui/utils/step.py +14 -13
  431. tomwer/gui/utils/tests/test_completer.py +41 -0
  432. tomwer/gui/utils/tests/test_line_selector.py +21 -0
  433. tomwer/gui/utils/tests/test_splashscreen.py +8 -0
  434. tomwer/gui/utils/tests/test_vignettes.py +68 -0
  435. tomwer/gui/utils/unitsystem.py +15 -69
  436. tomwer/gui/utils/utils.py +4 -5
  437. tomwer/gui/utils/vignettes.py +10 -41
  438. tomwer/gui/utils/waiterthread.py +0 -26
  439. tomwer/gui/visualization/__init__.py +2 -0
  440. tomwer/gui/visualization/dataviewer.py +68 -421
  441. tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
  442. tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
  443. tomwer/gui/visualization/fullscreenplot.py +5 -5
  444. tomwer/gui/visualization/imagestack.py +403 -0
  445. tomwer/gui/visualization/nxtomometadata.py +0 -4
  446. tomwer/gui/visualization/reconstructionparameters.py +14 -32
  447. tomwer/gui/visualization/scanoverview.py +33 -66
  448. tomwer/gui/visualization/sinogramviewer.py +2 -28
  449. tomwer/gui/visualization/test/__init__.py +0 -28
  450. tomwer/gui/visualization/test/test_dataviewer.py +1 -28
  451. tomwer/gui/visualization/test/test_diffviewer.py +1 -28
  452. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
  453. tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
  454. tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
  455. tomwer/gui/visualization/test/test_stacks.py +184 -115
  456. tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
  457. tomwer/gui/visualization/tomoobjoverview.py +2 -2
  458. tomwer/gui/visualization/volumeoverview.py +3 -2
  459. tomwer/gui/visualization/volumeviewer.py +47 -43
  460. tomwer/io/__init__.py +2 -0
  461. tomwer/io/utils/h5pyutils.py +1 -27
  462. tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
  463. tomwer/io/utils/test/test_utils.py +67 -0
  464. tomwer/io/utils/utils.py +2 -31
  465. tomwer/resources/__init__.py +13 -33
  466. tomwer/resources/gui/icons/edit_downstream.svg +114 -0
  467. tomwer/resources/gui/icons/edit_upstream.svg +112 -0
  468. tomwer/resources/gui/icons/free_edition.svg +23 -0
  469. tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
  470. tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
  471. tomwer/resources/gui/icons/search.png +0 -0
  472. tomwer/resources/gui/icons/search.svg +23 -0
  473. tomwer/resources/gui/icons/warning.png +0 -0
  474. tomwer/synctools/__init__.py +2 -0
  475. tomwer/synctools/axis.py +1 -27
  476. tomwer/synctools/darkref.py +1 -26
  477. tomwer/synctools/datalistener.py +1 -27
  478. tomwer/synctools/datatransfert.py +2 -27
  479. tomwer/synctools/imageloaderthread.py +1 -28
  480. tomwer/synctools/rsyncmanager.py +1 -25
  481. tomwer/synctools/saaxis.py +1 -26
  482. tomwer/synctools/sadeltabeta.py +1 -26
  483. tomwer/synctools/stacks/control/datalistener.py +1 -26
  484. tomwer/synctools/stacks/processingstack.py +4 -33
  485. tomwer/synctools/stacks/reconstruction/axis.py +6 -53
  486. tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
  487. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
  488. tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
  489. tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
  490. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
  491. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
  492. tomwer/synctools/tests/__init__.py +0 -0
  493. tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
  494. tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
  495. tomwer/synctools/utils/scanstages.py +2 -31
  496. tomwer/tests/__init__.py +1 -0
  497. tomwer/tests/app/test_stitching.py +95 -0
  498. tomwer/tests/datasets.py +1 -5
  499. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
  500. tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
  501. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
  502. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
  503. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
  504. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
  505. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
  506. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
  507. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
  508. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
  509. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
  510. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
  511. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
  512. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
  513. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
  514. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
  515. tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
  516. orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
  517. tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
  518. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
  519. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
  520. tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
  521. tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
  522. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
  523. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
  524. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
  525. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
  526. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
  527. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
  528. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
  529. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
  530. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
  531. tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
  532. tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
  533. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
  534. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
  535. tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
  536. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
  537. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
  538. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
  539. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
  540. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
  541. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
  542. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
  543. tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
  544. tomwer/tests/test_ewoks/test_conversion.py +104 -0
  545. tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
  546. tomwer/tests/test_ewoks/test_workflows.py +138 -0
  547. tomwer/utils.py +11 -39
  548. tomwer/version.py +2 -2
  549. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
  550. tomwer-1.4.0.dist-info/METADATA +337 -0
  551. tomwer-1.4.0.dist-info/RECORD +912 -0
  552. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
  553. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
  554. orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
  555. orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
  556. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
  557. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
  558. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
  559. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
  560. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
  561. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  562. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
  563. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  564. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
  565. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
  566. orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
  567. orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
  568. tomwer/core/log/logger.py +0 -130
  569. tomwer/core/process/control/test/test_volume_link.py +0 -74
  570. tomwer/core/process/control/tomoobjserie.py +0 -12
  571. tomwer/core/process/control/volumesymlink.py +0 -200
  572. tomwer/core/process/icat/createscreenshots.py +0 -100
  573. tomwer/core/process/icat/gallery.py +0 -377
  574. tomwer/core/process/icat/icatbase.py +0 -36
  575. tomwer/core/process/icat/publish.py +0 -228
  576. tomwer/core/process/icat/screenshots.py +0 -27
  577. tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
  578. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
  579. tomwer/core/process/test/test_axis.py +0 -309
  580. tomwer/core/process/visualization/liveslice.py +0 -6
  581. tomwer/core/progress.py +0 -100
  582. tomwer/core/scan/test/test_edf.py +0 -53
  583. tomwer/core/scan/test/test_future_scan.py +0 -61
  584. tomwer/core/scan/test/test_h5.py +0 -96
  585. tomwer/core/scan/test/test_process_registration.py +0 -109
  586. tomwer/core/test/test_scanutils.py +0 -53
  587. tomwer/gui/control/emailnotifier.py +0 -174
  588. tomwer/gui/control/serie/seriewaiter.py +0 -28
  589. tomwer/gui/control/test/__init__.py +0 -28
  590. tomwer/gui/control/test/test_datalist.py +0 -96
  591. tomwer/gui/control/test/test_datavalidator.py +0 -54
  592. tomwer/gui/control/test/test_email.py +0 -35
  593. tomwer/gui/control/test/test_process_manager.py +0 -65
  594. tomwer/gui/control/test/test_scanselector.py +0 -67
  595. tomwer/gui/edit/test/__init__.py +0 -28
  596. tomwer/gui/icat/gallery.py +0 -214
  597. tomwer/gui/icat/publish.py +0 -187
  598. tomwer/gui/reconstruction/axis/axis.py +0 -733
  599. tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
  600. tomwer/gui/stitching/stitching.py +0 -1392
  601. tomwer/gui/test/__init__.py +0 -28
  602. tomwer/gui/test/test_axis_gui.py +0 -34
  603. tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
  604. tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
  605. tomwer/third_part/WaitingOverlay.py +0 -110
  606. tomwer-1.3.26-py3.11-nspkg.pth +0 -1
  607. tomwer-1.3.26.dist-info/METADATA +0 -292
  608. tomwer-1.3.26.dist-info/RECORD +0 -785
  609. tomwer-1.3.26.dist-info/namespace_packages.txt +0 -1
  610. /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
  611. {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
  612. {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
  613. /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
  614. {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
  615. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
  616. /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
  617. {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
  618. {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
  619. {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
  620. {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
  621. {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
  622. {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
  623. {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
  624. /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
  625. /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
  626. /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
  627. /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
  628. /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
  629. /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
  630. /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
  631. /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
  632. /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
  633. /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
  634. /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
  635. /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
  636. /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
  637. {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
  638. {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,41 +1,12 @@
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
-
25
-
26
- __authors__ = ["H.Payno"]
27
- __license__ = "MIT"
28
- __date__ = "09/08/2018"
29
-
1
+ from __future__ import annotations
30
2
 
31
3
  import io
32
4
  import json
33
5
  import logging
34
6
  import os
35
- import typing
36
7
  from glob import glob
37
- from typing import Optional
38
8
  import functools
9
+ from typing import Iterable
39
10
 
40
11
  import numpy
41
12
  from silx.io.url import DataUrl
@@ -46,14 +17,15 @@ from tomoscan.identifier import VolumeIdentifier
46
17
  from tomoscan.normalization import IntensityNormalization
47
18
  from tomoscan.volumebase import VolumeBase
48
19
  from tomoscan.identifier import BaseIdentifier
20
+ from tomoscan.esrf.volume.utils import guess_volumes
49
21
 
50
22
  from tomwer.core.tomwer_object import TomwerObject
51
23
  from tomwer.core.utils.ftseriesutils import orderFileByLastLastModification
52
24
  from tomwer.core.utils.locker import FileLockerManager
53
- from tomwer.core.volume.edfvolume import EDFVolume
54
- from tomwer.core.volume.hdf5volume import HDF5Volume
55
- from tomwer.core.volume.jp2kvolume import JP2KVolume
56
- from tomwer.core.volume.tiffvolume import TIFFVolume
25
+ from tomwer.io.utils.raw_and_processed_data import (
26
+ to_raw_data_path,
27
+ to_processed_data_path,
28
+ )
57
29
 
58
30
  logger = logging.getLogger(__name__)
59
31
 
@@ -111,6 +83,7 @@ class TomwerScanBase(TomwerObject):
111
83
  self._latest_vol_reconstructions = []
112
84
  """list of url related to latest volume reconstruction from nabu"""
113
85
  self._reconstruction_paths = set()
86
+ """set of paths containing reconstructions of the scan. Make sure we have an entry point for it"""
114
87
  self._proposal_name = None
115
88
 
116
89
  def _clear_heavy_cache(self):
@@ -120,7 +93,7 @@ class TomwerScanBase(TomwerObject):
120
93
  pass
121
94
 
122
95
  @property
123
- def working_directory(self) -> Optional[str]:
96
+ def working_directory(self) -> str | None:
124
97
  """
125
98
  working directory to use for this scan (for launching reconstruction for example)
126
99
  """
@@ -149,7 +122,7 @@ class TomwerScanBase(TomwerObject):
149
122
  def _flat_field_correction(
150
123
  self,
151
124
  data,
152
- index_proj: typing.Union[int, None],
125
+ index_proj: int | None,
153
126
  dark,
154
127
  flat1,
155
128
  flat2,
@@ -160,7 +133,8 @@ class TomwerScanBase(TomwerObject):
160
133
  compute flat field correction for a provided data from is index
161
134
  one dark and two flats (require also indexes)
162
135
  """
163
- assert type(data) is numpy.ndarray
136
+ if not isinstance(data, numpy.ndarray):
137
+ raise TypeError("data is expected to be an instance of numpy.ndarray")
164
138
  can_process = True
165
139
 
166
140
  if dark is None:
@@ -178,6 +152,8 @@ class TomwerScanBase(TomwerObject):
178
152
  if self._notify_ffc_rsc_missing:
179
153
  logger.warning("cannot make flat field correction, flat not found")
180
154
  can_process = False
155
+ elif not isinstance(flat1, numpy.ndarray):
156
+ raise TypeError("flat1 is expected to be an instance of numpy.ndarray")
181
157
  else:
182
158
  if flat1.ndim != 2:
183
159
  logger.error(
@@ -281,15 +257,15 @@ class TomwerScanBase(TomwerObject):
281
257
  def projections_with_angle(self):
282
258
  raise NotImplementedError("Base class")
283
259
 
284
- def scan_dir_name(self) -> Optional[str]:
260
+ def scan_dir_name(self) -> str | None:
285
261
  """return name of the directory containing the acquisition"""
286
262
  raise NotImplementedError("Base class")
287
263
 
288
- def scan_basename(self) -> Optional[str]:
264
+ def scan_basename(self) -> str | None:
289
265
  """return basename of the directory containing the acquisition"""
290
266
  raise NotImplementedError("Base class")
291
267
 
292
- def scan_parent_dir_basename(self) -> Optional[str]:
268
+ def scan_parent_dir_basename(self) -> str | None:
293
269
  """return parent basename of the directory containing the acquisition"""
294
270
  raise NotImplementedError("Base class")
295
271
 
@@ -302,18 +278,7 @@ class TomwerScanBase(TomwerObject):
302
278
  @functools.lru_cache(maxsize=3)
303
279
  def get_opposite_projections(self, mode) -> tuple:
304
280
  """
305
- Return the radios for axis calculation and the requested mode.
306
-
307
- :param: angles we want to use for COR calculation. Can be 0-180,
308
- 90-180 or manual. If manual will return the 'most' appropriate
309
- :type: CorAngleMode
310
- :param nearest: if True then, pick the closest angle from the requested
311
- one. If False, return (None, None) if the the angles
312
- does not exists.
313
- :type: bool
314
- :return: couple of `opposite` radios that can be used for axis
315
- calculation.
316
- :rtype: tuple(Optional[AxisResource], Optional[AxisResource])
281
+ Return the two best opposite projections for the required mode.
317
282
  """
318
283
  radios_with_angle = self.projections_with_angle()
319
284
  angles = numpy.array(
@@ -325,7 +290,7 @@ class TomwerScanBase(TomwerObject):
325
290
  )
326
291
  )
327
292
 
328
- from ..process.reconstruction.axis.anglemode import CorAngleMode
293
+ from tomwer.core.process.reconstruction.axis.anglemode import CorAngleMode
329
294
  from ..process.reconstruction.axis.params import (
330
295
  AxisResource,
331
296
  ) # avoid cyclic import
@@ -356,28 +321,22 @@ class TomwerScanBase(TomwerObject):
356
321
  nearest_c1 = find_nearest(angles=angles, angle=couples[0])
357
322
  nearest_c2 = find_nearest(angles=angles, angle=couples[1])
358
323
  if nearest_c1 is not None and nearest_c2 is not None:
359
- radio_0 = AxisResource(radios_with_angle[nearest_c1])
360
- radio_1 = AxisResource(radios_with_angle[nearest_c2])
361
- return radio_0, radio_1
324
+ return (
325
+ AxisResource(radios_with_angle[nearest_c1], angle=nearest_c1),
326
+ AxisResource(radios_with_angle[nearest_c2], angle=nearest_c2),
327
+ )
362
328
  else:
363
329
  return None, None
364
330
 
365
- def data_flat_field_correction(self, data, index=None):
331
+ def data_flat_field_correction(
332
+ self, data: numpy.ndarray, index: int | None = None
333
+ ) -> numpy.ndarray:
366
334
  """Apply flat field correction on the given data
367
335
 
368
- :param numpy.ndarray data: the data to apply correction on
369
- :param Uion[int, None] index: index of the data in the acquisition
336
+ :param data: the data to apply correction on
337
+ :param index: index of the data in the acquisition
370
338
  sequence
371
339
  :return: corrected data
372
- :rtype: numpy.ndarray
373
- """
374
- raise NotImplementedError("Base class")
375
-
376
- def getReconsParamList(self):
377
- """
378
-
379
- :return: reconstruction parameters
380
- :rtype: ReconsParamList
381
340
  """
382
341
  raise NotImplementedError("Base class")
383
342
 
@@ -496,10 +455,10 @@ class TomwerScanBase(TomwerObject):
496
455
  def equal(self, other):
497
456
  """
498
457
 
499
- :param :class:`.ScanBase` other: instance to compare with
458
+ :param other: instance to compare with
500
459
  :return: True if instance are equivalent
501
- :note: we cannot use the __eq__ function because this object need to be
502
- pickable
460
+
461
+ :note: we cannot use the __eq__ function because this object need to be picklable
503
462
  """
504
463
  return (
505
464
  isinstance(other, self.__class__)
@@ -509,19 +468,19 @@ class TomwerScanBase(TomwerObject):
509
468
  and self.path == other.path # pylint: disable=E1101
510
469
  )
511
470
 
512
- def get_sinogram(self, line, subsampling=1, norm_method=None, **kwargs):
471
+ def get_sinogram(
472
+ self, line: int, subsampling: int = 1, norm_method=None, **kwargs
473
+ ) -> numpy.ndarray:
513
474
  """
514
475
  extract the sinogram from projections
515
476
 
516
477
  :param line: which sinogram we want
517
- :type: int
518
478
  :param subsampling: subsampling to apply on the sinogram
519
479
  :return: sinogram from the radio lines
520
- :rtype: numpy.array
521
480
  """
522
481
  raise NotImplementedError("Base class")
523
482
 
524
- def get_normed_sinogram(self, line, subsampling=1):
483
+ def get_normed_sinogram(self, line: int, subsampling: int = 1) -> numpy.ndarray:
525
484
  """
526
485
  Util to get the sinogram normed with settings currently defined
527
486
  on the 'intensity_normalization' property
@@ -564,50 +523,73 @@ class TomwerScanBase(TomwerObject):
564
523
  Create the scan that will be generated if this scan is
565
524
  copy to the output_dir
566
525
 
567
- :param str output_dir:
526
+ :param output_dir:
568
527
  """
569
528
  raise NotImplementedError("Base class")
570
529
 
571
- def get_proj_angle_url(self, use_cache: bool = True, *args, **kwargs):
530
+ def get_proj_angle_url(
531
+ self, use_cache: bool = True, *args, **kwargs
532
+ ) -> dict[int | str, DataUrl]:
572
533
  """
573
- retrieve the url for each projections (including the alignement /
534
+ retrieve the url for each projections (including the alignment /
574
535
  return one) and associate to each (if possible) the angle.
575
536
  Alignment angle are set as angle (1) to specify that this is an
576
537
  alignment one.
577
- :param bool use_cache:
538
+ :param use_cache:
578
539
  :return: dictionary with angle (str or int) as key and url as value
579
- :rtype: dict
580
540
  """
581
541
  raise NotImplementedError("Base class")
582
542
 
583
- def get_reconstructions_urls(self):
543
+ def get_reconstructed_slices(self) -> set[str]:
584
544
  """
585
-
586
- :return: list of urls that contains reconstruction from nabu
587
- :rtype: list
545
+ Return a set of all the reconstructed **slices** that can be discovered for the scan (it will only look for reconstructed slices and not the volumes!!!!)
546
+ slices are given as a string representing volume identifier
588
547
  """
589
548
  from tomwer.core.process.reconstruction.output import (
590
- PROCESS_FOLDER_NAME,
549
+ PROCESS_FOLDER_RECONSTRUCTED_SLICES,
591
550
  ) # avoid cyclic import
592
551
 
593
- all_recons_urls = set()
552
+ all_recons_ids = set()
594
553
  recons_paths = self.reconstruction_paths
554
+ # extend set reconstruction paths to some 'default' paths.
595
555
  if self.working_directory:
596
- recons_paths.add(
597
- os.path.join(
598
- self.working_directory,
599
- PROCESS_FOLDER_NAME,
600
- )
556
+ # default output folder if using working directory
557
+ working_dir_output_folder = os.path.join(
558
+ self.working_directory,
559
+ PROCESS_FOLDER_RECONSTRUCTED_SLICES,
601
560
  )
602
- for path in recons_paths:
603
- all_recons_urls.update(self.get_reconstructions_urls_from_path(path))
604
- return all_recons_urls
561
+ # add possible output folder: in raw_data (deprecated)
562
+ raw_data_output_folder = to_raw_data_path(working_dir_output_folder)
563
+ recons_paths.add(raw_data_output_folder)
564
+ # add expected output folder: in processed data
565
+ processed_data_output_folder = to_processed_data_path(
566
+ working_dir_output_folder
567
+ )
568
+ recons_paths.add(processed_data_output_folder)
605
569
 
606
- def get_reconstructions_urls_from_path(self, path, check_url=False):
607
- if path is None or not os.path.isdir(path):
608
- return []
609
- else:
570
+ for path in recons_paths:
571
+ all_recons_ids.update(self.get_reconstructed_slices_from_path(path))
572
+ return all_recons_ids
610
573
 
574
+ def get_reconstructed_slices_from_path(self, path, check_url=False) -> set[str]:
575
+ """
576
+ Look for some reconstructed slices at a specific position
577
+ slices are given as a string representing volume identifier
578
+ """
579
+ if path is None or not os.path.exists(path):
580
+ return set()
581
+
582
+ volumes = guess_volumes(path) or ()
583
+ # note: guess_volumes will find a volume only if the path fits a volume location
584
+ # like a hdf5 file containing a volume or a top level EDF volume folder.
585
+ # In the case path = xxx/reconstructed_slices for example it returns an empty set.
586
+ if len(volumes) > 0:
587
+ return set(
588
+ [volume.get_identifier().to_str() for volume in guess_volumes(path)]
589
+ )
590
+ elif os.path.isdir(path):
591
+ # in the case the location is a folder and doesn't fit any volume
592
+ # we want to look into sub folders
611
593
  from tomwer.core.process.reconstruction.saaxis.saaxis import (
612
594
  DEFAULT_RECONS_FOLDER as MULTI_COR_DEFAULT_FOLDER,
613
595
  )
@@ -619,35 +601,26 @@ class TomwerScanBase(TomwerObject):
619
601
  )
620
602
 
621
603
  res = set()
622
- for f in os.listdir(path):
604
+ filtered_name = (
605
+ "steps_file_basename_nabu_sinogram_save_step",
606
+ MULTI_COR_DEFAULT_FOLDER,
607
+ MULTI_DB_DEFAULT_FOLDER,
608
+ NABU_CFG_FILE_FOLDER,
609
+ )
610
+ # filter files that we already know they won't contain any reconstructed volume
611
+ sub_files = filter(
612
+ lambda name: name not in filtered_name,
613
+ os.listdir(path),
614
+ )
615
+ for f in sub_files:
623
616
  current_path = os.path.join(path, f)
624
- if os.path.isfile(current_path):
625
- volume = _get_reconstructed_single_file_volume(
626
- current_path, scan=self
627
- )
628
- if volume is not None:
629
- res.add(volume)
630
- # avoid looking deeper if this doesn't look like a folder that could contain slices
631
- elif (
632
- f
633
- in (
634
- "matlab",
635
- "steps_file_basename_nabu_sinogram_save_step",
636
- MULTI_COR_DEFAULT_FOLDER,
637
- MULTI_DB_DEFAULT_FOLDER,
638
- NABU_CFG_FILE_FOLDER,
639
- )
640
- or f.endswith("_vol")
641
- or "slice" not in f
642
- ):
643
- pass
644
- else:
645
- res.update(
646
- self.get_reconstructions_urls_from_path(
647
- path=current_path, check_url=check_url
648
- )
617
+ res.update(
618
+ self.get_reconstructed_slices_from_path(
619
+ path=current_path, check_url=check_url
649
620
  )
621
+ )
650
622
  return res
623
+ return set()
651
624
 
652
625
  @property
653
626
  def latest_reconstructions(self):
@@ -662,7 +635,7 @@ class TomwerScanBase(TomwerObject):
662
635
  def clear_latest_reconstructions(self):
663
636
  self._latest_reconstructions = []
664
637
 
665
- def set_latest_reconstructions(self, urls: typing.Iterable):
638
+ def set_latest_reconstructions(self, urls: Iterable):
666
639
  if urls is None:
667
640
  self._latest_reconstructions = None
668
641
  else:
@@ -670,7 +643,7 @@ class TomwerScanBase(TomwerObject):
670
643
  [self._process_volume_url(url) for url in urls]
671
644
  )
672
645
 
673
- def add_latest_reconstructions(self, urls: typing.Iterable):
646
+ def add_latest_reconstructions(self, urls: Iterable):
674
647
  self._latest_reconstructions.extend(urls)
675
648
 
676
649
  def clear_latest_vol_reconstructions(self):
@@ -689,13 +662,11 @@ class TomwerScanBase(TomwerObject):
689
662
  f"url should be a {VolumeIdentifier} or a string reprenseting a {VolumeIdentifier}. {type(url)} provided instead"
690
663
  )
691
664
 
692
- def set_latest_vol_reconstructions(self, volume_identifiers: typing.Iterable):
693
- if volume_identifiers is None:
694
- self._latest_vol_reconstructions = None
695
- else:
696
- self._latest_vol_reconstructions = list(
697
- [self._process_volume_url(url) for url in volume_identifiers]
698
- )
665
+ def set_latest_vol_reconstructions(self, volume_identifiers: Iterable | None):
666
+ volume_identifiers = volume_identifiers or tuple()
667
+ self._latest_vol_reconstructions = list(
668
+ [self._process_volume_url(url) for url in volume_identifiers]
669
+ )
699
670
 
700
671
  def add_latest_vol_reconstructions(self, volume_identifiers: tuple):
701
672
  assert isinstance(
@@ -774,11 +745,10 @@ class TomwerScanBase(TomwerObject):
774
745
  f"set process_index from tomwer process file to {self._process_index}"
775
746
  )
776
747
 
777
- def get_nabu_dataset_info(self, binning=1, binning_z=1, proj_subsampling=1):
748
+ def get_nabu_dataset_info(self, binning=1, binning_z=1, proj_subsampling=1) -> dict:
778
749
  """
779
750
 
780
751
  :return: nabu dataset descriptor
781
- :rtype: dict
782
752
  """
783
753
  raise NotImplementedError("Base class")
784
754
 
@@ -786,7 +756,7 @@ class TomwerScanBase(TomwerObject):
786
756
  """Return the equivalent DatasetAnalyzer for nabu"""
787
757
  raise NotImplementedError("Base class")
788
758
 
789
- def get_proposal_name(self) -> Optional[str]:
759
+ def get_proposal_name(self) -> str | None:
790
760
  return self._proposal_name
791
761
 
792
762
  def set_proposal_name(self, proposal_name: str) -> None:
@@ -811,72 +781,6 @@ def _containsDigits(input_):
811
781
  return any(char.isdigit() for char in input_)
812
782
 
813
783
 
814
- def _get_reconstructed_single_file_volume(
815
- file_, scan: TomwerScanBase, check_url=False
816
- ) -> Optional[VolumeBase]:
817
- scan_basename = scan.get_process_file_name
818
- scan_basename = scan.get_dataset_basename()
819
- if scan_basename is None:
820
- logger.error("TODO")
821
-
822
- file_base_name = os.path.basename(file_)
823
- if file_base_name.startswith(scan_basename) and "slice_" in file_base_name:
824
- if file_.endswith(TomwerScanBase.VALID_RECONS_EXTENSION):
825
- local_str = file_
826
-
827
- for extension in TomwerScanBase.VALID_RECONS_EXTENSION:
828
- if local_str.endswith(extension):
829
- local_str = local_str.rsplit(extension, 1)[0]
830
- break
831
- if "slice_pag_" in local_str:
832
- indexStr = local_str.split("slice_pag_")[-1].split("_")[0]
833
- volume_basename = local_str.split("slice_pag_")[0] + "slice_pag_"
834
- else:
835
- indexStr = local_str.split("slice_")[-1].split("_")[0]
836
- volume_basename = local_str.split("slice_")[0] + "slice_"
837
-
838
- if _containsDigits(indexStr):
839
- if extension == ".edf":
840
- return EDFVolume(
841
- folder=os.path.dirname(file_),
842
- volume_basename=volume_basename,
843
- )
844
-
845
- if extension in (".jp2", ".jp2"):
846
- return JP2KVolume(
847
- folder=os.path.dirname(file_),
848
- volume_basename=volume_basename,
849
- data_extension=extension,
850
- )
851
- elif extension in (".tiff", ".tif"):
852
- return TIFFVolume(
853
- folder=os.path.dirname(file_),
854
- volume_basename=volume_basename,
855
- data_extension=extension,
856
- )
857
- elif extension in (
858
- (".h5", ".hdf5", ".nx", ".nxs", ".nexus", ".nx5", ".hdf")
859
- ):
860
- entry = getattr(scan, "entry", "entry")
861
- volume = HDF5Volume(
862
- file_path=os.path.abspath(file_),
863
- data_path="/".join([entry, "reconstruction"]),
864
- )
865
-
866
- if check_url is True:
867
- try:
868
- with open_hdf5(os.path.abspath(file_)) as h5f:
869
- if entry not in h5f:
870
- logger.info("{volume} does not exists")
871
- return None
872
- except Exception:
873
- logger.info("unable to check {volume}")
874
- return None
875
- else:
876
- logger.info("{volume} checked")
877
- return volume
878
-
879
-
880
784
  class NormMethod(_Enum):
881
785
  MANUAL_ROI = "manual ROI"
882
786
  AUTO_ROI = "automatic ROI"
@@ -1,37 +1,8 @@
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
-
25
-
26
- __authors__ = ["H.Payno"]
27
- __license__ = "MIT"
28
- __date__ = "27/02/2019"
29
-
1
+ from __future__ import annotations
30
2
 
31
3
  import glob
32
4
  import logging
33
5
  import os
34
- from typing import Union
35
6
  from urllib.parse import urlparse
36
7
 
37
8
  import h5py
@@ -56,12 +27,12 @@ class ScanFactory(object):
56
27
  @docstring(_oScanFactory.create_scan_object)
57
28
  @staticmethod
58
29
  def create_tomo_object_from_identifier(
59
- identifier: Union[str, BaseIdentifier]
30
+ identifier: str | BaseIdentifier,
60
31
  ) -> TomoObject:
61
32
  """
62
33
  Create an instance of TomoScanBase from his identifier if possible
63
34
 
64
- :param str identifier: identifier of the TomoScanBase
35
+ :param identifier: identifier of the TomoScanBase
65
36
  :raises: TypeError if identifier is not a str
66
37
  :raises: ValueError if identifier cannot be converted back to an instance of TomoScanBase
67
38
  """
@@ -118,16 +89,17 @@ class ScanFactory(object):
118
89
  raise ValueError(f"Scheme {scheme} not recognized")
119
90
 
120
91
  @staticmethod
121
- def create_scan_object(scan_path, entry=None, accept_bliss_scan=False):
92
+ def create_scan_object(
93
+ scan_path: str, entry: str | None = None, accept_bliss_scan: bool = False
94
+ ) -> TomoScanBase:
122
95
  """
123
96
 
124
- :param TextIOWrapper scan_path: path to the scan directory or file
97
+ :param scan_path: path to the scan directory or file
125
98
  :param entry: entry on the file. Requested for hdf5 files
126
99
  :param accept_bliss_scan: if True the factory can return some BlissScan
127
100
  But this is only compatible with the
128
101
  Tomomill processing.
129
102
  :return: TomwerScanBase instance fitting the scan folder or scan path
130
- :rtype: tomwer.core.scan.scanbase.TomwerScanBase
131
103
  :raises: ValueError if scan_path is not containing a scan
132
104
  """
133
105
  if scan_path is None:
@@ -209,23 +181,21 @@ class ScanFactory(object):
209
181
  )
210
182
 
211
183
  @staticmethod
212
- def is_tomo_scandir(scan_path):
184
+ def is_tomo_scandir(scan_path: str) -> bool:
213
185
  """
214
186
 
215
- :param str scan_path: path to the scan directory or file
187
+ :param scan_path: path to the scan directory or file
216
188
  :return: True if the given path / file is a tomo_scandir. For now yes by
217
189
  default
218
- :rtype: bool
219
190
  """
220
191
  return True
221
192
 
222
193
  @staticmethod
223
- def is_edf_tomo(scan_path):
194
+ def is_edf_tomo(scan_path: str) -> bool:
224
195
  """
225
196
 
226
- :param str scan_path: path to the scan directory or file
197
+ :param scan_path: path to the scan directory or file
227
198
  :return: True if given path define a tomo scan based on .edf file
228
- :rtype: bool
229
199
  """
230
200
  if scan_path and os.path.isdir(scan_path):
231
201
  file_basename = os.path.basename(scan_path)
File without changes
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ from __future__ import annotations
3
+
4
+ import os
5
+
6
+ from tomwer.core.scan.edfscan import EDFTomoScan
7
+ from tomwer.core.utils.scanutils import MockEDF
8
+
9
+
10
+ def test_scan_dir(tmpdir):
11
+ full_path = os.path.join(tmpdir, "my", "aquisition", "folder")
12
+ MockEDF.fastMockAcquisition(full_path)
13
+ scan = EDFTomoScan(full_path)
14
+ assert scan.scan_dir_name() == "folder"
15
+ assert scan.scan_basename() == full_path
16
+
17
+
18
+ def test_working_directory():
19
+ """test behavior of the working directory function"""
20
+ scan = EDFTomoScan(scan=None)
21
+ assert scan.working_directory is None
22
+ scan = EDFTomoScan(scan="my_folder")
23
+ assert scan.working_directory == os.path.abspath("my_folder")
24
+ scan = EDFTomoScan(scan="/full/path/to/my/folder")
25
+ assert scan.working_directory == os.path.abspath("/full/path/to/my/folder")
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+
3
+ """Unit test for the scan defined at the hdf5 format"""
4
+ from __future__ import annotations
5
+
6
+ import asyncio
7
+ import os
8
+
9
+ from tomwer.core.futureobject import FutureTomwerObject
10
+ from tomwer.core.utils.scanutils import MockNXtomo
11
+
12
+
13
+ def test_simple_future_tomo_obj(tmpdir):
14
+ """Simple test of the FutureTomwerScan API"""
15
+ scan = MockNXtomo(
16
+ scan_path=os.path.join(tmpdir, "scan_test"),
17
+ n_proj=10,
18
+ n_ini_proj=10,
19
+ create_ini_dark=False,
20
+ create_ini_flat=False,
21
+ dim=10,
22
+ ).scan
23
+ future = asyncio.Future()
24
+ future.set_result(None)
25
+
26
+ future_tomo_obj = FutureTomwerObject(
27
+ tomo_obj=scan,
28
+ futures=[
29
+ future,
30
+ ],
31
+ )
32
+
33
+ future_tomo_obj.results()
34
+ assert future_tomo_obj.exceptions() is None
35
+ assert future_tomo_obj.cancelled() is False