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
@@ -45,6 +45,11 @@ from orangecontrib.tomwer.widgets.utils import WidgetLongProcessing
45
45
  from tomwer.core import settings
46
46
  from tomwer.core.cluster import SlurmClusterConfiguration
47
47
  from tomwer.core.futureobject import FutureTomwerObject
48
+ from tomwer.core.process.icat.gallery import (
49
+ IcatScreenshots,
50
+ deduce_dataset_gallery_location,
51
+ select_screenshot_from_volume,
52
+ )
48
53
  from tomwer.core.process.reconstruction.nabu import utils as nabu_utils
49
54
  from tomwer.core.process.reconstruction.nabu.nabuvolume import NabuVolumeTask
50
55
  from tomwer.core.scan.scanbase import TomwerScanBase
@@ -123,6 +128,11 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
123
128
  volume_urls = Output(
124
129
  name="volume urls", type=tuple, doc="url of the volume(s) reconstructed"
125
130
  )
131
+ screenshots = Output(
132
+ name="screenshots",
133
+ type=IcatScreenshots,
134
+ doc="screenshots that can be saved",
135
+ )
126
136
 
127
137
  class DialogCM(AbstractContextManager):
128
138
  """Simple context manager to hida / show button dialogs"""
@@ -172,7 +182,7 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
172
182
 
173
183
  if nabu_volume_params not in (dict(), None):
174
184
  try:
175
- self._nabuWidget.setConfiguration(nabu_volume_params)
185
+ self.setConfiguration(nabu_volume_params)
176
186
  except Exception:
177
187
  _logger.warning("fail to load reconstruction settings")
178
188
 
@@ -213,14 +223,19 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
213
223
  config = scan.nabu_recons_params
214
224
  # update output format if requested
215
225
  if self._nabuWidget._mainWidget.redefineNabuFileFormat():
216
- config.get("output")[
226
+ config["output"][
217
227
  "file_format"
218
228
  ] = self._nabuWidget._mainWidget.getNabuFileFormat()
219
229
  # update output location if requested
220
230
  if self._nabuWidget._mainWidget.redefineOutputLocation():
221
- config.get("output")["location"] = format_output_location(
222
- location=self._nabuWidget._mainWidget.getNabuOutputLocation(),
223
- scan=scan,
231
+ location = self._nabuWidget._mainWidget.getNabuOutputLocation()
232
+ if location is not None:
233
+ location = format_output_location(location=location, scan=scan)
234
+ config["output"]["location"] = location
235
+ config["output"][
236
+ "output_dir_mode"
237
+ ] = (
238
+ self._nabuWidget._mainWidget._outputLocationWidget.getOutputDirMode().value
224
239
  )
225
240
 
226
241
  if "phase" in config and "delta_beta" in config["phase"]:
@@ -314,7 +329,26 @@ class NabuVolumeOW(WidgetLongProcessing, SuperviseOW):
314
329
  assert isinstance(volume_id, VolumeIdentifier)
315
330
  volume_urls.extend(VolumeFactory.from_identifier_to_vol_urls(volume_id))
316
331
  if len(volume_urls) > 0:
332
+ # send list of reconcstructed volume
317
333
  self.Outputs.volume_urls.send(tuple(volume_urls))
334
+ # send list of screenshots
335
+ screenshots = {}
336
+ [
337
+ screenshots.update(
338
+ select_screenshot_from_volume(
339
+ VolumeFactory.create_tomo_object_from_identifier(volume_id)
340
+ )
341
+ )
342
+ for volume_id in scan.latest_vol_reconstructions
343
+ ]
344
+ self.Outputs.screenshots.send(
345
+ IcatScreenshots(
346
+ data_dir=deduce_dataset_gallery_location(scan),
347
+ screenshots=screenshots,
348
+ scan=scan,
349
+ ),
350
+ )
351
+
318
352
  # send volume identifier(s) # only one expected
319
353
  n_rec_volumes = len(scan.latest_vol_reconstructions)
320
354
  if n_rec_volumes > 0:
@@ -43,9 +43,9 @@ from silx.gui import qt
43
43
  import tomwer.core.process.reconstruction.saaxis.saaxis
44
44
  from orangecontrib.tomwer.orange.managedprocess import SuperviseOW
45
45
  from orangecontrib.tomwer.orange.settings import CallbackSettingsHandler
46
- from tomwer.core import settings, utils
46
+ from tomwer.core import settings
47
+ from tomwer.core.utils.lbsram import is_low_on_memory
47
48
  from tomwer.core.cluster import SlurmClusterConfiguration
48
- from tomwer.core.futureobject import FutureTomwerObject
49
49
  from tomwer.core.process.reconstruction.axis import AxisTask
50
50
  from tomwer.core.process.reconstruction.saaxis.saaxis import SAAxisTask
51
51
  from tomwer.core.scan.scanbase import TomwerScanBase, _TomwerBaseDock
@@ -270,12 +270,14 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
270
270
  Details about :ref:`saaxis score calculation`
271
271
  """
272
272
 
273
- name = "semi-automated center of rotation"
273
+ name = "multi-cor (sa-axis)"
274
274
  id = "orange.widgets.tomwer.sa_axis"
275
- description = "use to compute the center of rotation semi automatic way"
275
+ description = "Reconstruct a slice with different center of rotation (cor) values"
276
276
  icon = "icons/saaxis.png"
277
277
  priority = 21
278
278
  keywords = [
279
+ "multi",
280
+ "multi-cor",
279
281
  "tomography",
280
282
  "semi automatic",
281
283
  "half automatic",
@@ -322,12 +324,6 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
322
324
  class Outputs:
323
325
  data = Output(name="data", type=TomwerScanBase, doc="one scan to be process")
324
326
 
325
- future_out = Output(
326
- name="future_tomo_obj",
327
- type=FutureTomwerObject,
328
- doc="data with some remote processing",
329
- )
330
-
331
327
  def __init__(self, parent=None):
332
328
  """
333
329
 
@@ -404,9 +400,7 @@ class SAAxisOW(SuperviseOW, WidgetLongProcessing):
404
400
  scan.saaxis_params = QSAAxisParams()
405
401
  self._skipCurrentScan(new_scan=scan)
406
402
 
407
- if settings.isOnLbsram(scan) and utils.isLowOnMemory(
408
- settings.get_lbsram_path()
409
- ):
403
+ if settings.isOnLbsram(scan) and is_low_on_memory(settings.get_lbsram_path()):
410
404
  self.notify_skip(
411
405
  scan=scan,
412
406
  details=f"saaxis has been skiped for {scan} because of low space in lbsram",
@@ -41,9 +41,9 @@ from silx.gui import qt
41
41
  import tomwer.core.process.reconstruction.sadeltabeta.sadeltabeta
42
42
  from orangecontrib.tomwer.orange.managedprocess import SuperviseOW
43
43
  from orangecontrib.tomwer.orange.settings import CallbackSettingsHandler
44
- from tomwer.core import settings, utils
44
+ from tomwer.core import settings
45
+ from tomwer.core.utils.lbsram import is_low_on_memory
45
46
  from tomwer.core.cluster import SlurmClusterConfiguration
46
- from tomwer.core.futureobject import FutureTomwerObject
47
47
  from tomwer.core.process.reconstruction.sadeltabeta import SADeltaBetaTask
48
48
  from tomwer.core.scan.scanbase import TomwerScanBase, _TomwerBaseDock
49
49
  from tomwer.gui.reconstruction.sadeltabeta import (
@@ -198,16 +198,14 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
198
198
  Details about :ref:`sadeltabeta score calculation`
199
199
  """
200
200
 
201
- name = "semi automatic delta/beta calculation"
201
+ name = "multi-pag (sa-delta/beta calculation)"
202
202
  id = "orange.widgets.tomwer.sa_delta_beta"
203
- description = (
204
- "compute several delta / beta value to get the optimal "
205
- "delta / beta value (before reconstructing a volume for "
206
- "example."
207
- )
203
+ description = "Reconstruct a slice with several delta / beta values."
208
204
  icon = "icons/delta_beta_range.png"
209
205
  priority = 22
210
206
  keywords = [
207
+ "multi",
208
+ "multi-pag",
211
209
  "tomography",
212
210
  "semi automatic",
213
211
  "half automatic",
@@ -257,12 +255,6 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
257
255
  class Outputs:
258
256
  data = Output(name="data", type=TomwerScanBase)
259
257
 
260
- future_out = Output(
261
- name="future_tomo_obj",
262
- type=FutureTomwerObject,
263
- doc="data with some remote processing",
264
- )
265
-
266
258
  def __init__(self, parent=None):
267
259
  """
268
260
 
@@ -336,9 +328,7 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
336
328
  scan.sa_delta_beta_params = QSADeltaBetaParams()
337
329
  self._skipCurrentScan(new_scan=scan)
338
330
 
339
- if settings.isOnLbsram(scan) and utils.isLowOnMemory(
340
- settings.get_lbsram_path()
341
- ):
331
+ if settings.isOnLbsram(scan) and is_low_on_memory(settings.get_lbsram_path()):
342
332
  self.notify_skip(
343
333
  scan=scan,
344
334
  details=f"sa-delta-beta has been skiped for {scan} because of low space in lbsram",
@@ -42,7 +42,8 @@ from tomoscan.normalization import Method as NormMethod
42
42
 
43
43
  from orangecontrib.tomwer.widgets.utils import WidgetLongProcessing
44
44
 
45
- from tomwer.core import settings, utils
45
+ from tomwer.core import settings
46
+ from tomwer.core.utils.lbsram import is_low_on_memory
46
47
  from tomwer.core.process.reconstruction.normalization import SinoNormalizationTask
47
48
  from tomwer.core.process.reconstruction.normalization.params import _ValueSource
48
49
  from tomwer.core.scan.scanbase import TomwerScanBase
@@ -197,9 +198,7 @@ class SinoNormOW(WidgetLongProcessing, SuperviseOW):
197
198
  return
198
199
 
199
200
  self._skipCurrentScan(new_scan=scan)
200
- if settings.isOnLbsram(scan) and utils.isLowOnMemory(
201
- settings.get_lbsram_path()
202
- ):
201
+ if settings.isOnLbsram(scan) and is_low_on_memory(settings.get_lbsram_path()):
203
202
  details = f"skip {scan} because low memory on lbsram"
204
203
  self.notify_skip(scan=scan, details=details)
205
204
  self.Outputs.data_out.send(scan)
@@ -32,7 +32,7 @@ from orangewidget.widget import Input
32
32
 
33
33
  import tomwer.core.process.visualization.liveslice
34
34
  from tomwer.core.scan.scanbase import TomwerScanBase
35
- from tomwer.core.utils import getFirstProjFile
35
+ from tomwer.core.utils.spec import getFirstProjFile
36
36
 
37
37
  try:
38
38
  from liveslice.gui.liveslice_gui import ReconstructionApp
@@ -2,7 +2,7 @@ from orangewidget import gui, widget
2
2
  from orangewidget.widget import Input, Output
3
3
  from silx.gui import qt
4
4
 
5
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
5
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
6
6
  from tomwer.core.scan.scanbase import TomwerScanBase
7
7
  from tomwer.gui.visualization.nxtomometadata import NXtomoMetadataViewer
8
8
 
@@ -56,9 +56,9 @@ class NXtomoMetadataViewerOW(widget.OWBaseWidget, openclass=True):
56
56
  def setScan(self, scan):
57
57
  if scan is None:
58
58
  pass
59
- elif not isinstance(scan, HDF5TomoScan):
59
+ elif not isinstance(scan, NXtomoScan):
60
60
  raise TypeError(
61
- f"expect to have an instance of {HDF5TomoScan}. {type(scan)} provided."
61
+ f"expect to have an instance of {NXtomoScan}. {type(scan)} provided."
62
62
  )
63
63
  else:
64
64
  self.widget.setScan(scan)
@@ -1,32 +1,3 @@
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__ = "21/07/2020"
29
-
30
1
  import pytest
31
2
  from orangewidget import gui, widget
32
3
  from orangewidget.widget import Input
@@ -79,6 +50,9 @@ class VolumeViewerOW(widget.OWBaseWidget, openclass=True):
79
50
  self.viewer.setScan(scan)
80
51
 
81
52
  @Inputs.volume
53
+ def _volumeReceived(self, volume, *args, **kwargs):
54
+ self.addVolume(volume)
55
+
82
56
  def addVolume(self, volume):
83
57
  if volume is None:
84
58
  return
tomwer/__main__.py CHANGED
@@ -36,21 +36,16 @@ __date__ = "10/11/2020"
36
36
 
37
37
 
38
38
  import sys
39
- import logging
40
- import traceback
41
39
  from collections import namedtuple
42
40
  import tomwer.version
43
41
  from tomwer.utils import Launcher as _Launcher
44
-
42
+ from tomwer.core.utils.deprecation import deprecated_warning
45
43
 
46
44
  DeprecationWarning = namedtuple(
47
45
  "DeprecationWarning", ["since", "reason", "replacement"]
48
46
  )
49
47
 
50
48
 
51
- depreclog = logging.getLogger("nxtomomill.DEPRECATION")
52
-
53
-
54
49
  class Launcher(_Launcher):
55
50
  """
56
51
  Manage launch of module.
@@ -115,48 +110,6 @@ class Launcher(_Launcher):
115
110
  super().execute(argv=argv)
116
111
 
117
112
 
118
- def deprecated_warning(
119
- type_,
120
- name,
121
- reason=None,
122
- replacement=None,
123
- since_version=None,
124
- skip_backtrace_count=0,
125
- ):
126
- """
127
- Function to log a deprecation warning
128
-
129
- :param str type_: Nature of the object to be deprecated:
130
- "Module", "Function", "Class" ...
131
- :param name: Object name.
132
- :param str reason: Reason for deprecating this function
133
- (e.g. "feature no longer provided",
134
- :param str replacement: Name of replacement function (if the reason for
135
- deprecating was to rename the function)
136
- :param str since_version: First *silx* version for which the function was
137
- deprecated (e.g. "0.5.0").
138
- :param int skip_backtrace_count: Amount of last backtrace to ignore when
139
- logging the backtrace
140
- """
141
- if not depreclog.isEnabledFor(logging.WARNING):
142
- # Avoid computation when it is not logged
143
- return
144
-
145
- msg = "%s %s is deprecated"
146
- if since_version is not None:
147
- msg += " since silx version %s" % since_version
148
- msg += "."
149
- if reason is not None:
150
- msg += " Reason: %s." % reason
151
- if replacement is not None:
152
- msg += " Use '%s' instead." % replacement
153
- msg += "\n%s"
154
- limit = 2 + skip_backtrace_count
155
- backtrace = "".join(traceback.format_stack(limit=limit)[0])
156
- backtrace = backtrace.rstrip()
157
- depreclog.warning(msg, type_, name, backtrace)
158
-
159
-
160
113
  def main():
161
114
  """Main function of the launcher
162
115
 
@@ -225,6 +178,16 @@ def main():
225
178
  module_name="tomwer.app.liveslice",
226
179
  description="Run liveslice application",
227
180
  )
181
+ launcher.add_command(
182
+ "multi-cor",
183
+ module_name="tomwer.app.multicor",
184
+ description="Compute a slice with different values of cor",
185
+ )
186
+ launcher.add_command(
187
+ "multi-pag",
188
+ module_name="tomwer.app.multipag",
189
+ description="compute a slice with different values of delta / beta values",
190
+ )
228
191
  launcher.add_command(
229
192
  "nabu",
230
193
  module_name="tomwer.app.nabuapp",
@@ -273,16 +236,6 @@ def main():
273
236
  module_name="tomwer.app.sinogramviewer",
274
237
  description="Allows to compute on the fly sinogram " "and display them",
275
238
  )
276
- launcher.add_command(
277
- "sa-axis",
278
- module_name="tomwer.app.saaxis",
279
- description="Semi-automatic center of rotation research",
280
- )
281
- launcher.add_command(
282
- "sa-delta-beta",
283
- module_name="tomwer.app.sadeltabeta",
284
- description="Semi-automatic delta/beta Paganin parameter research",
285
- )
286
239
  launcher.add_command(
287
240
  "scan-viewer",
288
241
  module_name="tomwer.app.scanviewer",
tomwer/app/canvas.py CHANGED
@@ -23,11 +23,19 @@ except ImportError:
23
23
  has_nabu = False
24
24
  else:
25
25
  has_nabu = True
26
+ try:
27
+ import nxtomo.version
28
+ except ImportError:
29
+ has_nxtomo = False
30
+ else:
31
+ has_nxtomo = True
26
32
 
27
33
 
28
34
  def print_versions():
29
35
  print(f"tomwer version is {tomwer.version.version}")
30
36
  print(f"tomoscan version is {tomoscan.version.version}")
37
+ if has_nxtomo:
38
+ print(f"nxtomo version is {nxtomo.version.version}")
31
39
  if has_nxtomomill:
32
40
  print(f"nxtomomill version is {nxtomomill.version.version}")
33
41
  if has_nabu:
@@ -185,17 +185,19 @@ class TerminalTextDocument(_TerminalTextDocument):
185
185
  def writeWithFormat(self, string: str, charformat) -> None:
186
186
  assert qt.QThread.currentThread() is self.thread()
187
187
  # remove linux reset sequence
188
- string = string.replace("\033[0m", "")
189
- # remove linux reset sequence
190
- string = string.replace("\033[1;%dm", "")
191
- # remove linux reset sequence
192
- string = string.replace("\x1B[1m", "")
193
- string = string.replace("\x1B[1;30m", "")
194
- string = string.replace("\x1B[1;31m", "")
195
- string = string.replace("\x1B[1;32m", "")
196
- string = string.replace("\x1B[1;33m", "")
197
- string = string.replace("\x1B[1;34m", "")
198
- string = string.replace("\x1B[1;35m", "")
188
+ from tomwer.core.log import logger as tomwer_logger
189
+
190
+ for sequence in (
191
+ tomwer_logger._RESET_SEQ,
192
+ tomwer_logger._BOLD_SEQ,
193
+ tomwer_logger._BLACK,
194
+ tomwer_logger._RED,
195
+ tomwer_logger._GREEN,
196
+ tomwer_logger._YELLOW,
197
+ tomwer_logger._BLUE,
198
+ tomwer_logger._MAGENTA,
199
+ ):
200
+ string = string.replace(sequence, "")
199
201
 
200
202
  color = self.get_log_level(string) or qt.Qt.red
201
203
  charformat.setForeground(color)
tomwer/app/darkref.py CHANGED
@@ -1,4 +1,4 @@
1
- from silx.utils.deprecation import deprecated_warning
1
+ from tomwer.core.utils.deprecation import deprecated_warning
2
2
 
3
3
  deprecated_warning(
4
4
  "module",
@@ -1,4 +1,4 @@
1
- from silx.utils.deprecation import deprecated_warning
1
+ from tomwer.core.utils.deprecation import deprecated_warning
2
2
 
3
3
  deprecated_warning(
4
4
  "module",
@@ -8,7 +8,7 @@ import sys
8
8
 
9
9
  from silx.gui import qt
10
10
 
11
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
11
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
12
12
  from tomwer.core.utils.resource import increase_max_number_file
13
13
  from tomwer.core.process.edit.imagekeyeditor import ImageKeyEditorTask
14
14
  from tomwer.gui import icons
@@ -25,8 +25,8 @@ class ImageKeyDialog(_ImageKeyDialog):
25
25
  self._scan = None
26
26
 
27
27
  def setScan(self, scan):
28
- if not isinstance(scan, HDF5TomoScan):
29
- raise TypeError("This only manage HDF5TomoScan")
28
+ if not isinstance(scan, NXtomoScan):
29
+ raise TypeError("This only manage NXtomoScan")
30
30
  self._scan = scan
31
31
  _ImageKeyDialog.setScan(self, scan)
32
32
 
@@ -65,8 +65,8 @@ def main(argv):
65
65
  parser.add_argument("entry", default=None, help="Entry to treat")
66
66
  options = parser.parse_args(argv[1:])
67
67
 
68
- # image key can only handle HDF5Tomoscan for now
69
- scan = HDF5TomoScan(scan=options.scan_path, entry=options.entry)
68
+ # image key can only handle NXtomoScan for now
69
+ scan = NXtomoScan(scan=options.scan_path, entry=options.entry)
70
70
  increase_max_number_file()
71
71
 
72
72
  app = qt.QApplication.instance() or qt.QApplication(["tomwer"])
@@ -9,7 +9,7 @@ import sys
9
9
  from silx.gui import qt
10
10
 
11
11
  from tomwer.core.process.edit.imagekeyeditor import ImageKeyUpgraderTask
12
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
12
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
13
13
  from tomwer.core.utils.resource import increase_max_number_file
14
14
  from tomwer.gui import icons
15
15
  from tomwer.gui.edit.imagekeyeditor import (
@@ -40,8 +40,8 @@ class ImageKeyUpgraderDialog(qt.QDialog):
40
40
  self._buttons.button(qt.QDialogButtonBox.Cancel).released.connect(self.close)
41
41
 
42
42
  def setScan(self, scan):
43
- if not isinstance(scan, HDF5TomoScan):
44
- raise TypeError("This only manage HDF5TomoScan")
43
+ if not isinstance(scan, NXtomoScan):
44
+ raise TypeError("This only manage NXtomoScan")
45
45
  self._scan = scan
46
46
 
47
47
  def validate(self):
@@ -74,8 +74,8 @@ def main(argv):
74
74
  parser.add_argument("entry", default=None, help="Entry to treat")
75
75
  options = parser.parse_args(argv[1:])
76
76
 
77
- # image key can only handle HDF5Tomoscan for now
78
- scan = HDF5TomoScan(scan=options.scan_path, entry=options.entry)
77
+ # image key can only handle NXtomoScan for now
78
+ scan = NXtomoScan(scan=options.scan_path, entry=options.entry)
79
79
  increase_max_number_file()
80
80
 
81
81
  app = qt.QApplication.instance() or qt.QApplication(["tomwer"])
@@ -10,7 +10,7 @@ import sys
10
10
  from silx.gui import qt
11
11
 
12
12
  from tomwer.core.process.reconstruction.normalization import SinoNormalizationTask
13
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
13
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
14
14
  from tomwer.core.scan.scanbase import TomwerScanBase
15
15
  from tomwer.core.scan.scanfactory import ScanFactory
16
16
  from tomwer.gui import icons
@@ -175,7 +175,7 @@ def main(argv):
175
175
  )
176
176
  if options.entry is None:
177
177
  raise ValueError("entry in the master file should be specify")
178
- scan = HDF5TomoScan(scan=options.scan_path, entry=options.entry)
178
+ scan = NXtomoScan(scan=options.scan_path, entry=options.entry)
179
179
  else:
180
180
  scan = ScanFactory.mock_scan()
181
181
  # define the process_index is any tomwer_processes_existing
tomwer/app/radiostack.py CHANGED
@@ -9,7 +9,7 @@ import sys
9
9
 
10
10
  from silx.gui import qt
11
11
 
12
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
12
+ from tomwer.core.scan.nxtomoscan import NXtomoScan
13
13
  from tomwer.core.utils.resource import increase_max_number_file
14
14
  from tomwer.gui import icons
15
15
  from tomwer.gui.stacks import RadioStack
@@ -29,7 +29,7 @@ def addFolderAndSubFolder(stack, path):
29
29
  _path = os.path.join(path, f)
30
30
  if os.path.isdir(_path) is True:
31
31
  addFolderAndSubFolder(stack, _path)
32
- elif os.path.isfile(_path) and HDF5TomoScan.is_nexus_nxtomo_file(_path):
32
+ elif os.path.isfile(_path) and NXtomoScan.is_nexus_nxtomo_file(_path):
33
33
  stack.addLeafScan(_path)
34
34
 
35
35