tomwer 1.2.1__py3-none-any.whl → 1.3.12__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 (334) hide show
  1. orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
  2. orangecontrib/tomwer/widgets/__init__.py +11 -11
  3. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
  4. orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
  5. orangecontrib/tomwer/widgets/control/DataListenerOW.py +6 -6
  6. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
  7. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +6 -6
  8. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +24 -7
  9. orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
  10. orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +3 -3
  11. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +64 -23
  12. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +20 -8
  13. orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
  14. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +6 -6
  15. orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
  16. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
  17. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +5 -5
  18. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
  19. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
  20. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +8 -1
  21. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
  22. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
  23. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
  24. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
  25. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
  26. orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
  27. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  28. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
  29. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
  30. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
  31. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  32. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
  33. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
  34. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
  35. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +22 -20
  36. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +19 -3
  37. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +184 -169
  38. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
  39. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
  40. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +18 -22
  41. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +18 -26
  42. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +15 -19
  43. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +9 -9
  44. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
  45. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
  46. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
  47. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +0 -1
  48. orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
  49. tomwer/__main__.py +7 -64
  50. tomwer/app/axis.py +3 -3
  51. tomwer/app/canvas.py +8 -0
  52. tomwer/app/canvas_launcher/config.py +16 -14
  53. tomwer/app/canvas_launcher/environ.py +1 -0
  54. tomwer/app/canvas_launcher/mainwindow.py +4 -1
  55. tomwer/app/darkref.py +1 -1
  56. tomwer/app/darkrefpatch.py +1 -1
  57. tomwer/app/diffframe.py +3 -3
  58. tomwer/app/imagekeyeditor.py +5 -5
  59. tomwer/app/imagekeyupgrader.py +5 -5
  60. tomwer/app/intensitynormalization.py +14 -13
  61. tomwer/app/{saaxis.py → multicor.py} +3 -3
  62. tomwer/app/{sadeltabeta.py → multipag.py} +3 -3
  63. tomwer/app/nabuapp.py +0 -11
  64. tomwer/app/radiostack.py +6 -4
  65. tomwer/app/samplemoved.py +3 -2
  66. tomwer/app/scanviewer.py +4 -2
  67. tomwer/app/sinogramviewer.py +3 -2
  68. tomwer/app/slicestack.py +3 -2
  69. tomwer/app/zstitching.py +88 -6
  70. tomwer/core/cluster/cluster.py +26 -0
  71. tomwer/core/log/logger.py +7 -5
  72. tomwer/core/process/conditions/filters.py +1 -1
  73. tomwer/core/process/control/datalistener/datalistener.py +19 -14
  74. tomwer/core/process/control/datawatcher/edfdwprocess.py +0 -9
  75. tomwer/core/process/control/nxtomoconcatenate.py +13 -13
  76. tomwer/core/process/control/nxtomomill.py +92 -34
  77. tomwer/core/process/control/scantransfer.py +20 -43
  78. tomwer/core/process/control/scanvalidator.py +3 -2
  79. tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
  80. tomwer/core/process/control/test/test_email.py +4 -4
  81. tomwer/core/process/control/test/test_h52nx_process.py +59 -7
  82. tomwer/core/process/control/test/test_volume_link.py +64 -64
  83. tomwer/core/process/control/timer.py +1 -1
  84. tomwer/core/process/control/volumesymlink.py +200 -200
  85. tomwer/core/process/edit/darkflatpatch.py +14 -15
  86. tomwer/core/process/edit/imagekeyeditor.py +41 -39
  87. tomwer/core/process/icat/__init__.py +0 -0
  88. tomwer/core/process/icat/createscreenshots.py +100 -0
  89. tomwer/core/process/icat/gallery.py +377 -0
  90. tomwer/core/process/icat/icatbase.py +36 -0
  91. tomwer/core/process/icat/publish.py +228 -0
  92. tomwer/core/process/icat/screenshots.py +27 -0
  93. tomwer/core/process/output.py +52 -0
  94. tomwer/core/process/reconstruction/axis/axis.py +280 -69
  95. tomwer/core/process/reconstruction/axis/mode.py +163 -48
  96. tomwer/core/process/reconstruction/axis/params.py +29 -21
  97. tomwer/core/process/reconstruction/darkref/darkrefs.py +41 -127
  98. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +4 -3
  99. tomwer/core/process/reconstruction/darkref/params.py +1 -1
  100. tomwer/core/process/reconstruction/nabu/castvolume.py +4 -4
  101. tomwer/core/process/reconstruction/nabu/helical.py +9 -5
  102. tomwer/core/process/reconstruction/nabu/nabucommon.py +71 -78
  103. tomwer/core/process/reconstruction/nabu/nabuscores.py +425 -53
  104. tomwer/core/process/reconstruction/nabu/nabuslices.py +114 -93
  105. tomwer/core/process/reconstruction/nabu/nabuvolume.py +54 -27
  106. tomwer/core/process/reconstruction/nabu/plane.py +9 -0
  107. tomwer/core/process/reconstruction/nabu/settings.py +2 -2
  108. tomwer/core/process/reconstruction/nabu/utils.py +164 -26
  109. tomwer/core/process/reconstruction/output.py +108 -0
  110. tomwer/core/process/reconstruction/saaxis/saaxis.py +238 -264
  111. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +151 -87
  112. tomwer/core/process/reconstruction/scores/params.py +7 -4
  113. tomwer/core/process/reconstruction/scores/scores.py +13 -0
  114. tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
  115. tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
  116. tomwer/core/process/reconstruction/test/test_darkref_copy.py +7 -7
  117. tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
  118. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
  119. tomwer/core/process/stitching/nabustitcher.py +13 -12
  120. tomwer/core/process/task.py +34 -26
  121. tomwer/core/process/test/test_axis.py +13 -12
  122. tomwer/core/process/test/test_dark_and_flat.py +10 -7
  123. tomwer/core/process/test/test_data_transfer.py +10 -8
  124. tomwer/core/process/test/test_nabu.py +14 -6
  125. tomwer/core/process/test/test_normalization.py +4 -4
  126. tomwer/core/scan/blissscan.py +3 -3
  127. tomwer/core/scan/edfscan.py +13 -10
  128. tomwer/core/scan/hdf5scan.py +19 -530
  129. tomwer/core/scan/nxtomoscan.py +534 -0
  130. tomwer/core/scan/scanbase.py +72 -44
  131. tomwer/core/scan/scanfactory.py +13 -13
  132. tomwer/core/scan/test/test_edf.py +2 -2
  133. tomwer/core/scan/test/test_future_scan.py +3 -3
  134. tomwer/core/scan/test/test_h5.py +18 -16
  135. tomwer/core/scan/test/test_process_registration.py +4 -40
  136. tomwer/core/scan/test/test_scan.py +5 -78
  137. tomwer/core/settings.py +22 -2
  138. tomwer/core/test/test_scanutils.py +8 -7
  139. tomwer/core/test/test_utils.py +35 -28
  140. tomwer/core/tomwer_object.py +1 -1
  141. tomwer/core/utils/__init__.py +0 -466
  142. tomwer/core/utils/deprecation.py +1 -1
  143. tomwer/core/utils/dictutils.py +14 -0
  144. tomwer/core/utils/lbsram.py +35 -0
  145. tomwer/core/utils/nxtomoutils.py +1 -1
  146. tomwer/core/utils/scanutils.py +6 -6
  147. tomwer/core/utils/spec.py +263 -0
  148. tomwer/core/volume/edfvolume.py +6 -6
  149. tomwer/core/volume/hdf5volume.py +6 -6
  150. tomwer/core/volume/jp2kvolume.py +6 -6
  151. tomwer/core/volume/rawvolume.py +6 -6
  152. tomwer/core/volume/tiffvolume.py +12 -12
  153. tomwer/core/volume/volumefactory.py +2 -2
  154. tomwer/gui/cluster/slurm.py +274 -65
  155. tomwer/gui/cluster/supervisor.py +12 -0
  156. tomwer/gui/cluster/test/test_cluster.py +14 -2
  157. tomwer/gui/cluster/test/test_supervisor.py +3 -3
  158. tomwer/gui/configuration/__init__.py +0 -0
  159. tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
  160. tomwer/gui/configuration/level.py +22 -0
  161. tomwer/gui/control/actions.py +54 -0
  162. tomwer/gui/control/datalist.py +83 -16
  163. tomwer/gui/control/datalistener.py +4 -16
  164. tomwer/gui/control/datawatcher/controlwidget.py +2 -4
  165. tomwer/gui/control/datawatcher/datawatcher.py +1 -24
  166. tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
  167. tomwer/gui/control/history.py +2 -2
  168. tomwer/gui/control/observations.py +2 -2
  169. tomwer/gui/control/reducedarkflatselector.py +9 -9
  170. tomwer/gui/control/selectorwidgetbase.py +36 -9
  171. tomwer/gui/control/serie/seriecreator.py +5 -22
  172. tomwer/gui/control/test/test_email.py +1 -1
  173. tomwer/gui/control/test/test_scanvalidator.py +6 -5
  174. tomwer/gui/control/test/test_single_tomo_obj.py +3 -3
  175. tomwer/gui/control/tomoobjdisplaymode.py +8 -0
  176. tomwer/gui/debugtools/datasetgenerator.py +3 -3
  177. tomwer/gui/edit/dkrfpatch.py +20 -26
  178. tomwer/gui/edit/imagekeyeditor.py +11 -12
  179. tomwer/gui/edit/nxtomoeditor.py +111 -44
  180. tomwer/gui/edit/nxtomowarmer.py +7 -6
  181. tomwer/gui/edit/test/test_dkrf_patch.py +13 -13
  182. tomwer/gui/edit/test/test_image_key_editor.py +3 -3
  183. tomwer/gui/edit/test/test_nx_editor.py +40 -16
  184. tomwer/gui/icat/__init__.py +0 -0
  185. tomwer/gui/icat/createscreenshots.py +80 -0
  186. tomwer/gui/icat/gallery.py +214 -0
  187. tomwer/gui/icat/publish.py +187 -0
  188. tomwer/gui/imagefromfile.py +2 -2
  189. tomwer/gui/qfolderdialog.py +24 -1
  190. tomwer/gui/reconstruction/axis/CompareImages.py +88 -168
  191. tomwer/gui/reconstruction/axis/axis.py +171 -57
  192. tomwer/gui/reconstruction/axis/radioaxis.py +122 -257
  193. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
  194. tomwer/gui/reconstruction/darkref/darkrefwidget.py +2 -1
  195. tomwer/gui/reconstruction/nabu/castvolume.py +14 -3
  196. tomwer/gui/reconstruction/nabu/check.py +9 -9
  197. tomwer/gui/reconstruction/nabu/helical.py +29 -12
  198. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
  199. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +2 -1
  200. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +126 -35
  201. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +39 -32
  202. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +222 -31
  203. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +57 -27
  204. tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
  205. tomwer/gui/reconstruction/nabu/slices.py +10 -11
  206. tomwer/gui/reconstruction/nabu/volume.py +22 -10
  207. tomwer/gui/reconstruction/normalization/intensity.py +18 -48
  208. tomwer/gui/reconstruction/saaxis/corrangeselector.py +8 -24
  209. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
  210. tomwer/gui/reconstruction/saaxis/saaxis.py +9 -21
  211. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +45 -12
  212. tomwer/gui/reconstruction/scores/control.py +2 -9
  213. tomwer/gui/reconstruction/scores/scoreplot.py +13 -11
  214. tomwer/gui/reconstruction/test/test_axis.py +41 -16
  215. tomwer/gui/reconstruction/test/test_nabu.py +31 -9
  216. tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
  217. tomwer/gui/reconstruction/test/test_sadeltabeta.py +12 -2
  218. tomwer/gui/settings.py +5 -28
  219. tomwer/gui/stackplot.py +2 -5
  220. tomwer/gui/stitching/action.py +49 -0
  221. tomwer/gui/stitching/config/axisparams.py +7 -24
  222. tomwer/gui/stitching/config/output.py +10 -8
  223. tomwer/gui/stitching/config/positionoveraxis.py +22 -23
  224. tomwer/gui/stitching/normalization.py +117 -0
  225. tomwer/gui/stitching/stitchandbackground.py +4 -6
  226. tomwer/gui/stitching/stitching.py +267 -45
  227. tomwer/gui/stitching/stitching_preview.py +62 -55
  228. tomwer/gui/stitching/stitching_raw.py +13 -12
  229. tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
  230. tomwer/gui/utils/buttons.py +112 -29
  231. tomwer/gui/utils/inputwidget.py +43 -25
  232. tomwer/gui/utils/lineselector/lineselector.py +1 -1
  233. tomwer/gui/utils/scandescription.py +4 -0
  234. tomwer/gui/utils/step.py +144 -0
  235. tomwer/gui/utils/unitsystem.py +2 -5
  236. tomwer/gui/utils/vignettes.py +176 -15
  237. tomwer/gui/visualization/dataviewer.py +48 -35
  238. tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
  239. tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
  240. tomwer/gui/visualization/scanoverview.py +1 -1
  241. tomwer/gui/visualization/sinogramviewer.py +20 -36
  242. tomwer/gui/visualization/test/test_diffviewer.py +3 -3
  243. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
  244. tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
  245. tomwer/gui/visualization/test/test_stacks.py +3 -3
  246. tomwer/gui/visualization/test/test_volumeviewer.py +65 -67
  247. tomwer/gui/visualization/volumeviewer.py +114 -113
  248. tomwer/io/utils/h5pyutils.py +3 -3
  249. tomwer/io/utils/raw_and_processed_data.py +84 -0
  250. tomwer/io/utils/tomoobj.py +4 -6
  251. tomwer/io/utils/utils.py +7 -7
  252. tomwer/resources/gui/icons/parameters.svg +1 -1
  253. tomwer/resources/gui/icons/ruler.png +0 -0
  254. tomwer/resources/gui/icons/ruler.svg +273 -0
  255. tomwer/resources/gui/icons/short_description.png +0 -0
  256. tomwer/resources/gui/icons/short_description.svg +58 -0
  257. tomwer/resources/gui/icons/url.png +0 -0
  258. tomwer/resources/gui/icons/url.svg +58 -0
  259. tomwer/resources/gui/illustrations/no_rot.svg +1 -1
  260. tomwer/synctools/stacks/edit/darkflatpatch.py +19 -14
  261. tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
  262. tomwer/synctools/stacks/reconstruction/axis.py +4 -4
  263. tomwer/synctools/stacks/reconstruction/castvolume.py +22 -7
  264. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +25 -20
  265. tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
  266. tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
  267. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
  268. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
  269. tomwer/synctools/test/test_darkRefs.py +7 -58
  270. tomwer/synctools/test/test_foldertransfer.py +6 -6
  271. tomwer/synctools/utils/scanstages.py +6 -6
  272. tomwer/tests/conftest.py +34 -0
  273. tomwer/tests/datasets.py +13 -0
  274. tomwer/tests/test_scripts.py +91 -41
  275. tomwer/tests/utils.py +5 -0
  276. tomwer/third_part/WaitingOverlay.py +110 -0
  277. tomwer/third_part/__init__.py +0 -0
  278. tomwer/version.py +2 -2
  279. tomwer-1.3.12-py3.11-nspkg.pth +1 -0
  280. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/METADATA +73 -58
  281. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/RECORD +287 -286
  282. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/WHEEL +1 -1
  283. orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +0 -197
  284. orangecontrib/tomwer/widgets/reconstruction/icons/XY_lamino.svg +0 -168
  285. orangecontrib/tomwer/widgets/reconstruction/icons/XZ_lamino.svg +0 -275
  286. orangecontrib/tomwer/widgets/reconstruction/icons/YZ_lamino.svg +0 -182
  287. tomwer/app/lamino.py +0 -143
  288. tomwer/core/process/reconstruction/lamino/__init__.py +0 -1
  289. tomwer/core/process/reconstruction/lamino/tofu.py +0 -1000
  290. tomwer/core/process/test/test_lamino.py +0 -76
  291. tomwer/core/test/test_lamino.py +0 -92
  292. tomwer/gui/reconstruction/lamino/__init__.py +0 -31
  293. tomwer/gui/reconstruction/lamino/tofu/TofuOptionLoader.py +0 -107
  294. tomwer/gui/reconstruction/lamino/tofu/__init__.py +0 -1
  295. tomwer/gui/reconstruction/lamino/tofu/misc.py +0 -148
  296. tomwer/gui/reconstruction/lamino/tofu/projections.py +0 -896
  297. tomwer/gui/reconstruction/lamino/tofu/settings.py +0 -75
  298. tomwer/gui/reconstruction/lamino/tofu/tofu.py +0 -432
  299. tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +0 -567
  300. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +0 -760
  301. tomwer/gui/reconstruction/test/test_lamino.py +0 -189
  302. tomwer/resources/gui/icons/esrf_1.svg +0 -307
  303. tomwer/resources/gui/icons/lamino_parameters.svg +0 -70
  304. tomwer/resources/gui/icons/triangle.svg +0 -80
  305. tomwer/resources/gui/illustrations/lamino_angle.png +0 -0
  306. tomwer/resources/gui/illustrations/lamino_angle.svg +0 -509
  307. tomwer/resources/gui/illustrations/lamino_beta_angle.png +0 -0
  308. tomwer/resources/gui/illustrations/lamino_beta_angle.svg +0 -97
  309. tomwer/resources/gui/illustrations/lamino_theta_angle.png +0 -0
  310. tomwer/resources/gui/illustrations/lamino_theta_angle.svg +0 -368
  311. tomwer/resources/gui/illustrations/manual_slice.png +0 -0
  312. tomwer/resources/gui/illustrations/manual_slice.svg +0 -221
  313. tomwer/resources/gui/illustrations/psi_angle.png +0 -0
  314. tomwer/resources/gui/illustrations/psi_angle.svg +0 -479
  315. tomwer/resources/gui/illustrations/rotation_center.png +0 -0
  316. tomwer/resources/gui/illustrations/rotation_center.svg +0 -276
  317. tomwer/resources/gui/illustrations/slice_stack.png +0 -0
  318. tomwer/resources/gui/illustrations/slice_stack.svg +0 -266
  319. tomwer/resources/gui/illustrations/xy_slice.png +0 -0
  320. tomwer/resources/gui/illustrations/xy_slice.svg +0 -269
  321. tomwer/resources/gui/illustrations/xz_slice.png +0 -0
  322. tomwer/resources/gui/illustrations/xz_slice.svg +0 -270
  323. tomwer/resources/gui/illustrations/yz_slice.png +0 -0
  324. tomwer/resources/gui/illustrations/yz_slice.svg +0 -270
  325. tomwer/synctools/stacks/reconstruction/lamino.py +0 -233
  326. tomwer/synctools/test/test_scanstages.py +0 -162
  327. tomwer/tests/utils/__init__.py +0 -247
  328. tomwer/tests/utils/utilstest.py +0 -220
  329. tomwer-1.2.1-py3.11-nspkg.pth +0 -1
  330. /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
  331. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/LICENSE +0 -0
  332. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/entry_points.txt +0 -0
  333. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/namespace_packages.txt +0 -0
  334. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,143 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="48"
6
+ height="48"
7
+ viewBox="0 0 12.7 12.7"
8
+ version="1.1"
9
+ id="svg5"
10
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
11
+ sodipodi:docname="raw_screenshots.svg"
12
+ inkscape:export-filename="raw_screenshots.png"
13
+ inkscape:export-xdpi="96"
14
+ inkscape:export-ydpi="96"
15
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
16
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
17
+ xmlns="http://www.w3.org/2000/svg"
18
+ xmlns:svg="http://www.w3.org/2000/svg">
19
+ <sodipodi:namedview
20
+ id="namedview7"
21
+ pagecolor="#ffffff"
22
+ bordercolor="#000000"
23
+ borderopacity="0.25"
24
+ inkscape:showpageshadow="2"
25
+ inkscape:pageopacity="0.0"
26
+ inkscape:pagecheckerboard="0"
27
+ inkscape:deskcolor="#d1d1d1"
28
+ inkscape:document-units="mm"
29
+ showgrid="false"
30
+ inkscape:zoom="6.7277216"
31
+ inkscape:cx="0.37159682"
32
+ inkscape:cy="20.512145"
33
+ inkscape:window-width="1920"
34
+ inkscape:window-height="1131"
35
+ inkscape:window-x="0"
36
+ inkscape:window-y="32"
37
+ inkscape:window-maximized="1"
38
+ inkscape:current-layer="layer1" />
39
+ <defs
40
+ id="defs2" />
41
+ <g
42
+ inkscape:label="Layer 1"
43
+ inkscape:groupmode="layer"
44
+ id="layer1">
45
+ <g
46
+ id="g2439"
47
+ transform="matrix(1.3223936,0,0,1.4044944,-3.7419839,-4.8581475)">
48
+ <rect
49
+ style="fill:#000000;stroke-width:1.32292;stroke-miterlimit:3.5"
50
+ id="rect234"
51
+ width="5.2481794"
52
+ height="3.1437356"
53
+ x="6.3586993"
54
+ y="8.866684"
55
+ ry="0.55388486" />
56
+ <path
57
+ style="fill:#ffffff;fill-opacity:1;stroke-width:1.42435;stroke-miterlimit:3.5"
58
+ id="path288"
59
+ sodipodi:type="arc"
60
+ sodipodi:cx="8.9278183"
61
+ sodipodi:cy="10.418758"
62
+ sodipodi:rx="0.84004527"
63
+ sodipodi:ry="0.83572352"
64
+ sodipodi:start="0"
65
+ sodipodi:end="6.2816001"
66
+ sodipodi:open="true"
67
+ sodipodi:arc-type="arc"
68
+ d="M 9.7678636,10.418758 A 0.84004527,0.83572352 0 0 1 8.9281512,11.254482 0.84004527,0.83572352 0 0 1 8.0877733,10.419421 0.84004527,0.83572352 0 0 1 8.9268196,9.5830355 0.84004527,0.83572352 0 0 1 9.7678625,10.417434" />
69
+ <path
70
+ style="fill:#000000;fill-opacity:1;stroke-width:0.769944;stroke-miterlimit:3.5"
71
+ id="path288-3"
72
+ sodipodi:type="arc"
73
+ sodipodi:cx="8.9282637"
74
+ sodipodi:cy="10.447392"
75
+ sodipodi:rx="0.46633503"
76
+ sodipodi:ry="0.43989831"
77
+ sodipodi:start="0"
78
+ sodipodi:end="6.2816001"
79
+ sodipodi:open="true"
80
+ sodipodi:arc-type="arc"
81
+ d="m 9.3945987,10.447392 a 0.46633503,0.43989831 0 0 1 -0.4661502,0.439899 0.46633503,0.43989831 0 0 1 -0.4665197,-0.43955 0.46633503,0.43989831 0 0 1 0.4657804,-0.440247 0.46633503,0.43989831 0 0 1 0.4668889,0.439201" />
82
+ <path
83
+ style="fill:#ffffff;fill-opacity:1;stroke-width:1.41874;stroke-miterlimit:3.5"
84
+ id="path1187"
85
+ sodipodi:type="arc"
86
+ sodipodi:cx="10.826293"
87
+ sodipodi:cy="9.255497"
88
+ sodipodi:rx="0.1358857"
89
+ sodipodi:ry="0.13223246"
90
+ sodipodi:start="0"
91
+ sodipodi:end="6.2816001"
92
+ sodipodi:open="true"
93
+ sodipodi:arc-type="arc"
94
+ d="m 10.962179,9.255497 a 0.1358857,0.13223246 0 0 1 -0.135832,0.1322324 0.1358857,0.13223246 0 0 1 -0.13594,-0.1321276 0.1358857,0.13223246 0 0 1 0.135724,-0.1323372 0.1358857,0.13223246 0 0 1 0.136048,0.1320228" />
95
+ <path
96
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.2;stroke-miterlimit:3.5;stroke-dasharray:none;stroke-opacity:1"
97
+ d="m 7.0723913,9.0411421 0.2728473,-0.4792742 0.7183415,0.0059 0.3004728,0.4269695 z"
98
+ id="path1616" />
99
+ </g>
100
+ <rect
101
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.2;stroke-miterlimit:3.5;stroke-dasharray:1.20000002, 1.20000002;stroke-opacity:1;stroke-dashoffset:0"
102
+ id="rect2432"
103
+ width="9.5138874"
104
+ height="9.9463243"
105
+ x="1.3988938"
106
+ y="1.5929669"
107
+ ry="0.55388486" />
108
+ <text
109
+ xml:space="preserve"
110
+ style="font-style:italic;font-size:7.05556px;font-family:FreeMono;-inkscape-font-specification:'FreeMono Italic';fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.2;stroke-miterlimit:3.5;stroke-dasharray:1.2, 1.2;stroke-dashoffset:0;stroke-opacity:1;font-weight:normal;font-stretch:normal;font-variant:normal"
111
+ x="3.0658464"
112
+ y="4.1574163"
113
+ id="text2495"><tspan
114
+ sodipodi:role="line"
115
+ id="tspan2493"
116
+ style="stroke-width:0.2;-inkscape-font-specification:'FreeMono Italic';font-family:FreeMono;font-weight:normal;font-style:italic;font-stretch:normal;font-variant:normal"
117
+ x="3.0658464"
118
+ y="4.1574163" /></text>
119
+ <text
120
+ xml:space="preserve"
121
+ style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;font-family:'Nimbus Sans';-inkscape-font-specification:'Nimbus Sans Italic';fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.2;stroke-miterlimit:3.5;stroke-dasharray:1.2, 1.2;stroke-dashoffset:0;stroke-opacity:1"
122
+ x="2.6976638"
123
+ y="3.1980052"
124
+ id="text3964"><tspan
125
+ sodipodi:role="line"
126
+ id="tspan3962"
127
+ style="stroke-width:0.2;-inkscape-font-specification:'Nimbus Sans Italic';font-family:'Nimbus Sans';font-weight:normal;font-style:italic;font-stretch:normal;font-variant:normal"
128
+ x="2.6976638"
129
+ y="3.1980052" /></text>
130
+ <text
131
+ xml:space="preserve"
132
+ style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.05093px;font-family:'Nimbus Sans';-inkscape-font-specification:'Nimbus Sans Italic';fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.143176;stroke-miterlimit:3.5;stroke-dasharray:0.859056, 0.859056;stroke-dashoffset:0;stroke-opacity:1"
133
+ x="1.2965562"
134
+ y="5.3904872"
135
+ id="text4077"
136
+ transform="scale(1.0659358,0.93814282)"><tspan
137
+ sodipodi:role="line"
138
+ id="tspan4075"
139
+ style="fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.143176"
140
+ x="1.2965562"
141
+ y="5.3904872">raw</tspan></text>
142
+ </g>
143
+ </svg>
@@ -0,0 +1,76 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ version="1.1"
6
+ id="svg815"
7
+ width="150"
8
+ height="150"
9
+ viewBox="0 0 150 150"
10
+ sodipodi:docname="tomwer_data_portal.svg"
11
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
12
+ inkscape:export-filename="tomwer_data_portal.png"
13
+ inkscape:export-xdpi="59.900002"
14
+ inkscape:export-ydpi="59.900002"
15
+ xml:space="preserve"
16
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
17
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
18
+ xmlns:xlink="http://www.w3.org/1999/xlink"
19
+ xmlns="http://www.w3.org/2000/svg"
20
+ xmlns:svg="http://www.w3.org/2000/svg"
21
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
22
+ xmlns:cc="http://creativecommons.org/ns#"
23
+ xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata
24
+ id="metadata821"><rdf:RDF><cc:Work
25
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
26
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
27
+ id="defs819" /><sodipodi:namedview
28
+ pagecolor="#ffffff"
29
+ bordercolor="#666666"
30
+ borderopacity="1"
31
+ objecttolerance="10"
32
+ gridtolerance="10"
33
+ guidetolerance="10"
34
+ inkscape:pageopacity="0"
35
+ inkscape:pageshadow="2"
36
+ inkscape:window-width="1920"
37
+ inkscape:window-height="1163"
38
+ id="namedview817"
39
+ showgrid="false"
40
+ inkscape:zoom="1.2800001"
41
+ inkscape:cx="244.14061"
42
+ inkscape:cy="40.624997"
43
+ inkscape:window-x="1920"
44
+ inkscape:window-y="0"
45
+ inkscape:window-maximized="1"
46
+ inkscape:current-layer="svg815"
47
+ inkscape:showpageshadow="2"
48
+ inkscape:pagecheckerboard="0"
49
+ inkscape:deskcolor="#d1d1d1" /><g
50
+ inkscape:label="Layer 1"
51
+ id="layer1"
52
+ transform="matrix(1.9436012,0,0,2.2142382,30.503651,18.352115)"><g
53
+ inkscape:export-ydpi="200"
54
+ inkscape:export-xdpi="200"
55
+ inkscape:export-filename="/nobackup/linazimov/payno/dev/esrf/ID06/id06workflow/resources/gui/icons/parameters.png"
56
+ transform="matrix(0.91430392,0,0,0.88285849,0.42325717,3.0002197)"
57
+ id="surface1"><g
58
+ transform="matrix(2.7869502,0,0,2.6849752,-125.41844,-861.31264)"
59
+ id="layer1-3"
60
+ inkscape:label="Layer 1"><g
61
+ transform="matrix(5.2986592,0,0,3.9918944,42.609171,-787.71546)"
62
+ id="g872"><image
63
+ width="4.6438637"
64
+ height="5.2361312"
65
+ preserveAspectRatio="none"
66
+ xlink:href="data:image/png;base64,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 RU5ErkJggg== "
67
+ id="image23483"
68
+ x="0.71037143"
69
+ y="278.56134" /></g></g></g></g><image
70
+ width="150"
71
+ height="150"
72
+ preserveAspectRatio="none"
73
+ xlink:href="data:image/png;base64,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 b9Q9B8GOFVwAAAAASUVORK5CYII= "
74
+ id="image23552"
75
+ x="0.3958602"
76
+ y="-7.2153831" /></svg>
@@ -38,15 +38,17 @@ from orangewidget.widget import Input, Output
38
38
  from processview.core import helpers as pv_helpers
39
39
  from processview.core.manager import DatasetState
40
40
  from processview.gui.processmanager import ProcessManager
41
+
41
42
  from silx.gui import qt
42
43
 
43
44
  import tomwer.core.process.reconstruction.axis
44
45
  from orangecontrib.tomwer.orange.managedprocess import SuperviseOW
45
46
  from orangecontrib.tomwer.orange.settings import CallbackSettingsHandler
46
- from tomwer.core import settings, utils
47
+ from tomwer.core import settings
48
+ from tomwer.core.utils.lbsram import is_low_on_memory
47
49
  from tomwer.core.process.reconstruction.axis import AxisTask
48
50
  from tomwer.core.process.reconstruction.axis.mode import AxisMode
49
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
51
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
50
52
  from tomwer.core.scan.scanbase import TomwerScanBase, _TomwerBaseDock
51
53
  from tomwer.gui.reconstruction.axis import AxisWindow
52
54
  from tomwer.synctools.axis import QAxisRP
@@ -67,7 +69,7 @@ class AxisOW(SuperviseOW, WidgetLongProcessing):
67
69
  keep alive qt widgets.
68
70
  """
69
71
 
70
- name = "default center of rotation"
72
+ name = "center of rotation finder"
71
73
  id = "orange.widgets.tomwer.axis"
72
74
  description = "use to compute the center of rotation"
73
75
  icon = "icons/axis.png"
@@ -416,8 +418,7 @@ class AxisOW(SuperviseOW, WidgetLongProcessing):
416
418
  return
417
419
  scan_ = copy.copy(scan)
418
420
  if not (
419
- settings.isOnLbsram(scan)
420
- and utils.isLowOnMemory(settings.get_lbsram_path())
421
+ settings.isOnLbsram(scan) and is_low_on_memory(settings.get_lbsram_path())
421
422
  ):
422
423
  set_position = False # avoid shift reset
423
424
  self._widget.setScan(scan=scan_, set_position=set_position)
@@ -432,7 +433,7 @@ class AxisOW(SuperviseOW, WidgetLongProcessing):
432
433
  self._axis_params.frame_width = scan.dim_1
433
434
  if (
434
435
  settings.isOnLbsram(scan)
435
- and utils.isLowOnMemory(settings.get_lbsram_path()) is True
436
+ and is_low_on_memory(settings.get_lbsram_path()) is True
436
437
  ):
437
438
  self._updatePosition(scan=scan)
438
439
  self.scan_ready(scan=scan)
@@ -443,7 +444,7 @@ class AxisOW(SuperviseOW, WidgetLongProcessing):
443
444
  self._axis_params.relative_cor_value
444
445
  )
445
446
  cor = scan._axis_params.relative_cor_value
446
- if isinstance(scan, HDF5TomoScan):
447
+ if isinstance(scan, NXtomoScan):
447
448
  entry = scan.entry
448
449
  else:
449
450
  entry = "entry"
@@ -490,22 +491,23 @@ class AxisOW(SuperviseOW, WidgetLongProcessing):
490
491
  self.scan_ready(scan=scan)
491
492
 
492
493
  elif self.isValueLock():
493
- entry = scan.entry if isinstance(scan, HDF5TomoScan) else "entry"
494
+ entry = scan.entry if isinstance(scan, NXtomoScan) else "entry"
494
495
  cor = self._axis_params.relative_cor_value
495
496
  scan.axis_params.set_relative_value(cor)
496
497
  scan._axis_params.mode = "manual"
497
- try:
498
- AxisTask._register_process(
499
- process_file=scan.process_file,
500
- entry=entry,
501
- process=AxisTask,
502
- results={"center_of_rotation": cor if cor is not None else "-"},
503
- configuration=self._axis_params.to_dict(),
504
- process_index=scan.pop_process_index(),
505
- overwrite=True,
506
- )
507
- except Exception as e:
508
- logger.warning(f"Fail to register Axis process. Error is {e}")
498
+ with scan.acquire_process_file_lock():
499
+ try:
500
+ AxisTask._register_process(
501
+ process_file=scan.process_file,
502
+ entry=entry,
503
+ process=AxisTask,
504
+ results={"center_of_rotation": cor if cor is not None else "-"},
505
+ configuration=self._axis_params.to_dict(),
506
+ process_index=scan.pop_process_index(),
507
+ overwrite=True,
508
+ )
509
+ except Exception as e:
510
+ logger.warning(f"Fail to register Axis process. Error is {e}")
509
511
  ProcessManager().notify_dataset_state(
510
512
  dataset=scan,
511
513
  process=AxisTask(
@@ -42,10 +42,11 @@ from tomwer.core import settings
42
42
  from tomwer.core.cluster.cluster import SlurmClusterConfiguration
43
43
  from tomwer.core.futureobject import FutureTomwerObject
44
44
  from tomwer.core.scan.scanbase import TomwerScanBase
45
- from tomwer.core.utils import isLowOnMemory
45
+ from tomwer.core.utils.lbsram import is_low_on_memory
46
46
  from tomwer.core.volume.volumebase import TomwerVolumeBase
47
47
  from tomwer.gui.reconstruction.nabu.castvolume import CastVolumeWidget
48
48
  from tomwer.synctools.stacks.reconstruction.castvolume import CastVolumeProcessStack
49
+ from tomwer.utils import docstring
49
50
 
50
51
  from ...orange.managedprocess import SuperviseOW
51
52
 
@@ -68,7 +69,7 @@ class CastNabuVolumeOW(WidgetLongProcessing, SuperviseOW):
68
69
  # note of this widget should be the one registered on the documentation
69
70
  name = "cast volume"
70
71
  id = "orange.widgets.tomwer.reconstruction.CastNabuVolumeOW.CastNabuVolumeOW"
71
- description = "This widget will allow to cast from 32 bits to 16 bits nabu volume. Only works for tiff now"
72
+ description = "This widget will allow to cast a nabu volume data type / format to another one."
72
73
  icon = "icons/nabu_cast.svg"
73
74
  priority = 60
74
75
  keywords = [
@@ -164,6 +165,9 @@ class CastNabuVolumeOW(WidgetLongProcessing, SuperviseOW):
164
165
 
165
166
  @Inputs.data
166
167
  def process_data(self, scan: Optional[TomwerScanBase]):
168
+ self._process_data(scan)
169
+
170
+ def _process_data(self, scan: Optional[TomwerScanBase]):
167
171
  if scan is None:
168
172
  return
169
173
  if not isinstance(scan, TomwerScanBase):
@@ -172,7 +176,7 @@ class CastNabuVolumeOW(WidgetLongProcessing, SuperviseOW):
172
176
  )
173
177
  if (
174
178
  settings.isOnLbsram(scan)
175
- and isLowOnMemory(settings.get_lbsram_path()) is True
179
+ and is_low_on_memory(settings.get_lbsram_path()) is True
176
180
  ):
177
181
  ProcessManager().notify_dataset_state(
178
182
  dataset=scan,
@@ -186,6 +190,15 @@ class CastNabuVolumeOW(WidgetLongProcessing, SuperviseOW):
186
190
  else:
187
191
  self._processingStack.add(scan, configuration=self.getConfiguration())
188
192
 
193
+ @docstring
194
+ def reprocess(self, dataset):
195
+ if isinstance(dataset, TomwerScanBase):
196
+ self._process_data(dataset)
197
+ elif isinstance(dataset, TomwerVolumeBase):
198
+ self._process_volume(dataset)
199
+ else:
200
+ raise TypeError("dataset is expected to be an instance of ''")
201
+
189
202
  @Inputs.cluster_in
190
203
  def setCluster(self, slurm_cluster: Optional[SlurmClusterConfiguration]):
191
204
  assert isinstance(
@@ -195,6 +208,9 @@ class CastNabuVolumeOW(WidgetLongProcessing, SuperviseOW):
195
208
 
196
209
  @Inputs.volume
197
210
  def process_volume(self, volume: Optional[TomwerVolumeBase]):
211
+ self._process_volume(volume)
212
+
213
+ def _process_volume(self, volume: Optional[TomwerVolumeBase]):
198
214
  if volume is None:
199
215
  return
200
216
  if not isinstance(volume, TomwerVolumeBase):