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,263 @@
1
+ import fileinput
2
+ import logging
3
+ import os
4
+
5
+ import fabio.edfimage
6
+ from lxml import etree
7
+ from pyunitsystem import metricsystem
8
+
9
+
10
+ _logger = logging.getLogger(__name__)
11
+
12
+
13
+ def _getInformation(scan, refFile, information, _type, aliases=None):
14
+ """
15
+ Parse files contained in the given directory to get the requested
16
+ information
17
+
18
+ :param scan: directory containing the acquisition. Must be an absolute path
19
+ :param refFile: the refXXXX_YYYY which should contain information about the
20
+ scan.
21
+ :return: the requested information or None if not found
22
+ """
23
+
24
+ def parseRefFile(filePath):
25
+ header = fabio.open(filePath).header
26
+ for k in aliases:
27
+ if k in header:
28
+ return _type(header[k])
29
+ return None
30
+
31
+ def parseXMLFile(filePath):
32
+ try:
33
+ for alias in info_aliases:
34
+ tree = etree.parse(filePath)
35
+ elmt = tree.find("acquisition/" + alias)
36
+ if elmt is None:
37
+ continue
38
+ else:
39
+ info = _type(elmt.text)
40
+ if info == -1:
41
+ return None
42
+ else:
43
+ return info
44
+ except etree.XMLSyntaxError as e:
45
+ _logger.warning(e)
46
+ return None
47
+
48
+ def parseInfoFile(filePath):
49
+ def extractInformation(text, alias):
50
+ text = text.replace(alias, "")
51
+ text = text.replace("\n", "")
52
+ text = text.replace(" ", "")
53
+ text = text.replace("=", "")
54
+ return _type(text)
55
+
56
+ info = None
57
+ f = open(filePath, "r")
58
+ line = f.readline()
59
+ while line:
60
+ for alias in info_aliases:
61
+ if alias in line:
62
+ info = extractInformation(line, alias)
63
+ break
64
+ line = f.readline()
65
+ f.close()
66
+ return info
67
+
68
+ info_aliases = [information]
69
+ if aliases is not None:
70
+ assert type(aliases) in (tuple, list)
71
+ [info_aliases.append(alias) for alias in aliases]
72
+
73
+ if not os.path.isdir(scan):
74
+ return None
75
+
76
+ if refFile is not None and os.path.isfile(refFile):
77
+ try:
78
+ info = parseRefFile(refFile)
79
+ except IOError as e:
80
+ _logger.warning(e)
81
+ else:
82
+ if info is not None:
83
+ return info
84
+
85
+ baseName = os.path.basename(scan)
86
+ infoFiles = [os.path.join(scan, baseName + ".info")]
87
+ infoOnDataVisitor = infoFiles[0].replace("lbsram", "", 1)
88
+ # hack to check in lbsram, would need to be removed to add some consistency
89
+ if os.path.isfile(infoOnDataVisitor):
90
+ infoFiles.append(infoOnDataVisitor)
91
+ for infoFile in infoFiles:
92
+ if os.path.isfile(infoFile) is True:
93
+ info = parseInfoFile(infoFile)
94
+ if info is not None:
95
+ return info
96
+
97
+ xmlFiles = [os.path.join(scan, baseName + ".xml")]
98
+ xmlOnDataVisitor = xmlFiles[0].replace("lbsram", "", 1)
99
+ # hack to check in lbsram, would need to be removed to add some consistency
100
+ if os.path.isfile(xmlOnDataVisitor):
101
+ xmlFiles.append(xmlOnDataVisitor)
102
+ for xmlFile in xmlFiles:
103
+ if os.path.isfile(xmlFile) is True:
104
+ info = parseXMLFile(xmlFile)
105
+ if info is not None:
106
+ return info
107
+
108
+ return None
109
+
110
+
111
+ def getClosestEnergy(scan, refFile=None):
112
+ """
113
+ Parse files contained in the given directory to get information about the
114
+ incoming energy for the serie `iSerie`
115
+
116
+ :param scan: directory containing the acquisition
117
+ :param refFile: the refXXXX_YYYY which should contain information about the
118
+ energy.
119
+ :return: the energy in keV or none if no energy found
120
+ """
121
+ return _getInformation(
122
+ os.path.abspath(scan),
123
+ refFile,
124
+ information="Energy",
125
+ aliases=["energy", "ENERGY"],
126
+ _type=float,
127
+ )
128
+
129
+
130
+ def getTomo_N(scan):
131
+ """Return the number of radio taken"""
132
+ return _getInformation(
133
+ os.path.abspath(scan),
134
+ refFile=None,
135
+ information="TOMO_N",
136
+ _type=int,
137
+ aliases=["tomo_N", "Tomo_N"],
138
+ )
139
+
140
+
141
+ def getDARK_N(scan):
142
+ return _getInformation(
143
+ os.path.abspath(scan),
144
+ refFile=None,
145
+ information="DARK_N",
146
+ _type=int,
147
+ aliases=["dark_N"],
148
+ )
149
+
150
+
151
+ def rebaseParFile(_file, oldfolder, newfolder):
152
+ """Update the given .par file to replace oldfolder location by the newfolder.
153
+
154
+ .. warning:: make the replacement in place.
155
+
156
+ :param _file: par file to update
157
+ :param oldfolder: previous location of the .par file
158
+ :param newfolder: new location of the .par file
159
+ """
160
+ with fileinput.FileInput(_file, inplace=True, backup=".bak") as parfile:
161
+ for line in parfile:
162
+ line = line.rstrip().replace(oldfolder, newfolder, 1)
163
+ print(line)
164
+
165
+
166
+ def getDim1Dim2(scan):
167
+ """
168
+
169
+ :param scan: path to the acquisition
170
+ :return: detector definition
171
+ :rtype: tuple of int
172
+ """
173
+ d1 = _getInformation(
174
+ scan=scan,
175
+ refFile=None,
176
+ information="Dim_1",
177
+ aliases=["projectionSize/DIM_1"],
178
+ _type=int,
179
+ )
180
+ d2 = _getInformation(
181
+ scan=scan,
182
+ refFile=None,
183
+ information="Dim_2",
184
+ aliases=["projectionSize/DIM_2"],
185
+ _type=int,
186
+ )
187
+ return d1, d2
188
+
189
+
190
+ def getParametersFromParOrInfo(_file):
191
+ """
192
+ Create a dictionary from the file with the information name as keys and
193
+ their values as values
194
+ """
195
+ assert os.path.exists(_file) and os.path.isfile(_file)
196
+ ddict = {}
197
+ f = open(_file, "r")
198
+ lines = f.readlines()
199
+ for line in lines:
200
+ if "=" not in line:
201
+ continue
202
+ line_str = line.replace(" ", "")
203
+ line_str = line_str.rstrip("\n")
204
+ # remove on the line comments
205
+ if "#" in line_str:
206
+ line_str = line_str.split("#")[0]
207
+ if line_str == "":
208
+ continue
209
+ try:
210
+ key, value = line_str.split("=")
211
+ except ValueError:
212
+ _logger.error('fail to extract information from "%s"' % line_str)
213
+ else:
214
+ ddict[key.lower()] = value
215
+ return ddict
216
+
217
+
218
+ def getFirstProjFile(scan):
219
+ """Return the first .edf containing a projection"""
220
+ if os.path.isdir(scan) is False:
221
+ return None
222
+ files = sorted(os.listdir(scan))
223
+
224
+ while (
225
+ len(files) > 0
226
+ and (files[0].startswith(os.path.basename(scan)) and files[0].endswith(".edf"))
227
+ is False
228
+ ):
229
+ files.remove(files[0])
230
+
231
+ if len(files) > 0:
232
+ return os.path.join(scan, files[0])
233
+ else:
234
+ return None
235
+
236
+
237
+ def getPixelSize(scan):
238
+ """
239
+ Try to retrieve the pixel size from the set of files.
240
+
241
+ :return: the pixel size in meter or None
242
+ :rtype: None or float
243
+ """
244
+ if os.path.isdir(scan) is False:
245
+ return None
246
+ value = _getInformation(
247
+ scan=scan,
248
+ refFile=None,
249
+ information="PixelSize",
250
+ _type=float,
251
+ aliases=["pixelSize"],
252
+ )
253
+ if value is None:
254
+ parFile = os.path.join(scan, os.path.basename(scan) + ".par")
255
+ if os.path.exists(parFile):
256
+ ddict = getParametersFromParOrInfo(parFile)
257
+ if "IMAGE_PIXEL_SIZE_1".lower() in ddict:
258
+ value = float(ddict["IMAGE_PIXEL_SIZE_1".lower()])
259
+ # for now pixel size are stored in microns. We want to return them in meter
260
+ if value is not None:
261
+ return value * metricsystem.micrometer.value
262
+ else:
263
+ return None
@@ -86,11 +86,11 @@ class EDFVolume(_EDFVolume, TomwerVolumeBase, Dataset):
86
86
  file_prefix=self._volume_basename,
87
87
  metadata={
88
88
  "name": self.url.file_path(),
89
- "creation_time": datetime.fromtimestamp(stat.st_ctime)
90
- if stat
91
- else None,
92
- "modification_time": datetime.fromtimestamp(stat.st_ctime)
93
- if stat
94
- else None,
89
+ "creation_time": (
90
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
91
+ ),
92
+ "modification_time": (
93
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
94
+ ),
95
95
  },
96
96
  )
@@ -103,11 +103,11 @@ class HDF5Volume(_HDF5Volume, TomwerVolumeBase, Dataset):
103
103
  entry=self.url.data_path(),
104
104
  metadata={
105
105
  "name": self.url.file_path(),
106
- "creation_time": datetime.fromtimestamp(stat.st_ctime)
107
- if stat
108
- else None,
109
- "modification_time": datetime.fromtimestamp(stat.st_ctime)
110
- if stat
111
- else None,
106
+ "creation_time": (
107
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
108
+ ),
109
+ "modification_time": (
110
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
111
+ ),
112
112
  },
113
113
  )
@@ -87,11 +87,11 @@ class JP2KVolume(_JP2KVolume, TomwerVolumeBase, Dataset):
87
87
  file_prefix=self._volume_basename,
88
88
  metadata={
89
89
  "name": self.url.file_path(),
90
- "creation_time": datetime.fromtimestamp(stat.st_ctime)
91
- if stat
92
- else None,
93
- "modification_time": datetime.fromtimestamp(stat.st_ctime)
94
- if stat
95
- else None,
90
+ "creation_time": (
91
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
92
+ ),
93
+ "modification_time": (
94
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
95
+ ),
96
96
  },
97
97
  )
@@ -97,11 +97,11 @@ class RawVolume(_RawVolume, TomwerVolumeBase, Dataset):
97
97
  file_path=self.url.file_path(),
98
98
  metadata={
99
99
  "name": self.url.file_path(),
100
- "creation_time": datetime.fromtimestamp(stat.st_ctime)
101
- if stat
102
- else None,
103
- "modification_time": datetime.fromtimestamp(stat.st_ctime)
104
- if stat
105
- else None,
100
+ "creation_time": (
101
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
102
+ ),
103
+ "modification_time": (
104
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
105
+ ),
106
106
  },
107
107
  )
@@ -103,12 +103,12 @@ class TIFFVolume(_TIFFVolume, TomwerVolumeBase, Dataset):
103
103
  file_prefix=self._volume_basename,
104
104
  metadata={
105
105
  "name": self.url.file_path(),
106
- "creation_time": datetime.fromtimestamp(stat.st_ctime)
107
- if stat
108
- else None,
109
- "modification_time": datetime.fromtimestamp(stat.st_ctime)
110
- if stat
111
- else None,
106
+ "creation_time": (
107
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
108
+ ),
109
+ "modification_time": (
110
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
111
+ ),
112
112
  },
113
113
  )
114
114
 
@@ -145,12 +145,12 @@ class MultiTIFFVolume(_MultiTIFFVolume, TomwerVolumeBase, Dataset):
145
145
  tiff_file=self.url.file_path(),
146
146
  metadata={
147
147
  "name": self.url.file_path(),
148
- "creation_time": datetime.fromtimestamp(stat.st_ctime)
149
- if stat
150
- else None,
151
- "modification_time": datetime.fromtimestamp(stat.st_ctime)
152
- if stat
153
- else None,
148
+ "creation_time": (
149
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
150
+ ),
151
+ "modification_time": (
152
+ datetime.fromtimestamp(stat.st_ctime) if stat else None
153
+ ),
154
154
  },
155
155
  )
156
156
 
@@ -38,7 +38,7 @@ from tomoscan.factory import Factory as _oVolumeFactory
38
38
  from tomoscan.identifier import BaseIdentifier, ScanIdentifier, VolumeIdentifier
39
39
 
40
40
  from tomwer.core.scan.edfscan import EDFTomoScan, EDFTomoScanIdentifier
41
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
41
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
42
42
  from tomwer.core.volume import (
43
43
  EDFVolume,
44
44
  HDF5Volume,
@@ -156,7 +156,7 @@ class VolumeFactory(_oVolumeFactory):
156
156
  if tomo_type == VolumeIdentifier.TOMO_TYPE:
157
157
  return HDF5Volume.from_identifier(identifier=identifier)
158
158
  elif tomo_type == ScanIdentifier.TOMO_TYPE:
159
- return HDF5TomoScan.from_identifier(identifier=identifier)
159
+ return NXtomoScan.from_identifier(identifier=identifier)
160
160
  else:
161
161
  raise NotImplementedError()
162
162
  elif scheme == "jp2k":