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
tomwer/core/utils/__init__.py
CHANGED
@@ -1,466 +0,0 @@
|
|
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__ = "17/05/2017"
|
29
|
-
|
30
|
-
import fileinput
|
31
|
-
import logging
|
32
|
-
import os
|
33
|
-
import shutil
|
34
|
-
from urllib.request import urlopen
|
35
|
-
|
36
|
-
import fabio.edfimage
|
37
|
-
import psutil
|
38
|
-
from lxml import etree
|
39
|
-
from tomoscan.unitsystem import metricsystem
|
40
|
-
|
41
|
-
from tomwer.core import settings
|
42
|
-
|
43
|
-
logger = logging.getLogger(__name__)
|
44
|
-
|
45
|
-
MOCK_LOW_MEM = False # if True will simulate the case the computer run into low memory
|
46
|
-
|
47
|
-
IGNORE_LOW_MEM = False
|
48
|
-
|
49
|
-
|
50
|
-
def isLowOnMemory(path=""):
|
51
|
-
"""
|
52
|
-
|
53
|
-
:return: True if the RAM usage is more than MAX_MEM_USED (or low memory
|
54
|
-
is simulated)
|
55
|
-
"""
|
56
|
-
if IGNORE_LOW_MEM is True:
|
57
|
-
return False
|
58
|
-
if path == settings.get_dest_path():
|
59
|
-
if settings.MOCK_LBSRAM is True:
|
60
|
-
return MOCK_LOW_MEM
|
61
|
-
else:
|
62
|
-
assert os.path.isdir(path)
|
63
|
-
return psutil.disk_usage(path).percent > settings.MAX_MEM_USED
|
64
|
-
else:
|
65
|
-
return (MOCK_LOW_MEM is True) or (
|
66
|
-
os.path.exists(path)
|
67
|
-
and (psutil.disk_usage(path).percent > settings.MAX_MEM_USED)
|
68
|
-
)
|
69
|
-
|
70
|
-
|
71
|
-
def ignoreLowMemory(value=True):
|
72
|
-
"""ignore the low memory information"""
|
73
|
-
global IGNORE_LOW_MEM
|
74
|
-
IGNORE_LOW_MEM = value
|
75
|
-
|
76
|
-
|
77
|
-
def mockLowMemory(b=True):
|
78
|
-
"""Mock the case the computer is running into low memory"""
|
79
|
-
global MOCK_LOW_MEM
|
80
|
-
MOCK_LOW_MEM = b
|
81
|
-
return psutil.virtual_memory().percent > settings.MAX_MEM_USED
|
82
|
-
|
83
|
-
|
84
|
-
def _getInformation(scan, refFile, information, _type, aliases=None):
|
85
|
-
"""
|
86
|
-
Parse files contained in the given directory to get the requested
|
87
|
-
information
|
88
|
-
|
89
|
-
:param scan: directory containing the acquisition. Must be an absolute path
|
90
|
-
:param refFile: the refXXXX_YYYY which should contain information about the
|
91
|
-
scan.
|
92
|
-
:return: the requested information or None if not found
|
93
|
-
"""
|
94
|
-
|
95
|
-
def parseRefFile(filePath):
|
96
|
-
header = fabio.open(filePath).header
|
97
|
-
for k in aliases:
|
98
|
-
if k in header:
|
99
|
-
return _type(header[k])
|
100
|
-
return None
|
101
|
-
|
102
|
-
def parseXMLFile(filePath):
|
103
|
-
try:
|
104
|
-
for alias in info_aliases:
|
105
|
-
tree = etree.parse(filePath)
|
106
|
-
elmt = tree.find("acquisition/" + alias)
|
107
|
-
if elmt is None:
|
108
|
-
continue
|
109
|
-
else:
|
110
|
-
info = _type(elmt.text)
|
111
|
-
if info == -1:
|
112
|
-
return None
|
113
|
-
else:
|
114
|
-
return info
|
115
|
-
except etree.XMLSyntaxError as e:
|
116
|
-
logger.warning(e)
|
117
|
-
return None
|
118
|
-
|
119
|
-
def parseInfoFile(filePath):
|
120
|
-
def extractInformation(text, alias):
|
121
|
-
text = text.replace(alias, "")
|
122
|
-
text = text.replace("\n", "")
|
123
|
-
text = text.replace(" ", "")
|
124
|
-
text = text.replace("=", "")
|
125
|
-
return _type(text)
|
126
|
-
|
127
|
-
info = None
|
128
|
-
f = open(filePath, "r")
|
129
|
-
line = f.readline()
|
130
|
-
while line:
|
131
|
-
for alias in info_aliases:
|
132
|
-
if alias in line:
|
133
|
-
info = extractInformation(line, alias)
|
134
|
-
break
|
135
|
-
line = f.readline()
|
136
|
-
f.close()
|
137
|
-
return info
|
138
|
-
|
139
|
-
info_aliases = [information]
|
140
|
-
if aliases is not None:
|
141
|
-
assert type(aliases) in (tuple, list)
|
142
|
-
[info_aliases.append(alias) for alias in aliases]
|
143
|
-
|
144
|
-
if not os.path.isdir(scan):
|
145
|
-
return None
|
146
|
-
|
147
|
-
if refFile is not None and os.path.isfile(refFile):
|
148
|
-
try:
|
149
|
-
info = parseRefFile(refFile)
|
150
|
-
except IOError as e:
|
151
|
-
logger.warning(e)
|
152
|
-
else:
|
153
|
-
if info is not None:
|
154
|
-
return info
|
155
|
-
|
156
|
-
baseName = os.path.basename(scan)
|
157
|
-
infoFiles = [os.path.join(scan, baseName + ".info")]
|
158
|
-
infoOnDataVisitor = infoFiles[0].replace("lbsram", "", 1)
|
159
|
-
# hack to check in lbsram, would need to be removed to add some consistency
|
160
|
-
if os.path.isfile(infoOnDataVisitor):
|
161
|
-
infoFiles.append(infoOnDataVisitor)
|
162
|
-
for infoFile in infoFiles:
|
163
|
-
if os.path.isfile(infoFile) is True:
|
164
|
-
info = parseInfoFile(infoFile)
|
165
|
-
if info is not None:
|
166
|
-
return info
|
167
|
-
|
168
|
-
xmlFiles = [os.path.join(scan, baseName + ".xml")]
|
169
|
-
xmlOnDataVisitor = xmlFiles[0].replace("lbsram", "", 1)
|
170
|
-
# hack to check in lbsram, would need to be removed to add some consistency
|
171
|
-
if os.path.isfile(xmlOnDataVisitor):
|
172
|
-
xmlFiles.append(xmlOnDataVisitor)
|
173
|
-
for xmlFile in xmlFiles:
|
174
|
-
if os.path.isfile(xmlFile) is True:
|
175
|
-
info = parseXMLFile(xmlFile)
|
176
|
-
if info is not None:
|
177
|
-
return info
|
178
|
-
|
179
|
-
return None
|
180
|
-
|
181
|
-
|
182
|
-
def getClosestEnergy(scan, refFile=None):
|
183
|
-
"""
|
184
|
-
Parse files contained in the given directory to get information about the
|
185
|
-
incoming energy for the serie `iSerie`
|
186
|
-
|
187
|
-
:param scan: directory containing the acquisition
|
188
|
-
:param refFile: the refXXXX_YYYY which should contain information about the
|
189
|
-
energy.
|
190
|
-
:return: the energy in keV or none if no energy found
|
191
|
-
"""
|
192
|
-
return _getInformation(
|
193
|
-
os.path.abspath(scan),
|
194
|
-
refFile,
|
195
|
-
information="Energy",
|
196
|
-
aliases=["energy", "ENERGY"],
|
197
|
-
_type=float,
|
198
|
-
)
|
199
|
-
|
200
|
-
|
201
|
-
def getClosestSRCurrent(scan_dir, refFile=None):
|
202
|
-
"""
|
203
|
-
Parse files contained in the given directory to get information about the
|
204
|
-
incoming energy for the serie `iSerie`
|
205
|
-
|
206
|
-
:param scan_dir: directory containing the acquisition
|
207
|
-
:param refFile: the refXXXX_YYYY which should contain information about the
|
208
|
-
energy.
|
209
|
-
:return: the energy in keV or none if no energy found
|
210
|
-
"""
|
211
|
-
return _getInformation(
|
212
|
-
os.path.abspath(scan_dir),
|
213
|
-
refFile,
|
214
|
-
information="SRCUR",
|
215
|
-
aliases=["SrCurrent", "machineCurrentStart"],
|
216
|
-
_type=float,
|
217
|
-
)
|
218
|
-
|
219
|
-
|
220
|
-
def getSRCurrent(scan_dir, when):
|
221
|
-
assert when in ("start", "end")
|
222
|
-
xmlFiles = [
|
223
|
-
os.path.join(os.path.abspath(scan_dir), os.path.basename(scan_dir) + ".xml")
|
224
|
-
]
|
225
|
-
xmlOnDataVisitor = xmlFiles[0].replace("lbsram", "", 1)
|
226
|
-
# hack to check in lbsram, would need to be removed to add some consistency
|
227
|
-
if os.path.isfile(xmlOnDataVisitor):
|
228
|
-
xmlFiles.append(xmlOnDataVisitor)
|
229
|
-
for xmlFile in xmlFiles:
|
230
|
-
if os.path.isfile(xmlFile):
|
231
|
-
try:
|
232
|
-
tree = etree.parse(xmlFile)
|
233
|
-
key = "machineCurrentStart" if when == "start" else "machineCurrentStop"
|
234
|
-
elmt = tree.find("acquisition/" + key)
|
235
|
-
if elmt is None:
|
236
|
-
return None
|
237
|
-
else:
|
238
|
-
info = float(elmt.text)
|
239
|
-
if info == -1:
|
240
|
-
return None
|
241
|
-
else:
|
242
|
-
return info
|
243
|
-
except etree.XMLSyntaxError as e:
|
244
|
-
logger.warning(e)
|
245
|
-
return None
|
246
|
-
return None
|
247
|
-
|
248
|
-
|
249
|
-
# TODO : should be moved in the scan module
|
250
|
-
def getTomo_N(scan):
|
251
|
-
"""Return the number of radio taken"""
|
252
|
-
return _getInformation(
|
253
|
-
os.path.abspath(scan),
|
254
|
-
refFile=None,
|
255
|
-
information="TOMO_N",
|
256
|
-
_type=int,
|
257
|
-
aliases=["tomo_N", "Tomo_N"],
|
258
|
-
)
|
259
|
-
|
260
|
-
|
261
|
-
# TODO mv to scan module
|
262
|
-
def getScanRange(scan):
|
263
|
-
return _getInformation(
|
264
|
-
os.path.abspath(scan),
|
265
|
-
refFile=None,
|
266
|
-
information="ScanRange",
|
267
|
-
_type=int,
|
268
|
-
aliases=["scanRange"],
|
269
|
-
)
|
270
|
-
|
271
|
-
|
272
|
-
# TODO: mv to scan module
|
273
|
-
def getDARK_N(scan):
|
274
|
-
return _getInformation(
|
275
|
-
os.path.abspath(scan),
|
276
|
-
refFile=None,
|
277
|
-
information="DARK_N",
|
278
|
-
_type=int,
|
279
|
-
aliases=["dark_N"],
|
280
|
-
)
|
281
|
-
|
282
|
-
|
283
|
-
def getRef_N(scan):
|
284
|
-
return _getInformation(
|
285
|
-
os.path.abspath(scan),
|
286
|
-
refFile=None,
|
287
|
-
information="REF_N",
|
288
|
-
_type=int,
|
289
|
-
aliases=["ref_N"],
|
290
|
-
)
|
291
|
-
|
292
|
-
|
293
|
-
def getRefOn(scan):
|
294
|
-
return _getInformation(
|
295
|
-
os.path.abspath(scan),
|
296
|
-
refFile=None,
|
297
|
-
information="REF_ON",
|
298
|
-
_type=int,
|
299
|
-
aliases=["ref_On"],
|
300
|
-
)
|
301
|
-
|
302
|
-
|
303
|
-
def rebaseParFile(_file, oldfolder, newfolder):
|
304
|
-
"""Update the given .par file to replace oldfolder location by the newfolder.
|
305
|
-
|
306
|
-
.. warning:: make the replacement in place.
|
307
|
-
|
308
|
-
:param _file: par file to update
|
309
|
-
:param oldfolder: previous location of the .par file
|
310
|
-
:param newfolder: new location of the .par file
|
311
|
-
"""
|
312
|
-
with fileinput.FileInput(_file, inplace=True, backup=".bak") as parfile:
|
313
|
-
for line in parfile:
|
314
|
-
line = line.rstrip().replace(oldfolder, newfolder, 1)
|
315
|
-
print(line)
|
316
|
-
|
317
|
-
|
318
|
-
# TODO: move to scan module
|
319
|
-
def getDim1Dim2(scan):
|
320
|
-
"""
|
321
|
-
|
322
|
-
:param scan: path to the acquisition
|
323
|
-
:return: detector definition
|
324
|
-
:rtype: tuple of int
|
325
|
-
"""
|
326
|
-
d1 = _getInformation(
|
327
|
-
scan=scan,
|
328
|
-
refFile=None,
|
329
|
-
information="Dim_1",
|
330
|
-
aliases=["projectionSize/DIM_1"],
|
331
|
-
_type=int,
|
332
|
-
)
|
333
|
-
d2 = _getInformation(
|
334
|
-
scan=scan,
|
335
|
-
refFile=None,
|
336
|
-
information="Dim_2",
|
337
|
-
aliases=["projectionSize/DIM_2"],
|
338
|
-
_type=int,
|
339
|
-
)
|
340
|
-
return d1, d2
|
341
|
-
|
342
|
-
|
343
|
-
# TODO: move to scan module
|
344
|
-
def getParametersFromParOrInfo(_file):
|
345
|
-
"""
|
346
|
-
Create a dictionary from the file with the information name as keys and
|
347
|
-
their values as values
|
348
|
-
"""
|
349
|
-
assert os.path.exists(_file) and os.path.isfile(_file)
|
350
|
-
ddict = {}
|
351
|
-
f = open(_file, "r")
|
352
|
-
lines = f.readlines()
|
353
|
-
for line in lines:
|
354
|
-
if "=" not in line:
|
355
|
-
continue
|
356
|
-
line_str = line.replace(" ", "")
|
357
|
-
line_str = line_str.rstrip("\n")
|
358
|
-
# remove on the line comments
|
359
|
-
if "#" in line_str:
|
360
|
-
line_str = line_str.split("#")[0]
|
361
|
-
if line_str == "":
|
362
|
-
continue
|
363
|
-
try:
|
364
|
-
key, value = line_str.split("=")
|
365
|
-
except ValueError:
|
366
|
-
logger.error('fail to extract information from "%s"' % line_str)
|
367
|
-
else:
|
368
|
-
ddict[key.lower()] = value
|
369
|
-
return ddict
|
370
|
-
|
371
|
-
|
372
|
-
# TODO: move to scan module
|
373
|
-
def getFirstProjFile(scan):
|
374
|
-
"""Return the first .edf containing a projection"""
|
375
|
-
if os.path.isdir(scan) is False:
|
376
|
-
return None
|
377
|
-
files = sorted(os.listdir(scan))
|
378
|
-
|
379
|
-
while (
|
380
|
-
len(files) > 0
|
381
|
-
and (files[0].startswith(os.path.basename(scan)) and files[0].endswith(".edf"))
|
382
|
-
is False
|
383
|
-
):
|
384
|
-
files.remove(files[0])
|
385
|
-
|
386
|
-
if len(files) > 0:
|
387
|
-
return os.path.join(scan, files[0])
|
388
|
-
else:
|
389
|
-
return None
|
390
|
-
|
391
|
-
|
392
|
-
def getPixelSize(scan):
|
393
|
-
"""
|
394
|
-
Try to retrieve the pixel size from the set of files.
|
395
|
-
|
396
|
-
:return: the pixel size in meter or None
|
397
|
-
:rtype: None or float
|
398
|
-
"""
|
399
|
-
if os.path.isdir(scan) is False:
|
400
|
-
return None
|
401
|
-
value = _getInformation(
|
402
|
-
scan=scan,
|
403
|
-
refFile=None,
|
404
|
-
information="PixelSize",
|
405
|
-
_type=float,
|
406
|
-
aliases=["pixelSize"],
|
407
|
-
)
|
408
|
-
if value is None:
|
409
|
-
parFile = os.path.join(scan, os.path.basename(scan) + ".par")
|
410
|
-
if os.path.exists(parFile):
|
411
|
-
ddict = getParametersFromParOrInfo(parFile)
|
412
|
-
if "IMAGE_PIXEL_SIZE_1".lower() in ddict:
|
413
|
-
value = float(ddict["IMAGE_PIXEL_SIZE_1".lower()])
|
414
|
-
# for now pixel size are stored in microns. We want to return them in meter
|
415
|
-
if value is not None:
|
416
|
-
return value * metricsystem.micrometer.value
|
417
|
-
else:
|
418
|
-
return None
|
419
|
-
|
420
|
-
|
421
|
-
url_base = "http://www.edna-site.org/pub/tomwer/"
|
422
|
-
|
423
|
-
|
424
|
-
def DownloadDataset(dataset, output_folder, timeout, unpack=False):
|
425
|
-
# create if needed path scan
|
426
|
-
url = url_base + dataset
|
427
|
-
|
428
|
-
logger.info("Trying to download scan %s, timeout set to %ss", dataset, timeout)
|
429
|
-
logger.info("wget %s" % url)
|
430
|
-
|
431
|
-
data = urlopen(url, data=None, timeout=timeout).read()
|
432
|
-
logger.info("Image %s successfully downloaded." % dataset)
|
433
|
-
|
434
|
-
if not os.path.isdir(output_folder):
|
435
|
-
os.makedirs(output_folder)
|
436
|
-
|
437
|
-
try:
|
438
|
-
archive_folder = os.path.join(output_folder, os.path.basename(dataset))
|
439
|
-
with open(archive_folder, "wb") as outfile:
|
440
|
-
outfile.write(data)
|
441
|
-
except IOError:
|
442
|
-
raise IOError(
|
443
|
-
"unable to write downloaded \
|
444
|
-
data to disk at %s"
|
445
|
-
% archive_folder
|
446
|
-
)
|
447
|
-
|
448
|
-
if unpack is True:
|
449
|
-
shutil.unpack_archive(archive_folder, extract_dir=output_folder, format="bztar")
|
450
|
-
os.remove(archive_folder)
|
451
|
-
|
452
|
-
|
453
|
-
def concatenate_dict(dict_1, dict_2) -> dict:
|
454
|
-
"""update dict which has dict as values. And we want concatenate those values to"""
|
455
|
-
res = dict_1.copy()
|
456
|
-
for key in dict_2:
|
457
|
-
if key in dict_1:
|
458
|
-
if key in [f"axis_{axis}_params" for axis in (0, 1, 2)]:
|
459
|
-
res[key] = ";".join((dict_1[key], dict_2[key]))
|
460
|
-
elif isinstance(dict_1[key], dict):
|
461
|
-
res[key] = concatenate_dict(dict_1=dict_1[key], dict_2=dict_2[key])
|
462
|
-
else:
|
463
|
-
res.update({key: dict_2[key]})
|
464
|
-
else:
|
465
|
-
res[key] = dict_2[key]
|
466
|
-
return res
|
tomwer/core/utils/deprecation.py
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
def concatenate_dict(dict_1, dict_2) -> dict:
|
2
|
+
"""update dict which has dict as values. And we want concatenate those values to"""
|
3
|
+
res = dict_1.copy()
|
4
|
+
for key in dict_2:
|
5
|
+
if key in dict_1:
|
6
|
+
if key in [f"axis_{axis}_params" for axis in (0, 1, 2)]:
|
7
|
+
res[key] = ";".join((dict_1[key], dict_2[key]))
|
8
|
+
elif isinstance(dict_1[key], dict):
|
9
|
+
res[key] = concatenate_dict(dict_1=dict_1[key], dict_2=dict_2[key])
|
10
|
+
else:
|
11
|
+
res.update({key: dict_2[key]})
|
12
|
+
else:
|
13
|
+
res[key] = dict_2[key]
|
14
|
+
return res
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import os
|
2
|
+
import psutil
|
3
|
+
from tomwer.core import settings
|
4
|
+
|
5
|
+
MOCK_LOW_MEM = False # if True will simulate the case the computer run into low memory
|
6
|
+
|
7
|
+
IGNORE_LOW_MEM = False
|
8
|
+
|
9
|
+
|
10
|
+
def is_low_on_memory(path=""):
|
11
|
+
"""
|
12
|
+
|
13
|
+
:return: True if the RAM usage is more than MAX_MEM_USED (or low memory
|
14
|
+
is simulated)
|
15
|
+
"""
|
16
|
+
if IGNORE_LOW_MEM is True:
|
17
|
+
return False
|
18
|
+
if path == settings.get_dest_path():
|
19
|
+
if settings.MOCK_LBSRAM is True:
|
20
|
+
return MOCK_LOW_MEM
|
21
|
+
else:
|
22
|
+
assert os.path.isdir(path)
|
23
|
+
return psutil.disk_usage(path).percent > settings.MAX_MEM_USED
|
24
|
+
else:
|
25
|
+
return (MOCK_LOW_MEM is True) or (
|
26
|
+
os.path.exists(path)
|
27
|
+
and (psutil.disk_usage(path).percent > settings.MAX_MEM_USED)
|
28
|
+
)
|
29
|
+
|
30
|
+
|
31
|
+
def mock_low_memory(b=True):
|
32
|
+
"""Mock the case the computer is running into low memory"""
|
33
|
+
global MOCK_LOW_MEM
|
34
|
+
MOCK_LOW_MEM = b
|
35
|
+
return psutil.virtual_memory().percent > settings.MAX_MEM_USED
|
tomwer/core/utils/nxtomoutils.py
CHANGED
@@ -31,7 +31,7 @@ __date__ = "02/12/2021"
|
|
31
31
|
from typing import Union
|
32
32
|
|
33
33
|
import numpy
|
34
|
-
from
|
34
|
+
from nxtomo.nxobject.nxdetector import ImageKey
|
35
35
|
|
36
36
|
|
37
37
|
def get_n_series(image_key_values: Union[tuple, list], image_key_type: ImageKey) -> int:
|
tomwer/core/utils/scanutils.py
CHANGED
@@ -38,21 +38,21 @@ import h5py
|
|
38
38
|
import numpy
|
39
39
|
from silx.io.utils import h5py_read_dataset
|
40
40
|
from tomoscan.esrf.scan.mock import MockEDF as _MockEDF
|
41
|
-
from tomoscan.esrf.scan.mock import
|
41
|
+
from tomoscan.esrf.scan.mock import MockNXtomo as _MockNXtomo
|
42
42
|
from tomoscan.io import HDF5File
|
43
43
|
from tomoscan.test.utils import MockContext
|
44
44
|
|
45
45
|
from tomwer.core.scan.blissscan import BlissScan
|
46
|
-
from tomwer.core.scan.
|
46
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
47
47
|
from tomwer.core.scan.scanfactory import ScanFactory
|
48
48
|
|
49
49
|
_logger = logging.getLogger(__name__)
|
50
50
|
|
51
51
|
|
52
|
-
class
|
52
|
+
class MockNXtomo(_MockNXtomo):
|
53
53
|
def __init__(self, *args, **kwargs):
|
54
54
|
super().__init__(*args, **kwargs)
|
55
|
-
self.scan =
|
55
|
+
self.scan = NXtomoScan(scan=self.scan_master_file, entry="entry")
|
56
56
|
|
57
57
|
|
58
58
|
class MockEDF(_MockEDF):
|
@@ -383,7 +383,7 @@ class MockBlissAcquisition:
|
|
383
383
|
)
|
384
384
|
|
385
385
|
|
386
|
-
class HDF5MockContext(MockContext, mock_class=
|
386
|
+
class HDF5MockContext(MockContext, mock_class=MockNXtomo):
|
387
387
|
"""
|
388
388
|
Util class to provide a context with a new Mock HDF5 file
|
389
389
|
"""
|
@@ -395,7 +395,7 @@ class HDF5MockContext(MockContext, mock_class=MockHDF5):
|
|
395
395
|
self._scan_path = scan_path
|
396
396
|
|
397
397
|
def __enter__(self):
|
398
|
-
return
|
398
|
+
return MockNXtomo(
|
399
399
|
scan_path=self._scan_path, n_proj=self._n_proj, **self._mocks_params
|
400
400
|
).scan
|
401
401
|
|