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
@@ -1,182 +1,182 @@
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__ = "16/11/2020"
29
-
30
-
31
- import logging
32
-
33
- from orangewidget import gui
34
- from orangewidget.settings import Setting
35
- from orangewidget.widget import Input, Output
36
- from processview.core.manager import DatasetState, ProcessManager
37
- from silx.gui import qt
38
-
39
- import tomwer.core.process.control.volumesymlink
40
- from orangecontrib.tomwer.orange.managedprocess import SuperviseOW
41
- from tomwer.core.process.control.volumesymlink import (
42
- OutputType,
43
- VolumeSymbolicLinkTask,
44
- )
45
- from tomwer.core.scan.scanbase import TomwerScanBase
46
-
47
- _logger = logging.getLogger(__name__)
48
-
49
-
50
- class VolumeSymLinkOW(SuperviseOW):
51
- """
52
- link volume reconstructed at proposal file if possible else under
53
- the given folder
54
- """
55
-
56
- name = "volume symbolic link"
57
- id = "orange.widgets.tomwer.control.VolumeSymLinkOW.VolumeSymLinkOW"
58
- description = (
59
- "create a symbolic link for the latest volume reconstructed on a "
60
- "given folder"
61
- )
62
- icon = "icons/volumesymlink.svg"
63
- priority = 200
64
- keywords = [
65
- "hdf5",
66
- "tomwer",
67
- "folder",
68
- "volume",
69
- "symlink",
70
- "tomography",
71
- "symbolic link",
72
- ]
73
-
74
- want_main_area = True
75
- resizing_enabled = True
76
-
77
- ewokstaskclass = tomwer.core.process.control.volumesymlink.VolumeSymbolicLinkTask
78
-
79
- _scans = Setting(list())
80
-
81
- class Inputs:
82
- data = Input(name="data", type=TomwerScanBase, doc="scan to be process")
83
-
84
- class Outputs:
85
- data = Output(name="data", type=TomwerScanBase, doc="one scan to be process")
86
-
87
- def __init__(self, parent=None):
88
- super().__init__(parent)
89
- self._mainWidget = _OutputDir(parent=self)
90
- layout = gui.vBox(self.mainArea, self.name).layout()
91
- layout.addWidget(self._mainWidget)
92
-
93
- @Inputs.data
94
- def process(self, scan):
95
- if scan is None:
96
- return
97
- symlink_process = VolumeSymbolicLinkTask(
98
- inputs={
99
- "data": scan,
100
- "output_type": self._mainWidget.getOutputType(),
101
- "output_folder": self._mainWidget.getOutputFolder(),
102
- "serialize_output_data": False,
103
- }
104
- )
105
- ProcessManager().notify_dataset_state(
106
- dataset=self.scan,
107
- process=self,
108
- state=DatasetState.ON_GOING,
109
- )
110
- try:
111
- symlink_process.run()
112
- except Exception:
113
- mess = f"Failed to create symbolic link for {scan}"
114
- _logger.processFailed(mess)
115
- ProcessManager().notify_dataset_state(
116
- dataset=self.scan, process=self, state=DatasetState.FAILED, details=mess
117
- )
118
- else:
119
- mess = f"Create symbolic link for {scan}"
120
- _logger.processSucceed(mess)
121
- ProcessManager().notify_dataset_state(
122
- dataset=self.scan,
123
- process=self,
124
- state=DatasetState.SUCCEED,
125
- details=mess,
126
- )
127
- self.Outputs.data.send(scan)
128
-
129
- def reprocess(self, dataset):
130
- self.process(dataset)
131
-
132
-
133
- class _OutputDir(qt.QGroupBox):
134
- def __init__(self, parent):
135
- qt.QGroupBox.__init__(self, parent)
136
- self._button_grp = qt.QButtonGroup(self)
137
- self._button_grp.setExclusive(True)
138
- self.setLayout(qt.QGridLayout())
139
- self._oneLevelCB = qt.QRadioButton(OutputType.ONE_LEVEL_UPPER.value, self)
140
- self._button_grp.addButton(self._oneLevelCB)
141
- self.layout().addWidget(self._oneLevelCB, 1, 0, 1, 3)
142
- self._staticOpt = qt.QRadioButton("", self)
143
- self._button_grp.addButton(self._staticOpt)
144
- self.layout().addWidget(self._staticOpt, 2, 0, 1, 1)
145
- self._qleFolder = qt.QLineEdit("", self)
146
- self.layout().addWidget(self._qleFolder, 2, 1, 1, 1)
147
- self._selectPB = qt.QPushButton("select", self)
148
- self.layout().addWidget(self._selectPB, 2, 2, 1, 1)
149
-
150
- # connect signal / slot
151
- self._selectPB.released.connect(self._selectFolder)
152
- self._qleFolder.editingFinished.connect(self._activeStaticOpt)
153
-
154
- # set up
155
- self._oneLevelCB.setChecked(True)
156
-
157
- def _activeStaticOpt(self, *args, **kwargs):
158
- self._staticOpt.setChecked(True)
159
-
160
- def _selectFolder(self): # pragma: no cover
161
- dialog = qt.QFileDialog(self)
162
- dialog.setWindowTitle("Select destination folder for symbolic link")
163
- dialog.setModal(1)
164
- dialog.setFileMode(qt.QFileDialog.DirectoryOnly)
165
-
166
- if not dialog.exec_():
167
- dialog.close()
168
- return None
169
-
170
- dest_folder = dialog.selectedFiles()[0]
171
- self._qleFolder.setText(dest_folder)
172
-
173
- def getOutputType(self) -> OutputType:
174
- if self._oneLevelCB.isChecked():
175
- return OutputType.ONE_LEVEL_UPPER
176
- elif self._staticOpt.isChecked():
177
- return OutputType.STATIC
178
- else:
179
- raise TypeError("Not managed")
180
-
181
- def getOutputFolder(self):
182
- return self._qleFolder.text()
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__ = "16/11/2020"
29
+
30
+
31
+ # import logging
32
+
33
+ # from orangewidget import gui
34
+ # from orangewidget.settings import Setting
35
+ # from orangewidget.widget import Input, Output
36
+ # from processview.core.manager import DatasetState, ProcessManager
37
+ # from silx.gui import qt
38
+
39
+ # import tomwer.core.process.control.volumesymlink
40
+ # from orangecontrib.tomwer.orange.managedprocess import SuperviseOW
41
+ # from tomwer.core.process.control.volumesymlink import (
42
+ # OutputType,
43
+ # VolumeSymbolicLinkTask,
44
+ # )
45
+ # from tomwer.core.scan.scanbase import TomwerScanBase
46
+
47
+ # _logger = logging.getLogger(__name__)
48
+
49
+
50
+ # class VolumeSymLinkOW(SuperviseOW):
51
+ # """
52
+ # link volume reconstructed at proposal file if possible else under
53
+ # the given folder
54
+ # """
55
+
56
+ # name = "volume symbolic link"
57
+ # id = "orange.widgets.tomwer.control.VolumeSymLinkOW.VolumeSymLinkOW"
58
+ # description = (
59
+ # "create a symbolic link for the latest volume reconstructed on a "
60
+ # "given folder"
61
+ # )
62
+ # icon = "icons/volumesymlink.svg"
63
+ # priority = 200
64
+ # keywords = [
65
+ # "hdf5",
66
+ # "tomwer",
67
+ # "folder",
68
+ # "volume",
69
+ # "symlink",
70
+ # "tomography",
71
+ # "symbolic link",
72
+ # ]
73
+
74
+ # want_main_area = True
75
+ # resizing_enabled = True
76
+
77
+ # ewokstaskclass = tomwer.core.process.control.volumesymlink.VolumeSymbolicLinkTask
78
+
79
+ # _scans = Setting(list())
80
+
81
+ # class Inputs:
82
+ # data = Input(name="data", type=TomwerScanBase, doc="scan to be process")
83
+
84
+ # class Outputs:
85
+ # data = Output(name="data", type=TomwerScanBase, doc="one scan to be process")
86
+
87
+ # def __init__(self, parent=None):
88
+ # super().__init__(parent)
89
+ # self._mainWidget = _OutputDir(parent=self)
90
+ # layout = gui.vBox(self.mainArea, self.name).layout()
91
+ # layout.addWidget(self._mainWidget)
92
+
93
+ # @Inputs.data
94
+ # def process(self, scan):
95
+ # if scan is None:
96
+ # return
97
+ # symlink_process = VolumeSymbolicLinkTask(
98
+ # inputs={
99
+ # "data": scan,
100
+ # "output_type": self._mainWidget.getOutputType(),
101
+ # "output_folder": self._mainWidget.getOutputFolder(),
102
+ # "serialize_output_data": False,
103
+ # }
104
+ # )
105
+ # ProcessManager().notify_dataset_state(
106
+ # dataset=self.scan,
107
+ # process=self,
108
+ # state=DatasetState.ON_GOING,
109
+ # )
110
+ # try:
111
+ # symlink_process.run()
112
+ # except Exception:
113
+ # mess = f"Failed to create symbolic link for {scan}"
114
+ # _logger.processFailed(mess)
115
+ # ProcessManager().notify_dataset_state(
116
+ # dataset=self.scan, process=self, state=DatasetState.FAILED, details=mess
117
+ # )
118
+ # else:
119
+ # mess = f"Create symbolic link for {scan}"
120
+ # _logger.processSucceed(mess)
121
+ # ProcessManager().notify_dataset_state(
122
+ # dataset=self.scan,
123
+ # process=self,
124
+ # state=DatasetState.SUCCEED,
125
+ # details=mess,
126
+ # )
127
+ # self.Outputs.data.send(scan)
128
+
129
+ # def reprocess(self, dataset):
130
+ # self.process(dataset)
131
+
132
+
133
+ # class _OutputDir(qt.QGroupBox):
134
+ # def __init__(self, parent):
135
+ # qt.QGroupBox.__init__(self, parent)
136
+ # self._button_grp = qt.QButtonGroup(self)
137
+ # self._button_grp.setExclusive(True)
138
+ # self.setLayout(qt.QGridLayout())
139
+ # self._oneLevelCB = qt.QRadioButton(OutputType.ONE_LEVEL_UPPER.value, self)
140
+ # self._button_grp.addButton(self._oneLevelCB)
141
+ # self.layout().addWidget(self._oneLevelCB, 1, 0, 1, 3)
142
+ # self._staticOpt = qt.QRadioButton("", self)
143
+ # self._button_grp.addButton(self._staticOpt)
144
+ # self.layout().addWidget(self._staticOpt, 2, 0, 1, 1)
145
+ # self._qleFolder = qt.QLineEdit("", self)
146
+ # self.layout().addWidget(self._qleFolder, 2, 1, 1, 1)
147
+ # self._selectPB = qt.QPushButton("select", self)
148
+ # self.layout().addWidget(self._selectPB, 2, 2, 1, 1)
149
+
150
+ # # connect signal / slot
151
+ # self._selectPB.released.connect(self._selectFolder)
152
+ # self._qleFolder.editingFinished.connect(self._activeStaticOpt)
153
+
154
+ # # set up
155
+ # self._oneLevelCB.setChecked(True)
156
+
157
+ # def _activeStaticOpt(self, *args, **kwargs):
158
+ # self._staticOpt.setChecked(True)
159
+
160
+ # def _selectFolder(self): # pragma: no cover
161
+ # dialog = qt.QFileDialog(self)
162
+ # dialog.setWindowTitle("Select destination folder for symbolic link")
163
+ # dialog.setModal(1)
164
+ # dialog.setFileMode(qt.QFileDialog.DirectoryOnly)
165
+
166
+ # if not dialog.exec_():
167
+ # dialog.close()
168
+ # return None
169
+
170
+ # dest_folder = dialog.selectedFiles()[0]
171
+ # self._qleFolder.setText(dest_folder)
172
+
173
+ # def getOutputType(self) -> OutputType:
174
+ # if self._oneLevelCB.isChecked():
175
+ # return OutputType.ONE_LEVEL_UPPER
176
+ # elif self._staticOpt.isChecked():
177
+ # return OutputType.STATIC
178
+ # else:
179
+ # raise TypeError("Not managed")
180
+
181
+ # def getOutputFolder(self):
182
+ # return self._qleFolder.text()
@@ -41,8 +41,8 @@ from silx.gui.utils import concurrent
41
41
 
42
42
  from tomwer.core.scan.blissscan import BlissScan
43
43
  from tomwer.core.scan.edfscan import EDFTomoScan
44
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
45
- from tomwer.core.utils.scanutils import MockBlissAcquisition, MockEDF, MockHDF5
44
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
45
+ from tomwer.core.utils.scanutils import MockBlissAcquisition, MockEDF, MockNXtomo
46
46
  from tomwer.gui.debugtools.datasetgenerator import DatasetGeneratorDialog
47
47
 
48
48
 
@@ -150,8 +150,8 @@ class _DatasetGeneratorThread(threading.Thread):
150
150
  scan = MockEDF.mockScan(
151
151
  scanID=self.scan_path, nRadio=self.n_proj, dim=self.dims[0]
152
152
  )
153
- elif self.type_to_generate == HDF5TomoScan.__name__:
154
- scan = MockHDF5(
153
+ elif self.type_to_generate == NXtomoScan.__name__:
154
+ scan = MockNXtomo(
155
155
  scan_path=self.scan_path,
156
156
  n_proj=self.n_proj,
157
157
  n_ini_proj=self.n_proj,
@@ -38,7 +38,7 @@ from orangewidget.widget import Input, Output
38
38
  from silx.io.url import DataUrl
39
39
 
40
40
  import tomwer.core.process.edit.darkflatpatch
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.gui.edit.dkrfpatch import DarkRefPatchWidget
44
44
  from tomwer.synctools.stacks.edit.darkflatpatch import DarkFlatPatchProcessStack
@@ -52,7 +52,7 @@ _logger = logging.getLogger(__name__)
52
52
 
53
53
  class DarkFlatPatchOW(WidgetLongProcessing, SuperviseOW):
54
54
  """
55
- Widget to define on the fly the image_key of a HDF5TomoScan
55
+ Widget to define on the fly the image_key of a NXtomoScan
56
56
  """
57
57
 
58
58
  name = "dark-flat-patch"
@@ -110,8 +110,8 @@ class DarkFlatPatchOW(WidgetLongProcessing, SuperviseOW):
110
110
  def process(self, scan):
111
111
  if scan is None:
112
112
  return
113
- elif not isinstance(scan, HDF5TomoScan):
114
- _logger.error("We can only patch dark and flat for HDF5TomoScan")
113
+ elif not isinstance(scan, NXtomoScan):
114
+ _logger.error("We can only patch dark and flat for NXtomoScan")
115
115
  else:
116
116
  self._processingStack.add(scan, self.getConfiguration())
117
117
 
@@ -35,7 +35,7 @@ from orangewidget import gui
35
35
  from orangewidget.widget import Input, Output
36
36
 
37
37
  import tomwer.core.process.edit.imagekeyeditor
38
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
38
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
39
39
  from tomwer.core.scan.scanbase import TomwerScanBase
40
40
  from tomwer.gui.edit.imagekeyeditor import ImageKeyDialog
41
41
  from tomwer.synctools.stacks.edit.imagekeyeditor import ImageKeyEditorProcessStack
@@ -49,7 +49,7 @@ _logger = logging.getLogger(__name__)
49
49
 
50
50
  class ImageKeyEditorOW(SuperviseOW, WidgetLongProcessing):
51
51
  """
52
- Widget to define on the fly the image_key of a HDF5TomoScan
52
+ Widget to define on the fly the image_key of a NXtomoScan
53
53
  """
54
54
 
55
55
  name = "image-key-editor"
@@ -103,7 +103,7 @@ class ImageKeyEditorOW(SuperviseOW, WidgetLongProcessing):
103
103
  def process(self, scan):
104
104
  if scan is None:
105
105
  return
106
- elif not isinstance(scan, HDF5TomoScan):
106
+ elif not isinstance(scan, NXtomoScan):
107
107
  _logger.error("You can only edit image keys for the HDF5 scans")
108
108
  else:
109
109
  self._scan = scan
@@ -71,6 +71,8 @@ class ImageKeyUpgraderOW(
71
71
  want_main_area = True
72
72
  resizing_enabled = True
73
73
 
74
+ _ewoks_inputs_to_hide_from_orange = ("operations", "serialize_output_data")
75
+
74
76
  def __init__(self, parent=None, *args, **kwargs):
75
77
  super().__init__(parent=parent, *args, **kwargs)
76
78
 
@@ -5,7 +5,7 @@ from orangewidget.settings import Setting
5
5
  from orangewidget.widget import Input, Output
6
6
  from silx.gui import qt
7
7
 
8
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
8
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
9
9
  from tomwer.core.scan.scanbase import TomwerScanBase
10
10
  from tomwer.gui.edit.nxtomoeditor import NXtomoEditorDialog as _NXtomoEditorDialog
11
11
 
@@ -104,9 +104,9 @@ class NXtomoEditorOW(SuperviseOW):
104
104
  def _setScan(self, scan):
105
105
  if scan is None:
106
106
  pass
107
- elif not isinstance(scan, HDF5TomoScan):
107
+ elif not isinstance(scan, NXtomoScan):
108
108
  raise TypeError(
109
- f"expect to have an instance of {HDF5TomoScan}. {type(scan)} provided."
109
+ f"expect to have an instance of {NXtomoScan}. {type(scan)} provided."
110
110
  )
111
111
  else:
112
112
  self.widget.setScan(scan)
@@ -9,10 +9,10 @@ from nxtomomill.nexus.nxtomo import NXtomo
9
9
  from orangecanvas.scheme.readwrite import literal_dumps
10
10
  from silx.gui import qt
11
11
  from silx.gui.utils.testutils import SignalListener, TestCaseQt
12
- from tomoscan.esrf.scan.hdf5scan import ImageKey
12
+ from nxtomo.nxobject.nxdetector import ImageKey
13
13
 
14
14
  from orangecontrib.tomwer.widgets.edit.NXtomoEditorOW import NXtomoEditorOW
15
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
15
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
16
16
  from tomwer.tests.utils import skip_gui_test
17
17
 
18
18
 
@@ -100,7 +100,7 @@ class TestNXtomoEditorOW(TestCaseQt):
100
100
  data_path=entry,
101
101
  )
102
102
  # 2.0 set scan to the nxtomo-editor
103
- scan = HDF5TomoScan(file_path, entry)
103
+ scan = NXtomoScan(file_path, entry)
104
104
  self._window._setScan(scan=scan)
105
105
  self.qapp.processEvents()
106
106
  # 3.0 check results are as expected
@@ -0,0 +1,115 @@
1
+ import weakref
2
+ from typing import Optional
3
+ from silx.gui import qt
4
+ from ewoksorange.bindings.owwidgets import OWEwoksWidgetOneThreadPerRun
5
+ from orangewidget import gui
6
+ from orangewidget.settings import Setting
7
+
8
+ import tomwer.core.process.icat.publish
9
+ from tomwer.core.scan.scanbase import TomwerScanBase
10
+ from tomwer.gui.icat.publish import PublishProcessedDataWidget
11
+
12
+ from processview.core.superviseprocess import SuperviseProcess
13
+
14
+
15
+ class PublishProcessedDataOW(
16
+ OWEwoksWidgetOneThreadPerRun,
17
+ SuperviseProcess,
18
+ ewokstaskclass=tomwer.core.process.icat.publish.PublishReconstructedVolumeFromScanTask,
19
+ ):
20
+ """
21
+ This widget can receive 'data' (scan) and but some screenshot to be pushed on GALLERY.
22
+ """
23
+
24
+ name = "Publish processed data to icat"
25
+ id = "orangecontrib.widgets.tomwer.icat.PublishProcessedDataOW.PublishProcessedDataOW"
26
+ description = "Publish processed data to icat. \n For now we expect processed data to be reconstructed volume"
27
+ icon = "icons/publish.svg"
28
+ priority = 64
29
+ keywords = [
30
+ "tomography",
31
+ "tomwer",
32
+ "tomo_obj",
33
+ "processed data",
34
+ "PROCESSED_DATA",
35
+ "publish",
36
+ "icat",
37
+ "icatplus",
38
+ "pyicatplus",
39
+ "pyicat-plus",
40
+ ]
41
+
42
+ want_main_area = True
43
+ want_control_area = False
44
+ resizing_enabled = True
45
+
46
+ _ewoks_default_inputs = Setting({})
47
+
48
+ _ewoks_inputs_to_hide_from_orange = (
49
+ "__process__",
50
+ "beamline",
51
+ "proposal",
52
+ "dataset",
53
+ "dry_run",
54
+ "path",
55
+ )
56
+
57
+ def __init__(self, parent=None):
58
+ super().__init__(parent)
59
+ SuperviseProcess.__init__(self)
60
+ self._widget = PublishProcessedDataWidget(parent=self)
61
+ layout = gui.vBox(self.mainArea, self.name).layout()
62
+ layout.addWidget(self._widget)
63
+ self._scan = None
64
+
65
+ # load settings
66
+ self._widget.setConfiguration(self._ewoks_default_inputs)
67
+
68
+ # connect signal / slot
69
+ self._widget.sigConfigChanged.connect(self._updateSettings)
70
+
71
+ def _updateSettings(self):
72
+ self._ewoks_default_inputs = self._widget.getConfiguration()
73
+
74
+ def setScan(self, scan: TomwerScanBase):
75
+ self._scan = weakref.ref(scan)
76
+ self._widget.setScan(scan=scan)
77
+
78
+ def getScan(self) -> Optional[TomwerScanBase]:
79
+ if self._scan is None:
80
+ return None
81
+ else:
82
+ return self._scan()
83
+
84
+ def handleNewSignals(self) -> None:
85
+ """Invoked by the workflow signal propagation manager after all
86
+ signals handlers have been called.
87
+ """
88
+ # update the widget when receive the scan (proposal, dataset...)
89
+ scan = self.get_task_input_value("data", None)
90
+ if scan is None:
91
+ return
92
+ elif scan != self.getScan():
93
+ self._widget.setScan(scan)
94
+ super().handleNewSignals()
95
+ else:
96
+ super().handleNewSignals()
97
+
98
+ def get_task_inputs(self):
99
+ task_inputs = super().get_task_inputs()
100
+ configuration = self._widget.getConfiguration()
101
+
102
+ task_inputs["beamline"] = configuration["beamline"]
103
+ task_inputs["proposal"] = configuration["proposal"]
104
+ task_inputs["dataset"] = configuration["dataset"]
105
+ task_inputs["__process__"] = weakref.ref(self)
106
+
107
+ print("get task inputs")
108
+ from pprint import pprint
109
+
110
+ pprint(task_inputs)
111
+
112
+ return task_inputs
113
+
114
+ def sizeHint(self):
115
+ return qt.QSize(500, 200)