tomwer 1.2.8__py3-none-any.whl → 1.3.0a0__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 (253) hide show
  1. orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
  2. orangecontrib/tomwer/widgets/__init__.py +1 -0
  3. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
  4. orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
  5. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
  6. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +11 -5
  7. orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
  8. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +31 -18
  9. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +14 -7
  10. orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
  11. orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
  12. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
  13. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +4 -4
  14. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
  15. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
  16. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +2 -0
  17. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
  18. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
  19. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
  20. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
  21. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
  22. orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
  23. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  24. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
  25. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
  26. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
  27. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  28. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
  29. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
  30. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
  31. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +9 -8
  32. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +3 -3
  33. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +179 -169
  34. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
  35. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
  36. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +7 -13
  37. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +7 -17
  38. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +3 -4
  39. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
  40. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
  41. orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
  42. tomwer/__main__.py +11 -58
  43. tomwer/app/canvas.py +8 -0
  44. tomwer/app/canvas_launcher/config.py +13 -11
  45. tomwer/app/darkref.py +1 -1
  46. tomwer/app/darkrefpatch.py +1 -1
  47. tomwer/app/imagekeyeditor.py +5 -5
  48. tomwer/app/imagekeyupgrader.py +5 -5
  49. tomwer/app/intensitynormalization.py +2 -2
  50. tomwer/app/radiostack.py +2 -2
  51. tomwer/app/zstitching.py +74 -3
  52. tomwer/core/cluster/cluster.py +26 -0
  53. tomwer/core/log/logger.py +7 -5
  54. tomwer/core/process/conditions/filters.py +1 -1
  55. tomwer/core/process/control/datalistener/datalistener.py +3 -3
  56. tomwer/core/process/control/nxtomoconcatenate.py +13 -13
  57. tomwer/core/process/control/nxtomomill.py +83 -25
  58. tomwer/core/process/control/scantransfer.py +11 -10
  59. tomwer/core/process/control/scanvalidator.py +3 -2
  60. tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
  61. tomwer/core/process/control/test/test_email.py +4 -4
  62. tomwer/core/process/control/test/test_h52nx_process.py +59 -7
  63. tomwer/core/process/control/test/test_volume_link.py +64 -64
  64. tomwer/core/process/control/timer.py +1 -1
  65. tomwer/core/process/control/volumesymlink.py +200 -200
  66. tomwer/core/process/edit/darkflatpatch.py +6 -6
  67. tomwer/core/process/edit/imagekeyeditor.py +17 -18
  68. tomwer/core/process/icat/__init__.py +0 -0
  69. tomwer/core/process/icat/createscreenshots.py +100 -0
  70. tomwer/core/process/icat/gallery.py +377 -0
  71. tomwer/core/process/icat/icatbase.py +36 -0
  72. tomwer/core/process/icat/publish.py +228 -0
  73. tomwer/core/process/icat/screenshots.py +26 -0
  74. tomwer/core/process/output.py +52 -0
  75. tomwer/core/process/reconstruction/axis/axis.py +17 -10
  76. tomwer/core/process/reconstruction/axis/mode.py +4 -0
  77. tomwer/core/process/reconstruction/axis/params.py +9 -4
  78. tomwer/core/process/reconstruction/darkref/darkrefs.py +8 -6
  79. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +1 -1
  80. tomwer/core/process/reconstruction/darkref/params.py +1 -1
  81. tomwer/core/process/reconstruction/lamino/tofu.py +4 -4
  82. tomwer/core/process/reconstruction/nabu/castvolume.py +1 -1
  83. tomwer/core/process/reconstruction/nabu/helical.py +9 -5
  84. tomwer/core/process/reconstruction/nabu/nabucommon.py +32 -62
  85. tomwer/core/process/reconstruction/nabu/nabuscores.py +387 -61
  86. tomwer/core/process/reconstruction/nabu/nabuslices.py +33 -21
  87. tomwer/core/process/reconstruction/nabu/nabuvolume.py +37 -14
  88. tomwer/core/process/reconstruction/nabu/settings.py +2 -2
  89. tomwer/core/process/reconstruction/nabu/utils.py +129 -24
  90. tomwer/core/process/reconstruction/output.py +108 -0
  91. tomwer/core/process/reconstruction/saaxis/saaxis.py +233 -263
  92. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +140 -86
  93. tomwer/core/process/reconstruction/scores/params.py +4 -1
  94. tomwer/core/process/reconstruction/scores/scores.py +13 -0
  95. tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
  96. tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
  97. tomwer/core/process/reconstruction/test/test_darkref_copy.py +3 -3
  98. tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
  99. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
  100. tomwer/core/process/stitching/nabustitcher.py +2 -2
  101. tomwer/core/process/test/test_axis.py +6 -6
  102. tomwer/core/process/test/test_dark_and_flat.py +10 -7
  103. tomwer/core/process/test/test_data_transfer.py +7 -6
  104. tomwer/core/process/test/test_nabu.py +4 -4
  105. tomwer/core/process/test/test_normalization.py +2 -2
  106. tomwer/core/scan/edfscan.py +4 -1
  107. tomwer/core/scan/hdf5scan.py +19 -500
  108. tomwer/core/scan/nxtomoscan.py +532 -0
  109. tomwer/core/scan/scanbase.py +42 -20
  110. tomwer/core/scan/scanfactory.py +13 -13
  111. tomwer/core/scan/test/test_future_scan.py +2 -2
  112. tomwer/core/scan/test/test_h5.py +12 -10
  113. tomwer/core/scan/test/test_process_registration.py +2 -2
  114. tomwer/core/scan/test/test_scan.py +4 -3
  115. tomwer/core/settings.py +20 -0
  116. tomwer/core/test/test_scanutils.py +8 -7
  117. tomwer/core/test/test_utils.py +33 -26
  118. tomwer/core/utils/__init__.py +0 -466
  119. tomwer/core/utils/deprecation.py +1 -1
  120. tomwer/core/utils/dictutils.py +14 -0
  121. tomwer/core/utils/lbsram.py +35 -0
  122. tomwer/core/utils/nxtomoutils.py +1 -1
  123. tomwer/core/utils/scanutils.py +6 -6
  124. tomwer/core/utils/spec.py +263 -0
  125. tomwer/core/volume/volumefactory.py +2 -2
  126. tomwer/gui/cluster/slurm.py +260 -60
  127. tomwer/gui/cluster/test/test_cluster.py +13 -0
  128. tomwer/gui/cluster/test/test_supervisor.py +2 -2
  129. tomwer/gui/configuration/__init__.py +0 -0
  130. tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
  131. tomwer/gui/configuration/level.py +22 -0
  132. tomwer/gui/control/actions.py +54 -0
  133. tomwer/gui/control/datalist.py +78 -16
  134. tomwer/gui/control/datalistener.py +4 -16
  135. tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
  136. tomwer/gui/control/history.py +2 -2
  137. tomwer/gui/control/observations.py +2 -2
  138. tomwer/gui/control/reducedarkflatselector.py +1 -1
  139. tomwer/gui/control/selectorwidgetbase.py +36 -9
  140. tomwer/gui/control/serie/seriecreator.py +5 -22
  141. tomwer/gui/control/test/test_email.py +1 -1
  142. tomwer/gui/control/test/test_scanvalidator.py +6 -5
  143. tomwer/gui/control/test/test_single_tomo_obj.py +2 -2
  144. tomwer/gui/control/tomoobjdisplaymode.py +8 -0
  145. tomwer/gui/debugtools/datasetgenerator.py +3 -3
  146. tomwer/gui/edit/dkrfpatch.py +16 -22
  147. tomwer/gui/edit/imagekeyeditor.py +8 -11
  148. tomwer/gui/edit/nxtomoeditor.py +111 -44
  149. tomwer/gui/edit/nxtomowarmer.py +4 -4
  150. tomwer/gui/edit/test/test_dkrf_patch.py +7 -7
  151. tomwer/gui/edit/test/test_image_key_editor.py +3 -3
  152. tomwer/gui/edit/test/test_nx_editor.py +40 -16
  153. tomwer/gui/icat/__init__.py +0 -0
  154. tomwer/gui/icat/createscreenshots.py +80 -0
  155. tomwer/gui/icat/gallery.py +214 -0
  156. tomwer/gui/icat/publish.py +187 -0
  157. tomwer/gui/reconstruction/axis/axis.py +171 -57
  158. tomwer/gui/reconstruction/axis/radioaxis.py +80 -95
  159. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
  160. tomwer/gui/reconstruction/lamino/tofu/projections.py +1 -1
  161. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +3 -6
  162. tomwer/gui/reconstruction/nabu/castvolume.py +1 -1
  163. tomwer/gui/reconstruction/nabu/check.py +9 -9
  164. tomwer/gui/reconstruction/nabu/helical.py +29 -12
  165. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
  166. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +110 -33
  167. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +9 -12
  168. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +219 -29
  169. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +3 -6
  170. tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
  171. tomwer/gui/reconstruction/nabu/slices.py +6 -7
  172. tomwer/gui/reconstruction/nabu/volume.py +22 -10
  173. tomwer/gui/reconstruction/normalization/intensity.py +15 -23
  174. tomwer/gui/reconstruction/saaxis/corrangeselector.py +7 -23
  175. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
  176. tomwer/gui/reconstruction/saaxis/saaxis.py +7 -9
  177. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +2 -1
  178. tomwer/gui/reconstruction/scores/control.py +2 -9
  179. tomwer/gui/reconstruction/scores/scoreplot.py +11 -5
  180. tomwer/gui/reconstruction/test/test_axis.py +23 -12
  181. tomwer/gui/reconstruction/test/test_lamino.py +8 -3
  182. tomwer/gui/reconstruction/test/test_nabu.py +28 -9
  183. tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
  184. tomwer/gui/reconstruction/test/test_sadeltabeta.py +2 -2
  185. tomwer/gui/settings.py +5 -28
  186. tomwer/gui/stackplot.py +2 -5
  187. tomwer/gui/stitching/action.py +49 -0
  188. tomwer/gui/stitching/config/axisparams.py +7 -24
  189. tomwer/gui/stitching/config/output.py +10 -8
  190. tomwer/gui/stitching/config/positionoveraxis.py +22 -23
  191. tomwer/gui/stitching/normalization.py +117 -0
  192. tomwer/gui/stitching/stitchandbackground.py +4 -6
  193. tomwer/gui/stitching/stitching.py +265 -43
  194. tomwer/gui/stitching/stitching_preview.py +62 -5
  195. tomwer/gui/stitching/stitching_raw.py +2 -5
  196. tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
  197. tomwer/gui/utils/buttons.py +112 -29
  198. tomwer/gui/utils/inputwidget.py +33 -25
  199. tomwer/gui/utils/scandescription.py +4 -0
  200. tomwer/gui/utils/step.py +144 -0
  201. tomwer/gui/utils/unitsystem.py +2 -5
  202. tomwer/gui/utils/vignettes.py +176 -15
  203. tomwer/gui/visualization/dataviewer.py +1 -18
  204. tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
  205. tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
  206. tomwer/gui/visualization/scanoverview.py +1 -1
  207. tomwer/gui/visualization/sinogramviewer.py +1 -10
  208. tomwer/gui/visualization/test/test_diffviewer.py +3 -3
  209. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
  210. tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
  211. tomwer/gui/visualization/test/test_stacks.py +3 -3
  212. tomwer/gui/visualization/test/test_volumeviewer.py +2 -2
  213. tomwer/io/utils/raw_and_processed_data.py +84 -0
  214. tomwer/io/utils/tomoobj.py +4 -6
  215. tomwer/resources/gui/icons/ruler.png +0 -0
  216. tomwer/resources/gui/icons/ruler.svg +273 -0
  217. tomwer/resources/gui/icons/short_description.png +0 -0
  218. tomwer/resources/gui/icons/short_description.svg +58 -0
  219. tomwer/resources/gui/icons/url.png +0 -0
  220. tomwer/resources/gui/icons/url.svg +58 -0
  221. tomwer/synctools/stacks/edit/darkflatpatch.py +2 -2
  222. tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
  223. tomwer/synctools/stacks/reconstruction/axis.py +4 -4
  224. tomwer/synctools/stacks/reconstruction/castvolume.py +2 -2
  225. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -10
  226. tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
  227. tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
  228. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
  229. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
  230. tomwer/synctools/test/test_darkRefs.py +7 -58
  231. tomwer/synctools/test/test_foldertransfer.py +6 -6
  232. tomwer/synctools/utils/scanstages.py +6 -6
  233. tomwer/tests/conftest.py +34 -0
  234. tomwer/tests/datasets.py +13 -0
  235. tomwer/tests/test_scripts.py +92 -39
  236. tomwer/tests/utils.py +5 -0
  237. tomwer/version.py +3 -3
  238. {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/METADATA +39 -44
  239. {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/RECORD +248 -209
  240. tomwer/resources/gui/icons/esrf_1.svg +0 -307
  241. tomwer/resources/gui/icons/triangle.svg +0 -80
  242. tomwer/synctools/test/test_scanstages.py +0 -162
  243. tomwer/tests/utils/__init__.py +0 -247
  244. tomwer/tests/utils/utilstest.py +0 -220
  245. /tomwer/app/{saaxis.py → multicor.py} +0 -0
  246. /tomwer/app/{sadeltabeta.py → multipag.py} +0 -0
  247. /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
  248. /tomwer-1.2.8-py3.11-nspkg.pth → /tomwer-1.3.0a0-py3.11-nspkg.pth +0 -0
  249. {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/LICENSE +0 -0
  250. {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/WHEEL +0 -0
  251. {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/entry_points.txt +0 -0
  252. {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/namespace_packages.txt +0 -0
  253. {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/top_level.txt +0 -0
@@ -36,7 +36,7 @@ from silx.gui.utils import blockSignals
36
36
 
37
37
  from tomwer.core.scan.scanbase import TomwerScanBase
38
38
  from tomwer.core.settings import get_lbsram_path, isOnLbsram
39
- from tomwer.core.utils import isLowOnMemory
39
+ from tomwer.core.utils.lbsram import is_low_on_memory
40
40
  from tomwer.core.process.reconstruction.nabu.nabuslices import NabuSlicesTask
41
41
  from tomwer.core.process.reconstruction.nabu.nabuvolume import NabuVolumeTask
42
42
 
@@ -66,7 +66,7 @@ class NabuSliceProcessStack(FIFO, qt.QObject):
66
66
  assert isinstance(data, TomwerScanBase)
67
67
  self._computationThread.finished.connect(self._end_threaded_computation)
68
68
 
69
- if isOnLbsram(data) and isLowOnMemory(get_lbsram_path()) is True:
69
+ if isOnLbsram(data) and is_low_on_memory(get_lbsram_path()) is True:
70
70
  # if computer is running into low memory on lbsram skip it
71
71
  mess = f"low memory, skip nabu reconstruction for {data.path}"
72
72
  _logger.processSkipped(mess)
@@ -37,7 +37,7 @@ from silx.gui import qt
37
37
  from tomwer.core.process.reconstruction.normalization import SinoNormalizationTask
38
38
  from tomwer.core.scan.scanbase import TomwerScanBase
39
39
  from tomwer.core.settings import get_lbsram_path, isOnLbsram
40
- from tomwer.core.utils import isLowOnMemory
40
+ from tomwer.core.utils.lbsram import is_low_on_memory
41
41
 
42
42
  from ..processingstack import FIFO, ProcessingThread
43
43
 
@@ -60,7 +60,7 @@ class INormalizationProcessStack(FIFO, qt.QObject):
60
60
  )
61
61
  _logger.processStarted(f"start intensity normalization {data}")
62
62
  assert isinstance(data, TomwerScanBase)
63
- if isOnLbsram(data) and isLowOnMemory(get_lbsram_path()) is True:
63
+ if isOnLbsram(data) and is_low_on_memory(get_lbsram_path()) is True:
64
64
  # if computer is running into low memory on lbsram skip it
65
65
  mess = "low memory, skip intensity normalization", data.path
66
66
  ProcessManager().notify_dataset_state(
@@ -37,7 +37,7 @@ from silx.gui import qt
37
37
  from tomwer.core.process.reconstruction.saaxis import SAAxisTask
38
38
  from tomwer.core.scan.scanbase import TomwerScanBase
39
39
  from tomwer.core.settings import get_lbsram_path, isOnLbsram
40
- from tomwer.core.utils import isLowOnMemory
40
+ from tomwer.core.utils.lbsram import is_low_on_memory
41
41
  from tomwer.synctools.axis import QAxisRP
42
42
  from tomwer.synctools.saaxis import QSAAxisParams
43
43
 
@@ -78,7 +78,7 @@ class SAAxisProcessStack(FIFO, qt.QObject):
78
78
  self._data_currently_computed = data
79
79
  saaxis_params = QSAAxisParams.from_dict(configuration)
80
80
  saaxis_params.frame_width = data.dim_1
81
- if isOnLbsram(data) and isLowOnMemory(get_lbsram_path()) is True:
81
+ if isOnLbsram(data) and is_low_on_memory(get_lbsram_path()) is True:
82
82
  # if computer is running into low memory on lbsram skip it
83
83
  mess = f"low memory, skip saaxis calculation {data.path}"
84
84
  ProcessManager().notify_dataset_state(
@@ -39,7 +39,7 @@ from tomwer.core.process.reconstruction.sadeltabeta.sadeltabeta import (
39
39
  )
40
40
  from tomwer.core.scan.scanbase import TomwerScanBase
41
41
  from tomwer.core.settings import get_lbsram_path, isOnLbsram
42
- from tomwer.core.utils import isLowOnMemory
42
+ from tomwer.core.utils.lbsram import is_low_on_memory
43
43
  from tomwer.synctools.axis import QAxisRP
44
44
  from tomwer.synctools.sadeltabeta import QSADeltaBetaParams
45
45
 
@@ -79,7 +79,7 @@ class SADeltaBetaProcessStack(FIFO, qt.QObject):
79
79
  data.sa_delta_beta_params = QSADeltaBetaParams()
80
80
  self._data_currently_computed = data
81
81
  sa_delta_beta_params = QSADeltaBetaParams.from_dict(configuration)
82
- if isOnLbsram(data) and isLowOnMemory(get_lbsram_path()) is True:
82
+ if isOnLbsram(data) and is_low_on_memory(get_lbsram_path()) is True:
83
83
  # if computer is running into low memory on lbsram skip it
84
84
  mess = f"low memory, skip sa-delta-beta-axis calculation {data.path}"
85
85
  ProcessManager().notify_dataset_state(
@@ -38,9 +38,8 @@ from silx.gui.utils.testutils import TestCaseQt
38
38
 
39
39
  from tomwer.core.process.reconstruction.darkref.darkrefs import DarkRefsTask
40
40
  from tomwer.core.process.reconstruction.darkref.params import DKRFRP, ReduceMethod
41
- from tomwer.core.scan.scanfactory import ScanFactory
42
41
  from tomwer.core.utils.scanutils import MockEDF
43
- from tomwer.tests.utils import UtilsTest
42
+ from tomwer.tests.datasets import TomwerCIDatasets
44
43
 
45
44
 
46
45
  class TestDarkRefsBehavior(TestCaseQt):
@@ -58,7 +57,9 @@ class TestDarkRefsBehavior(TestCaseQt):
58
57
  """number of theoretical dark file the algorithm should create"""
59
58
  self.dataset_folder = os.path.join(self.tmpDir, self.datasetsID)
60
59
 
61
- dataDir = UtilsTest.getEDFDataset(self.datasetsID)
60
+ dataDir = TomwerCIDatasets.get_dataset(
61
+ f"edf_datasets/{self.datasetsID}",
62
+ )
62
63
  shutil.copytree(dataDir, self.dataset_folder)
63
64
  files = os.listdir(self.dataset_folder)
64
65
  for _f in files:
@@ -380,7 +381,9 @@ class TestDarkAccumulation(TestCaseQt):
380
381
  def setUp(self):
381
382
  super().setUp()
382
383
  self.dataset = "bone8_1_"
383
- dataDir = UtilsTest.getEDFDataset(self.dataset)
384
+ dataDir = TomwerCIDatasets.get_dataset(
385
+ f"edf_datasets/{self.dataset}",
386
+ )
384
387
  self.outputdir = tempfile.mkdtemp()
385
388
  shutil.copytree(src=dataDir, dst=os.path.join(self.outputdir, self.dataset))
386
389
  self.darkFile = os.path.join(self.outputdir, self.dataset, "dark.edf")
@@ -418,57 +421,3 @@ class TestDarkAccumulation(TestCaseQt):
418
421
  with fabio.open(self.darkFile) as dsc:
419
422
  self.computed_dark = dsc.data
420
423
  self.assertTrue(numpy.array_equal(self.computed_dark, self.dark_reference))
421
-
422
-
423
- class TestPCOTomo(TestCaseQt):
424
- """Test processing of DKRF are correct"""
425
-
426
- def setUp(self):
427
- TestCaseQt.setUp(self)
428
- self.tmp_dir = tempfile.mkdtemp()
429
- MockEDF.fastMockAcquisition(self.tmp_dir)
430
-
431
- self.recons_params = DKRFRP()
432
- self.recons_params.flat_calc_method = ReduceMethod.NONE
433
- self.recons_params.dark_calc_method = ReduceMethod.NONE
434
- self.recons_params.dark_pattern = ".*_dark_.*"
435
- self.recons_params.flat_pattern = ".*_ref_.*"
436
- self.recons_params._set_remove_opt(True)
437
-
438
- def copyDataset(self, dataset):
439
- folder = os.path.join(self.tmp_dir, dataset)
440
- shutil.copytree(os.path.join(UtilsTest.getEDFDataset(dataset)), folder)
441
- self.scan = ScanFactory.create_scan_object(scan_path=folder)
442
-
443
- def tearDown(self):
444
- shutil.rmtree(self.tmp_dir)
445
-
446
- def testDark2x2Scan(self):
447
- self.dataset = "pcotomo_2x2scan_refdarkbeg_end_conti"
448
- self.copyDataset(self.dataset)
449
- self.recons_params.dark_calc_method = ReduceMethod.MEDIAN
450
- dar_ref_process = DarkRefsTask(
451
- inputs={
452
- "dark_ref_params": self.recons_params,
453
- "data": self.scan,
454
- "darkhst_prefix": "darkHST",
455
- "force_sync": True,
456
- "serialize_output_data": False,
457
- }
458
- )
459
- dar_ref_process.run()
460
-
461
- def testRef2x2Scan(self):
462
- self.dataset = "pcotomo_2x2scan_refdarkbeg_end_conti"
463
- self.copyDataset(self.dataset)
464
- self.recons_params.flat_calc_method = ReduceMethod.MEDIAN
465
- dar_ref_process = DarkRefsTask(
466
- inputs={
467
- "dark_ref_params": self.recons_params,
468
- "data": self.scan,
469
- "darkhst_prefix": "darkHST",
470
- "force_sync": True,
471
- "serialize_output_data": False,
472
- }
473
- )
474
- dar_ref_process.run()
@@ -40,12 +40,12 @@ from nxtomomill.converter import from_h5_to_nx
40
40
  from nxtomomill.io.config.hdf5config import TomoHDF5Config
41
41
  from silx.gui.utils.testutils import TestCaseQt
42
42
 
43
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
43
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
44
44
  from tomwer.core.scan.scanfactory import ScanFactory
45
- from tomwer.core.utils import rebaseParFile
45
+ from tomwer.core.utils.spec import rebaseParFile
46
46
  from tomwer.core.utils.scanutils import MockEDF
47
47
  from tomwer.synctools.datatransfert import ScanTransfer
48
- from tomwer.tests.utils import UtilsTest
48
+ from tomwer.tests.datasets import TomwerCIDatasets
49
49
 
50
50
  try:
51
51
  from tomwer.synctools.rsyncmanager import RSyncManager
@@ -239,7 +239,7 @@ class TestHDFDataTransfert(TestCaseQt):
239
239
  self.input_dir = tempfile.mkdtemp()
240
240
  self.output_dir = tempfile.mkdtemp()
241
241
  shutil.copytree(
242
- UtilsTest.getBlissDataset(folderID="sample"),
242
+ TomwerCIDatasets.get_dataset("bliss/sample"),
243
243
  os.path.join(self.input_dir, "sample"),
244
244
  )
245
245
 
@@ -272,7 +272,7 @@ class TestHDFDataTransfert(TestCaseQt):
272
272
  output_file_path, entry = results[0]
273
273
  assert os.path.exists(output_file_path)
274
274
  assert os.path.isfile(output_file_path)
275
- self.scan = HDF5TomoScan(scan=output_file_path, entry=entry)
275
+ self.scan = NXtomoScan(scan=output_file_path, entry=entry)
276
276
 
277
277
  # register information regarding origin of the file
278
278
  from tomwer.core.process.control.datalistener import DataListener
@@ -333,7 +333,7 @@ class TestPreTransfert(unittest.TestCase):
333
333
 
334
334
  def setUp(self):
335
335
  unittest.TestCase.setUp(self)
336
- folderDataset = UtilsTest.getEDFDataset("scan_3_")
336
+ folderDataset = TomwerCIDatasets.get_dataset("edf_datasets/scan_3_")
337
337
  self.tmpdir = tempfile.mkdtemp()
338
338
  self.outputfolder = tempfile.mkdtemp()
339
339
  scan_path = os.path.join(self.tmpdir, "scan_3_")
@@ -38,7 +38,7 @@ from silx.io.url import DataUrl
38
38
  from silx.utils.enum import Enum as _Enum
39
39
 
40
40
  from tomwer.core.scan.edfscan import EDFTomoScan
41
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
41
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
42
42
  from tomwer.core.scan.scanbase import TomwerScanBase
43
43
  from tomwer.synctools.rsyncmanager import RSyncManager
44
44
 
@@ -117,7 +117,7 @@ class ScanStages:
117
117
  RSyncManager().sync_file(
118
118
  source=info_file, target=file_info_dest, wait=True
119
119
  )
120
- elif isinstance(self.scan, HDF5TomoScan):
120
+ elif isinstance(self.scan, NXtomoScan):
121
121
  raise NotImplementedError()
122
122
  elif stage is ScanStages.AcquisitionStage.ACQUI_ON_GOING:
123
123
  # copy half of the acquisition file
@@ -129,7 +129,7 @@ class ScanStages:
129
129
  n_url -= 1
130
130
  self._copy_url_file(url=urls[keys[n_url]], dest_dir=dest_dir)
131
131
 
132
- elif isinstance(self.scan, HDF5TomoScan):
132
+ elif isinstance(self.scan, NXtomoScan):
133
133
  raise NotImplementedError()
134
134
  elif stage is ScanStages.AcquisitionStage.ACQUI_ENDED:
135
135
  if isinstance(self.scan, EDFTomoScan):
@@ -142,7 +142,7 @@ class ScanStages:
142
142
  )
143
143
  xml_dest = os.path.join(dest_dir, os.path.basename(xml_file))
144
144
  RSyncManager().sync_file(source=xml_file, target=xml_dest, wait=True)
145
- elif isinstance(self.scan, HDF5TomoScan):
145
+ elif isinstance(self.scan, NXtomoScan):
146
146
  raise NotImplementedError()
147
147
  elif stage is ScanStages.AcquisitionStage.RECONSTRUCTION_ADDED:
148
148
  # copy reconstruction
@@ -188,14 +188,14 @@ class ScanStages:
188
188
  RSyncManager().sync_file(
189
189
  source=_xml_file, target=xml_dest, wait=True
190
190
  )
191
- elif isinstance(self.scan, HDF5TomoScan):
191
+ elif isinstance(self.scan, NXtomoScan):
192
192
  raise NotImplementedError()
193
193
  elif stage is ScanStages.AcquisitionStage.COMPLETE:
194
194
  if isinstance(self.scan, EDFTomoScan):
195
195
  for file_ in os.listdir(self.scan.path):
196
196
  file_fp = os.path.join(self.scan.path, file_)
197
197
  RSyncManager().sync_file(source=file_fp, target=dest_dir, wait=True)
198
- elif isinstance(self.scan, HDF5TomoScan):
198
+ elif isinstance(self.scan, NXtomoScan):
199
199
  raise NotImplementedError()
200
200
  else:
201
201
  raise ValueError("given stage is not recognized", stage)
tomwer/tests/conftest.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import gc
2
+ import os
2
3
  import logging
3
4
 
4
5
  import pytest
@@ -49,3 +50,36 @@ def warn_qtwidgets_alive():
49
50
  len(widgets),
50
51
  "\n ".join(map(str, widgets)),
51
52
  )
53
+
54
+
55
+ @pytest.fixture(scope="function")
56
+ def nxtomo_scan_180(tmp_path):
57
+ test_path = tmp_path / "test"
58
+ test_path.mkdir()
59
+ yield create_default_scan(
60
+ scan_path=os.path.join(test_path, "scan_180"),
61
+ scan_range=180,
62
+ )
63
+
64
+
65
+ @pytest.fixture(scope="function")
66
+ def nxtomo_scan_360(tmp_path):
67
+ test_path = tmp_path / "test"
68
+ test_path.mkdir()
69
+ yield create_default_scan(
70
+ scan_path=os.path.join(test_path, "scan_360"),
71
+ scan_range=360,
72
+ )
73
+
74
+
75
+ def create_default_scan(scan_path: str, scan_range: int):
76
+ from tomwer.core.utils.scanutils import MockNXtomo
77
+
78
+ return MockNXtomo(
79
+ scan_path=scan_path,
80
+ n_proj=10,
81
+ n_ini_proj=10,
82
+ scan_range=scan_range,
83
+ dim=20,
84
+ energy=12.3,
85
+ ).scan
@@ -0,0 +1,13 @@
1
+ import os
2
+ from tomoscan.test.datasets import GitlabProject
3
+
4
+ TomwerCIDatasets = GitlabProject(
5
+ branch_name="tomwer",
6
+ host="https://gitlab.esrf.fr",
7
+ cache_dir=os.path.join(
8
+ os.path.dirname(__file__),
9
+ "__archive__",
10
+ ),
11
+ token=None,
12
+ project_id=4299, # https://gitlab.esrf.fr/tomotools/ci_datasets
13
+ )
@@ -1,44 +1,10 @@
1
- # coding: utf-8
2
- # /*##########################################################################
3
- # Copyright (C) 2016 European Synchrotron Radiation Facility
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
- #
23
- #############################################################################*/
24
-
25
-
26
- from __future__ import absolute_import, division, print_function
27
-
28
1
  """Test suite to scripts"""
29
2
 
30
- __authors__ = ["V.Valls", "H.Payno"]
31
- __license__ = "MIT"
32
- __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
33
- __date__ = "21/02/2018"
34
-
35
-
36
3
  import logging
37
4
  import subprocess
38
5
  import sys
39
6
  import unittest
40
-
41
- from tomwer.tests.utils.utilstest import UtilsTest
7
+ import os
42
8
 
43
9
  _logger = logging.getLogger(__name__)
44
10
 
@@ -77,8 +43,9 @@ class TestScriptsHelp(unittest.TestCase):
77
43
  self.assertEqual(p.returncode, 0)
78
44
 
79
45
  def executeAppHelp(self, script_name, module_name):
80
- script = UtilsTest.script_path(script_name, module_name)
81
- env = UtilsTest.get_test_env()
46
+ test_script = ScriptTest()
47
+ script = test_script.script_path(script_name, module_name)
48
+ env = test_script.get_test_env()
82
49
  if script.endswith(".exe"):
83
50
  command_line = [script]
84
51
  else:
@@ -89,23 +56,109 @@ class TestScriptsHelp(unittest.TestCase):
89
56
  def testAxis(self):
90
57
  self.executeAppHelp("axis", "tomwer.app.axis")
91
58
 
59
+ def testCanvas(self):
60
+ self.executeAppHelp("axis", "tomwer.app.canvas")
61
+
92
62
  def testDarkRef(self):
93
63
  self.executeAppHelp("darkref", "tomwer.app.darkref")
94
64
 
65
+ def testDarkRefPath(self):
66
+ self.executeAppHelp("darkrefpatch", "tomwer.app.darkrefpatch")
67
+
68
+ def testDiffFrame(self):
69
+ self.executeAppHelp("diffFrame", "tomwer.app.diffframe")
70
+
71
+ def testImageKeyEditor(self):
72
+ self.executeAppHelp("image-key-editor", "tomwer.app.imagekeyeditor")
73
+
74
+ def testImageKeyUpgrader(self):
75
+ self.executeAppHelp("image-key-upgrader", "tomwer.app.imagekeyupgrader")
76
+
77
+ def testIntensityNormalization(self):
78
+ self.executeAppHelp(
79
+ "intensity-normalization", "tomwer.app.intensitynormalization"
80
+ )
81
+
95
82
  def testLamino(self):
96
83
  self.executeAppHelp("lamino", "tomwer.app.lamino")
97
84
 
85
+ def testMulticor(self):
86
+ self.executeAppHelp("multicor", "tomwer.app.multicor")
87
+
88
+ def testMultiPag(self):
89
+ self.executeAppHelp("multipag", "tomwer.app.multipag")
90
+
98
91
  def testNabu(self):
99
92
  self.executeAppHelp("nabu", "tomwer.app.nabuapp")
100
93
 
94
+ def testNxTomoEditor(self):
95
+ self.executeAppHelp("nxtomo-editor", "tomwer.app.nxtomoeditor")
96
+
97
+ def testPatchRawDarkflat(self):
98
+ self.executeAppHelp("patch-raw-dark-flat", "tomwer.app.patchrawdarkflat")
99
+
101
100
  def testRadioStack(self):
102
101
  self.executeAppHelp("radiostack", "tomwer.app.radiostack")
103
102
 
103
+ def testReduceDarkFlat(self):
104
+ self.executeAppHelp("reduce-dark-flat", "tomwer.app.reducedarkflat")
105
+
106
+ def testRSync(self):
107
+ self.executeAppHelp("rsync", "tomwer.app.rsync")
108
+
104
109
  def testSampleMoved(self):
105
110
  self.executeAppHelp("samplemoved", "tomwer.app.samplemoved")
106
111
 
112
+ def testScanviewer(self):
113
+ self.executeAppHelp("scanviewer", "tomwer.app.scanviewer")
114
+
115
+ def testSinogramViewer(self):
116
+ self.executeAppHelp("sinogramviewer", "tomwer.app.sinogramviewer")
117
+
107
118
  def testSliceStack(self):
108
119
  self.executeAppHelp("slicestack", "tomwer.app.slicestack")
109
120
 
110
- def testRSync(self):
111
- self.executeAppHelp("rsync", "tomwer.app.rsync")
121
+ def testStopDataListener(self):
122
+ self.executeAppHelp("stop-data-listener", "tomwer.app.stopdatalistener")
123
+
124
+ def testZStitching(self):
125
+ self.executeAppHelp("zstitching", "tomwer.app.zstitching")
126
+
127
+
128
+ class ScriptTest:
129
+ """
130
+ Class providing useful stuff for preparing script tests.
131
+ """
132
+
133
+ def get_test_env(self):
134
+ """
135
+ Returns an associated environment with a working project.
136
+ """
137
+ env = dict((str(k), str(v)) for k, v in os.environ.items())
138
+ env["PYTHONPATH"] = os.pathsep.join(sys.path)
139
+ return env
140
+
141
+ def script_path(self, script_name, module_name):
142
+ """Returns the script path according to it's location"""
143
+ import importlib
144
+
145
+ module = importlib.import_module(module_name)
146
+ script = module.__file__
147
+ return script
148
+
149
+ def get_installed_script_path(self, script):
150
+ """
151
+ Returns the path of the executable and the associated environment
152
+
153
+ In Windows, it checks availability of script using .py .bat, and .exe
154
+ file extensions.
155
+ """
156
+ paths = os.environ.get("PATH", "").split(os.pathsep)
157
+ for base in paths:
158
+ # clean up extra quotes from paths
159
+ if base.startswith('"') and base.endswith('"'):
160
+ base = base[1:-1]
161
+ # script not found
162
+ _logger.warning("Script '%s' not found in paths: %s", script, ":".join(paths))
163
+ script_path = script
164
+ return script_path
tomwer/tests/utils.py ADDED
@@ -0,0 +1,5 @@
1
+ import os
2
+
3
+
4
+ def skip_gui_test():
5
+ return os.environ.get("_TOMWER_NO_GUI_UNIT_TESTS", "False") == "True"
tomwer/version.py CHANGED
@@ -76,9 +76,9 @@ RELEASE_LEVEL_VALUE = {
76
76
  }
77
77
 
78
78
  MAJOR = 1
79
- MINOR = 2
80
- MICRO = 8
81
- RELEV = "final" # <16
79
+ MINOR = 3
80
+ MICRO = 0
81
+ RELEV = "alpha" # <16
82
82
  SERIAL = 0 # <16
83
83
 
84
84
  date = __date__