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
@@ -41,8 +41,9 @@ from nabu.pipeline.fullfield.nabu_config import (
|
|
41
41
|
from silx.utils.enum import Enum as _Enum
|
42
42
|
|
43
43
|
import tomwer.version
|
44
|
+
from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
|
44
45
|
from tomwer.core.scan.edfscan import EDFTomoScan
|
45
|
-
from tomwer.core.scan.
|
46
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
46
47
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
47
48
|
from tomwer.core.volume.edfvolume import EDFVolume
|
48
49
|
from tomwer.core.volume.hdf5volume import HDF5Volume
|
@@ -148,27 +149,30 @@ def get_recons_volume_identifier(
|
|
148
149
|
file_format: str,
|
149
150
|
scan: TomwerScanBase,
|
150
151
|
slice_index: typing.Union[int, None],
|
151
|
-
|
152
|
-
end_z: typing.Union[int, None],
|
153
|
-
expects_single_slice: bool,
|
152
|
+
axis: NabuPlane,
|
154
153
|
) -> tuple:
|
155
154
|
"""
|
156
155
|
return tuple of DataUrl for existings slices
|
157
156
|
"""
|
157
|
+
axis = NabuPlane.from_value(axis)
|
158
158
|
file_format = file_format.lower()
|
159
159
|
if file_format in ("hdf5", "h5", "hdf"):
|
160
160
|
if slice_index is not None:
|
161
161
|
# case of a single hdf5 file
|
162
|
-
file_name = "_".join(
|
162
|
+
file_name = "_".join(
|
163
|
+
(file_prefix, "plane", axis.value, str(slice_index).zfill(6))
|
164
|
+
)
|
163
165
|
else:
|
164
166
|
file_name = file_prefix
|
165
167
|
file_name = ".".join((file_name, file_format))
|
166
168
|
file_path = os.path.join(location, file_name)
|
167
169
|
|
168
|
-
if isinstance(scan,
|
170
|
+
if isinstance(scan, NXtomoScan):
|
169
171
|
entry = scan.entry
|
170
172
|
elif isinstance(scan, EDFTomoScan):
|
171
173
|
entry = "entry"
|
174
|
+
else:
|
175
|
+
raise NotImplementedError(f"unrecognized scan type ({type(scan)})")
|
172
176
|
|
173
177
|
volumes = (
|
174
178
|
HDF5Volume(
|
@@ -179,7 +183,9 @@ def get_recons_volume_identifier(
|
|
179
183
|
elif file_format in ("vol", "raw"):
|
180
184
|
if slice_index is not None:
|
181
185
|
# case of a single hdf5 file
|
182
|
-
file_name = "_".join(
|
186
|
+
file_name = "_".join(
|
187
|
+
(file_prefix, "plane", axis.value, str(slice_index).zfill(6))
|
188
|
+
)
|
183
189
|
else:
|
184
190
|
file_name = file_prefix
|
185
191
|
file_name = ".".join((file_name, file_format))
|
@@ -223,6 +229,79 @@ def get_recons_volume_identifier(
|
|
223
229
|
return tuple([volume.get_identifier() for volume in volumes])
|
224
230
|
|
225
231
|
|
232
|
+
def get_multi_cor_recons_volume_identifiers(
|
233
|
+
scan: TomwerScanBase,
|
234
|
+
slice_index: int,
|
235
|
+
location: str,
|
236
|
+
file_prefix: str,
|
237
|
+
cors: tuple,
|
238
|
+
file_format: str,
|
239
|
+
axis=NabuPlane.XY,
|
240
|
+
) -> dict:
|
241
|
+
"""
|
242
|
+
util to retrieve Volumes (identifier) reconstructed by nabu-multicor
|
243
|
+
|
244
|
+
:param TomwerScanBase scan: scam processed by the nabu-multicor
|
245
|
+
:param str location: location of the files
|
246
|
+
:param tuple cors: cors for which we want the reconstructed slices. As this extension is created by nabu
|
247
|
+
the cor reference is in absolute.
|
248
|
+
:param str file_format: file format of the reconstruction
|
249
|
+
|
250
|
+
:return: a dict with absolute cor value as key and the Volume identifier as value
|
251
|
+
"""
|
252
|
+
_logger.info("Deduce volume identifiers for nabu-multicor")
|
253
|
+
if isinstance(slice_index, str):
|
254
|
+
slice_index = slice_index_to_int(
|
255
|
+
slice_index=slice_index,
|
256
|
+
scan=scan,
|
257
|
+
axis=axis, # for now we always expect the multicor to be done along Z
|
258
|
+
)
|
259
|
+
assert isinstance(
|
260
|
+
slice_index, int
|
261
|
+
), "slice_index is expected to be an int or to be converted to it"
|
262
|
+
res = {}
|
263
|
+
if isinstance(scan, EDFTomoScan):
|
264
|
+
entry = "entry"
|
265
|
+
else:
|
266
|
+
entry = scan.entry
|
267
|
+
|
268
|
+
for cor in cors:
|
269
|
+
file_path = os.path.join(
|
270
|
+
location,
|
271
|
+
f"{file_prefix}_{cor:.3f}_{str(slice_index).zfill(5)}.{file_format}",
|
272
|
+
)
|
273
|
+
|
274
|
+
if file_format in ("hdf5", "h5", "hdf"):
|
275
|
+
file_path = os.path.join(
|
276
|
+
location,
|
277
|
+
f"{file_prefix}_{cor:.3f}_{str(slice_index).zfill(5)}.{file_format}",
|
278
|
+
)
|
279
|
+
volume = HDF5Volume(
|
280
|
+
file_path=file_path,
|
281
|
+
data_path="/".join([entry, "reconstruction"]),
|
282
|
+
)
|
283
|
+
elif file_format in ("vol", "raw"):
|
284
|
+
volume = (RawVolume(file_path=file_path),)
|
285
|
+
elif file_format in ("jp2", "jp2k", "edf", "tiff"):
|
286
|
+
if file_format in ("jp2k", "jp2"):
|
287
|
+
constructor = JP2KVolume
|
288
|
+
elif file_format == "edf":
|
289
|
+
constructor = EDFVolume
|
290
|
+
elif file_format == "tiff":
|
291
|
+
constructor = TIFFVolume
|
292
|
+
else:
|
293
|
+
raise NotImplementedError
|
294
|
+
file_path = location
|
295
|
+
volume = constructor(
|
296
|
+
folder=os.path.dirname(file_path),
|
297
|
+
volume_basename=os.path.basename(file_path),
|
298
|
+
)
|
299
|
+
else:
|
300
|
+
raise ValueError(f"file_format {file_format} is not handled for now")
|
301
|
+
res[cor] = volume.get_identifier()
|
302
|
+
return res
|
303
|
+
|
304
|
+
|
226
305
|
class _NabuMode(_Enum):
|
227
306
|
FULL_FIELD = "standard acquisition"
|
228
307
|
HALF_ACQ = "half acquisition"
|
@@ -302,24 +381,6 @@ class _NabuProcessing(_Enum):
|
|
302
381
|
return (_NabuProcessing.RECONSTRUCTION,)
|
303
382
|
|
304
383
|
|
305
|
-
class ConfigurationLevel(_Enum):
|
306
|
-
REQUIRED = "required"
|
307
|
-
OPTIONAL = "optional"
|
308
|
-
ADVANCED = "advanced"
|
309
|
-
|
310
|
-
def _get_num_value(self) -> int:
|
311
|
-
if self is self.REQUIRED:
|
312
|
-
return 0
|
313
|
-
elif self is self.OPTIONAL:
|
314
|
-
return 1
|
315
|
-
elif self is self.ADVANCED:
|
316
|
-
return 2
|
317
|
-
|
318
|
-
def __le__(self, other):
|
319
|
-
assert isinstance(other, ConfigurationLevel)
|
320
|
-
return self._get_num_value() <= other._get_num_value()
|
321
|
-
|
322
|
-
|
323
384
|
class _NabuPostProcessing(_Enum):
|
324
385
|
"""Define all the post processing action available"""
|
325
386
|
|
@@ -374,9 +435,12 @@ class _NabuPaddingType(_Enum):
|
|
374
435
|
EDGES = "edges"
|
375
436
|
|
376
437
|
|
377
|
-
class
|
438
|
+
class RingCorrectionMethod(_Enum):
|
378
439
|
NONE = "None"
|
379
440
|
MUNCH = "munch"
|
441
|
+
VO = "vo"
|
442
|
+
MEAN_SUBTRACTION = "mean-subtraction"
|
443
|
+
MEAN_DIVISION = "mean-division"
|
380
444
|
|
381
445
|
|
382
446
|
def nabu_std_err_has_error(errs: typing.Optional[bytes]):
|
@@ -390,10 +454,19 @@ def nabu_std_err_has_error(errs: typing.Optional[bytes]):
|
|
390
454
|
return (
|
391
455
|
"warning" in line
|
392
456
|
or "Warning" in line
|
457
|
+
or "cupyx.jit.rawkernel" in line
|
393
458
|
or "deprecated" in line
|
394
459
|
or line.replace(" ", "") == ""
|
395
460
|
or "unable to load" in line
|
396
461
|
or "deprecated" in line
|
462
|
+
or "self.module = SourceModule(self.src, **self.sourcemodule_kwargs)"
|
463
|
+
in line
|
464
|
+
or "return SourceModule(" in line
|
465
|
+
or "CUBLAS" in line
|
466
|
+
or "Not supported for EDF"
|
467
|
+
in line # debatable but very disturbing from the gui side... anyway EDF days are coming to an end
|
468
|
+
or "PerformanceWarning" in line
|
469
|
+
or "jitify._init_module()" in line
|
397
470
|
)
|
398
471
|
|
399
472
|
if errs is None:
|
@@ -435,3 +508,68 @@ def update_cfg_file_after_transfer(config_file_path, old_path, new_path):
|
|
435
508
|
config=config_as_dict,
|
436
509
|
options_level="advanced",
|
437
510
|
)
|
511
|
+
|
512
|
+
|
513
|
+
def slice_index_to_int(
|
514
|
+
slice_index: typing.Union[int, str],
|
515
|
+
scan: TomwerScanBase,
|
516
|
+
axis=NabuPlane.XY,
|
517
|
+
) -> int:
|
518
|
+
"""
|
519
|
+
cast a slice to an index. The slice can be a string in ['first', 'last', 'middle']
|
520
|
+
"""
|
521
|
+
axis = NabuPlane.from_value(axis)
|
522
|
+
if slice_index == "fisrt":
|
523
|
+
return 0
|
524
|
+
elif slice_index == "last":
|
525
|
+
if scan is None:
|
526
|
+
# backward compatibility in the case the scan is not provided. Should not happen anymore
|
527
|
+
_logger.warning("Scan not provided. Consider the 2048 width detector")
|
528
|
+
return 2047
|
529
|
+
elif scan.dim_2 is not None:
|
530
|
+
return scan.dim_2 - 1
|
531
|
+
else:
|
532
|
+
# this could happen on some EDF scans. Not expected to happen for HDF5
|
533
|
+
_logger.warning("unable to get dim size, guess this is 2048 width")
|
534
|
+
# in this
|
535
|
+
return 2047
|
536
|
+
elif slice_index == "middle":
|
537
|
+
if scan is None:
|
538
|
+
# backward compatibility in the case the scan is not provided. Should not happen anymore
|
539
|
+
_logger.warning("Scan not provided. Consider the 1024 width detector")
|
540
|
+
# default middle.
|
541
|
+
return 1024
|
542
|
+
elif axis is NabuPlane.XY:
|
543
|
+
if scan.dim_2 is None:
|
544
|
+
_logger.warning("unable to get dim size, guess this is 2048 height")
|
545
|
+
return 1024
|
546
|
+
else:
|
547
|
+
return scan.dim_2 // 2
|
548
|
+
elif axis in (NabuPlane.YZ, NabuPlane.XZ):
|
549
|
+
if scan.dim_1 is None:
|
550
|
+
_logger.warning("unable to get dim size, guess this is 2048 width")
|
551
|
+
return 1024
|
552
|
+
else:
|
553
|
+
return scan.dim_1 // 2
|
554
|
+
else:
|
555
|
+
raise ValueError(f"axis {axis} is not handled")
|
556
|
+
else:
|
557
|
+
return int(slice_index)
|
558
|
+
|
559
|
+
|
560
|
+
def get_nabu_multicor_file_prefix(scan):
|
561
|
+
if isinstance(scan, EDFTomoScan):
|
562
|
+
dataset_path = scan.path
|
563
|
+
elif isinstance(scan, NXtomoScan):
|
564
|
+
dataset_path = scan.master_file
|
565
|
+
else:
|
566
|
+
raise TypeError(f"{type(scan)} is not handled")
|
567
|
+
|
568
|
+
if os.path.isfile(dataset_path): # hdf5
|
569
|
+
file_prefix = os.path.basename(dataset_path).split(".")[0]
|
570
|
+
elif os.path.isdir(dataset_path):
|
571
|
+
file_prefix = os.path.basename(dataset_path)
|
572
|
+
else:
|
573
|
+
raise ValueError(f"dataset location {scan.path} is neither a file or directory")
|
574
|
+
file_prefix += "_rec" # avoid overwriting dataset
|
575
|
+
return file_prefix
|
@@ -0,0 +1,108 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
import os
|
3
|
+
import logging
|
4
|
+
from silx.utils.enum import Enum as _Enum
|
5
|
+
from tomwer.io.utils.raw_and_processed_data import (
|
6
|
+
to_processed_data_path,
|
7
|
+
to_raw_data_path,
|
8
|
+
)
|
9
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
10
|
+
from tomwer.core.utils.scanutils import format_output_location
|
11
|
+
|
12
|
+
_logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
|
15
|
+
PROCESS_FOLDER_NAME = "reconstructed_volumes"
|
16
|
+
|
17
|
+
|
18
|
+
class ProcessDataOutputDirMode(_Enum):
|
19
|
+
IN_SCAN_FOLDER = "same folder as scan"
|
20
|
+
PROCESSED_DATA_FOLDER = "PROCESSED_DATA folder"
|
21
|
+
RAW_DATA_FOLDER = "RAW_DATA folder"
|
22
|
+
OTHER = "other"
|
23
|
+
|
24
|
+
|
25
|
+
class NabuOutputFileFormat(_Enum):
|
26
|
+
TIFF = "tiff"
|
27
|
+
HDF5 = "hdf5"
|
28
|
+
JP2K = "jp2"
|
29
|
+
EDF = "edf"
|
30
|
+
RAW = "vol"
|
31
|
+
|
32
|
+
@classmethod
|
33
|
+
def from_value(cls, value):
|
34
|
+
if isinstance(value, str):
|
35
|
+
value = value.lstrip(".")
|
36
|
+
return super().from_value(value)
|
37
|
+
|
38
|
+
|
39
|
+
def get_file_format(file_str):
|
40
|
+
extension = os.path.splitext(file_str.lower())[-1]
|
41
|
+
extension = extension.lstrip(".")
|
42
|
+
if extension in ("tiff", "tif"):
|
43
|
+
return NabuOutputFileFormat.TIFF
|
44
|
+
elif extension in ("hdf5", "hdf", "h5"):
|
45
|
+
return NabuOutputFileFormat.HDF5
|
46
|
+
elif extension in ("jp2", "jp2k", "jpg2k"):
|
47
|
+
return NabuOutputFileFormat.JP2K
|
48
|
+
elif extension in ("edf",):
|
49
|
+
return NabuOutputFileFormat.EDF
|
50
|
+
elif extension in ("vol", "raw"):
|
51
|
+
return NabuOutputFileFormat.RAW
|
52
|
+
else:
|
53
|
+
raise ValueError(f"Unrecognized file extension {extension} from {file_str}")
|
54
|
+
|
55
|
+
|
56
|
+
def get_output_folder_from_scan(
|
57
|
+
mode: ProcessDataOutputDirMode,
|
58
|
+
scan: TomwerScanBase,
|
59
|
+
nabu_location: str | None,
|
60
|
+
file_basename: str,
|
61
|
+
file_format: NabuOutputFileFormat,
|
62
|
+
) -> tuple[str, str]:
|
63
|
+
"""
|
64
|
+
:return: (location, location_cfg_files). Location is the nabu configuration field 'output/location' 'location_cfg_files' is the information on where to save the nabu configuration file
|
65
|
+
|
66
|
+
"""
|
67
|
+
output_mode = ProcessDataOutputDirMode.from_value(mode)
|
68
|
+
file_format = NabuOutputFileFormat.from_value(file_format)
|
69
|
+
|
70
|
+
if output_mode is ProcessDataOutputDirMode.OTHER and nabu_location in ("", None):
|
71
|
+
_logger.info(
|
72
|
+
"output dir requested is other bit no path provided. Fall back on the output dir to the scan folder"
|
73
|
+
)
|
74
|
+
# note: this is only an info because we expect to pass by this one for all .ows configuration (before 1.3 version)
|
75
|
+
# as there was no different option by the time
|
76
|
+
output_mode = ProcessDataOutputDirMode.IN_SCAN_FOLDER
|
77
|
+
|
78
|
+
if output_mode is ProcessDataOutputDirMode.OTHER:
|
79
|
+
assert nabu_location not in (
|
80
|
+
"",
|
81
|
+
None,
|
82
|
+
), "nabu_location not provided when expected"
|
83
|
+
location = format_output_location(nabu_location, scan=scan)
|
84
|
+
location_cfg_files = location
|
85
|
+
elif output_mode in (
|
86
|
+
ProcessDataOutputDirMode.IN_SCAN_FOLDER,
|
87
|
+
ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER,
|
88
|
+
ProcessDataOutputDirMode.RAW_DATA_FOLDER,
|
89
|
+
):
|
90
|
+
# otherwise default location will be the data root level
|
91
|
+
location = os.path.join(scan.path, PROCESS_FOLDER_NAME)
|
92
|
+
location_cfg_files = location
|
93
|
+
if file_format in (
|
94
|
+
NabuOutputFileFormat.EDF.value,
|
95
|
+
NabuOutputFileFormat.TIFF.value,
|
96
|
+
NabuOutputFileFormat.JP2K.value,
|
97
|
+
): # if user specify the location
|
98
|
+
location = "/".join([location, file_basename])
|
99
|
+
if output_mode is ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER:
|
100
|
+
location = to_processed_data_path(location)
|
101
|
+
location_cfg_files = to_processed_data_path(location_cfg_files)
|
102
|
+
if output_mode is ProcessDataOutputDirMode.RAW_DATA_FOLDER:
|
103
|
+
location = to_raw_data_path(location)
|
104
|
+
location_cfg_files = to_raw_data_path(location_cfg_files)
|
105
|
+
else:
|
106
|
+
raise NotImplementedError(f"mode {output_mode.value} is not implemented yet")
|
107
|
+
|
108
|
+
return location, location_cfg_files
|