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,57 +1,29 @@
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__ = "12/01/2022"
29
-
1
+ from __future__ import annotations
30
2
 
31
3
  import logging
32
4
  from contextlib import AbstractContextManager
33
- from typing import Iterable, Optional
5
+ from typing import Iterable
34
6
 
35
7
  from silx.gui import qt
36
8
  from silx.gui.utils import blockSignals
37
9
  from silx.utils.enum import Enum as _Enum
38
- from tomoscan.serie import Serie
10
+ from tomoscan.series import Series
39
11
 
40
12
  from tomwer.core.scan.scanbase import TomwerScanBase
41
13
  from tomwer.core.scan.scanfactory import ScanFactory
42
14
  from tomwer.core.tomwer_object import TomwerObject
43
15
  from tomwer.core.volume.volumefactory import VolumeFactory
44
16
  from tomwer.gui.control.datalist import TomoObjList
45
- from tomwer.gui.qfolderdialog import QDataDialog
17
+ from tomwer.gui.dialog.QDataDialog import QDataDialog
46
18
  from tomwer.gui.visualization.tomoobjoverview import TomoObjOverview
47
19
 
48
20
  _logger = logging.getLogger(__name__)
49
21
 
50
22
 
51
- class SerieWidgetDialog(qt.QDialog):
52
- sigSerieSelected = qt.Signal(Serie)
23
+ class SeriesWidgetDialog(qt.QDialog):
24
+ sigSeriesSelected = qt.Signal(Series)
53
25
  """
54
- emit when a serie is selected / triggered by the user
26
+ emit when a series is selected / triggered by the user
55
27
  """
56
28
 
57
29
  def __init__(self, *args, **kwargs) -> None:
@@ -59,108 +31,110 @@ class SerieWidgetDialog(qt.QDialog):
59
31
 
60
32
  self.setLayout(qt.QVBoxLayout())
61
33
  # add list
62
- self._widget = SerieWidget()
34
+ self._widget = SeriesWidget()
63
35
  self.layout().addWidget(self._widget)
64
36
  # add buttons
65
37
  self._buttons = qt.QDialogButtonBox(parent=self)
66
- self._selectButton = qt.QPushButton("Select (active) serie", parent=self)
38
+ self._selectButton = qt.QPushButton("Select (active) series", parent=self)
67
39
  self._buttons.addButton(self._selectButton, qt.QDialogButtonBox.ActionRole)
68
40
  self.layout().addWidget(self._buttons)
69
41
 
70
42
  # connect signal / slot
71
- self._selectButton.released.connect(self._serieSelected)
43
+ self._selectButton.released.connect(self._seriesSelected)
72
44
 
73
- def getSelectedSerie(self) -> Optional[Serie]:
74
- return self._widget.getSelectedSerie()
45
+ def getSelectedSeries(self) -> Series | None:
46
+ return self._widget.getSelectedSeries()
75
47
 
76
- def _serieSelected(self, *args, **kwargs):
77
- serie = self.getSelectedSerie()
78
- if serie is not None:
79
- self.sigSerieSelected.emit(serie)
48
+ def _seriesSelected(self, *args, **kwargs):
49
+ series = self.getSelectedSeries()
50
+ if series is not None:
51
+ self.sigSeriesSelected.emit(series)
80
52
 
81
53
  # expose API
82
54
  def add(self, tomo_obj):
83
55
  self._widget.add(tomo_obj=tomo_obj)
84
56
 
85
57
 
86
- class SerieWidget(qt.QTabWidget):
87
- sigCurrentSerieChanged = qt.Signal()
88
- """signal emit when the current serie changes"""
58
+ class SeriesWidget(qt.QTabWidget):
59
+ sigCurrentSeriesChanged = qt.Signal()
60
+ """signal emit when the current series changes"""
89
61
 
90
62
  sigHistoryChanged = qt.Signal()
91
- """signal emit when the history changed (a serie has been added or removed"""
63
+ """signal emit when the history changed (a series has been added or removed"""
92
64
 
93
- sigSerieSend = qt.Signal(Serie)
94
- """Signal emited when a serie has been send"""
65
+ sigSeriesSend = qt.Signal(Series)
66
+ """Signal emit when a series has been send"""
95
67
 
96
68
  _HISTORY_MODE = "history"
97
- _DEFINITION_MODE = "serie definition"
69
+ _DEFINITION_MODE = "series definition"
98
70
 
99
71
  def __init__(self, parent=None) -> None:
100
72
  super().__init__(parent)
101
- self.setWindowTitle("serie of scans")
102
- self._serieDefinitionWidget = SerieDefinition(parent=self)
103
- self.addTab(self._serieDefinitionWidget, self._DEFINITION_MODE)
104
- self._historyWidget = SerieHistoryDialog(parent=self)
73
+ self.setWindowTitle("series of scans")
74
+ self._seriesDefinitionWidget = SeriesDefinition(parent=self)
75
+ self.addTab(self._seriesDefinitionWidget, self._DEFINITION_MODE)
76
+ self._historyWidget = SeriesHistoryDialog(parent=self)
105
77
  self._historyWidget.setWindowFlags(qt.Qt.Widget)
106
78
  self.addTab(self._historyWidget, self._HISTORY_MODE)
107
79
 
108
- # conenct signal / slot
109
- self._historyWidget.sigEditSerie.connect(self._serieEditionRequested)
110
- self._historyWidget.sigSerieSend.connect(self.sigSerieSend)
80
+ # connect signal / slot
81
+ self._historyWidget.sigEditSeries.connect(self._seriesEditionRequested)
82
+ self._historyWidget.sigSeriesSend.connect(self.sigSeriesSend)
111
83
  self._historyWidget.sigHistoryUpdated.connect(self._repeatHistoryUpdated)
112
- self._serieDefinitionWidget.sigSerieChanged.connect(self._repeatSerieChanged)
113
- self._serieDefinitionWidget.sigSerieSend.connect(self.sigSerieSend)
114
- self._serieDefinitionWidget.sigSerieSend.connect(self._historyWidget.addSerie)
84
+ self._seriesDefinitionWidget.sigSeriesChanged.connect(self._repeatSeriesChanged)
85
+ self._seriesDefinitionWidget.sigSeriesSend.connect(self.sigSeriesSend)
86
+ self._seriesDefinitionWidget.sigSeriesSend.connect(
87
+ self._historyWidget.addSeries
88
+ )
115
89
 
116
90
  def getHistoryWidget(self):
117
91
  return self._historyWidget
118
92
 
119
93
  def getDefinitionWidget(self):
120
- return self._serieDefinitionWidget
94
+ return self._seriesDefinitionWidget
121
95
 
122
- def getSelectedSerie(self) -> Optional[Serie]:
123
- return self._serieDefinitionWidget.getSelectedSerie()
96
+ def getSelectedSeries(self) -> Series | None:
97
+ return self._seriesDefinitionWidget.getSelectedSeries()
124
98
 
125
- def setMode(self, mode: str, definition_mode: Optional[str] = None):
99
+ def setMode(self, mode: str, definition_mode: str | None = None):
126
100
  valid_modes = (self._HISTORY_MODE, self._DEFINITION_MODE)
127
101
  if mode == self._HISTORY_MODE:
128
102
  self.setCurrentWidget(self._historyWidget)
129
103
  elif mode == self._DEFINITION_MODE:
130
- self.setCurrentWidget(self._serieDefinitionWidget)
131
- self._serieDefinitionWidget.setMode(definition_mode)
104
+ self.setCurrentWidget(self._seriesDefinitionWidget)
105
+ self._seriesDefinitionWidget.setMode(definition_mode)
132
106
  else:
133
107
  raise ValueError(
134
108
  f"mode {mode} is no recognized. Valid modes are {valid_modes}"
135
109
  )
136
110
 
137
- def _serieEditionRequested(self, serie: Serie):
138
- if not isinstance(serie, Serie):
139
- raise TypeError(f"serie is expected to be a serie not {type(serie)}")
140
- self.setMode("serie definition", "manual")
141
- self.getDefinitionWidget().getManualDefinitionWidget().setSerie(serie)
111
+ def _seriesEditionRequested(self, series: Series):
112
+ if not isinstance(series, Series):
113
+ raise TypeError(f"series is expected to be a series not {type(series)}")
114
+ self.setMode("series definition", "manual")
115
+ self.getDefinitionWidget().getManualDefinitionWidget().setSeries(series)
142
116
 
143
- def _repeatSerieChanged(self, *args, **kwargs):
144
- self.sigCurrentSerieChanged.emit()
117
+ def _repeatSeriesChanged(self, *args, **kwargs):
118
+ self.sigCurrentSeriesChanged.emit()
145
119
 
146
120
  def _repeatHistoryUpdated(self, *args, **kwargs):
147
121
  self.sigHistoryChanged.emit()
148
122
 
149
123
  def add(self, tomo_obj):
150
- return self._serieDefinitionWidget.addTomoObj(tomo_obj)
124
+ return self._seriesDefinitionWidget.addTomoObj(tomo_obj)
151
125
 
152
126
 
153
- class _SerieDefinitionMode(_Enum):
127
+ class _SeriesDefinitionMode(_Enum):
154
128
  MANUAL = "manual"
155
129
  AUTO = "auto"
156
130
 
157
131
 
158
- class SerieDefinition(qt.QWidget):
159
- sigSerieChanged = qt.Signal()
160
- ### signal emit when a the serie defined manually changed
132
+ class SeriesDefinition(qt.QWidget):
133
+ sigSeriesChanged = qt.Signal()
134
+ """signal emit when a the series defined manually changed"""
161
135
 
162
- sigSerieSend = qt.Signal(Serie)
163
- ### signal emit when a serie is send
136
+ sigSeriesSend = qt.Signal(Series)
137
+ """Signal emited when a series has been send"""
164
138
 
165
139
  def __init__(self, parent=None) -> None:
166
140
  super().__init__(parent)
@@ -170,41 +144,43 @@ class SerieDefinition(qt.QWidget):
170
144
  self.layout().addWidget(self._modeLabel, 0, 0, 1, 1)
171
145
 
172
146
  self._modeCB = qt.QComboBox(self)
173
- for mode in _SerieDefinitionMode.values():
147
+ for mode in _SeriesDefinitionMode.values():
174
148
  self._modeCB.addItem(mode)
175
149
  self.layout().addWidget(self._modeCB, 0, 1, 1, 1)
176
150
 
177
- self._manualDefWidget = SerieManualFromTomoObj(parent=self)
151
+ self._manualDefWidget = SeriesManualFromTomoObj(parent=self)
178
152
  self.layout().addWidget(self._manualDefWidget, 1, 0, 1, 2)
179
153
  self._manualDefWidget.setWindowFlags(qt.Qt.Widget)
180
154
 
181
- self._automaticDefWidget = SerieAutomaticDefinitionWidget(parent=self)
155
+ self._automaticDefWidget = SeriesAutomaticDefinitionWidget(parent=self)
182
156
  self.layout().addWidget(self._automaticDefWidget, 2, 0, 1, 2)
183
157
 
184
158
  # connect signal / slot
185
159
  self._modeCB.currentIndexChanged.connect(self._updateVisibility)
186
- self._manualDefWidget._newSerieWidget.sigUpdated.connect(self.sigSerieChanged)
160
+ self._manualDefWidget._newSeriesWidget.sigUpdated.connect(self.sigSeriesChanged)
187
161
 
188
162
  # set up
189
163
  self._updateVisibility()
190
164
 
191
- def getSelectedSerie(self) -> Optional[Serie]:
192
- if self.getMode() == _SerieDefinitionMode.MANUAL:
193
- return self._manualDefWidget.getSerie()
165
+ def getSelectedSeries(self) -> Series | None:
166
+ if self.getMode() == _SeriesDefinitionMode.MANUAL:
167
+ return self._manualDefWidget.getSeries()
194
168
  else:
195
169
  raise ValueError(f"mode {self.getMode()} is not handled yet")
196
170
 
197
171
  def getMode(self) -> str:
198
- return _SerieDefinitionMode.from_value(self._modeCB.currentText())
172
+ return _SeriesDefinitionMode.from_value(self._modeCB.currentText())
199
173
 
200
174
  def setMode(self, mode: str):
201
- mode = _SerieDefinitionMode.from_value(mode)
175
+ mode = _SeriesDefinitionMode.from_value(mode)
202
176
  idx = self._modeCB.findText(mode.value)
203
177
  self._modeCB.setCurrentIndex(idx)
204
178
 
205
179
  def _updateVisibility(self):
206
- self._manualDefWidget.setVisible(self.getMode() == _SerieDefinitionMode.MANUAL)
207
- self._automaticDefWidget.setVisible(self.getMode() == _SerieDefinitionMode.AUTO)
180
+ self._manualDefWidget.setVisible(self.getMode() == _SeriesDefinitionMode.MANUAL)
181
+ self._automaticDefWidget.setVisible(
182
+ self.getMode() == _SeriesDefinitionMode.AUTO
183
+ )
208
184
 
209
185
  def getManualDefinitionWidget(self):
210
186
  return self._manualDefWidget
@@ -212,24 +188,24 @@ class SerieDefinition(qt.QWidget):
212
188
  def getAutoDefinitionWidget(self):
213
189
  return self._automaticDefWidget
214
190
 
215
- def createManualSerie(self):
216
- self._manualDefWidget.createSerie()
191
+ def createManualSeries(self):
192
+ self._manualDefWidget.createSeries()
217
193
 
218
194
  def addTomoObj(self, tomo_obj: TomwerObject):
219
195
  self._manualDefWidget.addTomoObj(tomo_obj=tomo_obj)
220
196
 
221
- def setSerieName(self, name: str):
222
- self._manualDefWidget.setSerieName(name=name)
197
+ def setSeriesName(self, name: str):
198
+ self._manualDefWidget.setSeriesName(name=name)
223
199
 
224
200
 
225
- class _SerieDefinitionTree(qt.QWidget):
201
+ class _SeriesDefinitionTree(qt.QWidget):
226
202
  """
227
- Tree used to define manually serie of scan.
203
+ Tree used to define manually series of scan.
228
204
  Drag and drop of files is handled
229
205
  """
230
206
 
231
207
  sigUpdated = qt.Signal()
232
- """Signal emit when the serie is updated"""
208
+ """Signal emit when the series is updated"""
233
209
 
234
210
  class SignalBlocker(AbstractContextManager):
235
211
  """Simple context manager to hide / show button dialogs"""
@@ -254,15 +230,15 @@ class _SerieDefinitionTree(qt.QWidget):
254
230
  self._tree = qt.QTreeWidget(self)
255
231
  self._tree.setSelectionMode(qt.QAbstractItemView.MultiSelection)
256
232
  self._tree.setColumnCount(2)
257
- self._tree.setHeaderLabels(("serie", "scan ids"))
233
+ self._tree.setHeaderLabels(("series", "scan ids"))
258
234
  self._tree.setItemsExpandable(False)
259
235
  self.layout().addWidget(self._tree)
260
236
 
261
237
  # set up the tree with the serie name that will stay during the entire
262
238
  # life time of the tree
263
- self._serieItem = qt.QTreeWidgetItem(self._tree)
264
- self._serieItem.setFlags(self._serieItem.flags() | qt.Qt.ItemIsEditable)
265
- self._serieItem.setExpanded(True)
239
+ self._seriesItem = qt.QTreeWidgetItem(self._tree)
240
+ self._seriesItem.setFlags(self._seriesItem.flags() | qt.Qt.ItemIsEditable)
241
+ self._seriesItem.setExpanded(True)
266
242
 
267
243
  self.setAcceptDrops(True)
268
244
 
@@ -270,22 +246,22 @@ class _SerieDefinitionTree(qt.QWidget):
270
246
  self._tree.itemChanged.connect(self._updated)
271
247
 
272
248
  # set up
273
- self.setSerieName(name=serie_name)
249
+ self.setSeriesName(name=serie_name)
274
250
 
275
251
  # expose API
276
252
  self.itemChanged = self._tree.itemChanged
277
253
 
278
254
  @property
279
255
  def rootItem(self):
280
- return self._serieItem
256
+ return self._seriesItem
281
257
 
282
- def setSerieName(self, name: str):
258
+ def setSeriesName(self, name: str):
283
259
  with self.SignalBlocker(self):
284
- self._serieItem.setText(0, name)
260
+ self._seriesItem.setText(0, name)
285
261
  self.sigUpdated.emit()
286
262
 
287
- def getSerieName(self):
288
- return self._serieItem.text(0)
263
+ def getSeriesName(self):
264
+ return self._seriesItem.text(0)
289
265
 
290
266
  def addTomoObj(self, tomo_obj: TomwerObject):
291
267
  if not isinstance(tomo_obj, TomwerObject):
@@ -324,16 +300,16 @@ class _SerieDefinitionTree(qt.QWidget):
324
300
  def n_tomo_objs(self):
325
301
  return len(self._tomo_objs)
326
302
 
327
- def setSerie(self, serie: Serie) -> None:
328
- if not isinstance(serie, Serie):
303
+ def setSeries(self, series: Series) -> None:
304
+ if not isinstance(series, Series):
329
305
  raise TypeError(
330
- f"serie is expected to be an instance of {Serie} not {type(serie)}"
306
+ f"serie is expected to be an instance of {Series} not {type(series)}"
331
307
  )
332
308
 
333
309
  with self.SignalBlocker(self):
334
310
  self.clearTomoObjs()
335
- self.setSerieName(serie.name)
336
- for tomo_obj in serie:
311
+ self.setSeriesName(series.name)
312
+ for tomo_obj in series:
337
313
  if isinstance(tomo_obj, str):
338
314
  try:
339
315
  tomo_obj = ScanFactory.create_tomo_object_from_identifier(
@@ -354,10 +330,10 @@ class _SerieDefinitionTree(qt.QWidget):
354
330
  self.addTomoObj(tomo_obj)
355
331
  self.sigUpdated.emit()
356
332
 
357
- def getSerie(self, use_identifiers=False) -> Serie:
333
+ def getSeries(self, use_identifiers=False) -> Series:
358
334
  scans = [scan for scan, _ in self._tomo_objs.values()]
359
- return Serie(
360
- name=self.getSerieName(),
335
+ return Series(
336
+ name=self.getSeriesName(),
361
337
  iterable=scans,
362
338
  use_identifiers=use_identifiers,
363
339
  )
@@ -378,7 +354,7 @@ class _SerieDefinitionTree(qt.QWidget):
378
354
  if scan_item is not None:
379
355
  scan_item.setSelected(True)
380
356
 
381
- def _getTomoObjItem(self, tomo_obj: TomwerObject) -> Optional[qt.QTreeWidgetItem]:
357
+ def _getTomoObjItem(self, tomo_obj: TomwerObject) -> qt.QTreeWidgetItem | None:
382
358
  if not isinstance(tomo_obj, TomwerObject):
383
359
  raise TypeError(
384
360
  f"scan is expected to be an instance of {TomwerObject} not {type(tomo_obj)}"
@@ -404,7 +380,7 @@ class _SerieDefinitionTree(qt.QWidget):
404
380
  def clearSelection(self) -> None:
405
381
  self._tree.selectionModel().clearSelection()
406
382
 
407
- def addScanFromNxFile(self, file_: str, entry: Optional[str] = None):
383
+ def addScanFromNxFile(self, file_: str, entry: str | None = None):
408
384
  try:
409
385
  if entry is None:
410
386
  scans = ScanFactory.create_scan_objects(scan_path=file_)
@@ -452,18 +428,19 @@ class _SerieDefinitionTree(qt.QWidget):
452
428
  qt.QListWidget.dragMoveEvent(self, event)
453
429
 
454
430
 
455
- class SerieManualControlDialog(qt.QDialog):
431
+ class SeriesManualControlDialog(qt.QDialog):
456
432
  """
457
- Same as the :class:`SerieManualDefinitionDialog` but with control of the serie.
458
- This include a `create serie` and a `create serie and clear button`
433
+ Same as the :class:`SeriesManualDefinitionDialog` but with control of the serie.
434
+ This include a `create series` and a `create series and clear button`
459
435
  """
460
436
 
461
- sigSerieSend = qt.Signal(Serie)
437
+ sigSeriesSend = qt.Signal(Series)
438
+ """Signal emit when a series has been send"""
462
439
 
463
440
  def __init__(self, parent=None) -> None:
464
441
  super().__init__(parent)
465
442
  self.setLayout(qt.QVBoxLayout())
466
- self._mainWidget = SerieManualDefinitionDialog(parent=self)
443
+ self._mainWidget = SeriesManualDefinitionDialog(parent=self)
467
444
  self._mainWidget.setWindowFlags(qt.Qt.Widget)
468
445
  self.layout().addWidget(self._mainWidget)
469
446
 
@@ -472,32 +449,32 @@ class SerieManualControlDialog(qt.QDialog):
472
449
  self._buttons.addButton(self._createButton, qt.QDialogButtonBox.ActionRole)
473
450
 
474
451
  # connect signal / slot
475
- self._createButton.clicked.connect(self._sendSerie)
452
+ self._createButton.clicked.connect(self._sendSeries)
476
453
  self.layout().addWidget(self._buttons)
477
454
 
478
455
  # expose API
479
456
  self.sigUpdated = self._mainWidget.sigUpdated
480
457
 
481
- def _sendSerie(self):
482
- self.sigSerieSend.emit(self._mainWidget.getSerie())
458
+ def _sendSeries(self):
459
+ self.sigSeriesSend.emit(self._mainWidget.getSeries())
483
460
 
484
461
  @property
485
462
  def n_tomo_objs(self):
486
463
  return self._mainWidget.n_tomo_objs
487
464
 
488
- def setSerieName(self, name: str):
489
- self._mainWidget.setSerieName(name=name)
465
+ def setSeriesName(self, name: str):
466
+ self._mainWidget.setSeriesName(name=name)
490
467
 
491
- def getSerieName(self) -> str:
492
- return self._mainWidget.getSerieName()
468
+ def getSeriesName(self) -> str:
469
+ return self._mainWidget.getSeriesName()
493
470
 
494
- def setSerie(self, serie: Serie) -> None:
495
- self._mainWidget.setSerie(serie)
471
+ def setSeries(self, series: Series) -> None:
472
+ self._mainWidget.setSeries(series)
496
473
 
497
- def getSerie(self, *args, **kwargs) -> Serie:
498
- return self._mainWidget.getSerie(*args, **kwargs)
474
+ def getSeries(self, *args, **kwargs) -> Series:
475
+ return self._mainWidget.getSeries(*args, **kwargs)
499
476
 
500
- def addScanFromNxFile(self, file_: str, entry: Optional[str] = None):
477
+ def addScanFromNxFile(self, file_: str, entry: str | None = None):
501
478
  return self._mainWidget.addScanFromNxFile(file_=file_, entry=entry)
502
479
 
503
480
  def removeSelectedScans(self) -> None:
@@ -515,14 +492,14 @@ class SerieManualControlDialog(qt.QDialog):
515
492
  def removeScan(self, scan: TomwerScanBase) -> None:
516
493
  self._mainWidget.removeTomoObj(scan=scan)
517
494
 
518
- def clearSerie(self) -> None:
519
- self._mainWidget.clearSerie()
495
+ def clearSeries(self) -> None:
496
+ self._mainWidget.clearSeries()
520
497
 
521
- def createSerie(self):
522
- self.sigSerieSend.emit(self.getSerie())
498
+ def createSeries(self):
499
+ self.sigSeriesSend.emit(self.getSeries())
523
500
 
524
501
 
525
- class SerieManualFromTomoObj(qt.QWidget):
502
+ class SeriesManualFromTomoObj(qt.QWidget):
526
503
  def __init__(self, parent=None) -> None:
527
504
  super().__init__(parent)
528
505
  style = qt.QApplication.style()
@@ -552,11 +529,11 @@ class SerieManualFromTomoObj(qt.QWidget):
552
529
  self._leftArrowButton.setFixedWidth(30)
553
530
  self.layout().addWidget(self._leftArrowButton, 2, 2, 1, 1)
554
531
 
555
- # new serie
556
- self._newSerieWidget = NewSerieWidget(self)
532
+ # new series
533
+ self._newSeriesWidget = NewSeriesWidget(self)
557
534
  self._newSerieWidgetScrollArea = qt.QScrollArea(self)
558
535
  self._newSerieWidgetScrollArea.setWidgetResizable(True)
559
- self._newSerieWidgetScrollArea.setWidget(self._newSerieWidget)
536
+ self._newSerieWidgetScrollArea.setWidget(self._newSeriesWidget)
560
537
  self.layout().addWidget(self._newSerieWidgetScrollArea, 0, 3, 4, 2)
561
538
 
562
539
  # tomo obj details
@@ -574,18 +551,17 @@ class SerieManualFromTomoObj(qt.QWidget):
574
551
  def selectedTomoObjects(self) -> tuple:
575
552
  """
576
553
  :return: tuple of tomo object selected on the list
577
- :rtype: tuple
578
554
  """
579
555
  items = self._tomoObjList.selectedItems()
580
556
  return [item.data(qt.Qt.UserRole) for item in items]
581
557
 
582
558
  def _removeSelectedObjs(self, *args, **kwargs):
583
559
  for tomo_obj in self.selectedTomoObjects():
584
- self._newSerieWidget.removeTomoObjToCurrentSerie(tomo_obj)
560
+ self._newSeriesWidget.removeTomoObjToCurrentSeries(tomo_obj)
585
561
 
586
562
  def _addSelectedObjs(self, *args, **kwargs):
587
563
  for tomo_obj in self.selectedTomoObjects():
588
- self._newSerieWidget.addTomoObjToCurrentSerie(tomo_obj)
564
+ self._newSeriesWidget.addTomoObjToCurrentSeries(tomo_obj)
589
565
 
590
566
  def _updateTomoObjInfos(self, *args, **kwargs):
591
567
  # should
@@ -597,23 +573,23 @@ class SerieManualFromTomoObj(qt.QWidget):
597
573
  self._tomoObjInfos.setTomoObj(None)
598
574
 
599
575
  # expose API
600
- def setSerie(self, serie: Serie):
601
- self._newSerieWidget.setSerie(serie=serie)
576
+ def setSeries(self, series: Series):
577
+ self._newSeriesWidget.setSeries(series=series)
602
578
 
603
- def getSerie(self, *args, **kwargs) -> Serie:
604
- return self._newSerieWidget.getSerie(*args, **kwargs)
579
+ def getSeries(self, *args, **kwargs) -> Series:
580
+ return self._newSeriesWidget.getSeries(*args, **kwargs)
605
581
 
606
582
  def addTomoObj(self, tomo_obj):
607
583
  self._tomoObjList.add(tomo_obj)
608
584
 
609
- def addToCurrentSerie(self, tomo_obj):
610
- self._newSerieWidget.addTomoObjToCurrentSerie(tomo_obj)
585
+ def addToCurrentSeries(self, tomo_obj):
586
+ self._newSeriesWidget.addTomoObjToCurrentSeries(tomo_obj)
611
587
 
612
- def setSerieName(self, name: str):
613
- self._newSerieWidget.setSerieName(name=name)
588
+ def setSeriesName(self, name: str):
589
+ self._newSeriesWidget.setSeriesName(name=name)
614
590
 
615
591
 
616
- class NewSerieWidget(qt.QWidget):
592
+ class NewSeriesWidget(qt.QWidget):
617
593
  sigNameChanged = qt.Signal()
618
594
  """Emit when serie name changed"""
619
595
 
@@ -622,7 +598,7 @@ class NewSerieWidget(qt.QWidget):
622
598
  Emit when the serie has been updated by the tree
623
599
  """
624
600
 
625
- DEFAULT_SERIE_NAME = "my_serie"
601
+ DEFAULT_SERIES_NAME = "my_series"
626
602
 
627
603
  def __init__(self, parent=None) -> None:
628
604
  super().__init__(parent)
@@ -630,12 +606,14 @@ class NewSerieWidget(qt.QWidget):
630
606
 
631
607
  self._nameWidget = qt.QWidget(self)
632
608
  self._nameWidget.setLayout(qt.QHBoxLayout())
633
- self._nameWidget.layout().addWidget(qt.QLabel("serie name", self))
634
- self._nameQLE = qt.QLineEdit(self.DEFAULT_SERIE_NAME, self)
609
+ self._nameWidget.layout().addWidget(qt.QLabel("series name", self))
610
+ self._nameQLE = qt.QLineEdit(self.DEFAULT_SERIES_NAME, self)
635
611
  self._nameWidget.layout().addWidget(self._nameQLE)
636
612
  self.layout().addWidget(self._nameWidget)
637
613
 
638
- self._serieTree = _SerieDefinitionTree(self, serie_name=self.DEFAULT_SERIE_NAME)
614
+ self._serieTree = _SeriesDefinitionTree(
615
+ self, serie_name=self.DEFAULT_SERIES_NAME
616
+ )
639
617
  self.layout().addWidget(self._serieTree)
640
618
 
641
619
  # Signal / slot connection
@@ -643,17 +621,17 @@ class NewSerieWidget(qt.QWidget):
643
621
  self._serieTree.sigUpdated.connect(self.sigUpdated)
644
622
  self._nameQLE.textChanged.connect(self._nameChangedOnQLE)
645
623
 
646
- def setSerie(self, serie: Serie) -> None:
624
+ def setSeries(self, series: Series) -> None:
647
625
  with blockSignals(self._nameQLE):
648
- self._nameQLE.setText(serie.name)
649
- self._serieTree.setSerie(serie=serie)
626
+ self._nameQLE.setText(series.name)
627
+ self._serieTree.setSeries(series=series)
650
628
 
651
- def getSerie(self, *args, **kwargs) -> Serie:
652
- return self._serieTree.getSerie(*args, **kwargs)
629
+ def getSeries(self, *args, **kwargs) -> Series:
630
+ return self._serieTree.getSeries(*args, **kwargs)
653
631
 
654
632
  def _nameChangedOnQLE(self, name):
655
633
  with blockSignals(self._serieTree):
656
- self._serieTree.setSerieName(name)
634
+ self._serieTree.setSeriesName(name)
657
635
  self.sigNameChanged.emit()
658
636
 
659
637
  def _handleItemUpdate(self, item, column):
@@ -663,35 +641,36 @@ class NewSerieWidget(qt.QWidget):
663
641
  self.blockSignals(old)
664
642
  self.sigUpdated.emit()
665
643
 
666
- def addTomoObjToCurrentSerie(self, tomo_obj: TomwerObject):
644
+ def addTomoObjToCurrentSeries(self, tomo_obj: TomwerObject):
667
645
  assert isinstance(
668
646
  tomo_obj, TomwerObject
669
647
  ), f"invalid type {type(tomo_obj)}. {TomwerObject} expected"
670
648
  self._serieTree.addTomoObj(tomo_obj)
671
649
 
672
- def removeTomoObjToCurrentSerie(self, tomo_obj: TomwerObject):
650
+ def removeTomoObjToCurrentSeries(self, tomo_obj: TomwerObject):
673
651
  assert isinstance(
674
652
  tomo_obj, TomwerObject
675
653
  ), f"invalid type {type(tomo_obj)}. {TomwerObject} expected"
676
654
  self._serieTree.removeTomoObj(tomo_obj)
677
655
 
678
- def getSerieName(self) -> str:
679
- return self._serieTree.getSerieName()
656
+ def getSeriesName(self) -> str:
657
+ return self._serieTree.getSeriesName()
680
658
 
681
- def setSerieName(self, name: str):
682
- self._serieTree.setSerieName(name=name)
659
+ def setSeriesName(self, name: str):
660
+ self._serieTree.setSeriesName(name=name)
683
661
 
684
662
 
685
- class SerieManualDefinitionDialog(qt.QDialog):
663
+ class SeriesManualDefinitionDialog(qt.QDialog):
686
664
  """Dialog to define a serie manually"""
687
665
 
688
666
  sigUpdated = qt.Signal()
667
+ """emit when serie is updated"""
689
668
 
690
669
  def __init__(self, parent=None) -> None:
691
670
  super().__init__(parent)
692
671
  self.setLayout(qt.QVBoxLayout())
693
672
 
694
- self._newSerieWidget = NewSerieWidget(self)
673
+ self._newSeriesWidget = NewSeriesWidget(self)
695
674
 
696
675
  self._buttons = qt.QDialogButtonBox(parent=self)
697
676
 
@@ -711,34 +690,34 @@ class SerieManualDefinitionDialog(qt.QDialog):
711
690
  self.layout().addWidget(self._buttons)
712
691
 
713
692
  # connect signal / slot
714
- self._newSerieWidget.sigNameChanged.connect(self._nameChanged)
715
- self._newSerieWidget.sigUpdated.connect(self.sigUpdated)
693
+ self._newSeriesWidget.sigNameChanged.connect(self._nameChanged)
694
+ self._newSeriesWidget.sigUpdated.connect(self.sigUpdated)
716
695
  self._addScanButton.clicked.connect(self.addScanFromFileDialog)
717
696
  self._removeSelectedButton.clicked.connect(self.removeSelectedTomoObjs)
718
- self._clearButton.clicked.connect(self.clearSerie)
697
+ self._clearButton.clicked.connect(self.clearSeries)
719
698
 
720
699
  @property
721
700
  def n_tomo_objs(self):
722
- serieTree = self._newSerieWidget._serieTree
701
+ serieTree = self._newSeriesWidget._serieTree
723
702
  return serieTree.n_tomo_objs
724
703
 
725
704
  def _nameChanged(self, new_name):
726
- serieTree = self._newSerieWidget._serieTree
705
+ serieTree = self._newSeriesWidget._serieTree
727
706
  with blockSignals(self._serieTree):
728
- serieTree.setSerieName(name=new_name)
707
+ serieTree.setSeriesName(name=new_name)
729
708
  self.sigUpdated.emit()
730
709
 
731
- def setSerieName(self, name: str):
732
- self._newSerieWidget.setSerieName(name=name)
710
+ def setSeriesName(self, name: str):
711
+ self._newSeriesWidget.setSeriesName(name=name)
733
712
 
734
- def getSerieName(self) -> str:
735
- return self._newSerieWidget.getSerieName()
713
+ def getSeriesName(self) -> str:
714
+ return self._newSeriesWidget.getSeriesName()
736
715
 
737
- def setSerie(self, serie: Serie) -> None:
738
- self._newSerieWidget.setSerie(serie)
716
+ def setSeries(self, series: Series) -> None:
717
+ self._newSeriesWidget.setSeries(series)
739
718
 
740
- def getSerie(self, *args, **kwargs) -> Serie:
741
- return self._newSerieWidget.getSerie(*args, **kwargs)
719
+ def getSeries(self, *args, **kwargs) -> Series:
720
+ return self._newSeriesWidget.getSeries(*args, **kwargs)
742
721
 
743
722
  def addScanFromFileDialog(self) -> None:
744
723
  dialog = QDataDialog(self, multiSelection=True)
@@ -751,70 +730,70 @@ class SerieManualDefinitionDialog(qt.QDialog):
751
730
  for folder in foldersSelected:
752
731
  self.addScanFromNxFile(file_=folder, entry=None)
753
732
 
754
- def addScanFromNxFile(self, file_: str, entry: Optional[str] = None):
755
- serieTree = self._newSerieWidget._serieTree
733
+ def addScanFromNxFile(self, file_: str, entry: str | None = None):
734
+ serieTree = self._newSeriesWidget._serieTree
756
735
  return serieTree.addScanFromNxFile(file_=file_, entry=entry)
757
736
 
758
737
  def removeSelectedTomoObjs(self) -> None:
759
- serieTree = self._newSerieWidget._serieTree
738
+ serieTree = self._newSeriesWidget._serieTree
760
739
  return serieTree.removeSelectedTomoObjs()
761
740
 
762
741
  def getSelectedTomoObjs(self) -> tuple:
763
- serieTree = self._newSerieWidget._serieTree
742
+ serieTree = self._newSeriesWidget._serieTree
764
743
  return serieTree.getSelectedTomoObjs()
765
744
 
766
745
  def setSelectedTomoObjs(self, scans: Iterable) -> None:
767
- serieTree = self._newSerieWidget._serieTree
746
+ serieTree = self._newSeriesWidget._serieTree
768
747
  serieTree.setSelectedTomoObjs(objs=scans)
769
748
 
770
749
  def addTomoObj(self, scan: TomwerScanBase) -> None:
771
- serieTree = self._newSerieWidget._serieTree
750
+ serieTree = self._newSeriesWidget._serieTree
772
751
  return serieTree.addTomoObj(tomo_obj=scan)
773
752
 
774
753
  def removeTomoObj(self, scan: TomwerScanBase) -> None:
775
- serieTree = self._newSerieWidget._serieTree
754
+ serieTree = self._newSeriesWidget._serieTree
776
755
  serieTree.removeTomoObj(tomo_obj=scan)
777
756
 
778
- def clearSerie(self) -> None:
779
- serieTree = self._newSerieWidget._serieTree
757
+ def clearSeries(self) -> None:
758
+ serieTree = self._newSeriesWidget._serieTree
780
759
  serieTree.clearTomoObjs()
781
760
 
782
761
 
783
- class SerieAutomaticDefinitionWidget(qt.QWidget):
762
+ class SeriesAutomaticDefinitionWidget(qt.QWidget):
784
763
  pass
785
764
 
786
765
 
787
- class SerieTree(qt.QWidget):
766
+ class SeriesTree(qt.QWidget):
788
767
  """
789
- Widget used to define a scan serie from a list of scans.
768
+ Widget used to define a scan series from a list of scans.
790
769
  """
791
770
 
792
771
  def __init__(self, parent=None, scans=tuple()) -> None:
793
772
  self._series = {}
794
- # associated serie name (key) to tuple (serie, QTreeWidgetItem)
773
+ # associated series name (key) to tuple (series, QTreeWidgetItem)
795
774
  super().__init__(parent)
796
775
  self.setLayout(qt.QVBoxLayout())
797
776
  self._tree = qt.QTreeWidget(self)
798
777
  self._tree.setSelectionMode(qt.QAbstractItemView.MultiSelection)
799
778
  self._tree.setColumnCount(2)
800
- self._tree.setHeaderLabels(("serie", "scan ids"))
779
+ self._tree.setHeaderLabels(("series", "scan ids"))
801
780
  self.layout().addWidget(self._tree)
802
781
 
803
782
  # set up
804
- [self.addSerie(scan) for scan in scans]
783
+ [self.addSeries(scan) for scan in scans]
805
784
 
806
- def addSerie(self, serie: Serie):
807
- if not isinstance(serie, Serie):
785
+ def addSeries(self, series: Series):
786
+ if not isinstance(series, Series):
808
787
  raise TypeError(
809
- f"{serie} is expected to be an instance of {Serie} not {type(serie)}"
788
+ f"{series} is expected to be an instance of {Series} not {type(series)}"
810
789
  )
811
- if serie.name in self._series:
812
- self.removeSerie(self._series[serie.name][0])
790
+ if series.name in self._series:
791
+ self.removeSeries(self._series[series.name][0])
813
792
 
814
793
  root_item = qt.QTreeWidgetItem(self._tree)
815
- root_item.setText(0, serie.name)
816
- self._series[serie.name] = (serie, root_item)
817
- for obj in serie:
794
+ root_item.setText(0, series.name)
795
+ self._series[series.name] = (series, root_item)
796
+ for obj in series:
818
797
  scan_item = qt.QTreeWidgetItem(root_item)
819
798
  if isinstance(obj, TomwerObject):
820
799
  text = obj.get_identifier().to_str()
@@ -823,13 +802,13 @@ class SerieTree(qt.QWidget):
823
802
  scan_item.setText(1, text)
824
803
  scan_item.setFlags(qt.Qt.NoItemFlags)
825
804
 
826
- def removeSerie(self, serie: Serie):
827
- if not isinstance(serie, Serie):
805
+ def removeSeries(self, series: Series):
806
+ if not isinstance(series, Series):
828
807
  raise TypeError(
829
- f"{serie} is expected to be an instance of {Serie} not {type(serie)}"
808
+ f"{series} is expected to be an instance of {Series} not {type(series)}"
830
809
  )
831
- if serie.name in self._series:
832
- _, serie_item = self._series.pop(serie.name)
810
+ if series.name in self._series:
811
+ _, serie_item = self._series.pop(series.name)
833
812
  root = self._tree.invisibleRootItem()
834
813
  root.removeChild(serie_item)
835
814
 
@@ -848,35 +827,35 @@ class SerieTree(qt.QWidget):
848
827
  def setSelectedSeries(self, series):
849
828
  self.clearSelection()
850
829
  for serie in series:
851
- serie_item = self._getSerieItem(serie)
830
+ serie_item = self._getSeriesItem(serie)
852
831
  if serie_item is not None:
853
832
  serie_item.setSelected(True)
854
833
 
855
- def _getSerieItem(self, serie: Serie) -> Optional[qt.QTreeWidgetItem]:
856
- if not isinstance(serie, Serie):
834
+ def _getSeriesItem(self, series: Series) -> qt.QTreeWidgetItem | None:
835
+ if not isinstance(series, Series):
857
836
  raise TypeError(
858
- f"serie is expected to be an instance of {Serie} not {type(serie)}"
837
+ f"serie is expected to be an instance of {Series} not {type(series)}"
859
838
  )
860
- return self._series.get(serie.name, (None, None))[1]
839
+ return self._series.get(series.name, (None, None))[1]
861
840
 
862
841
  def getSelectedSeries(self) -> tuple():
863
842
  """return selected series"""
864
843
  selected = []
865
- for _, (serie, item) in self._series.items():
844
+ for _, (series, item) in self._series.items():
866
845
  if item.isSelected():
867
- selected.append(serie)
846
+ selected.append(series)
868
847
  return tuple(selected)
869
848
 
870
849
  def removeSelected(self) -> None:
871
- for serie in self.getSelectedSeries():
872
- self.removeSerie(serie)
850
+ for series in self.getSelectedSeries():
851
+ self.removeSeries(series)
873
852
 
874
853
 
875
- class SerieHistoryDialog(qt.QDialog):
876
- sigSerieSend = qt.Signal(Serie)
854
+ class SeriesHistoryDialog(qt.QDialog):
855
+ sigSeriesSend = qt.Signal(Series)
877
856
  """signal emit when a serie has been selected by the user"""
878
857
 
879
- sigEditSerie = qt.Signal(Serie)
858
+ sigEditSeries = qt.Signal(Series)
880
859
  """Signal emit when user request to edit a serie"""
881
860
 
882
861
  sigHistoryUpdated = qt.Signal()
@@ -886,7 +865,7 @@ class SerieHistoryDialog(qt.QDialog):
886
865
  super().__init__(parent)
887
866
  self.setLayout(qt.QVBoxLayout())
888
867
 
889
- self._serieList = SerieTree(self)
868
+ self._serieList = SeriesTree(self)
890
869
  self.layout().addWidget(self._serieList)
891
870
 
892
871
  self._buttons = qt.QDialogButtonBox(parent=self)
@@ -911,15 +890,15 @@ class SerieHistoryDialog(qt.QDialog):
911
890
  self._clearButton.clicked.connect(self.clearSelection)
912
891
  self._editButton.clicked.connect(self.editSelected)
913
892
 
914
- def addSerie(self, serie: Serie):
893
+ def addSeries(self, serie: Series):
915
894
  old = self.blockSignals(True)
916
- self._serieList.addSerie(serie)
895
+ self._serieList.addSeries(serie)
917
896
  self.blockSignals(old)
918
897
  self.sigHistoryUpdated.emit()
919
898
 
920
- def removeSerie(self, serie: Serie):
899
+ def removeSeries(self, serie: Series):
921
900
  old = self.blockSignals(True)
922
- self._serieList.removeSerie(serie)
901
+ self._serieList.removeSeries(serie)
923
902
  self.blockSignals(old)
924
903
  self.sigHistoryUpdated.emit()
925
904
 
@@ -934,7 +913,7 @@ class SerieHistoryDialog(qt.QDialog):
934
913
 
935
914
  def sendSelected(self):
936
915
  for serie in self.getSelectedSeries():
937
- self.sigSerieSend.emit(serie)
916
+ self.sigSeriesSend.emit(serie)
938
917
 
939
918
  def editSelected(self):
940
919
  selected = self.getSelectedSeries()
@@ -944,7 +923,7 @@ class SerieHistoryDialog(qt.QDialog):
944
923
  _logger.warning(
945
924
  "more than one serie selected for edition. Will only edit the first one"
946
925
  )
947
- self.sigEditSerie.emit(selected[0])
926
+ self.sigEditSeries.emit(selected[0])
948
927
 
949
928
  def removeSelected(self):
950
929
  old = self.blockSignals(True)