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,48 +1,16 @@
1
- # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2016-2017 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "04/03/2019"
29
-
1
+ from __future__ import annotations
30
2
 
31
3
  import logging
32
- import os
33
4
  from collections import namedtuple
34
- from typing import Union
35
5
 
36
- import h5py
37
6
  import numpy
38
7
  from silx.io.url import DataUrl
39
- from silx.utils.deprecation import deprecated
40
8
  from silx.utils.enum import Enum as _Enum
41
9
  from tomoscan.esrf.scan.utils import get_data
42
10
 
43
- from tomwer.core.process.task import Task
11
+ from tomwer.core.process.reconstruction.utils.cor import relative_pos_to_absolute
12
+ from tomwer.core.process.reconstruction.axis.side import Side
44
13
  from tomwer.core.scan.scanbase import TomwerScanBase
45
- from tomwer.core.utils.spec import getParametersFromParOrInfo
46
14
 
47
15
  from .anglemode import CorAngleMode
48
16
  from .mode import AxisMode, AXIS_MODE_METADATAS
@@ -110,13 +78,14 @@ class AxisResource(object):
110
78
  """Paganin configuration for axis calculation. To simplify we have only one
111
79
  static configuration for now. Otherwise complicate stuff"""
112
80
 
113
- def __init__(self, url):
81
+ def __init__(self, url: None | DataUrl, angle: float | None = None):
114
82
  assert url is None or isinstance(url, DataUrl)
115
83
  assert url is None or url.is_valid()
116
84
  self.__url = url
117
85
  self.__raw_data = None
118
86
  self.__norme_data = None
119
87
  self.__norm_paganin = None
88
+ self.__angle = angle
120
89
 
121
90
  def __str__(self):
122
91
  return f"{type(self)}, url: {self.__url.path() if self.__url else None}"
@@ -149,6 +118,10 @@ class AxisResource(object):
149
118
  def normalized_data(self, data):
150
119
  self.__norme_data = data
151
120
 
121
+ @property
122
+ def angle(self) -> float | None:
123
+ return self.__angle
124
+
152
125
  def normalize_data(self, scan, log_):
153
126
  """Normalize data for axis calculation"""
154
127
  if not isinstance(scan, TomwerScanBase):
@@ -183,8 +156,7 @@ class AxisResource(object):
183
156
  def normalized_data_paganin(self):
184
157
  """
185
158
 
186
- :return: data processed by the pagagnin phase retrieval
187
- :rtype: 2D numpy.array
159
+ :return: data processed by the Pagagin phase retrieval
188
160
  """
189
161
  if self.__url is None:
190
162
  return None
@@ -216,7 +188,7 @@ class AxisResource(object):
216
188
 
217
189
  class AxisRP:
218
190
  """
219
- Configuration class for a tomwer :class:`AxisProcess`
191
+ Configuration class for a tomwer :class:`AxisTask`
220
192
 
221
193
  note: every modification on the parameters will process a call fo changed
222
194
  except `axis_url_1` and `axis_url_2` which will produce a call to the
@@ -240,11 +212,12 @@ class AxisRP:
240
212
  "FINE_STEP_X",
241
213
  "SCALE_IMG2_TO_IMG1",
242
214
  "NEAR_POSITION",
215
+ "MOTOR_OFFSET",
216
+ "X_ROTATION_AXIS_PIXEL_POSITION",
243
217
  "SINOGRAM_SUBSAMPLING",
244
218
  "PADDING_MODE",
245
219
  "FLIP_LR",
246
220
  "COMPOSITE_OPTS",
247
- "SIDE",
248
221
  "COR_OPTIONS",
249
222
  )
250
223
 
@@ -259,17 +232,18 @@ class AxisRP:
259
232
  None is not processing"""
260
233
  self.__angle_mode = CorAngleMode.use_0_180
261
234
  """Angle to use for radios"""
235
+ self.__x_rotation_axis_pixel_position = None
236
+ """rotation axis position obtained from motor"""
237
+ self.__x_rotation_axis_pos_px_offset = 0.0
238
+ """motor offset to be used to compute the 'estimated_cor' from 'x_rotation_axis_pixel_position'"""
262
239
  self.__estimated_cor = 0.0
263
- """Position to use for near calculation"""
240
+ """Estimated position of the center of rotation. Given by the user or computed from 'x_rotation_axis_pixel_position' and 'pixel_offset'"""
264
241
  self.__axis_url_1 = AxisResource(url=None)
265
242
  """first data url to use for axis cor calculation"""
266
243
  self.__axis_url_2 = AxisResource(url=None)
267
244
  """second data url to use for axis cor calculation"""
268
245
  self.__calculation_input_type = AxisCalculationInput.transmission
269
246
  """Type of input (emission, absorption, with or without paganin)"""
270
- self.__use_sinogram = False
271
- """Do we want to use the sinogram of the radios for computing center
272
- of rotation"""
273
247
  self.__sinogram_line = "middle"
274
248
  """Line of the radios to use for getting the sinogram"""
275
249
  self.__sinogram_subsampling = 10
@@ -278,17 +252,14 @@ class AxisRP:
278
252
  self.__look_at_stdmax = False
279
253
  """do the near search at X position which as the max Y column standard
280
254
  deviation"""
281
- self.__near_wx = 5
255
+ self.__composite_window_size = 5
282
256
  """do the near search in an X window of size +-near_wx"""
283
- self.__fine_stepx = 0.1
257
+ self.__composite_fine_step = 0.1
284
258
  """shift step x for fine shifting image"""
285
259
  self.__scale_img2_to_img1 = False
286
260
  """do image scaling"""
287
261
  self.__padding_mode = None
288
262
  self.__frame_width = None
289
- self.__side = "right"
290
- """side of the cor. Requested by nabu cor algorithms growing-window
291
- and sliding-window"""
292
263
  self.__flip_lr = True
293
264
  self.__composite_options = {
294
265
  "theta": DEFAULT_CMP_THETA,
@@ -308,41 +279,11 @@ class AxisRP:
308
279
 
309
280
  @mode.setter
310
281
  def mode(self, mode):
311
- if isinstance(mode, str):
312
- try:
313
- name = mode
314
- if name in ("global_", "global"):
315
- name = AxisMode.global_.name
316
- elif name == "accurate":
317
- _logger.info(
318
- f"convert axis mode {name} to {AxisMode.centered.name} (renamed)"
319
- )
320
- name = AxisMode.centered.name
321
- elif name == "growing-window":
322
- _logger.warning(
323
- f"growing-window mode has been removed. Replace it by {AxisMode.growing_window_radios.value}"
324
- )
325
- name = AxisMode.growing_window_radios.name
326
- elif name == "sliding-window":
327
- _logger.warning(
328
- f"sliding-window mode has been removed. Replace it by {AxisMode.sliding_window_radios.value}"
329
- )
330
- name = AxisMode.sliding_window_radios.name
331
- try:
332
- _mode = getattr(AxisMode, name)
333
- except Exception:
334
- _mode = AxisMode.from_value(name)
335
- except Exception:
336
- raise ValueError(f"Fail to create axis mode from {mode}")
337
- else:
338
- if not isinstance(mode, AxisMode):
339
- raise TypeError(f"mode is expected to be an instance of {AxisMode}")
340
- _mode = mode
341
- self.__mode = _mode
282
+ self.__mode = AxisMode.from_value(mode)
342
283
  self.changed()
343
284
 
344
285
  @property
345
- def frame_width(self) -> Union[None, float]:
286
+ def frame_width(self) -> float | None:
346
287
  return self.__frame_width
347
288
 
348
289
  @frame_width.setter
@@ -369,11 +310,6 @@ class AxisRP:
369
310
  self.__angle_mode = mode
370
311
  self.changed()
371
312
 
372
- @property
373
- @deprecated(replacement="relative_cor_value", since_version="0.7")
374
- def value_ref_tomwer(self):
375
- return self.relative_cor_value
376
-
377
313
  @property
378
314
  def relative_cor_value(self):
379
315
  return self.__relative_value
@@ -385,7 +321,7 @@ class AxisRP:
385
321
  def set_relative_value(self, value):
386
322
  if not isinstance(value, (int, float, str, type(None))):
387
323
  raise TypeError(
388
- f"value is expected to be an instance of {int} {float}, {str} or {None}. {type(value)} provided"
324
+ f"value is expected to be an instance of {int}, {float}, {str}, or {None}. {type(value)} provided"
389
325
  )
390
326
  if value is None:
391
327
  changed = self.__relative_value is not None
@@ -400,41 +336,46 @@ class AxisRP:
400
336
  else:
401
337
  self.__relative_value = float(value)
402
338
  if self.frame_width is not None:
403
- self.__absolute_value = (
404
- self.__relative_value + self.frame_width / 2.0
339
+ self.__absolute_value = relative_pos_to_absolute(
340
+ relative_pos=self.__relative_value, det_width=self.frame_width
405
341
  )
406
342
  self.changed()
407
343
 
408
- @deprecated(replacement="set_relative_value", since_version="0.7")
409
- def set_value_ref_tomwer(self, value):
410
- self.set_relative_value(value=value)
411
-
412
- @property
413
- @deprecated(replacement="absolute_cor_value", since_version="0.7")
414
- def value_ref_nabu(self):
415
- return self.__absolute_value
416
-
417
344
  @property
418
- def estimated_cor(self):
345
+ def estimated_cor(self) -> Side | float | None:
419
346
  return self.__estimated_cor
420
347
 
421
348
  @estimated_cor.setter
422
- def estimated_cor(self, value):
349
+ def estimated_cor(self, value: Side | float | None):
350
+ try:
351
+ value = Side.from_value(value)
352
+ except ValueError:
353
+ pass
423
354
  if self.__estimated_cor != value:
424
355
  self.__estimated_cor = value
425
356
  self.changed()
426
357
 
427
358
  @property
428
- def side(self):
429
- return self.__side
430
-
431
- @side.setter
432
- def side(self, side):
433
- if side not in ("all", "left", "right", "center", "near"):
434
- raise ValueError(f"side '{side}' is not managed")
435
- if self.__side != side:
436
- self.__side = side
437
- self.changed()
359
+ def x_rotation_axis_pos_px_offset(self) -> float:
360
+ return self.__x_rotation_axis_pos_px_offset
361
+
362
+ @x_rotation_axis_pos_px_offset.setter
363
+ def x_rotation_axis_pos_px_offset(self, value: float):
364
+ assert isinstance(
365
+ value, float
366
+ ), f"x_rotation_axis_pos_px_offset should be a float. Got {type(value)}"
367
+ self.__x_rotation_axis_pos_px_offset = value
368
+
369
+ @property
370
+ def x_rotation_axis_pixel_position(self) -> float | None:
371
+ return self.__x_rotation_axis_pixel_position
372
+
373
+ @x_rotation_axis_pixel_position.setter
374
+ def x_rotation_axis_pixel_position(self, value: float | None):
375
+ assert isinstance(
376
+ value, (float, type(None))
377
+ ), f"x_rotation_axis_pixel_position should be None or a float. Got{type(value)}"
378
+ self.__x_rotation_axis_pixel_position = value
438
379
 
439
380
  @property
440
381
  def axis_url_1(self):
@@ -518,16 +459,6 @@ class AxisRP:
518
459
  self.__calculation_input_type = type_
519
460
  self.changed()
520
461
 
521
- @property
522
- def use_sinogram(self):
523
- return self.__use_sinogram
524
-
525
- @use_sinogram.setter
526
- def use_sinogram(self, sinogram):
527
- if self.__use_sinogram != sinogram:
528
- self.__use_sinogram = sinogram
529
- self.changed()
530
-
531
462
  @property
532
463
  def sinogram_line(self):
533
464
  return self.__sinogram_line
@@ -568,23 +499,24 @@ class AxisRP:
568
499
  self.__look_at_stdmax = stdmax
569
500
 
570
501
  @property
571
- def near_wx(self):
572
- return self.__near_wx
502
+ def composite_window_size(self):
503
+ return self.__composite_window_size
573
504
 
574
- @near_wx.setter
575
- def near_wx(self, width):
576
- if self.__near_wx != width:
577
- self.__near_wx = width
505
+ @composite_window_size.setter
506
+ def composite_window_size(self, width):
507
+ if self.__composite_window_size != width:
508
+ self.__composite_window_size = width
578
509
  self.changed()
579
510
 
580
511
  @property
581
- def fine_step_x(self):
582
- return self.__fine_stepx
583
-
584
- @fine_step_x.setter
585
- def fine_step_x(self, step_size):
586
- if self.__fine_stepx != step_size:
587
- self.__fine_stepx = step_size
512
+ def composite_fine_step(self):
513
+ """Fine step along x axis"""
514
+ return self.__composite_fine_step
515
+
516
+ @composite_fine_step.setter
517
+ def composite_fine_step(self, step_size):
518
+ if self.__composite_fine_step != step_size:
519
+ self.__composite_fine_step = step_size
588
520
  self.changed()
589
521
 
590
522
  @property
@@ -620,7 +552,7 @@ class AxisRP:
620
552
  @composite_options.setter
621
553
  def composite_options(self, opts: dict) -> None:
622
554
  """
623
- :param dict opts: options to use for the composite COR search
555
+ :param opts: options to use for the composite COR search
624
556
  :raises:
625
557
  * KeyError if some provided keys are not handled
626
558
  * TypeError if opts is not an instance of dictionary
@@ -641,7 +573,7 @@ class AxisRP:
641
573
  "near_pos",
642
574
  "near_width",
643
575
  ):
644
- raise KeyError(f"{key} is not recogized")
576
+ raise KeyError(f"{key} is not recognized")
645
577
  self.__composite_options = opts
646
578
 
647
579
  @property
@@ -655,102 +587,9 @@ class AxisRP:
655
587
  self.changed()
656
588
 
657
589
  def changed(self):
658
- """callback to overwrite when the paramter value changed"""
590
+ """callback to overwrite when the parameter value changed"""
659
591
  pass
660
592
 
661
- def set_position_frm_par_file(self, file_path, entry=None, force=False):
662
- """Set position value from a file
663
-
664
- :param str file_path: path to the par file
665
- :param bool force: if True, force the mode to read and set
666
- `position_value` to None if failed to read the file.
667
- Otherwise only `mode` and `position_value` when the
668
- file read succeed.
669
- """
670
-
671
- def get_position_in_file():
672
- if not os.path.isfile(file_path):
673
- raise ValueError(file_path, "is not a valid file path")
674
-
675
- if h5py.is_hdf5(file_path):
676
- return self.get_cor_position_frm_tomwer_file(
677
- file_path=file_path, entry=entry
678
- )
679
- elif file_path.lower().endswith(".par") or file_path.lower().endswith(
680
- ".info"
681
- ):
682
- _dict = getParametersFromParOrInfo(file_path)
683
- if self.AXIS_POSITION_PAR_KEY.lower() not in _dict:
684
- err = f"fail to find `{self.AXIS_POSITION_PAR_KEY}` in {file_path}"
685
- _logger.info(err)
686
- raise KeyError(err)
687
- else:
688
- return _dict[self.AXIS_POSITION_PAR_KEY.lower()]
689
- else:
690
- with open(file_path, mode="r") as fd:
691
- l1 = fd.readline()
692
- values = l1.split(" ")
693
- if len(values) > 0:
694
- try:
695
- res = float(values[0])
696
- except Exception:
697
- _logger.info(
698
- f"fail to load center of rotation from {file_path}"
699
- )
700
- return None
701
- else:
702
- return res
703
-
704
- if force:
705
- try:
706
- position = get_position_in_file()
707
- except (KeyError, ValueError) as e:
708
- _logger.warning(e)
709
- position = None
710
- else:
711
- position = get_position_in_file()
712
-
713
- changed = self.mode != AxisMode.read or position != self.relative_cor_value
714
- self.mode = AxisMode.read
715
- if position is None:
716
- self.set_relative_value(None)
717
- else:
718
- self.set_relative_value(float(position))
719
-
720
- if changed:
721
- self.changed()
722
-
723
- @staticmethod
724
- def get_cor_position_frm_tomwer_file(
725
- file_path: str, entry=None
726
- ) -> Union[None, float]:
727
- """
728
- Parse the given .h5 file, looking for axis processes. If found some
729
- then return the first value discover
730
-
731
- :param str file_path: tomwer processes file (.h5)
732
- :return: center of rotation or none
733
- :rtype: Union[None, float]
734
- """
735
- from .axis import AxisTask # avoid cyclic import
736
-
737
- processes = Task.get_processes_frm_type(
738
- process_file=file_path, process_type=AxisTask, entry=entry
739
- )
740
- if len(processes) == 0:
741
- _logger.warning("failed to find any information on center " "of rotation")
742
- return None
743
- elif len(processes) > 1:
744
- _logger.info("found more than one value computed for " "center of rotation")
745
- _logger.info(
746
- f"load center of rotation from {file_path}: {processes[0].results['center_of_rotation']}"
747
- )
748
- cor = processes[0].results["center_of_rotation"]
749
- if cor in [None, ""]:
750
- return None
751
- else:
752
- return float(cor)
753
-
754
593
  def n_url(self):
755
594
  """
756
595
 
@@ -781,21 +620,27 @@ class AxisRP:
781
620
  "POSITION_VALUE": self.relative_cor_value,
782
621
  "CALC_INPUT_TYPE": self.calculation_input_type.to_dict(),
783
622
  "ANGLE_MODE": self.angle_mode.value,
784
- "USE_SINOGRAM": self.use_sinogram,
785
- "SINOGRAM_LINE": self.sinogram_line if self.use_sinogram else "",
623
+ "SINOGRAM_LINE": (
624
+ self.sinogram_line if self.mode.requires_sinogram_index() else ""
625
+ ),
786
626
  "SINOGRAM_SUBSAMPLING": self.sinogram_subsampling,
787
627
  "AXIS_URL_1": axis_urls_1,
788
628
  "AXIS_URL_2": axis_urls_2,
789
629
  "LOOK_AT_STDMAX": self.look_at_stdmax,
790
- "NEAR_WX": self.near_wx,
791
- "FINE_STEP_X": self.fine_step_x,
630
+ "NEAR_WX": self.composite_window_size,
631
+ "FINE_STEP_X": self.composite_fine_step,
792
632
  "SCALE_IMG2_TO_IMG1": self.scale_img2_to_img1,
793
- "NEAR_POSITION": self.estimated_cor,
633
+ "NEAR_POSITION": (
634
+ self.estimated_cor.value
635
+ if isinstance(self.estimated_cor, Side)
636
+ else self.estimated_cor
637
+ ),
794
638
  "PADDING_MODE": self.padding_mode,
795
639
  "FLIP_LR": self.flip_lr,
796
640
  "COMPOSITE_OPTS": self.composite_options,
797
- "SIDE": self.side,
798
641
  "COR_OPTIONS": self.extra_cor_options,
642
+ "MOTOR_OFFSET": self.x_rotation_axis_pos_px_offset,
643
+ "X_ROTATION_AXIS_PIXEL_POSITION": self.x_rotation_axis_pixel_position,
799
644
  }
800
645
  return _dict
801
646
 
@@ -820,8 +665,6 @@ class AxisRP:
820
665
  self.calculation_input_type = AxisCalculationInput.from_value(
821
666
  _dict["CALC_INPUT_TYPE"]
822
667
  )
823
- if "USE_SINOGRAM" in _dict:
824
- self.use_sinogram = _dict["USE_SINOGRAM"]
825
668
  if "ANGLE_MODE" in _dict:
826
669
  self.angle_mode = CorAngleMode.from_value(_dict["ANGLE_MODE"])
827
670
  if "SINOGRAM_LINE" in _dict:
@@ -833,13 +676,13 @@ class AxisRP:
833
676
  if "LOOK_AT_STDMAX" in _dict:
834
677
  self.look_at_stdmax = _dict["LOOK_AT_STDMAX"]
835
678
  if "NEAR_WX" in _dict:
836
- self.near_wx = _dict["NEAR_WX"]
679
+ self.composite_window_size = _dict["NEAR_WX"]
837
680
  if "FINE_STEP_X" in _dict:
838
- self.fine_step_x = _dict["FINE_STEP_X"]
681
+ self.composite_fine_step = _dict["FINE_STEP_X"]
839
682
  if "SCALE_IMG2_TO_IMG1" in _dict:
840
683
  self.scale_img2_to_img1 = _dict["SCALE_IMG2_TO_IMG1"]
841
684
  if "NEAR_POSITION" in _dict:
842
- self.estimated_cor = float(_dict["NEAR_POSITION"])
685
+ self.estimated_cor = _dict["NEAR_POSITION"]
843
686
  if "SINOGRAM_SUBSAMPLING" in _dict:
844
687
  self.sinogram_subsampling = _dict["SINOGRAM_SUBSAMPLING"]
845
688
  if "PADDING_MODE" in _dict:
@@ -848,8 +691,6 @@ class AxisRP:
848
691
  self.flip_lr = bool(_dict["FLIP_LR"])
849
692
  if "COMPOSITE_OPTS" in _dict:
850
693
  self.composite_options = _dict["COMPOSITE_OPTS"]
851
- if "SIDE" in _dict:
852
- self.side = _dict["SIDE"]
853
694
  self.extra_cor_options = _dict.get("COR_OPTIONS", "")
854
695
 
855
696
  def copy(self, axis_params, copy_axis_url=True, copy_flip_lr=True):
@@ -858,17 +699,17 @@ class AxisRP:
858
699
  self.frame_width = axis_params.frame_width
859
700
  self.set_relative_value(axis_params.relative_cor_value)
860
701
  self.calculation_input_type = axis_params.calculation_input_type
861
- self.use_sinogram = axis_params.use_sinogram
862
702
  self.angle_mode = axis_params.angle_mode
863
703
  self.sinogram_line = axis_params.sinogram_line
864
704
  self.sinogram_subsampling = axis_params.sinogram_subsampling
865
705
  self.look_at_stdmax = axis_params.look_at_stdmax
866
- self.near_wx = axis_params.near_wx
867
- self.fine_step_x = axis_params.fine_step_x
706
+ self.composite_window_size = axis_params.composite_window_size
707
+ self.composite_fine_step = axis_params.composite_fine_step
868
708
  self.scale_img2_to_img1 = axis_params.scale_img2_to_img1
869
709
  self.estimated_cor = axis_params.estimated_cor
710
+ self.x_rotation_axis_pixel_position = axis_params.x_rotation_axis_pixel_position
711
+ self.x_rotation_axis_pos_px_offset = axis_params.x_rotation_axis_pos_px_offset
870
712
  self.padding_mode = axis_params.padding_mode
871
- self.side = axis_params.side
872
713
  self.composite_options = axis_params.composite_options
873
714
  self.extra_cor_options = axis_params.extra_cor_options
874
715
  if copy_axis_url:
@@ -895,56 +736,63 @@ class AxisRP:
895
736
  AxisMode.sliding_window_radios,
896
737
  AxisMode.sliding_window_sinogram,
897
738
  ):
898
- extra_info = f"side: {self.side}, use sinogram: {self.use_sinogram}"
739
+ extra_info = f"side: {self.estimated_cor}"
899
740
  results = ", ".join((results, extra_info))
900
741
  return results
901
742
 
902
743
  def get_nabu_cor_options_as_dict(self) -> str:
903
744
  options = {}
904
- if self.mode is AxisMode.near:
905
- self.side = "near"
906
- request_side = len(AXIS_MODE_METADATAS[self.mode].valid_sides) > 0
907
- if request_side:
908
-
909
- if self.side == "near":
910
- options["side"] = self.composite_options.get(
911
- "near_pos", self.estimated_cor
912
- )
913
- else:
914
- options["side"] = self.side
745
+ # provide side. Scalar if a first guess is provided else a value in ('left', 'right', 'center', 'all')
746
+ if (
747
+ isinstance(self.estimated_cor, Side)
748
+ and AXIS_MODE_METADATAS[self.mode].valid_sides
749
+ ):
750
+ options["side"] = self.estimated_cor.value
751
+ elif AXIS_MODE_METADATAS[self.mode].allows_estimated_cor_as_numerical_value:
752
+ options["side"] = self.estimated_cor
753
+
754
+ if self.mode in (AxisMode.composite_coarse_to_fine, AxisMode.near):
755
+ options["near_width"] = self.composite_options.get(
756
+ "near_width", DEFAULT_CMP_NEAR_WIDTH
757
+ )
758
+ options["theta_interval"] = self.composite_options.get(
759
+ "theta_interval", DEFAULT_CMP_THETA
760
+ )
761
+ options["oversampling"] = self.composite_options.get(
762
+ "oversampling", DEFAULT_CMP_OVERSAMPLING
763
+ )
764
+ options["n_subsampling_y"] = self.composite_options.get(
765
+ "n_subsampling_y", DEFAULT_CMP_N_SUBSAMPLING_Y
766
+ )
767
+ options["take_log"] = self.composite_options.get(
768
+ "take_log", DEFAULT_CMP_TAKE_LOG
769
+ )
915
770
 
916
- if self.side == "near":
917
- near_width = self.composite_options.get("near_width", 20.0)
918
- options["near_width"] = near_width
771
+ # provide radio indices or sinogram index
772
+ if self.mode.requires_radio_indices:
773
+ # warning: nabu expect radio angles to be in rad, in nxtomo and tomwer they are in degrees
774
+ options["radio_angles"] = (
775
+ numpy.deg2rad(self.axis_url_1.angle or 0.0),
776
+ numpy.deg2rad(self.axis_url_2.angle or 180.0),
777
+ )
778
+ if self.mode.requires_sinogram_index:
779
+ options["slice_idx"] = self.sinogram_line
919
780
 
920
781
  # append "extra_cor_options" to already handled cor options
782
+ # expected values: low_pass, high_pass
921
783
  extra_cor_options = self.extra_cor_options.replace(" ", "")
922
784
 
923
785
  if extra_cor_options != "":
924
786
  for opt in self.extra_cor_options.replace(" ", "").split(";"):
925
787
  if len(opt.split("=")) == 2:
926
788
  key, value = opt.split("=")
927
- options[key] = value
789
+ if key in ("low_pass", "high_pass"):
790
+ value = float(value)
791
+ options[key] = value
792
+ else:
793
+ _logger.warning(
794
+ f"key {key} is not recognized by nabu. Ignore it."
795
+ )
928
796
  else:
929
- _logger.info(f"ignore option {opt}. Invalid synthax")
797
+ _logger.info(f"ignore option {opt}. Invalid syntax")
930
798
  return options
931
-
932
- @deprecated(replacement="get_nabu_cor_options_as_str", since_version="1.1")
933
- def get_nabu_cor_options(self) -> str:
934
- return self.get_nabu_cor_options_as_str()
935
-
936
- def get_nabu_cor_options_as_str(self) -> str:
937
- """return cor option for nabu"""
938
-
939
- def cast_key_value(key, value):
940
- if key in ("side",):
941
- return f"{key}='{value}'"
942
- else:
943
- return f"{key}={value}"
944
-
945
- return " ; ".join(
946
- [
947
- cast_key_value(key, value)
948
- for key, value in self.get_nabu_cor_options_as_dict().items()
949
- ]
950
- )
@@ -1,32 +1,4 @@
1
1
  # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2016-2017 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "15/10/2019"
29
-
30
2
 
31
3
  from silx.utils.enum import Enum as _Enum
32
4