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
@@ -1,466 +0,0 @@
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__ = "17/05/2017"
29
-
30
- import fileinput
31
- import logging
32
- import os
33
- import shutil
34
- from urllib.request import urlopen
35
-
36
- import fabio.edfimage
37
- import psutil
38
- from lxml import etree
39
- from tomoscan.unitsystem import metricsystem
40
-
41
- from tomwer.core import settings
42
-
43
- logger = logging.getLogger(__name__)
44
-
45
- MOCK_LOW_MEM = False # if True will simulate the case the computer run into low memory
46
-
47
- IGNORE_LOW_MEM = False
48
-
49
-
50
- def isLowOnMemory(path=""):
51
- """
52
-
53
- :return: True if the RAM usage is more than MAX_MEM_USED (or low memory
54
- is simulated)
55
- """
56
- if IGNORE_LOW_MEM is True:
57
- return False
58
- if path == settings.get_dest_path():
59
- if settings.MOCK_LBSRAM is True:
60
- return MOCK_LOW_MEM
61
- else:
62
- assert os.path.isdir(path)
63
- return psutil.disk_usage(path).percent > settings.MAX_MEM_USED
64
- else:
65
- return (MOCK_LOW_MEM is True) or (
66
- os.path.exists(path)
67
- and (psutil.disk_usage(path).percent > settings.MAX_MEM_USED)
68
- )
69
-
70
-
71
- def ignoreLowMemory(value=True):
72
- """ignore the low memory information"""
73
- global IGNORE_LOW_MEM
74
- IGNORE_LOW_MEM = value
75
-
76
-
77
- def mockLowMemory(b=True):
78
- """Mock the case the computer is running into low memory"""
79
- global MOCK_LOW_MEM
80
- MOCK_LOW_MEM = b
81
- return psutil.virtual_memory().percent > settings.MAX_MEM_USED
82
-
83
-
84
- def _getInformation(scan, refFile, information, _type, aliases=None):
85
- """
86
- Parse files contained in the given directory to get the requested
87
- information
88
-
89
- :param scan: directory containing the acquisition. Must be an absolute path
90
- :param refFile: the refXXXX_YYYY which should contain information about the
91
- scan.
92
- :return: the requested information or None if not found
93
- """
94
-
95
- def parseRefFile(filePath):
96
- header = fabio.open(filePath).header
97
- for k in aliases:
98
- if k in header:
99
- return _type(header[k])
100
- return None
101
-
102
- def parseXMLFile(filePath):
103
- try:
104
- for alias in info_aliases:
105
- tree = etree.parse(filePath)
106
- elmt = tree.find("acquisition/" + alias)
107
- if elmt is None:
108
- continue
109
- else:
110
- info = _type(elmt.text)
111
- if info == -1:
112
- return None
113
- else:
114
- return info
115
- except etree.XMLSyntaxError as e:
116
- logger.warning(e)
117
- return None
118
-
119
- def parseInfoFile(filePath):
120
- def extractInformation(text, alias):
121
- text = text.replace(alias, "")
122
- text = text.replace("\n", "")
123
- text = text.replace(" ", "")
124
- text = text.replace("=", "")
125
- return _type(text)
126
-
127
- info = None
128
- f = open(filePath, "r")
129
- line = f.readline()
130
- while line:
131
- for alias in info_aliases:
132
- if alias in line:
133
- info = extractInformation(line, alias)
134
- break
135
- line = f.readline()
136
- f.close()
137
- return info
138
-
139
- info_aliases = [information]
140
- if aliases is not None:
141
- assert type(aliases) in (tuple, list)
142
- [info_aliases.append(alias) for alias in aliases]
143
-
144
- if not os.path.isdir(scan):
145
- return None
146
-
147
- if refFile is not None and os.path.isfile(refFile):
148
- try:
149
- info = parseRefFile(refFile)
150
- except IOError as e:
151
- logger.warning(e)
152
- else:
153
- if info is not None:
154
- return info
155
-
156
- baseName = os.path.basename(scan)
157
- infoFiles = [os.path.join(scan, baseName + ".info")]
158
- infoOnDataVisitor = infoFiles[0].replace("lbsram", "", 1)
159
- # hack to check in lbsram, would need to be removed to add some consistency
160
- if os.path.isfile(infoOnDataVisitor):
161
- infoFiles.append(infoOnDataVisitor)
162
- for infoFile in infoFiles:
163
- if os.path.isfile(infoFile) is True:
164
- info = parseInfoFile(infoFile)
165
- if info is not None:
166
- return info
167
-
168
- xmlFiles = [os.path.join(scan, baseName + ".xml")]
169
- xmlOnDataVisitor = xmlFiles[0].replace("lbsram", "", 1)
170
- # hack to check in lbsram, would need to be removed to add some consistency
171
- if os.path.isfile(xmlOnDataVisitor):
172
- xmlFiles.append(xmlOnDataVisitor)
173
- for xmlFile in xmlFiles:
174
- if os.path.isfile(xmlFile) is True:
175
- info = parseXMLFile(xmlFile)
176
- if info is not None:
177
- return info
178
-
179
- return None
180
-
181
-
182
- def getClosestEnergy(scan, refFile=None):
183
- """
184
- Parse files contained in the given directory to get information about the
185
- incoming energy for the serie `iSerie`
186
-
187
- :param scan: directory containing the acquisition
188
- :param refFile: the refXXXX_YYYY which should contain information about the
189
- energy.
190
- :return: the energy in keV or none if no energy found
191
- """
192
- return _getInformation(
193
- os.path.abspath(scan),
194
- refFile,
195
- information="Energy",
196
- aliases=["energy", "ENERGY"],
197
- _type=float,
198
- )
199
-
200
-
201
- def getClosestSRCurrent(scan_dir, refFile=None):
202
- """
203
- Parse files contained in the given directory to get information about the
204
- incoming energy for the serie `iSerie`
205
-
206
- :param scan_dir: directory containing the acquisition
207
- :param refFile: the refXXXX_YYYY which should contain information about the
208
- energy.
209
- :return: the energy in keV or none if no energy found
210
- """
211
- return _getInformation(
212
- os.path.abspath(scan_dir),
213
- refFile,
214
- information="SRCUR",
215
- aliases=["SrCurrent", "machineCurrentStart"],
216
- _type=float,
217
- )
218
-
219
-
220
- def getSRCurrent(scan_dir, when):
221
- assert when in ("start", "end")
222
- xmlFiles = [
223
- os.path.join(os.path.abspath(scan_dir), os.path.basename(scan_dir) + ".xml")
224
- ]
225
- xmlOnDataVisitor = xmlFiles[0].replace("lbsram", "", 1)
226
- # hack to check in lbsram, would need to be removed to add some consistency
227
- if os.path.isfile(xmlOnDataVisitor):
228
- xmlFiles.append(xmlOnDataVisitor)
229
- for xmlFile in xmlFiles:
230
- if os.path.isfile(xmlFile):
231
- try:
232
- tree = etree.parse(xmlFile)
233
- key = "machineCurrentStart" if when == "start" else "machineCurrentStop"
234
- elmt = tree.find("acquisition/" + key)
235
- if elmt is None:
236
- return None
237
- else:
238
- info = float(elmt.text)
239
- if info == -1:
240
- return None
241
- else:
242
- return info
243
- except etree.XMLSyntaxError as e:
244
- logger.warning(e)
245
- return None
246
- return None
247
-
248
-
249
- # TODO : should be moved in the scan module
250
- def getTomo_N(scan):
251
- """Return the number of radio taken"""
252
- return _getInformation(
253
- os.path.abspath(scan),
254
- refFile=None,
255
- information="TOMO_N",
256
- _type=int,
257
- aliases=["tomo_N", "Tomo_N"],
258
- )
259
-
260
-
261
- # TODO mv to scan module
262
- def getScanRange(scan):
263
- return _getInformation(
264
- os.path.abspath(scan),
265
- refFile=None,
266
- information="ScanRange",
267
- _type=int,
268
- aliases=["scanRange"],
269
- )
270
-
271
-
272
- # TODO: mv to scan module
273
- def getDARK_N(scan):
274
- return _getInformation(
275
- os.path.abspath(scan),
276
- refFile=None,
277
- information="DARK_N",
278
- _type=int,
279
- aliases=["dark_N"],
280
- )
281
-
282
-
283
- def getRef_N(scan):
284
- return _getInformation(
285
- os.path.abspath(scan),
286
- refFile=None,
287
- information="REF_N",
288
- _type=int,
289
- aliases=["ref_N"],
290
- )
291
-
292
-
293
- def getRefOn(scan):
294
- return _getInformation(
295
- os.path.abspath(scan),
296
- refFile=None,
297
- information="REF_ON",
298
- _type=int,
299
- aliases=["ref_On"],
300
- )
301
-
302
-
303
- def rebaseParFile(_file, oldfolder, newfolder):
304
- """Update the given .par file to replace oldfolder location by the newfolder.
305
-
306
- .. warning:: make the replacement in place.
307
-
308
- :param _file: par file to update
309
- :param oldfolder: previous location of the .par file
310
- :param newfolder: new location of the .par file
311
- """
312
- with fileinput.FileInput(_file, inplace=True, backup=".bak") as parfile:
313
- for line in parfile:
314
- line = line.rstrip().replace(oldfolder, newfolder, 1)
315
- print(line)
316
-
317
-
318
- # TODO: move to scan module
319
- def getDim1Dim2(scan):
320
- """
321
-
322
- :param scan: path to the acquisition
323
- :return: detector definition
324
- :rtype: tuple of int
325
- """
326
- d1 = _getInformation(
327
- scan=scan,
328
- refFile=None,
329
- information="Dim_1",
330
- aliases=["projectionSize/DIM_1"],
331
- _type=int,
332
- )
333
- d2 = _getInformation(
334
- scan=scan,
335
- refFile=None,
336
- information="Dim_2",
337
- aliases=["projectionSize/DIM_2"],
338
- _type=int,
339
- )
340
- return d1, d2
341
-
342
-
343
- # TODO: move to scan module
344
- def getParametersFromParOrInfo(_file):
345
- """
346
- Create a dictionary from the file with the information name as keys and
347
- their values as values
348
- """
349
- assert os.path.exists(_file) and os.path.isfile(_file)
350
- ddict = {}
351
- f = open(_file, "r")
352
- lines = f.readlines()
353
- for line in lines:
354
- if "=" not in line:
355
- continue
356
- line_str = line.replace(" ", "")
357
- line_str = line_str.rstrip("\n")
358
- # remove on the line comments
359
- if "#" in line_str:
360
- line_str = line_str.split("#")[0]
361
- if line_str == "":
362
- continue
363
- try:
364
- key, value = line_str.split("=")
365
- except ValueError:
366
- logger.error('fail to extract information from "%s"' % line_str)
367
- else:
368
- ddict[key.lower()] = value
369
- return ddict
370
-
371
-
372
- # TODO: move to scan module
373
- def getFirstProjFile(scan):
374
- """Return the first .edf containing a projection"""
375
- if os.path.isdir(scan) is False:
376
- return None
377
- files = sorted(os.listdir(scan))
378
-
379
- while (
380
- len(files) > 0
381
- and (files[0].startswith(os.path.basename(scan)) and files[0].endswith(".edf"))
382
- is False
383
- ):
384
- files.remove(files[0])
385
-
386
- if len(files) > 0:
387
- return os.path.join(scan, files[0])
388
- else:
389
- return None
390
-
391
-
392
- def getPixelSize(scan):
393
- """
394
- Try to retrieve the pixel size from the set of files.
395
-
396
- :return: the pixel size in meter or None
397
- :rtype: None or float
398
- """
399
- if os.path.isdir(scan) is False:
400
- return None
401
- value = _getInformation(
402
- scan=scan,
403
- refFile=None,
404
- information="PixelSize",
405
- _type=float,
406
- aliases=["pixelSize"],
407
- )
408
- if value is None:
409
- parFile = os.path.join(scan, os.path.basename(scan) + ".par")
410
- if os.path.exists(parFile):
411
- ddict = getParametersFromParOrInfo(parFile)
412
- if "IMAGE_PIXEL_SIZE_1".lower() in ddict:
413
- value = float(ddict["IMAGE_PIXEL_SIZE_1".lower()])
414
- # for now pixel size are stored in microns. We want to return them in meter
415
- if value is not None:
416
- return value * metricsystem.micrometer.value
417
- else:
418
- return None
419
-
420
-
421
- url_base = "http://www.edna-site.org/pub/tomwer/"
422
-
423
-
424
- def DownloadDataset(dataset, output_folder, timeout, unpack=False):
425
- # create if needed path scan
426
- url = url_base + dataset
427
-
428
- logger.info("Trying to download scan %s, timeout set to %ss", dataset, timeout)
429
- logger.info("wget %s" % url)
430
-
431
- data = urlopen(url, data=None, timeout=timeout).read()
432
- logger.info("Image %s successfully downloaded." % dataset)
433
-
434
- if not os.path.isdir(output_folder):
435
- os.makedirs(output_folder)
436
-
437
- try:
438
- archive_folder = os.path.join(output_folder, os.path.basename(dataset))
439
- with open(archive_folder, "wb") as outfile:
440
- outfile.write(data)
441
- except IOError:
442
- raise IOError(
443
- "unable to write downloaded \
444
- data to disk at %s"
445
- % archive_folder
446
- )
447
-
448
- if unpack is True:
449
- shutil.unpack_archive(archive_folder, extract_dir=output_folder, format="bztar")
450
- os.remove(archive_folder)
451
-
452
-
453
- def concatenate_dict(dict_1, dict_2) -> dict:
454
- """update dict which has dict as values. And we want concatenate those values to"""
455
- res = dict_1.copy()
456
- for key in dict_2:
457
- if key in dict_1:
458
- if key in [f"axis_{axis}_params" for axis in (0, 1, 2)]:
459
- res[key] = ";".join((dict_1[key], dict_2[key]))
460
- elif isinstance(dict_1[key], dict):
461
- res[key] = concatenate_dict(dict_1=dict_1[key], dict_2=dict_2[key])
462
- else:
463
- res.update({key: dict_2[key]})
464
- else:
465
- res[key] = dict_2[key]
466
- return res
@@ -33,7 +33,7 @@ import logging
33
33
  import sys
34
34
  import traceback
35
35
 
36
- depreclog = logging.getLogger("silx.DEPRECATION")
36
+ depreclog = logging.getLogger("tomwer.DEPRECATION")
37
37
 
38
38
  deprecache = set([])
39
39
 
@@ -0,0 +1,14 @@
1
+ def concatenate_dict(dict_1, dict_2) -> dict:
2
+ """update dict which has dict as values. And we want concatenate those values to"""
3
+ res = dict_1.copy()
4
+ for key in dict_2:
5
+ if key in dict_1:
6
+ if key in [f"axis_{axis}_params" for axis in (0, 1, 2)]:
7
+ res[key] = ";".join((dict_1[key], dict_2[key]))
8
+ elif isinstance(dict_1[key], dict):
9
+ res[key] = concatenate_dict(dict_1=dict_1[key], dict_2=dict_2[key])
10
+ else:
11
+ res.update({key: dict_2[key]})
12
+ else:
13
+ res[key] = dict_2[key]
14
+ return res
@@ -0,0 +1,35 @@
1
+ import os
2
+ import psutil
3
+ from tomwer.core import settings
4
+
5
+ MOCK_LOW_MEM = False # if True will simulate the case the computer run into low memory
6
+
7
+ IGNORE_LOW_MEM = False
8
+
9
+
10
+ def is_low_on_memory(path=""):
11
+ """
12
+
13
+ :return: True if the RAM usage is more than MAX_MEM_USED (or low memory
14
+ is simulated)
15
+ """
16
+ if IGNORE_LOW_MEM is True:
17
+ return False
18
+ if path == settings.get_dest_path():
19
+ if settings.MOCK_LBSRAM is True:
20
+ return MOCK_LOW_MEM
21
+ else:
22
+ assert os.path.isdir(path)
23
+ return psutil.disk_usage(path).percent > settings.MAX_MEM_USED
24
+ else:
25
+ return (MOCK_LOW_MEM is True) or (
26
+ os.path.exists(path)
27
+ and (psutil.disk_usage(path).percent > settings.MAX_MEM_USED)
28
+ )
29
+
30
+
31
+ def mock_low_memory(b=True):
32
+ """Mock the case the computer is running into low memory"""
33
+ global MOCK_LOW_MEM
34
+ MOCK_LOW_MEM = b
35
+ return psutil.virtual_memory().percent > settings.MAX_MEM_USED
@@ -31,7 +31,7 @@ __date__ = "02/12/2021"
31
31
  from typing import Union
32
32
 
33
33
  import numpy
34
- from tomoscan.esrf.scan.hdf5scan import ImageKey
34
+ from nxtomo.nxobject.nxdetector import ImageKey
35
35
 
36
36
 
37
37
  def get_n_series(image_key_values: Union[tuple, list], image_key_type: ImageKey) -> int:
@@ -38,21 +38,21 @@ import h5py
38
38
  import numpy
39
39
  from silx.io.utils import h5py_read_dataset
40
40
  from tomoscan.esrf.scan.mock import MockEDF as _MockEDF
41
- from tomoscan.esrf.scan.mock import MockHDF5 as _MockHDF5
41
+ from tomoscan.esrf.scan.mock import MockNXtomo as _MockNXtomo
42
42
  from tomoscan.io import HDF5File
43
43
  from tomoscan.test.utils import MockContext
44
44
 
45
45
  from tomwer.core.scan.blissscan import BlissScan
46
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
46
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
47
47
  from tomwer.core.scan.scanfactory import ScanFactory
48
48
 
49
49
  _logger = logging.getLogger(__name__)
50
50
 
51
51
 
52
- class MockHDF5(_MockHDF5):
52
+ class MockNXtomo(_MockNXtomo):
53
53
  def __init__(self, *args, **kwargs):
54
54
  super().__init__(*args, **kwargs)
55
- self.scan = HDF5TomoScan(scan=self.scan_master_file, entry="entry")
55
+ self.scan = NXtomoScan(scan=self.scan_master_file, entry="entry")
56
56
 
57
57
 
58
58
  class MockEDF(_MockEDF):
@@ -383,7 +383,7 @@ class MockBlissAcquisition:
383
383
  )
384
384
 
385
385
 
386
- class HDF5MockContext(MockContext, mock_class=MockHDF5):
386
+ class HDF5MockContext(MockContext, mock_class=MockNXtomo):
387
387
  """
388
388
  Util class to provide a context with a new Mock HDF5 file
389
389
  """
@@ -395,7 +395,7 @@ class HDF5MockContext(MockContext, mock_class=MockHDF5):
395
395
  self._scan_path = scan_path
396
396
 
397
397
  def __enter__(self):
398
- return MockHDF5(
398
+ return MockNXtomo(
399
399
  scan_path=self._scan_path, n_proj=self._n_proj, **self._mocks_params
400
400
  ).scan
401
401