tomwer 1.2.1__py3-none-any.whl → 1.3.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
- orangecontrib/tomwer/widgets/__init__.py +11 -11
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
- orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +6 -6
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +6 -6
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +24 -7
- orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
- orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +3 -3
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +64 -23
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +20 -8
- orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +6 -6
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +5 -5
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +8 -1
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
- orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
- orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
- orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
- orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +22 -20
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +19 -3
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +184 -169
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +18 -22
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +18 -26
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +15 -19
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +9 -9
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +0 -1
- orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
- tomwer/__main__.py +7 -64
- tomwer/app/axis.py +3 -3
- tomwer/app/canvas.py +8 -0
- tomwer/app/canvas_launcher/config.py +16 -14
- tomwer/app/canvas_launcher/environ.py +1 -0
- tomwer/app/canvas_launcher/mainwindow.py +4 -1
- tomwer/app/darkref.py +1 -1
- tomwer/app/darkrefpatch.py +1 -1
- tomwer/app/diffframe.py +3 -3
- tomwer/app/imagekeyeditor.py +5 -5
- tomwer/app/imagekeyupgrader.py +5 -5
- tomwer/app/intensitynormalization.py +14 -13
- tomwer/app/{saaxis.py → multicor.py} +3 -3
- tomwer/app/{sadeltabeta.py → multipag.py} +3 -3
- tomwer/app/nabuapp.py +0 -11
- tomwer/app/radiostack.py +6 -4
- tomwer/app/samplemoved.py +3 -2
- tomwer/app/scanviewer.py +4 -2
- tomwer/app/sinogramviewer.py +3 -2
- tomwer/app/slicestack.py +3 -2
- tomwer/app/zstitching.py +88 -6
- tomwer/core/cluster/cluster.py +26 -0
- tomwer/core/log/logger.py +7 -5
- tomwer/core/process/conditions/filters.py +1 -1
- tomwer/core/process/control/datalistener/datalistener.py +19 -14
- tomwer/core/process/control/datawatcher/edfdwprocess.py +0 -9
- tomwer/core/process/control/nxtomoconcatenate.py +13 -13
- tomwer/core/process/control/nxtomomill.py +92 -34
- tomwer/core/process/control/scantransfer.py +20 -43
- tomwer/core/process/control/scanvalidator.py +3 -2
- tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
- tomwer/core/process/control/test/test_email.py +4 -4
- tomwer/core/process/control/test/test_h52nx_process.py +59 -7
- tomwer/core/process/control/test/test_volume_link.py +64 -64
- tomwer/core/process/control/timer.py +1 -1
- tomwer/core/process/control/volumesymlink.py +200 -200
- tomwer/core/process/edit/darkflatpatch.py +14 -15
- tomwer/core/process/edit/imagekeyeditor.py +41 -39
- tomwer/core/process/icat/__init__.py +0 -0
- tomwer/core/process/icat/createscreenshots.py +100 -0
- tomwer/core/process/icat/gallery.py +377 -0
- tomwer/core/process/icat/icatbase.py +36 -0
- tomwer/core/process/icat/publish.py +228 -0
- tomwer/core/process/icat/screenshots.py +27 -0
- tomwer/core/process/output.py +52 -0
- tomwer/core/process/reconstruction/axis/axis.py +280 -69
- tomwer/core/process/reconstruction/axis/mode.py +163 -48
- tomwer/core/process/reconstruction/axis/params.py +29 -21
- tomwer/core/process/reconstruction/darkref/darkrefs.py +41 -127
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +4 -3
- tomwer/core/process/reconstruction/darkref/params.py +1 -1
- tomwer/core/process/reconstruction/nabu/castvolume.py +4 -4
- tomwer/core/process/reconstruction/nabu/helical.py +9 -5
- tomwer/core/process/reconstruction/nabu/nabucommon.py +71 -78
- tomwer/core/process/reconstruction/nabu/nabuscores.py +425 -53
- tomwer/core/process/reconstruction/nabu/nabuslices.py +114 -93
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +54 -27
- tomwer/core/process/reconstruction/nabu/plane.py +9 -0
- tomwer/core/process/reconstruction/nabu/settings.py +2 -2
- tomwer/core/process/reconstruction/nabu/utils.py +164 -26
- tomwer/core/process/reconstruction/output.py +108 -0
- tomwer/core/process/reconstruction/saaxis/saaxis.py +238 -264
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +151 -87
- tomwer/core/process/reconstruction/scores/params.py +7 -4
- tomwer/core/process/reconstruction/scores/scores.py +13 -0
- tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
- tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
- tomwer/core/process/reconstruction/test/test_darkref_copy.py +7 -7
- tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
- tomwer/core/process/stitching/nabustitcher.py +13 -12
- tomwer/core/process/task.py +34 -26
- tomwer/core/process/test/test_axis.py +13 -12
- tomwer/core/process/test/test_dark_and_flat.py +10 -7
- tomwer/core/process/test/test_data_transfer.py +10 -8
- tomwer/core/process/test/test_nabu.py +14 -6
- tomwer/core/process/test/test_normalization.py +4 -4
- tomwer/core/scan/blissscan.py +3 -3
- tomwer/core/scan/edfscan.py +13 -10
- tomwer/core/scan/hdf5scan.py +19 -530
- tomwer/core/scan/nxtomoscan.py +534 -0
- tomwer/core/scan/scanbase.py +72 -44
- tomwer/core/scan/scanfactory.py +13 -13
- tomwer/core/scan/test/test_edf.py +2 -2
- tomwer/core/scan/test/test_future_scan.py +3 -3
- tomwer/core/scan/test/test_h5.py +18 -16
- tomwer/core/scan/test/test_process_registration.py +4 -40
- tomwer/core/scan/test/test_scan.py +5 -78
- tomwer/core/settings.py +22 -2
- tomwer/core/test/test_scanutils.py +8 -7
- tomwer/core/test/test_utils.py +35 -28
- tomwer/core/tomwer_object.py +1 -1
- tomwer/core/utils/__init__.py +0 -466
- tomwer/core/utils/deprecation.py +1 -1
- tomwer/core/utils/dictutils.py +14 -0
- tomwer/core/utils/lbsram.py +35 -0
- tomwer/core/utils/nxtomoutils.py +1 -1
- tomwer/core/utils/scanutils.py +6 -6
- tomwer/core/utils/spec.py +263 -0
- tomwer/core/volume/edfvolume.py +6 -6
- tomwer/core/volume/hdf5volume.py +6 -6
- tomwer/core/volume/jp2kvolume.py +6 -6
- tomwer/core/volume/rawvolume.py +6 -6
- tomwer/core/volume/tiffvolume.py +12 -12
- tomwer/core/volume/volumefactory.py +2 -2
- tomwer/gui/cluster/slurm.py +274 -65
- tomwer/gui/cluster/supervisor.py +12 -0
- tomwer/gui/cluster/test/test_cluster.py +14 -2
- tomwer/gui/cluster/test/test_supervisor.py +3 -3
- tomwer/gui/configuration/__init__.py +0 -0
- tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
- tomwer/gui/configuration/level.py +22 -0
- tomwer/gui/control/actions.py +54 -0
- tomwer/gui/control/datalist.py +83 -16
- tomwer/gui/control/datalistener.py +4 -16
- tomwer/gui/control/datawatcher/controlwidget.py +2 -4
- tomwer/gui/control/datawatcher/datawatcher.py +1 -24
- tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
- tomwer/gui/control/history.py +2 -2
- tomwer/gui/control/observations.py +2 -2
- tomwer/gui/control/reducedarkflatselector.py +9 -9
- tomwer/gui/control/selectorwidgetbase.py +36 -9
- tomwer/gui/control/serie/seriecreator.py +5 -22
- tomwer/gui/control/test/test_email.py +1 -1
- tomwer/gui/control/test/test_scanvalidator.py +6 -5
- tomwer/gui/control/test/test_single_tomo_obj.py +3 -3
- tomwer/gui/control/tomoobjdisplaymode.py +8 -0
- tomwer/gui/debugtools/datasetgenerator.py +3 -3
- tomwer/gui/edit/dkrfpatch.py +20 -26
- tomwer/gui/edit/imagekeyeditor.py +11 -12
- tomwer/gui/edit/nxtomoeditor.py +111 -44
- tomwer/gui/edit/nxtomowarmer.py +7 -6
- tomwer/gui/edit/test/test_dkrf_patch.py +13 -13
- tomwer/gui/edit/test/test_image_key_editor.py +3 -3
- tomwer/gui/edit/test/test_nx_editor.py +40 -16
- tomwer/gui/icat/__init__.py +0 -0
- tomwer/gui/icat/createscreenshots.py +80 -0
- tomwer/gui/icat/gallery.py +214 -0
- tomwer/gui/icat/publish.py +187 -0
- tomwer/gui/imagefromfile.py +2 -2
- tomwer/gui/qfolderdialog.py +24 -1
- tomwer/gui/reconstruction/axis/CompareImages.py +88 -168
- tomwer/gui/reconstruction/axis/axis.py +171 -57
- tomwer/gui/reconstruction/axis/radioaxis.py +122 -257
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +2 -1
- tomwer/gui/reconstruction/nabu/castvolume.py +14 -3
- tomwer/gui/reconstruction/nabu/check.py +9 -9
- tomwer/gui/reconstruction/nabu/helical.py +29 -12
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +2 -1
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +126 -35
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +39 -32
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +222 -31
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +57 -27
- tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
- tomwer/gui/reconstruction/nabu/slices.py +10 -11
- tomwer/gui/reconstruction/nabu/volume.py +22 -10
- tomwer/gui/reconstruction/normalization/intensity.py +18 -48
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +8 -24
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
- tomwer/gui/reconstruction/saaxis/saaxis.py +9 -21
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +45 -12
- tomwer/gui/reconstruction/scores/control.py +2 -9
- tomwer/gui/reconstruction/scores/scoreplot.py +13 -11
- tomwer/gui/reconstruction/test/test_axis.py +41 -16
- tomwer/gui/reconstruction/test/test_nabu.py +31 -9
- tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
- tomwer/gui/reconstruction/test/test_sadeltabeta.py +12 -2
- tomwer/gui/settings.py +5 -28
- tomwer/gui/stackplot.py +2 -5
- tomwer/gui/stitching/action.py +49 -0
- tomwer/gui/stitching/config/axisparams.py +7 -24
- tomwer/gui/stitching/config/output.py +10 -8
- tomwer/gui/stitching/config/positionoveraxis.py +22 -23
- tomwer/gui/stitching/normalization.py +117 -0
- tomwer/gui/stitching/stitchandbackground.py +4 -6
- tomwer/gui/stitching/stitching.py +267 -45
- tomwer/gui/stitching/stitching_preview.py +62 -55
- tomwer/gui/stitching/stitching_raw.py +13 -12
- tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
- tomwer/gui/utils/buttons.py +112 -29
- tomwer/gui/utils/inputwidget.py +43 -25
- tomwer/gui/utils/lineselector/lineselector.py +1 -1
- tomwer/gui/utils/scandescription.py +4 -0
- tomwer/gui/utils/step.py +144 -0
- tomwer/gui/utils/unitsystem.py +2 -5
- tomwer/gui/utils/vignettes.py +176 -15
- tomwer/gui/visualization/dataviewer.py +48 -35
- tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
- tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
- tomwer/gui/visualization/scanoverview.py +1 -1
- tomwer/gui/visualization/sinogramviewer.py +20 -36
- tomwer/gui/visualization/test/test_diffviewer.py +3 -3
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
- tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
- tomwer/gui/visualization/test/test_stacks.py +3 -3
- tomwer/gui/visualization/test/test_volumeviewer.py +65 -67
- tomwer/gui/visualization/volumeviewer.py +114 -113
- tomwer/io/utils/h5pyutils.py +3 -3
- tomwer/io/utils/raw_and_processed_data.py +84 -0
- tomwer/io/utils/tomoobj.py +4 -6
- tomwer/io/utils/utils.py +7 -7
- tomwer/resources/gui/icons/parameters.svg +1 -1
- tomwer/resources/gui/icons/ruler.png +0 -0
- tomwer/resources/gui/icons/ruler.svg +273 -0
- tomwer/resources/gui/icons/short_description.png +0 -0
- tomwer/resources/gui/icons/short_description.svg +58 -0
- tomwer/resources/gui/icons/url.png +0 -0
- tomwer/resources/gui/icons/url.svg +58 -0
- tomwer/resources/gui/illustrations/no_rot.svg +1 -1
- tomwer/synctools/stacks/edit/darkflatpatch.py +19 -14
- tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
- tomwer/synctools/stacks/reconstruction/axis.py +4 -4
- tomwer/synctools/stacks/reconstruction/castvolume.py +22 -7
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +25 -20
- tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
- tomwer/synctools/test/test_darkRefs.py +7 -58
- tomwer/synctools/test/test_foldertransfer.py +6 -6
- tomwer/synctools/utils/scanstages.py +6 -6
- tomwer/tests/conftest.py +34 -0
- tomwer/tests/datasets.py +13 -0
- tomwer/tests/test_scripts.py +91 -41
- tomwer/tests/utils.py +5 -0
- tomwer/third_part/WaitingOverlay.py +110 -0
- tomwer/third_part/__init__.py +0 -0
- tomwer/version.py +2 -2
- tomwer-1.3.12-py3.11-nspkg.pth +1 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/METADATA +73 -58
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/RECORD +287 -286
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/WHEEL +1 -1
- orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +0 -197
- orangecontrib/tomwer/widgets/reconstruction/icons/XY_lamino.svg +0 -168
- orangecontrib/tomwer/widgets/reconstruction/icons/XZ_lamino.svg +0 -275
- orangecontrib/tomwer/widgets/reconstruction/icons/YZ_lamino.svg +0 -182
- tomwer/app/lamino.py +0 -143
- tomwer/core/process/reconstruction/lamino/__init__.py +0 -1
- tomwer/core/process/reconstruction/lamino/tofu.py +0 -1000
- tomwer/core/process/test/test_lamino.py +0 -76
- tomwer/core/test/test_lamino.py +0 -92
- tomwer/gui/reconstruction/lamino/__init__.py +0 -31
- tomwer/gui/reconstruction/lamino/tofu/TofuOptionLoader.py +0 -107
- tomwer/gui/reconstruction/lamino/tofu/__init__.py +0 -1
- tomwer/gui/reconstruction/lamino/tofu/misc.py +0 -148
- tomwer/gui/reconstruction/lamino/tofu/projections.py +0 -896
- tomwer/gui/reconstruction/lamino/tofu/settings.py +0 -75
- tomwer/gui/reconstruction/lamino/tofu/tofu.py +0 -432
- tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +0 -567
- tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +0 -760
- tomwer/gui/reconstruction/test/test_lamino.py +0 -189
- tomwer/resources/gui/icons/esrf_1.svg +0 -307
- tomwer/resources/gui/icons/lamino_parameters.svg +0 -70
- tomwer/resources/gui/icons/triangle.svg +0 -80
- tomwer/resources/gui/illustrations/lamino_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_angle.svg +0 -509
- tomwer/resources/gui/illustrations/lamino_beta_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_beta_angle.svg +0 -97
- tomwer/resources/gui/illustrations/lamino_theta_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_theta_angle.svg +0 -368
- tomwer/resources/gui/illustrations/manual_slice.png +0 -0
- tomwer/resources/gui/illustrations/manual_slice.svg +0 -221
- tomwer/resources/gui/illustrations/psi_angle.png +0 -0
- tomwer/resources/gui/illustrations/psi_angle.svg +0 -479
- tomwer/resources/gui/illustrations/rotation_center.png +0 -0
- tomwer/resources/gui/illustrations/rotation_center.svg +0 -276
- tomwer/resources/gui/illustrations/slice_stack.png +0 -0
- tomwer/resources/gui/illustrations/slice_stack.svg +0 -266
- tomwer/resources/gui/illustrations/xy_slice.png +0 -0
- tomwer/resources/gui/illustrations/xy_slice.svg +0 -269
- tomwer/resources/gui/illustrations/xz_slice.png +0 -0
- tomwer/resources/gui/illustrations/xz_slice.svg +0 -270
- tomwer/resources/gui/illustrations/yz_slice.png +0 -0
- tomwer/resources/gui/illustrations/yz_slice.svg +0 -270
- tomwer/synctools/stacks/reconstruction/lamino.py +0 -233
- tomwer/synctools/test/test_scanstages.py +0 -162
- tomwer/tests/utils/__init__.py +0 -247
- tomwer/tests/utils/utilstest.py +0 -220
- tomwer-1.2.1-py3.11-nspkg.pth +0 -1
- /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/LICENSE +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/entry_points.txt +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/namespace_packages.txt +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,228 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
import os
|
3
|
+
import logging
|
4
|
+
|
5
|
+
from tomwer.core.process.task import Task
|
6
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
7
|
+
from tomwer.core.scan.edfscan import EDFTomoScan
|
8
|
+
from tomwer.core.volume.hdf5volume import HDF5VolumeIdentifier
|
9
|
+
from tomwer.core.volume.rawvolume import RawVolumeIdentifier
|
10
|
+
from tomwer.io.utils.raw_and_processed_data import file_is_on_processed_data
|
11
|
+
from tomoscan.identifier import VolumeIdentifier
|
12
|
+
from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
|
13
|
+
|
14
|
+
from processview.core.manager import DatasetState, ProcessManager
|
15
|
+
|
16
|
+
try:
|
17
|
+
from pyicat_plus.client.main import IcatClient # noqa F401
|
18
|
+
except ImportError:
|
19
|
+
has_pyicat_plus = False
|
20
|
+
else:
|
21
|
+
has_pyicat_plus = True
|
22
|
+
|
23
|
+
_logger = logging.getLogger(__name__)
|
24
|
+
|
25
|
+
|
26
|
+
class PublishProcessedDataFolderTask(
|
27
|
+
Task,
|
28
|
+
input_names=(
|
29
|
+
"beamline",
|
30
|
+
"proposal",
|
31
|
+
"dataset",
|
32
|
+
"path",
|
33
|
+
"raw",
|
34
|
+
),
|
35
|
+
optional_input_names=(
|
36
|
+
"metadata",
|
37
|
+
"dry_run",
|
38
|
+
),
|
39
|
+
):
|
40
|
+
"""publish a list of volume to icat for the provided beamline && dataset && proposal"""
|
41
|
+
|
42
|
+
def run(self):
|
43
|
+
beamline = self.inputs.beamline
|
44
|
+
proposal = self.inputs.proposal
|
45
|
+
dataset = self.inputs.dataset
|
46
|
+
raw = self.inputs.raw
|
47
|
+
metadata = self.get_input_value("metadata", {})
|
48
|
+
path = self.inputs.path
|
49
|
+
dry_run = self.get_input_value("dry_run", False)
|
50
|
+
|
51
|
+
# checks (need because can be pass by a GUI and will set those values to empty string mostly)
|
52
|
+
missing = []
|
53
|
+
if beamline in (None, ""):
|
54
|
+
missing.append("beamline")
|
55
|
+
if proposal in (None, ""):
|
56
|
+
missing.append("proposal")
|
57
|
+
if dataset in (None, ""):
|
58
|
+
missing.append("dataset")
|
59
|
+
if raw is None or len(raw) == 0:
|
60
|
+
missing.append("raw")
|
61
|
+
|
62
|
+
if len(missing) > 0:
|
63
|
+
mess = f"Missing information about {','.join(missing)}"
|
64
|
+
_logger.error(mess)
|
65
|
+
raise ValueError(mess)
|
66
|
+
if not os.path.exists(path):
|
67
|
+
raise ValueError(f"path: {path} doesn't exists")
|
68
|
+
|
69
|
+
if not file_is_on_processed_data(str(path)):
|
70
|
+
# for now it is safer to limit the publication of metadata to the folder contained in 'PROCESSED_DATA'
|
71
|
+
raise ValueError(
|
72
|
+
f"processed data dir ({path}) is not in a PROCESSED_DATA folder. Cannot publish it"
|
73
|
+
)
|
74
|
+
# publish
|
75
|
+
if not has_pyicat_plus:
|
76
|
+
raise ImportError("pyicat_plus not installed")
|
77
|
+
|
78
|
+
if not dry_run:
|
79
|
+
print("will publish")
|
80
|
+
from pprint import pprint
|
81
|
+
|
82
|
+
pprint(
|
83
|
+
{
|
84
|
+
"beamline": beamline,
|
85
|
+
"proposal": proposal,
|
86
|
+
"dataset": dataset,
|
87
|
+
"path": path,
|
88
|
+
"metadata": metadata,
|
89
|
+
"raw": raw,
|
90
|
+
}
|
91
|
+
)
|
92
|
+
icat_client = IcatClient(
|
93
|
+
metadata_urls=("bcu-mq-01.esrf.fr:61613", "bcu-mq-02.esrf.fr:61613")
|
94
|
+
)
|
95
|
+
|
96
|
+
icat_client.store_processed_data(
|
97
|
+
beamline=beamline,
|
98
|
+
proposal=proposal,
|
99
|
+
dataset=dataset,
|
100
|
+
path=path,
|
101
|
+
metadata=metadata,
|
102
|
+
raw=raw,
|
103
|
+
)
|
104
|
+
|
105
|
+
|
106
|
+
class PublishReconstructedVolumeFromScanTask(
|
107
|
+
Task,
|
108
|
+
input_names=(
|
109
|
+
"data",
|
110
|
+
"beamline",
|
111
|
+
"proposal",
|
112
|
+
"dataset",
|
113
|
+
),
|
114
|
+
optional_input_names=(
|
115
|
+
"metadata",
|
116
|
+
"dry_run",
|
117
|
+
"__process__",
|
118
|
+
),
|
119
|
+
):
|
120
|
+
"""
|
121
|
+
Proxy to PublishProcessedDataTask
|
122
|
+
publish processed data from a 'TomwerScanBase' instance. We expect volume to be registered under 'latest_vol_reconstructions' property.
|
123
|
+
"""
|
124
|
+
|
125
|
+
def __init__(
|
126
|
+
self, varinfo=None, inputs=None, node_id=None, node_attrs=None, execinfo=None
|
127
|
+
):
|
128
|
+
super().__init__(varinfo, inputs, node_id, node_attrs, execinfo)
|
129
|
+
scan = self.inputs.data
|
130
|
+
|
131
|
+
if not isinstance(scan, TomwerScanBase):
|
132
|
+
raise TypeError(f"scan is expected to be an instance of {TomwerScanBase}")
|
133
|
+
if isinstance(scan, EDFTomoScan):
|
134
|
+
raise TypeError(
|
135
|
+
"EDFTomoScan is not handling for pushing processed data to icat"
|
136
|
+
)
|
137
|
+
else:
|
138
|
+
raw = from_bliss_original_file_to_raw(scan.get_bliss_orginal_files())
|
139
|
+
|
140
|
+
def get_volume_identifier_path_to_save(volume_identfier):
|
141
|
+
assert isinstance(volume_identfier, VolumeIdentifier)
|
142
|
+
if isinstance(
|
143
|
+
volume_identfier, (HDF5VolumeIdentifier, RawVolumeIdentifier)
|
144
|
+
):
|
145
|
+
return os.path.dirname(volume_identfier.file_path)
|
146
|
+
elif isinstance(volume_identfier, VolumeSingleFrameBase):
|
147
|
+
if volume_identfier.url is not None:
|
148
|
+
return volume_identfier.url.file_path()
|
149
|
+
elif volume_identfier.data_url.file_path() is not None:
|
150
|
+
return volume_identfier.data_url.file_path()
|
151
|
+
else:
|
152
|
+
raise ValueError(
|
153
|
+
f"identifier type {type(volume_identfier)} is not handled"
|
154
|
+
)
|
155
|
+
|
156
|
+
paths_to_save = set(
|
157
|
+
[
|
158
|
+
get_volume_identifier_path_to_save(volume_id)
|
159
|
+
for volume_id in scan.latest_vol_reconstructions
|
160
|
+
]
|
161
|
+
)
|
162
|
+
self._sub_tasks = [
|
163
|
+
PublishProcessedDataFolderTask(
|
164
|
+
inputs={
|
165
|
+
"beamline": self.inputs.beamline,
|
166
|
+
"proposal": self.inputs.proposal,
|
167
|
+
"dataset": self.inputs.dataset,
|
168
|
+
"path": path_to_save,
|
169
|
+
"raw": raw,
|
170
|
+
"metadata": scan.build_icat_metadata(),
|
171
|
+
"dry_run": self.get_input_value("dry_run", False),
|
172
|
+
}
|
173
|
+
)
|
174
|
+
for path_to_save in paths_to_save
|
175
|
+
]
|
176
|
+
|
177
|
+
def run(self):
|
178
|
+
scan = self.inputs.data
|
179
|
+
process = self.get_input_value("__process__", None)
|
180
|
+
|
181
|
+
if process is not None:
|
182
|
+
ProcessManager().notify_dataset_state(
|
183
|
+
dataset=scan,
|
184
|
+
process=process(),
|
185
|
+
state=DatasetState.ON_GOING,
|
186
|
+
)
|
187
|
+
|
188
|
+
try:
|
189
|
+
for sub_task in self._sub_tasks:
|
190
|
+
sub_task.run()
|
191
|
+
except Exception as e:
|
192
|
+
if process is not None:
|
193
|
+
ProcessManager().notify_dataset_state(
|
194
|
+
dataset=scan,
|
195
|
+
process=process(),
|
196
|
+
state=DatasetState.FAILED,
|
197
|
+
)
|
198
|
+
raise e
|
199
|
+
else:
|
200
|
+
if process is not None:
|
201
|
+
ProcessManager().notify_dataset_state(
|
202
|
+
dataset=scan,
|
203
|
+
process=process(),
|
204
|
+
state=DatasetState.SUCCEED,
|
205
|
+
)
|
206
|
+
|
207
|
+
|
208
|
+
def from_bliss_original_file_to_raw(bliss_original_files: tuple | None) -> tuple:
|
209
|
+
"""
|
210
|
+
convert NXtomo 'bliss_original_files' to icat raw parameter (folder containing the raw)
|
211
|
+
without '/mnt/multipath-shares' prefix
|
212
|
+
"""
|
213
|
+
if bliss_original_files is None:
|
214
|
+
return None
|
215
|
+
|
216
|
+
# TODO: FIXME
|
217
|
+
def fix_path(file_path):
|
218
|
+
path = os.path.dirname(file_path)
|
219
|
+
if "/mnt/multipath-shares" in path:
|
220
|
+
# no simple workaround. abspath return a path with '/mnt/multipath-shares'
|
221
|
+
_logger.info(
|
222
|
+
"looks like raw data is given with '/mnt/multipath-shares' prefix. Icat will fail on it. Must remove it. No proper other handling found :()"
|
223
|
+
)
|
224
|
+
# small workaround to fix abspath. Should not be the case anymore so raise an error
|
225
|
+
path.replace("/mnt/multipath-shares", "")
|
226
|
+
return path
|
227
|
+
|
228
|
+
return tuple([os.path.dirname(bliss_file) for bliss_file in bliss_original_files])
|
@@ -0,0 +1,27 @@
|
|
1
|
+
"""utils around screenshots.
|
2
|
+
"""
|
3
|
+
|
4
|
+
from .icatbase import IcatProcessedDataBase
|
5
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
6
|
+
|
7
|
+
|
8
|
+
class IcatScreenshots(IcatProcessedDataBase):
|
9
|
+
"""Class to define an icat process publishing screenshot (so to the galery)"""
|
10
|
+
|
11
|
+
def __init__(self, data_dir: str, screenshots: dict, scan: TomwerScanBase) -> None:
|
12
|
+
super().__init__(data_dir, scan)
|
13
|
+
if not isinstance(screenshots, dict):
|
14
|
+
raise TypeError(
|
15
|
+
f"Screenshots is expected to be a dict. Get {type(screenshots)} instead."
|
16
|
+
)
|
17
|
+
|
18
|
+
self._screenshots = screenshots
|
19
|
+
|
20
|
+
@property
|
21
|
+
def screenshots(self):
|
22
|
+
return self._screenshots
|
23
|
+
|
24
|
+
def to_dict(self):
|
25
|
+
res = super().to_dict()
|
26
|
+
res["screenshots_as_dict"] = self.screenshots
|
27
|
+
return res
|
@@ -0,0 +1,52 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
import os
|
3
|
+
from silx.utils.enum import Enum as _Enum
|
4
|
+
|
5
|
+
|
6
|
+
class ProcessDataOutputDirMode(_Enum):
|
7
|
+
IN_SCAN_FOLDER = "same folder as scan"
|
8
|
+
PROCESSED_DATA_FOLDER = "PROCESSED_DATA folder"
|
9
|
+
RAW_DATA_FOLDER = "RAW_DATA folder"
|
10
|
+
OTHER = "other"
|
11
|
+
|
12
|
+
@classmethod
|
13
|
+
def from_value(cls, value):
|
14
|
+
# ensure backward compatibility
|
15
|
+
if value == "near input":
|
16
|
+
return cls.IN_SCAN_FOLDER
|
17
|
+
elif value == "processed data dir":
|
18
|
+
return cls.PROCESSED_DATA_FOLDER
|
19
|
+
elif value == "raw data dir":
|
20
|
+
return cls.RAW_DATA_FOLDER
|
21
|
+
return super().from_value(value)
|
22
|
+
|
23
|
+
|
24
|
+
class NabuOutputFileFormat(_Enum):
|
25
|
+
TIFF = "tiff"
|
26
|
+
HDF5 = "hdf5"
|
27
|
+
JP2K = "jp2"
|
28
|
+
EDF = "edf"
|
29
|
+
RAW = "vol"
|
30
|
+
|
31
|
+
@classmethod
|
32
|
+
def from_value(cls, value):
|
33
|
+
if isinstance(value, str):
|
34
|
+
value = value.lstrip(".")
|
35
|
+
return super().from_value(value)
|
36
|
+
|
37
|
+
|
38
|
+
def get_file_format(file_str):
|
39
|
+
extension = os.path.splitext(file_str.lower())[-1]
|
40
|
+
extension = extension.lstrip(".")
|
41
|
+
if extension in ("tiff", "tif"):
|
42
|
+
return NabuOutputFileFormat.TIFF
|
43
|
+
elif extension in ("hdf5", "hdf", "h5"):
|
44
|
+
return NabuOutputFileFormat.HDF5
|
45
|
+
elif extension in ("jp2", "jp2k", "jpg2k"):
|
46
|
+
return NabuOutputFileFormat.JP2K
|
47
|
+
elif extension in ("edf",):
|
48
|
+
return NabuOutputFileFormat.EDF
|
49
|
+
elif extension in ("vol", "raw"):
|
50
|
+
return NabuOutputFileFormat.RAW
|
51
|
+
else:
|
52
|
+
raise ValueError(f"Unrecognized file extension {extension} from {file_str}")
|