tomwer 1.3.27__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.27.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.27.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
  553. {tomwer-1.3.27.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 -1388
  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.27-py3.11-nspkg.pth +0 -1
  607. tomwer-1.3.27.dist-info/METADATA +0 -292
  608. tomwer-1.3.27.dist-info/RECORD +0 -785
  609. tomwer-1.3.27.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.27.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,55 +1,20 @@
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
- """contain the AxisProcess
1
+ """contain the AxisTask class
26
2
  """
27
3
 
28
- __authors__ = ["C.Nemoz", "H.Payno"]
29
- __license__ = "MIT"
30
- __date__ = "19/03/2019"
4
+ from __future__ import annotations
31
5
 
32
6
  import logging
33
- from typing import Optional, Union
34
7
 
35
- import numpy
36
- from nabu.estimation.cor import (
37
- CenterOfRotation,
38
- CenterOfRotationAdaptiveSearch,
39
- CenterOfRotationGrowingWindow,
40
- CenterOfRotationSlidingWindow,
41
- CenterOfRotationOctaveAccurate,
42
- )
43
- from nabu.pipeline.estimators import SinoCORFinder, CORFinder
8
+ from nabu.pipeline.estimators import estimate_cor
44
9
  from nabu.resources.nxflatfield import update_dataset_info_flats_darks
45
10
  from processview.core.manager import DatasetState, ProcessManager
46
11
  from processview.core.superviseprocess import SuperviseProcess
47
- from tomwer.core.utils.deprecation import deprecated_warning
48
12
 
49
13
  import tomwer.version
50
14
  from tomwer.core.process.reconstruction.utils.cor import absolute_pos_to_relative
51
15
  from tomwer.core.process.task import Task
52
16
  from tomwer.core.scan.nxtomoscan import NXtomoScan
17
+ from tomwer.core.scan.edfscan import EDFTomoScan
53
18
  from tomwer.core.scan.scanbase import TomwerScanBase
54
19
  from tomwer.core.scan.scanfactory import ScanFactory
55
20
  from tomwer.core.utils import image, logconfig
@@ -68,19 +33,8 @@ from .params import (
68
33
  )
69
34
  from .projectiontype import ProjectionType
70
35
 
71
- try:
72
- from nabu.pipeline.estimators import CompositeCOREstimator
73
- except ImportError:
74
- has_composite_cor_finder = False
75
- else:
76
- has_composite_cor_finder = True
77
- from silx.io.url import DataUrl
78
- from silx.io.utils import h5py_read_dataset
79
- from silx.io.utils import open as open_hdf5
80
-
81
36
  _logger = logging.getLogger(__name__)
82
- if not has_composite_cor_finder:
83
- _logger.warning("No composite cor finder found at nabu level")
37
+
84
38
  # vertically, work on a window having only a percentage of the frame.
85
39
  pc_height = 10.0 / 100.0
86
40
  # horizontally. Global method supposes the COR is more or less in center
@@ -89,9 +43,7 @@ pc_height = 10.0 / 100.0
89
43
  pc_width = 50.0 / 100.0
90
44
 
91
45
 
92
- def _absolute_pos_to_relative_with_warning(
93
- absolute_pos: float, det_width: Optional[int]
94
- ):
46
+ def _absolute_pos_to_relative_with_warning(absolute_pos: float, det_width: int | None):
95
47
  """
96
48
  nabu returns the value as absolute. tomwer needs it as relative
97
49
  Also handle the case (unlikely) the detector width cannot be found
@@ -133,196 +85,7 @@ def adapt_tomwer_scan_to_nabu(scan: TomwerScanBase):
133
85
  return dataset_infos
134
86
 
135
87
 
136
- def compute_cor_nabu_growing_window(
137
- radio_1: numpy.ndarray,
138
- radio_2: numpy.ndarray,
139
- side: str,
140
- padding_mode,
141
- flip_frame_2_lr=True,
142
- horz_fft_width=False,
143
- ):
144
- """
145
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
146
-
147
- :param radio_1:
148
- :param radio_2:
149
- :param padding_mode: padding mode
150
- :param str side: side of the cor
151
- :param bool flip_frame_2_lr: if True will left-right flip the second frame
152
- :param horz_fft_width:
153
-
154
- :return:
155
- """
156
- nabu_class = CenterOfRotationGrowingWindow(horz_fft_width=horz_fft_width)
157
- # value return is relative
158
- res = nabu_class.find_shift(
159
- img_1=radio_1,
160
- img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
161
- side=side,
162
- roi_yxhw=None,
163
- padding_mode=padding_mode,
164
- median_filt_shape=None,
165
- )
166
- if isinstance(res, numpy.ndarray):
167
- if len(res) == 1:
168
- return res[0]
169
- else:
170
- raise ValueError(
171
- "nabu rsult is expected to be a scalar, numpy array found. Please upgrade nabu this issue is expected to be solved"
172
- )
173
- else:
174
- return res
175
-
176
-
177
- def compute_cor_nabu_growing_window_radios(
178
- scan: TomwerScanBase,
179
- ):
180
- """
181
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
182
-
183
- :param TomwerScanBase scan:
184
-
185
- :return:
186
- """
187
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
188
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
189
-
190
- projection_angles = scan.get_proj_angle_url()
191
- projection_angles_i = {
192
- value.path(): key for key, value in projection_angles.items()
193
- }
194
- url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
195
- angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
196
- angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
197
- radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
198
-
199
- corfinder = CORFinder(
200
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
201
- method="growing-window",
202
- do_flatfield=has_darks and has_flats,
203
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
204
- radio_angles=radio_angles,
205
- logger=_logger,
206
- )
207
- res = corfinder.find_cor() # Returns absolute cor
208
- if isinstance(res, numpy.ndarray):
209
- if len(res) == 1:
210
- res = res[0]
211
- else:
212
- raise ValueError(
213
- "nabu rsult is expected to be a scalar, numpy array found. Please upgrade nabu this issue is expected to be solved"
214
- )
215
-
216
- return _absolute_pos_to_relative_with_warning(
217
- absolute_pos=res, det_width=scan.dim_1
218
- )
219
-
220
-
221
- def compute_cor_nabu_growing_window_sinogram(
222
- scan: TomwerScanBase,
223
- ):
224
- """
225
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
226
-
227
- :param TomwerScanBase scan:
228
-
229
- :return:
230
- """
231
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
232
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
233
-
234
- corfinder = SinoCORFinder(
235
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
236
- method="sino-growing-window",
237
- slice_idx=scan.axis_params.sinogram_line or "middle",
238
- subsampling=scan.axis_params.sinogram_subsampling,
239
- do_flatfield=has_darks and has_flats,
240
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
241
- logger=_logger,
242
- )
243
- res = corfinder.find_cor()
244
- if isinstance(res, numpy.ndarray):
245
- if len(res) == 1:
246
- res = res[0]
247
- else:
248
- raise ValueError(
249
- "nabu rsult is expected to be a scalar, numpy array found. Please upgrade nabu this issue is expected to be solved"
250
- )
251
-
252
- return _absolute_pos_to_relative_with_warning(
253
- absolute_pos=res, det_width=scan.dim_1
254
- )
255
-
256
-
257
- def compute_scan_sino_coarse_to_fine(scan):
258
- """
259
- Compute center of rotation from `sino-coarse-to-fine` algorithm for given
260
- scan
261
- :param scan:
262
- :return:
263
- """
264
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
265
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
266
-
267
- corfinder = SinoCORFinder(
268
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
269
- method=AxisMode.sino_coarse_to_fine.value,
270
- slice_idx=scan.axis_params.sinogram_line or "middle",
271
- subsampling=scan.axis_params.sinogram_subsampling,
272
- do_flatfield=has_darks and has_flats,
273
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
274
- logger=_logger,
275
- )
276
- res = corfinder.find_cor()
277
- return _absolute_pos_to_relative_with_warning(
278
- absolute_pos=res, det_width=scan.dim_1
279
- )
280
-
281
-
282
- def compute_scan_composite_coarse_to_fine(scan: TomwerScanBase):
283
- """
284
- Compute center of rotation from `sino-coarse-to-fine` algorithm for given
285
- scan
286
- :param scan:
287
- :return:
288
- """
289
- if not has_composite_cor_finder:
290
- _logger.error("unable to find nabu CompositeCOREstimator")
291
- return None
292
-
293
- (
294
- theta,
295
- n_subsampling_y,
296
- oversampling,
297
- take_log,
298
- near_pos,
299
- near_width,
300
- ) = get_composite_options(scan)
301
-
302
- # as the new corfinder is not yet merged in the main branch
303
- # allow some tolerance for the "side" argument that is there only
304
- # in the new one
305
-
306
- cor_options = scan.axis_params.get_nabu_cor_options_as_dict()
307
- for key in "low_pass", "high_pass":
308
- if key in cor_options:
309
- cor_options[key] = int(cor_options[key])
310
- corfinder = CompositeCOREstimator(
311
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
312
- theta_interval=theta,
313
- n_subsampling_y=n_subsampling_y,
314
- oversampling=oversampling,
315
- cor_options=cor_options,
316
- logger=_logger,
317
- take_log=take_log,
318
- )
319
- res = corfinder.find_cor()
320
- return _absolute_pos_to_relative_with_warning(
321
- absolute_pos=res, det_width=scan.dim_1
322
- )
323
-
324
-
325
- def get_composite_options(scan):
88
+ def get_composite_options(scan) -> tuple:
326
89
  theta = scan.axis_params.composite_options.get("theta", DEFAULT_CMP_THETA)
327
90
  n_subsampling_y = scan.axis_params.composite_options.get(
328
91
  "n_subsampling_y", DEFAULT_CMP_N_SUBSAMPLING_Y
@@ -339,446 +102,19 @@ def get_composite_options(scan):
339
102
  return theta, n_subsampling_y, oversampling, take_log, near_pos, near_width
340
103
 
341
104
 
342
- def compute_scan_cor_nabu_growing_window(scan):
343
- """
344
- Call to nabu.preproc.alignment.CenterOfRotation from the scan axis_params
345
- value.
346
-
347
- :param `.TomoBase` scan: scan to process
348
- :return: Union[float, None]
349
- """
350
- if not scan.axis_params.use_sinogram:
351
- radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
352
- if radio_1 is None or radio_2 is None:
353
- raise NoAxisUrl("Unable to find projections for nabu axis calculation")
105
+ def read_scan_x_rotation_axis_pixel_position(scan: TomwerScanBase):
106
+ """read center of rotation estimation from metadata"""
107
+ if isinstance(scan, EDFTomoScan):
108
+ raise TypeError("EDFTomoScan have not information about estimated cor position")
354
109
  else:
355
- radio_1, radio_2 = None, None
356
-
357
- _logger.info(
358
- "compute scan axis from nabu CenterOfRotationGrowingWindow with padding "
359
- "mode {} and side {}. Use sinogram: {}".format(
360
- scan.axis_params.padding_mode,
361
- scan.axis_params.side,
362
- scan.axis_params.use_sinogram,
363
- )
364
- )
365
-
366
- if scan.axis_params.use_sinogram:
367
- return compute_cor_nabu_growing_window_sinogram(scan=scan)
368
- else:
369
- return compute_cor_nabu_growing_window_radios(scan=scan)
370
-
371
-
372
- def compute_cor_nabu_sliding_window(
373
- radio_1: numpy.ndarray,
374
- radio_2: numpy.ndarray,
375
- side: str,
376
- padding_mode,
377
- flip_frame_2_lr=True,
378
- horz_fft_width=False,
379
- ):
380
- """
381
- Call nabu.preproc.alignement.CenterOfRotationSlidingWindow.find_shift
382
-
383
- :param radio_1:
384
- :param radio_2:
385
- :param padding_mode:
386
- :param str side: side of the cor
387
- :param horz_fft_width:
388
- :param bool flip_frame_2_lr: if True will left-right flip the second frame
389
- :param half_acq_cor_guess: The approximate position of the rotation axis
390
- from the image center. Optional. When given a
391
- special algorithm is used which can work also
392
- in half-tomo conditions.
393
-
394
- :return:
395
- """
396
- nabu_class = CenterOfRotationSlidingWindow(horz_fft_width=horz_fft_width)
397
- res = nabu_class.find_shift(
398
- img_1=radio_1,
399
- img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
400
- side=side,
401
- roi_yxhw=None,
402
- padding_mode=padding_mode,
403
- median_filt_shape=None,
404
- )
405
- return res
406
-
407
-
408
- def compute_cor_nabu_sliding_window_radios(
409
- scan,
410
- ):
411
- """
412
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
413
-
414
- :param TomwerScanBase scan:
415
-
416
- :return:
417
- """
418
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
419
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
420
-
421
- projection_angles = scan.get_proj_angle_url()
422
- projection_angles_i = {
423
- value.path(): key for key, value in projection_angles.items()
424
- }
425
- url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
426
- angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
427
- angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
428
- radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
429
-
430
- corfinder = CORFinder(
431
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
432
- method="sliding-window",
433
- do_flatfield=has_darks and has_flats,
434
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
435
- radio_angles=radio_angles,
436
- logger=_logger,
437
- )
438
- res = corfinder.find_cor() # Returns absolute cor.
439
- return _absolute_pos_to_relative_with_warning(
440
- absolute_pos=res, det_width=scan.dim_1
441
- )
442
-
443
-
444
- def compute_cor_nabu_sliding_window_sinogram(
445
- scan,
446
- ):
447
- """
448
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
449
-
450
- :param TomwerScanBase scan:
451
-
452
- :return:
453
- """
454
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
455
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
456
-
457
- corfinder = SinoCORFinder(
458
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
459
- method="sino-sliding-window",
460
- slice_idx=scan.axis_params.sinogram_line or "middle",
461
- subsampling=scan.axis_params.sinogram_subsampling,
462
- do_flatfield=has_darks and has_flats,
463
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
464
- logger=_logger,
465
- )
466
- res = corfinder.find_cor()
467
- return _absolute_pos_to_relative_with_warning(
468
- absolute_pos=res, det_width=scan.dim_1
469
- )
470
-
471
-
472
- def compute_scan_cor_nabu_sliding_window(scan):
473
- """
474
- Call to nabu.preproc.alignment.CenterOfRotation from the scan axis_params
475
- value.
476
-
477
- :param `.TomoBase` scan: scan to process
478
- :return: Union[float, None]
479
- """
480
- if not scan.axis_params.use_sinogram:
481
- radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
482
- if radio_1 is None or radio_2 is None:
483
- raise NoAxisUrl("Unable to find projections for nabu axis calculation")
484
- else:
485
- radio_1 = radio_2 = None
486
-
487
- _logger.info(
488
- "compute scan axis from nabu CenterOfRotationSlidingWindow with padding "
489
- "mode {} and side {}. Use sinogram: {}".format(
490
- scan.axis_params.padding_mode,
491
- scan.axis_params.side,
492
- scan.axis_params.use_sinogram,
493
- )
494
- )
495
-
496
- if scan.axis_params.use_sinogram:
497
- return compute_cor_nabu_sliding_window_sinogram(scan=scan)
498
- else:
499
- return compute_cor_nabu_sliding_window_radios(scan=scan)
500
-
501
-
502
- def compute_scan_fourier_angles(scan):
503
- """
504
- run 'scan_fourier_angles' algorithm for the requested scan
505
- """
506
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
507
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
508
-
509
- corfinder = SinoCORFinder(
510
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
511
- method="fourier-angles",
512
- slice_idx=scan.axis_params.sinogram_line or "middle",
513
- subsampling=scan.axis_params.sinogram_subsampling,
514
- do_flatfield=has_darks and has_flats,
515
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
516
- logger=_logger,
517
- )
518
- res = corfinder.find_cor()
519
- return _absolute_pos_to_relative_with_warning(
520
- absolute_pos=res, det_width=scan.dim_1
521
- )
522
-
523
-
524
- def compute_scan_octave_accurate_radios(
525
- scan,
526
- ):
527
- """
528
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
529
-
530
- :param TomwerScanBase scan:
531
-
532
- :return:
533
- """
534
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
535
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
536
-
537
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
538
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
539
-
540
- projection_angles = scan.get_proj_angle_url()
541
- projection_angles_i = {
542
- value.path(): key for key, value in projection_angles.items()
543
- }
544
- url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
545
- angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
546
- angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
547
- radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
548
-
549
- corfinder = CORFinder(
550
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
551
- method="octave-accurate",
552
- do_flatfield=has_darks and has_flats,
553
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
554
- radio_angles=radio_angles,
555
- logger=_logger,
556
- )
557
- res = corfinder.find_cor()
558
- return _absolute_pos_to_relative_with_warning(
559
- absolute_pos=res, det_width=scan.dim_1
560
- )
561
-
562
-
563
- def compute_scan_octave_accurate(scan):
564
- """
565
- Compute center of rotation from `octave-accurate` algorithm
566
- scan
567
- :param scan:
568
- :return:
569
- """
570
- cor_options = scan.axis_params.get_nabu_cor_options_as_dict()
571
- radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
572
- extra_options = {}
573
- for key in "low_pass", "high_pass":
574
- if key in cor_options:
575
- extra_options[key] = float(cor_options[key])
576
-
577
- corfinder = CenterOfRotationOctaveAccurate(cor_options=cor_options)
578
- res = corfinder.find_shift(
579
- img_1=radio_1,
580
- img_2=numpy.fliplr(radio_2) if scan.axis_params.flip_lr else radio_2,
581
- side=scan.axis_params.side,
582
- padding_mode=scan.axis_params.padding_mode,
583
- **extra_options,
584
- )
110
+ res = scan.x_rotation_axis_pixel_position
111
+ if res is None:
112
+ _logger.error(
113
+ f"unable to find x_rotation_axis_pixel_position from {scan.get_identifier()}"
114
+ )
585
115
  return res
586
116
 
587
117
 
588
- def compute_cor_nabu_centered_radios(
589
- scan,
590
- ):
591
- """
592
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
593
-
594
- :param TomwerScanBase scan:
595
-
596
- :return:
597
- """
598
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
599
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
600
-
601
- projection_angles = scan.get_proj_angle_url()
602
- projection_angles_i = {
603
- value.path(): key for key, value in projection_angles.items()
604
- }
605
- url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
606
- angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
607
- angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
608
- radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
609
-
610
- corfinder = CORFinder(
611
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
612
- method="centered",
613
- do_flatfield=has_darks and has_flats,
614
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
615
- radio_angles=radio_angles,
616
- logger=_logger,
617
- )
618
- res = corfinder.find_cor()
619
- return _absolute_pos_to_relative_with_warning(
620
- absolute_pos=res, det_width=scan.dim_1
621
- )
622
-
623
-
624
- def compute_cor_nabu_centered(
625
- radio_1: numpy.ndarray,
626
- radio_2: numpy.ndarray,
627
- padding_mode,
628
- flip_frame_2_lr=True,
629
- horz_fft_width=False,
630
- vert_fft_width=False,
631
- ):
632
- """
633
- Call nabu.preproc.alignement.CenterOfRotation.find_shift
634
-
635
- :param radio_1:
636
- :param radio_2:
637
- :param padding_mode:
638
- :param horz_fft_width:
639
- :param bool flip_frame_2_lr: if True will left-right flip the second frame
640
- :param half_acq_cor_guess: The approximate position of the rotation axis
641
- from the image center. Optional. When given a
642
- special algorithm is used which can work also
643
- in half-tomo conditions.
644
-
645
- :return:
646
- """
647
- nabu_class = CenterOfRotation(
648
- horz_fft_width=horz_fft_width, vert_fft_width=vert_fft_width
649
- )
650
- return nabu_class.find_shift(
651
- img_1=radio_1,
652
- img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
653
- roi_yxhw=None,
654
- padding_mode=padding_mode,
655
- median_filt_shape=None,
656
- )
657
-
658
-
659
- def compute_scan_cor_nabu_centered(scan):
660
- """
661
- Call to nabu.preproc.alignment.CenterOfRotation from the scan axis_params
662
- value.
663
-
664
- :param `.TomoBase` scan: scan to process
665
- :return: Union[float, None]
666
-
667
- """
668
- assert scan.axis_params is not None
669
- radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
670
- if radio_1 is None or radio_2 is None:
671
- raise NoAxisUrl("Unable to find projections for nabu axis calculation")
672
-
673
- _logger.info(
674
- "compute scan axis from nabu CenterOfRotation with padding "
675
- "mode %s" % scan.axis_params.padding_mode
676
- )
677
-
678
- return compute_cor_nabu_centered_radios(scan)
679
-
680
-
681
- def compute_cor_nabu_global(
682
- radio_1: numpy.ndarray,
683
- radio_2: numpy.ndarray,
684
- padding_mode,
685
- flip_frame_2_lr=True,
686
- horz_fft_width=False,
687
- ):
688
- """
689
- Call nabu.preproc.alignement.CenterOfRotation.find_shift
690
-
691
- :param radio_1:
692
- :param radio_2:
693
- :param padding_mode:
694
- :param horz_fft_width:
695
- :param bool flip_frame_2_lr: if True will left-right flip the second frame
696
- :return:
697
- """
698
- nabu_class = CenterOfRotationAdaptiveSearch(horz_fft_width=horz_fft_width)
699
- return nabu_class.find_shift(
700
- img_1=radio_1,
701
- img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
702
- roi_yxhw=None,
703
- padding_mode=padding_mode,
704
- median_filt_shape=None,
705
- )
706
-
707
-
708
- def compute_cor_nabu_global_radios(
709
- scan: TomwerScanBase,
710
- ):
711
- """
712
- Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
713
-
714
- :param TomwerScanBase scan:
715
-
716
- :return:
717
- """
718
- has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
719
- has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
720
-
721
- projection_angles = scan.get_proj_angle_url()
722
- projection_angles_i = {
723
- value.path(): key for key, value in projection_angles.items()
724
- }
725
- url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
726
- angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
727
- angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
728
- radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
729
-
730
- corfinder = CORFinder(
731
- dataset_info=adapt_tomwer_scan_to_nabu(scan),
732
- method="global",
733
- do_flatfield=has_darks and has_flats,
734
- cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
735
- radio_angles=radio_angles,
736
- logger=_logger,
737
- )
738
- res = corfinder.find_cor()
739
- return _absolute_pos_to_relative_with_warning(
740
- absolute_pos=res, det_width=scan.dim_1
741
- )
742
-
743
-
744
- def compute_scan_cor_nabu_global(scan):
745
- """
746
- Call to nabu.preproc.alignment.CenterOfRotation from the scan axis_params
747
- value.
748
-
749
- :param `.TomoBase` scan: scan to process
750
- :return: Union[float, None]
751
-
752
- """
753
- assert scan.axis_params is not None
754
- radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
755
- if radio_1 is None or radio_2 is None:
756
- raise NoAxisUrl("Unable to find projections for nabu axis calculation")
757
-
758
- _logger.info(
759
- "compute scan axis from nabu CenterOfRotation with padding "
760
- "mode %s" % scan.axis_params.padding_mode
761
- )
762
- return compute_cor_nabu_global_radios(scan)
763
-
764
-
765
- def get_stdmax_column(x: numpy.ndarray) -> float:
766
- """
767
-
768
- :param x:
769
- :return: column index of the maximal standard deviation
770
- """
771
- kernel_size = 5
772
- length = len(x)
773
- r = range(length - kernel_size)
774
- y = numpy.empty(length - kernel_size)
775
- for i in r:
776
- s = numpy.std(x[i : i + kernel_size])
777
- y[i] = s
778
-
779
- return y.argmax()
780
-
781
-
782
118
  class NoAxisUrl(Exception):
783
119
  pass
784
120
 
@@ -792,25 +128,8 @@ class AxisTask(
792
128
  ):
793
129
  """
794
130
  Process used to compute the center of rotation of a scan
795
-
796
- :param axis_params: parameters to configure the axis process
797
- :type: AxisRP
798
131
  """
799
132
 
800
- _CALCULATIONS_METHODS = {
801
- AxisMode.centered: compute_scan_cor_nabu_centered,
802
- AxisMode.global_: compute_scan_cor_nabu_global,
803
- AxisMode.sliding_window_sinogram: compute_scan_cor_nabu_sliding_window,
804
- AxisMode.sliding_window_radios: compute_scan_cor_nabu_sliding_window,
805
- AxisMode.growing_window_sinogram: compute_scan_cor_nabu_growing_window,
806
- AxisMode.growing_window_radios: compute_scan_cor_nabu_growing_window,
807
- AxisMode.sino_coarse_to_fine: compute_scan_sino_coarse_to_fine,
808
- AxisMode.composite_coarse_to_fine: compute_scan_composite_coarse_to_fine,
809
- AxisMode.near: compute_scan_composite_coarse_to_fine,
810
- AxisMode.sino_fourier_angles: compute_scan_fourier_angles,
811
- AxisMode.octave_accurate_radios: compute_scan_octave_accurate,
812
- }
813
-
814
133
  def __init__(
815
134
  self,
816
135
  process_id=None,
@@ -867,12 +186,12 @@ class AxisTask(
867
186
  In this case we will lock the axis as defined 'fixed' with the current
868
187
  value
869
188
 
870
- :param bool lock: if true lock the currently existing position value
189
+ :param lock: if true lock the currently existing position value
871
190
  """
872
191
  self._locked = lock
873
192
  if lock:
874
193
  self._recons_params_before_lock = self._axis_params.to_dict()
875
- if self._axis_params not in (AxisMode.manual, AxisMode.read):
194
+ if self._axis_params != AxisMode.manual:
876
195
  self._axis_params.mode = AxisMode.manual
877
196
  else:
878
197
  if self._recons_params_before_lock:
@@ -985,13 +304,12 @@ class AxisTask(
985
304
  _logger.error(e)
986
305
 
987
306
  @staticmethod
988
- def get_inputs_urls(scan):
307
+ def get_input_radios(scan) -> tuple:
989
308
  """Make sure we have valid projections to be used for axis calculation
990
309
 
991
- :param TomwerScanBase scan: scan to check
310
+ :param scan: scan to check
992
311
  :raise: NoAxisUrl if fails to found
993
- :return: the two projections to be used for axis calculation
994
- :rtype: tuple of AxisResource
312
+ :return: tuple of AxisResource
995
313
  """
996
314
  if (
997
315
  scan.axis_params
@@ -999,16 +317,13 @@ class AxisTask(
999
317
  and scan.axis_params.axis_url_1.url
1000
318
  ):
1001
319
  return scan.axis_params.axis_url_1, scan.axis_params.axis_url_2
1002
- else:
1003
- _radio_1, _radio_2 = scan.get_opposite_projections(
1004
- mode=scan.axis_params.angle_mode
1005
- )
1006
- return _radio_1, _radio_2
320
+
321
+ return scan.get_opposite_projections(mode=scan.axis_params.angle_mode)
1007
322
 
1008
323
  @staticmethod
1009
324
  def get_inputs(scan):
1010
325
  assert isinstance(scan, TomwerScanBase)
1011
- radio_1, radio_2 = AxisTask.get_inputs_urls(scan=scan)
326
+ radio_1, radio_2 = AxisTask.get_input_radios(scan=scan)
1012
327
  if radio_1 and radio_2:
1013
328
  mess = " ".join(
1014
329
  ("input radios are", radio_1.url.path(), "and", radio_2.url.path())
@@ -1040,8 +355,8 @@ class AxisTask(
1040
355
  """
1041
356
  Compute the position value for the scan
1042
357
 
1043
- :param TomwerScanBase scan:
1044
- :param bool wait: used for threaded process. True if we want to end the
358
+ :param scan:
359
+ :param wait: used for threaded process. True if we want to end the
1045
360
  computation before releasing hand.
1046
361
  :return: scan as a TomoBase
1047
362
  """
@@ -1091,14 +406,8 @@ class AxisTask(
1091
406
  self._axis_params.frame_width = scan.dim_1
1092
407
  self._axis_params.set_relative_value(position)
1093
408
  scan_name = scan.path or "undef scan"
1094
- if scan.axis_params.use_sinogram:
1095
- method = "sinogram"
1096
- else:
1097
- method = scan.axis_params.mode.value
1098
409
  r_cor_value = scan.axis_params.relative_cor_value
1099
- mess = (
1100
- f"Compute axis position ({r_cor_value}) with {method} for {scan_name}"
1101
- )
410
+ mess = f"Compute axis position ({r_cor_value}) with {scan.axis_params.mode.value}"
1102
411
  _logger.info(mess)
1103
412
  return scan
1104
413
 
@@ -1108,10 +417,10 @@ class AxisTask(
1108
417
  else:
1109
418
  raise NotImplementedError("mode not implemented yet")
1110
419
 
1111
- def define_calculation_mode(self, mode, fct_pointer):
420
+ def define_calculation_mode(self, mode: AxisMode, fct_pointer):
1112
421
  """Register the function to call of the given mode
1113
422
 
1114
- :param AxisMode mode: the mode to register
423
+ :param mode: the mode to register
1115
424
  :param fct_pointer: pointer to the function to call
1116
425
  """
1117
426
  self._mode_calculation_fct[mode] = fct_pointer
@@ -1120,21 +429,31 @@ class AxisTask(
1120
429
  """
1121
430
 
1122
431
  :param scan: scan for which we compute the center of rotation
1123
- :type: TomoScan
1124
432
  :return: position of the rotation axis. Use the `.AxisMode` defined
1125
- by the `.ReconsParams` of the `.AxisProcess`
1126
- :rtype: float or None (if fail to compute the axis position)
433
+ by the `.ReconsParams` of the `.AxisTask`
1127
434
  """
1128
435
  mode = self._axis_params.mode
1129
- if mode in (AxisMode.manual, AxisMode.read):
436
+ if mode is AxisMode.manual:
1130
437
  # If mode is read or manual the position_value is not computed and
1131
438
  # we will keep the actual one (should have been defined previously)
1132
439
  res = self._axis_params.relative_cor_value
1133
- elif mode in self._CALCULATIONS_METHODS:
1134
- _logger.info("use radios, mode is %s" % mode.value)
1135
- res = self._CALCULATIONS_METHODS[mode](scan)
440
+ elif mode is AxisMode.read:
441
+ res = read_scan_x_rotation_axis_pixel_position(scan=scan)
1136
442
  else:
1137
- raise NotImplementedError("Method for", mode, "is not defined")
443
+ has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
444
+ has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
445
+
446
+ res = estimate_cor(
447
+ method=mode.value,
448
+ dataset_info=adapt_tomwer_scan_to_nabu(scan=scan),
449
+ do_flatfield=has_darks and has_flats,
450
+ cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
451
+ )
452
+ # convert back to relative
453
+ res = _absolute_pos_to_relative_with_warning(
454
+ absolute_pos=res, det_width=scan.dim_1
455
+ )
456
+
1138
457
  return res
1139
458
 
1140
459
  @docstring(Task.program_name)
@@ -1151,79 +470,3 @@ class AxisTask(
1151
470
  @staticmethod
1152
471
  def definition():
1153
472
  return "Compute center of rotation"
1154
-
1155
- @staticmethod
1156
- def get_cor_frm_process_file(
1157
- process_file, entry, as_url=False
1158
- ) -> Union[None, float]:
1159
- """
1160
- Read cor position from a tomwer_process file
1161
-
1162
- :param process_file:
1163
- :param entry:
1164
- :return:
1165
- """
1166
- if entry is None:
1167
- with open_hdf5(process_file) as h5f:
1168
- entries = AxisTask._get_process_nodes(root_node=h5f, process=AxisTask)
1169
- if len(entries) == 0:
1170
- _logger.info("unable to find a Axis process in %s" % process_file)
1171
- return None
1172
- elif len(entries) > 1:
1173
- raise ValueError("several entry found, entry should be " "specify")
1174
- else:
1175
- entry = list(entries.keys())[0]
1176
- _logger.info("take %s as default entry" % entry)
1177
-
1178
- with open_hdf5(process_file) as h5f:
1179
- axis_nodes = AxisTask._get_process_nodes(
1180
- root_node=h5f[entry], process=AxisTask
1181
- )
1182
- index_to_path = {}
1183
- for key, index in axis_nodes.items():
1184
- index_to_path[index] = key
1185
-
1186
- if len(axis_nodes) == 0:
1187
- return None
1188
- # take the last processed dark ref
1189
- last_process_index = sorted(list(axis_nodes.values()))[-1]
1190
- last_process_dark = index_to_path[last_process_index]
1191
- if (len(index_to_path)) > 1:
1192
- _logger.debug(
1193
- "several processing found for dark-ref,"
1194
- "take the last one: %s" % last_process_dark
1195
- )
1196
-
1197
- res = None
1198
- if "results" in h5f[last_process_dark].keys():
1199
- results_node = h5f[last_process_dark]["results"]
1200
- if "center_of_rotation" in results_node.keys():
1201
- if as_url:
1202
- res = DataUrl(
1203
- file_path=process_file,
1204
- data_path="/".join((results_node, "center_of_rotation")),
1205
- scheme="h5py",
1206
- )
1207
- else:
1208
- res = h5py_read_dataset(results_node["center_of_rotation"])
1209
- return res
1210
-
1211
-
1212
- class AxisProcess(AxisTask):
1213
- def __init__(
1214
- self,
1215
- process_id=None,
1216
- varinfo=None,
1217
- inputs=None,
1218
- node_id=None,
1219
- node_attrs=None,
1220
- execinfo=None,
1221
- ):
1222
- deprecated_warning(
1223
- name="tomwer.core.process.reconstruction.axis.axis.AxisProcess",
1224
- type_="class",
1225
- reason="improve readibility",
1226
- since_version="1.2",
1227
- replacement="AxisTask",
1228
- )
1229
- super().__init__(process_id, varinfo, inputs, node_id, node_attrs, execinfo)