nxtomomill 2.1.0.dev3__tar.gz → 2.1.0.dev4__tar.gz
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.
- {nxtomomill-2.1.0.dev3/nxtomomill.egg-info → nxtomomill-2.1.0.dev4}/PKG-INFO +2 -2
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/dxfile2nx.py +15 -1
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/h52nx.py +5 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/dxfileconverter.py +11 -2
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/tests/test_dxfile.py +56 -11
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/edfconverter.py +9 -1
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fscan/fscanconverter.py +1 -3
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/baseacquisition.py +2 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/standardacquisition.py +41 -6
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_legacy.py +1 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/tests/test_hdf5converter.py +20 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/confighandler.py +1 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/tests/test_confighandler.py +1 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/dx2nx.py +23 -2
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/detector_section.py +5 -2
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/edf2nx.py +1 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/general_section.py +5 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/h52nx.py +1 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/version.py +1 -1
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4/nxtomomill.egg-info}/PKG-INFO +2 -2
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/SOURCES.txt +0 -1
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/requires.txt +1 -1
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/top_level.txt +0 -1
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/pyproject.toml +1 -1
- nxtomomill-2.1.0.dev3/nxtomomill/converter/edf/_Blosc2Jp2kWrapper.py +0 -63
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/LICENSE +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/README.md +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/doc/conf.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/__main__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/blissfluo2nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/blissfluoconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/edf2nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/edf2nx_check.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/edfconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/fluo2nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/fluoconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/fscan2nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/h5config.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/nxcopy.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/patch_nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/split_nxfile.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_bliss_fluo2nx_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_dxfile2nx_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_edf2nx_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_edf_config_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_fluo2nx_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_h52nx_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_h5_config_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_nx_copy.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_patch_nx_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_split_nxfile_app.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/z_concatenate_scans.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/zstages2nxs.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/baseconverter.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/checks.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/tests/test_checks.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/tests/test_edf2nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/tests/test_edf2nx_check.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/blissfluoscan.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/fluoconverter.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/fluoscan.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/tests/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/tests/test_fluoscan2D.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/tests/test_fluoscan3D.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fscan/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/_bliss_activeconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/backandforth.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/blisstomoconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/multitomo.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/pcotomoacquisition.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/bliss_tomo_datasets.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_acquisition.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_acquisition_utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_back_and_forth.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_bliss_tomo_config.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_holotomo.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_multitomo_zseries.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_multitomoacquisition.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/_context.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/_keys.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/_scan_type_finder.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/bliss_scan_type.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/detector.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/machine_current.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/series.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/timestamps.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/zseriesacquisition.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisitionConstructor.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/hdf5converter.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/post_processing/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/post_processing/dark_flat_copy.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/tests/test_frame_flip.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/tests/test_h52nx_utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/version.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/configbase.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/dxconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/edfconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/fluoconfig.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/hdf5config.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/tests/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/tests/test_frame_group.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/tests/utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/ConfigBase.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/FrmFlatToNestedBase.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/NestedModelBase.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/general_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/instrument_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/source_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/blissfluo2nx/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/blissfluo2nx/blissfluo2nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/blissfluo2nx/general_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/dark_and_flat_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/general_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/keys_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/sample_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/unit_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/fluo2nx/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/fluo2nx/fluo2nx.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/fluo2nx/general_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/FrameGroup.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/_acquisitionstep.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/_context.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/entries_and_title_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/extra_params_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/frame_type_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/keys_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/multitomo_section.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_context.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_edf2nx_model.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_fluo2nx_model.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_h52nx_model.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_io_utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/settings.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/test.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/datasets.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/edf2nx_config_files/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/fluo2nx_config_files/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/h52nx_config_files/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/test_version.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/utils/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/utils/bliss.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/utils/dxfile.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/__init__.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/_os.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/flat_reducer.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/h5pyutils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/hdf5.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/io.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/nexus.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/pintutils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_flat_reducer.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_h5pyutils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_nexus_utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/utils.py +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/dependency_links.txt +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/entry_points.txt +0 -0
- {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nxtomomill
|
|
3
|
-
Version: 2.1.0.
|
|
3
|
+
Version: 2.1.0.dev4
|
|
4
4
|
Summary: applications and library to convert raw format to NXtomo format
|
|
5
5
|
Author-email: Henri Payno <henri.payno@esrf.fr>, Pierre Paleo <pierre.paleo@esrf.fr>, Pierre-Olivier Autran <pierre-olivier.autran@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>
|
|
6
6
|
License:
|
|
@@ -55,7 +55,7 @@ License-File: LICENSE
|
|
|
55
55
|
Requires-Dist: numpy
|
|
56
56
|
Requires-Dist: h5py>=3.0
|
|
57
57
|
Requires-Dist: silx>=2.0
|
|
58
|
-
Requires-Dist: nxtomo>=3.1.
|
|
58
|
+
Requires-Dist: nxtomo>=3.1.0dev1
|
|
59
59
|
Requires-Dist: pint
|
|
60
60
|
Requires-Dist: packaging
|
|
61
61
|
Requires-Dist: tomoscan[full]>=2.2.0a4
|
|
@@ -103,9 +103,16 @@ def main(argv):
|
|
|
103
103
|
"--fov",
|
|
104
104
|
"--field-of-view",
|
|
105
105
|
default=None,
|
|
106
|
-
help="field of view
|
|
106
|
+
help="DEPRECATED: field of view as string. Use --half-acquisition instead.",
|
|
107
107
|
dest="field_of_view",
|
|
108
108
|
)
|
|
109
|
+
parser.add_argument(
|
|
110
|
+
"--half-acquisition",
|
|
111
|
+
help="Use half acquisition instead of full acquisition.",
|
|
112
|
+
action="store_true",
|
|
113
|
+
dest="half_acquisition",
|
|
114
|
+
default=None,
|
|
115
|
+
)
|
|
109
116
|
# as distance is not stored in the dxfile and requested for paganin
|
|
110
117
|
# we provide some default value
|
|
111
118
|
parser.add_argument(
|
|
@@ -139,6 +146,12 @@ def main(argv):
|
|
|
139
146
|
)
|
|
140
147
|
options = parser.parse_args(argv[1:])
|
|
141
148
|
|
|
149
|
+
if options.field_of_view is not None and options.half_acquisition is not None:
|
|
150
|
+
raise ValueError(
|
|
151
|
+
"Cannot use --field-of-view and --half-acquisition together. "
|
|
152
|
+
"Please use --half-acquisition."
|
|
153
|
+
)
|
|
154
|
+
|
|
142
155
|
distance = options.distance
|
|
143
156
|
if distance is not None:
|
|
144
157
|
distance = float(options.distance)
|
|
@@ -163,6 +176,7 @@ def main(argv):
|
|
|
163
176
|
scan_range=convert_2elmts__tuple_to_float(options.scan_range),
|
|
164
177
|
pixel_size=_get_pixel_size(options.pixel_size),
|
|
165
178
|
field_of_view=options.field_of_view,
|
|
179
|
+
half_acquisition=options.half_acquisition,
|
|
166
180
|
distance=distance,
|
|
167
181
|
overwrite=options.overwrite,
|
|
168
182
|
duplicate_data=options.duplicate_data,
|
|
@@ -125,6 +125,11 @@ def main(argv):
|
|
|
125
125
|
"parse raw data to find this information.",
|
|
126
126
|
default=None,
|
|
127
127
|
)
|
|
128
|
+
parser.add_argument(
|
|
129
|
+
"--half-acquisition",
|
|
130
|
+
help="If the scan is an half-acquisition (CoR at the borders of projections).",
|
|
131
|
+
default=None,
|
|
132
|
+
)
|
|
128
133
|
parser.add_argument(
|
|
129
134
|
"--no-input",
|
|
130
135
|
"--no-input-for-missing-information",
|
{nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/dxfileconverter.py
RENAMED
|
@@ -49,6 +49,7 @@ def from_dx_to_nx(
|
|
|
49
49
|
scan_range: tuple = (0.0, 180.0),
|
|
50
50
|
pixel_size=(None, None),
|
|
51
51
|
field_of_view: FieldOfView | str | None = None,
|
|
52
|
+
half_acquisition: bool | None = None,
|
|
52
53
|
distance: float | None = None,
|
|
53
54
|
overwrite: bool = True,
|
|
54
55
|
energy: float | None = None,
|
|
@@ -84,6 +85,7 @@ def from_dx_to_nx(
|
|
|
84
85
|
configuration.scan_range = scan_range
|
|
85
86
|
configuration.pixel_size = pixel_size
|
|
86
87
|
configuration.field_of_view = field_of_view
|
|
88
|
+
configuration.half_acquisition = half_acquisition
|
|
87
89
|
configuration.sample_detector_distance = distance
|
|
88
90
|
configuration.overwrite = overwrite
|
|
89
91
|
configuration.energy = energy
|
|
@@ -200,6 +202,10 @@ class _DxFileToNxConverter(BaseConverter):
|
|
|
200
202
|
def field_of_view(self) -> FieldOfView | None:
|
|
201
203
|
return self._configuration.field_of_view
|
|
202
204
|
|
|
205
|
+
@property
|
|
206
|
+
def half_acquisition(self) -> bool | None:
|
|
207
|
+
return self._configuration.half_acquisition
|
|
208
|
+
|
|
203
209
|
@property
|
|
204
210
|
def energy(self) -> float | None:
|
|
205
211
|
return self._configuration.energy
|
|
@@ -281,12 +287,15 @@ class _DxFileToNxConverter(BaseConverter):
|
|
|
281
287
|
detector_grp["y_pixel_size"] = y_pixel_size
|
|
282
288
|
detector_grp["y_pixel_size"].attrs["units"] = "m"
|
|
283
289
|
# field of view
|
|
284
|
-
if self.field_of_view is not None:
|
|
290
|
+
if self.field_of_view is not None or self.half_acquisition is not None:
|
|
285
291
|
with HDF5File(self.output_file, mode="a") as h5f:
|
|
286
292
|
root_grp = h5f.require_group(self.output_entry)
|
|
287
293
|
instrument_grp = root_grp.require_group("instrument")
|
|
288
294
|
detector_grp = instrument_grp.require_group("detector")
|
|
289
|
-
|
|
295
|
+
if self.field_of_view is not None:
|
|
296
|
+
detector_grp["field_of_view"] = self.field_of_view.value
|
|
297
|
+
if self.half_acquisition is not None:
|
|
298
|
+
detector_grp["half_acquisition"] = self.half_acquisition
|
|
290
299
|
# distance
|
|
291
300
|
if self._configuration.sample_detector_distance is None:
|
|
292
301
|
# if value not set by the user let read it
|
{nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/tests/test_dxfile.py
RENAMED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
+
import h5py
|
|
4
5
|
import pytest
|
|
5
6
|
import numpy
|
|
6
7
|
|
|
7
|
-
from nxtomomill import
|
|
8
|
+
from nxtomomill.converter.dxfile.dxfileconverter import from_dx_config_to_nx
|
|
9
|
+
from nxtomomill.models.dx2nx import DX2nxModel
|
|
8
10
|
from nxtomomill.tests.utils.dxfile import MockDxFile
|
|
9
11
|
|
|
10
12
|
from tomoscan.esrf.scan.nxtomoscan import NXtomoScan
|
|
11
13
|
from tomoscan.validator import is_valid_for_reconstruction
|
|
12
14
|
|
|
13
|
-
from silx.io.utils import get_data
|
|
15
|
+
from silx.io.utils import get_data, h5py_read_dataset
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
@pytest.mark.parametrize("duplicate_data", (True, False))
|
|
@@ -32,11 +34,13 @@ def test_dx_file_conversion(tmp_path, duplicate_data):
|
|
|
32
34
|
|
|
33
35
|
output_file = os.path.join(folder, "dxfile.nx")
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
config = DX2nxModel(
|
|
36
38
|
input_file=dxfile_path,
|
|
37
39
|
output_file=output_file,
|
|
38
40
|
duplicate_data=duplicate_data,
|
|
39
41
|
)
|
|
42
|
+
|
|
43
|
+
results = from_dx_config_to_nx(config)
|
|
40
44
|
assert len(results) == 1
|
|
41
45
|
assert os.path.exists(output_file)
|
|
42
46
|
_, entry = results[0]
|
|
@@ -62,17 +66,58 @@ def test_dx_file_conversion(tmp_path, duplicate_data):
|
|
|
62
66
|
|
|
63
67
|
# if overwrite not requested should fail on reprocessing
|
|
64
68
|
with pytest.raises(OSError):
|
|
65
|
-
|
|
69
|
+
from_dx_config_to_nx(
|
|
70
|
+
DX2nxModel(
|
|
71
|
+
input_file=dxfile_path,
|
|
72
|
+
output_file=output_file,
|
|
73
|
+
duplicate_data=duplicate_data,
|
|
74
|
+
overwrite=False,
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
# if overwrite requested should succeed
|
|
79
|
+
from_dx_config_to_nx(
|
|
80
|
+
DX2nxModel(
|
|
66
81
|
input_file=dxfile_path,
|
|
67
82
|
output_file=output_file,
|
|
68
83
|
duplicate_data=duplicate_data,
|
|
69
|
-
overwrite=
|
|
84
|
+
overwrite=True,
|
|
70
85
|
)
|
|
86
|
+
)
|
|
71
87
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
88
|
+
|
|
89
|
+
def test_dx_file_conversion_half_acquisition(tmp_path):
|
|
90
|
+
folder = tmp_path / "test_dx_file_conversion_half_acquisition"
|
|
91
|
+
folder.mkdir()
|
|
92
|
+
dxfile_path = os.path.join(folder, "dxfile.h5")
|
|
93
|
+
|
|
94
|
+
n_projections = 10
|
|
95
|
+
n_darks = 1
|
|
96
|
+
n_flats = 1
|
|
97
|
+
MockDxFile(
|
|
98
|
+
file_path=dxfile_path,
|
|
99
|
+
n_projection=n_projections,
|
|
100
|
+
n_darks=n_darks,
|
|
101
|
+
n_flats=n_flats,
|
|
78
102
|
)
|
|
103
|
+
|
|
104
|
+
output_file = os.path.join(folder, "dxfile_half.nx")
|
|
105
|
+
|
|
106
|
+
results = from_dx_config_to_nx(
|
|
107
|
+
DX2nxModel(
|
|
108
|
+
input_file=dxfile_path,
|
|
109
|
+
output_file=output_file,
|
|
110
|
+
half_acquisition=True,
|
|
111
|
+
)
|
|
112
|
+
)
|
|
113
|
+
assert len(results) == 1
|
|
114
|
+
assert os.path.exists(output_file)
|
|
115
|
+
|
|
116
|
+
with h5py.File(output_file, "r") as h5f:
|
|
117
|
+
assert h5py_read_dataset(
|
|
118
|
+
h5f["entry0000/instrument/detector/half_acquisition"]
|
|
119
|
+
) is numpy.bool(True)
|
|
120
|
+
assert (
|
|
121
|
+
h5py_read_dataset(h5f["entry0000/instrument/detector/field_of_view"])
|
|
122
|
+
== "Half"
|
|
123
|
+
)
|
|
@@ -1000,16 +1000,24 @@ def __process(
|
|
|
1000
1000
|
output_grp["/entry/instrument"].attrs["NX_class"] = "NXinstrument"
|
|
1001
1001
|
output_grp["/entry/instrument/detector"].attrs["NX_class"] = "NXdetector"
|
|
1002
1002
|
output_grp["/entry/instrument/detector/data"].attrs["interpretation"] = "image"
|
|
1003
|
-
if configuration.
|
|
1003
|
+
if configuration.half_acquisition is not None:
|
|
1004
|
+
half_acquisition = configuration.half_acquisition
|
|
1005
|
+
field_of_view = "Half" if half_acquisition else "Full"
|
|
1006
|
+
elif configuration.field_of_view is not None:
|
|
1004
1007
|
field_of_view = configuration.field_of_view
|
|
1008
|
+
half_acquisition = field_of_view is FieldOfView.HALF
|
|
1005
1009
|
elif abs(scan.scan_range) == 180:
|
|
1006
1010
|
field_of_view = "Full"
|
|
1011
|
+
half_acquisition = False
|
|
1007
1012
|
elif abs(scan.scan_range) == 360:
|
|
1008
1013
|
field_of_view = "Half"
|
|
1014
|
+
half_acquisition = True
|
|
1009
1015
|
|
|
1010
1016
|
if field_of_view is not None:
|
|
1011
1017
|
field_of_view = FieldOfView(field_of_view)
|
|
1012
1018
|
output_grp["/entry/instrument/detector/field_of_view"] = field_of_view.value
|
|
1019
|
+
if half_acquisition is not None:
|
|
1020
|
+
output_grp["/entry/instrument/detector/half_acquisition"] = half_acquisition
|
|
1013
1021
|
|
|
1014
1022
|
output_grp["/entry/sample"].attrs["NX_class"] = "NXsample"
|
|
1015
1023
|
output_grp["/entry/definition"] = "NXtomo"
|
{nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fscan/fscanconverter.py
RENAMED
|
@@ -125,9 +125,7 @@ def from_fscan_to_nx(
|
|
|
125
125
|
)
|
|
126
126
|
my_nxtomo.sample.rotation_angle = np.concatenate(rotation_angles) * _ureg.degree
|
|
127
127
|
|
|
128
|
-
my_nxtomo.instrument.detector.
|
|
129
|
-
"Half" if (halftomo and do_360) else "Full"
|
|
130
|
-
)
|
|
128
|
+
my_nxtomo.instrument.detector.half_acquisition = halftomo and do_360
|
|
131
129
|
my_nxtomo.instrument.detector.x_pixel_size = (
|
|
132
130
|
my_nxtomo.instrument.detector.y_pixel_size
|
|
133
131
|
) = (6.5 * 1e-6)
|
|
@@ -71,6 +71,8 @@ class BaseAcquisition:
|
|
|
71
71
|
|
|
72
72
|
_FOV_PATH = "technique/scan/field_of_view"
|
|
73
73
|
|
|
74
|
+
_HALF_ACQUISITION = "technique/scan/half_acquisition"
|
|
75
|
+
|
|
74
76
|
_NB_LOOP_PATH = ("technique/scan/nb_loop", "technique/proj/nb_loop")
|
|
75
77
|
|
|
76
78
|
_NB_TOMO_PATH = ("technique/scan/nb_tomo", "technique/proj/nb_tomo")
|
|
@@ -1126,7 +1126,7 @@ class StandardAcquisition(BaseAcquisition):
|
|
|
1126
1126
|
_logger.warning(mess)
|
|
1127
1127
|
return 10e-6 * _ureg.meter
|
|
1128
1128
|
|
|
1129
|
-
def _get_field_of_view(self) -> str:
|
|
1129
|
+
def _get_field_of_view(self) -> str | None:
|
|
1130
1130
|
if self.configuration.field_of_view is not None:
|
|
1131
1131
|
return self.configuration.field_of_view.value
|
|
1132
1132
|
url = self.parent_root_url() or self.root_url
|
|
@@ -1138,11 +1138,27 @@ class StandardAcquisition(BaseAcquisition):
|
|
|
1138
1138
|
if self._FOV_PATH in entry:
|
|
1139
1139
|
return h5py_read_dataset(entry[self._FOV_PATH])
|
|
1140
1140
|
else:
|
|
1141
|
-
# FOV is optional: don't raise an error
|
|
1142
1141
|
_logger.warning(
|
|
1143
|
-
f"
|
|
1142
|
+
f"Unable to find information regarding field of view for entry {entry}. Set it to default value (Full)"
|
|
1144
1143
|
)
|
|
1145
|
-
return
|
|
1144
|
+
return None
|
|
1145
|
+
|
|
1146
|
+
def _get_half_acquisition(self) -> bool | None:
|
|
1147
|
+
if self.configuration.half_acquisition is not None:
|
|
1148
|
+
return self.configuration.half_acquisition
|
|
1149
|
+
url = self.parent_root_url() or self.root_url
|
|
1150
|
+
if url is None:
|
|
1151
|
+
return None
|
|
1152
|
+
with EntryReader(
|
|
1153
|
+
url, open_mode_for_reading=self.configuration.open_mode_for_reading
|
|
1154
|
+
) as entry:
|
|
1155
|
+
if self._HALF_ACQUISITION in entry:
|
|
1156
|
+
return bool(h5py_read_dataset(entry[self._HALF_ACQUISITION]))
|
|
1157
|
+
else:
|
|
1158
|
+
_logger.warning(
|
|
1159
|
+
f"Unable to find information regarding 'half_acquisition' for entry {entry}."
|
|
1160
|
+
)
|
|
1161
|
+
return None
|
|
1146
1162
|
|
|
1147
1163
|
def _update_configuration_from_tomo_config(self):
|
|
1148
1164
|
"""
|
|
@@ -1213,9 +1229,21 @@ class StandardAcquisition(BaseAcquisition):
|
|
|
1213
1229
|
active_tomo_config_dataset_name = h5py_read_dataset(
|
|
1214
1230
|
dataset_name, decode_ascii=True
|
|
1215
1231
|
)[0]
|
|
1232
|
+
|
|
1233
|
+
active_tomo_config_path = (
|
|
1234
|
+
f"instrument/{active_tomo_config_dataset_name}"
|
|
1235
|
+
)
|
|
1236
|
+
if active_tomo_config_path not in entry:
|
|
1237
|
+
_logger.error(
|
|
1238
|
+
f"Cannot find the active tomo config in {active_tomo_config_path!r}"
|
|
1239
|
+
)
|
|
1240
|
+
self._active_config_tomo_detector = None
|
|
1241
|
+
return
|
|
1242
|
+
|
|
1216
1243
|
active_tomo_config = BlissActiveConfig.from_hdf5_group(
|
|
1217
|
-
entry[
|
|
1244
|
+
entry[active_tomo_config_path]
|
|
1218
1245
|
)
|
|
1246
|
+
|
|
1219
1247
|
if active_tomo_config.tomo_detector:
|
|
1220
1248
|
# tomo_detector is given as a tuple of 1 element
|
|
1221
1249
|
self._active_config_tomo_detector = (
|
|
@@ -1353,7 +1381,14 @@ class StandardAcquisition(BaseAcquisition):
|
|
|
1353
1381
|
DetXFlipTransformation(flip=self.ud_flipped)
|
|
1354
1382
|
)
|
|
1355
1383
|
|
|
1356
|
-
#
|
|
1384
|
+
# half-acquisition
|
|
1385
|
+
half_acquisition = self._get_half_acquisition()
|
|
1386
|
+
assert isinstance(
|
|
1387
|
+
half_acquisition, (bool, type(None))
|
|
1388
|
+
), f"half acquisition has to be a boolean or None. Got {half_acquisition}"
|
|
1389
|
+
# Note: default value is False and not None. So if the half_acquisition is not found in the metadata we will set it to False
|
|
1390
|
+
nx_tomo.instrument.detector.half_acquisition = half_acquisition
|
|
1391
|
+
# fov (deprecated. half-acquisition is preferred)
|
|
1357
1392
|
fov = self._get_field_of_view()
|
|
1358
1393
|
if fov is not None:
|
|
1359
1394
|
nx_tomo.instrument.detector.field_of_view = fov
|
|
@@ -61,6 +61,7 @@ def test_S59_68p41b_16mm_6p5mm_F8_0001_dataset(
|
|
|
61
61
|
assert len(nxtomo.instrument.detector.image_key) == n_frames
|
|
62
62
|
assert len(nxtomo.instrument.detector.image_key_control) == n_frames
|
|
63
63
|
assert nxtomo.instrument.detector.field_of_view.value == "Full"
|
|
64
|
+
assert nxtomo.instrument.detector.half_acquisition is None
|
|
64
65
|
|
|
65
66
|
N_PROJ = 10000
|
|
66
67
|
|
|
@@ -1496,3 +1496,23 @@ def test_keys_operations(tmp_path):
|
|
|
1496
1496
|
first_scan.z_translation,
|
|
1497
1497
|
(numpy.array([150.49] * n_frames) * _ureg.millimeter).to_base_units().magnitude,
|
|
1498
1498
|
)
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
def test_invalid_active_tomo_config(tmp_path):
|
|
1502
|
+
config = TomoHDF5Config()
|
|
1503
|
+
config.input_file = GitlabDataset.get_dataset(
|
|
1504
|
+
os.sep.join(
|
|
1505
|
+
(
|
|
1506
|
+
"h5_datasets",
|
|
1507
|
+
"failling",
|
|
1508
|
+
"SPL_WG_WG_K_03_Zseries_LR_167_P_239_7479_D_2477_0000_0000.h5",
|
|
1509
|
+
)
|
|
1510
|
+
)
|
|
1511
|
+
)
|
|
1512
|
+
config.output_file = str(tmp_path / "test.nx")
|
|
1513
|
+
result = converter.from_h5_to_nx(configuration=config)
|
|
1514
|
+
assert len(result) == 1
|
|
1515
|
+
output_file, output_entry = result[0]
|
|
1516
|
+
assert os.path.exists(output_file)
|
|
1517
|
+
scan = NXtomo().load(file_path=output_file, data_path=output_entry)
|
|
1518
|
+
assert len(scan.sample.rotation_angle) == 2542
|
{nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/tests/test_confighandler.py
RENAMED
|
@@ -41,6 +41,7 @@ class _ARParseMock(object):
|
|
|
41
41
|
self.no_master_file = False
|
|
42
42
|
self.file_extension = None
|
|
43
43
|
self.field_of_view = None
|
|
44
|
+
self.half_acquisition = None
|
|
44
45
|
self.sample_detector_distance_keys = None
|
|
45
46
|
self.use_abs_path_for_vds = None
|
|
46
47
|
self.open_mode_for_reading = "robust"
|
|
@@ -4,7 +4,13 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from nxtomo.nxobject.nxdetector import FieldOfView
|
|
6
6
|
from .base.general_section import GeneralSection
|
|
7
|
-
from pydantic import
|
|
7
|
+
from pydantic import (
|
|
8
|
+
Field,
|
|
9
|
+
ConfigDict,
|
|
10
|
+
field_serializer,
|
|
11
|
+
field_validator,
|
|
12
|
+
model_validator,
|
|
13
|
+
)
|
|
8
14
|
|
|
9
15
|
__all__ = [
|
|
10
16
|
"DX2nxModel",
|
|
@@ -38,8 +44,13 @@ class DX2nxModel(GeneralSection):
|
|
|
38
44
|
default=(None, None),
|
|
39
45
|
description="Pixel size can be provided - in meter - as (x_pizel_size, y_pixel_size)",
|
|
40
46
|
)
|
|
47
|
+
half_acquisition: bool | None = Field(
|
|
48
|
+
default=None,
|
|
49
|
+
description="If True, run a half acquisition. This replaces the string-based field_of_view setting.",
|
|
50
|
+
)
|
|
41
51
|
field_of_view: FieldOfView | None = Field(
|
|
42
|
-
default=None,
|
|
52
|
+
default=None,
|
|
53
|
+
description="DEPRECATED: Detector field of view. Use half_acquisition instead.",
|
|
43
54
|
)
|
|
44
55
|
sample_detector_distance: float | None = Field(
|
|
45
56
|
default=1.0, description="sample / detector distance in meter"
|
|
@@ -55,6 +66,16 @@ class DX2nxModel(GeneralSection):
|
|
|
55
66
|
return None
|
|
56
67
|
return FieldOfView(value)
|
|
57
68
|
|
|
69
|
+
@model_validator(mode="after")
|
|
70
|
+
def normalize_half_acquisition(self):
|
|
71
|
+
if self.half_acquisition is not None and self.field_of_view is None:
|
|
72
|
+
self.field_of_view = (
|
|
73
|
+
FieldOfView.HALF if self.half_acquisition else FieldOfView.FULL
|
|
74
|
+
)
|
|
75
|
+
elif self.field_of_view is not None and self.half_acquisition is None:
|
|
76
|
+
self.half_acquisition = self.field_of_view == FieldOfView.HALF
|
|
77
|
+
return self
|
|
78
|
+
|
|
58
79
|
@field_serializer(
|
|
59
80
|
"field_of_view",
|
|
60
81
|
when_used="always",
|
{nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/detector_section.py
RENAMED
|
@@ -9,10 +9,13 @@ from pydantic import BaseModel, Field, field_validator, ConfigDict, field_serial
|
|
|
9
9
|
class DetectorSection(BaseModel):
|
|
10
10
|
|
|
11
11
|
model_config = ConfigDict(validate_assignment=True, validate_by_name=True)
|
|
12
|
-
|
|
12
|
+
half_acquisition: bool | None = Field(
|
|
13
|
+
default=None,
|
|
14
|
+
description="Is the acquisition an full acquisition of an half acquisition (CoR in at borders of projections)",
|
|
15
|
+
)
|
|
13
16
|
field_of_view: FieldOfView | None = Field(
|
|
14
17
|
default=None,
|
|
15
|
-
description="Detector field of view. If set must be in `Half` or `Full`",
|
|
18
|
+
description="Deprecated to the benefit of 'half_acquisition'. Detector field of view. If set must be in `Half` or `Full`",
|
|
16
19
|
)
|
|
17
20
|
|
|
18
21
|
@field_validator(
|
|
@@ -38,6 +38,10 @@ class GeneralSection(_GeneralSectionBase):
|
|
|
38
38
|
default=None,
|
|
39
39
|
description="Force output to be a 'Full' or 'Half' acquisition. Else determine from existing metadata",
|
|
40
40
|
)
|
|
41
|
+
half_acquisition: bool | None = Field(
|
|
42
|
+
default=None,
|
|
43
|
+
description="Is is a full acquisition or an half-acquisition (CoR at bordrs of projections)",
|
|
44
|
+
)
|
|
41
45
|
create_control_data: bool = Field(
|
|
42
46
|
default=True, description="Generate control/data - filled with machine current."
|
|
43
47
|
)
|
|
@@ -77,6 +81,7 @@ class GeneralSection(_GeneralSectionBase):
|
|
|
77
81
|
@field_validator(
|
|
78
82
|
"check_tomo_n",
|
|
79
83
|
"rotation_is_clockwise",
|
|
84
|
+
"half_acquisition",
|
|
80
85
|
mode="before",
|
|
81
86
|
)
|
|
82
87
|
@classmethod
|
|
@@ -49,6 +49,7 @@ class H52nxModel(
|
|
|
49
49
|
single_file=self.single_file,
|
|
50
50
|
no_master_file=self.no_master_file,
|
|
51
51
|
field_of_view=self.field_of_view,
|
|
52
|
+
half_acquisition=self.half_acquisition,
|
|
52
53
|
rotation_is_clockwise=self.rotation_is_clockwise,
|
|
53
54
|
create_control_data=self.create_control_data,
|
|
54
55
|
check_tomo_n=self.check_tomo_n,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nxtomomill
|
|
3
|
-
Version: 2.1.0.
|
|
3
|
+
Version: 2.1.0.dev4
|
|
4
4
|
Summary: applications and library to convert raw format to NXtomo format
|
|
5
5
|
Author-email: Henri Payno <henri.payno@esrf.fr>, Pierre Paleo <pierre.paleo@esrf.fr>, Pierre-Olivier Autran <pierre-olivier.autran@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>
|
|
6
6
|
License:
|
|
@@ -55,7 +55,7 @@ License-File: LICENSE
|
|
|
55
55
|
Requires-Dist: numpy
|
|
56
56
|
Requires-Dist: h5py>=3.0
|
|
57
57
|
Requires-Dist: silx>=2.0
|
|
58
|
-
Requires-Dist: nxtomo>=3.1.
|
|
58
|
+
Requires-Dist: nxtomo>=3.1.0dev1
|
|
59
59
|
Requires-Dist: pint
|
|
60
60
|
Requires-Dist: packaging
|
|
61
61
|
Requires-Dist: tomoscan[full]>=2.2.0a4
|
|
@@ -46,7 +46,6 @@ nxtomomill/converter/version.py
|
|
|
46
46
|
nxtomomill/converter/dxfile/__init__.py
|
|
47
47
|
nxtomomill/converter/dxfile/dxfileconverter.py
|
|
48
48
|
nxtomomill/converter/dxfile/tests/test_dxfile.py
|
|
49
|
-
nxtomomill/converter/edf/_Blosc2Jp2kWrapper.py
|
|
50
49
|
nxtomomill/converter/edf/__init__.py
|
|
51
50
|
nxtomomill/converter/edf/checks.py
|
|
52
51
|
nxtomomill/converter/edf/edfconverter.py
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
import numpy
|
|
3
|
-
from h5py import Dataset
|
|
4
|
-
|
|
5
|
-
try:
|
|
6
|
-
import blosc2
|
|
7
|
-
import blosc2_grok
|
|
8
|
-
except ImportError:
|
|
9
|
-
_has_blosc2 = False
|
|
10
|
-
else:
|
|
11
|
-
_has_blosc2 = True
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Blosc2Jp2kWrapper:
|
|
15
|
-
"""Wrapper to apply JP2K conversion to a dataset"""
|
|
16
|
-
|
|
17
|
-
def __init__(self, dataset: Dataset, compression_params: dict):
|
|
18
|
-
self.dataset: Dataset = dataset
|
|
19
|
-
self.compression_params: dict = self.get_default_compression_params()
|
|
20
|
-
self.compression_params.update(compression_params)
|
|
21
|
-
|
|
22
|
-
blosc2_grok.set_params_defaults(
|
|
23
|
-
# codec=blosc2.Codec.GROK,
|
|
24
|
-
cod_format=blosc2_grok.GrkFileFmt.GRK_FMT_JP2,
|
|
25
|
-
num_threads=self.compression_params["nthreads"],
|
|
26
|
-
quality_mode="rates",
|
|
27
|
-
quality_layers=numpy.array(
|
|
28
|
-
[self.compression_params["cratio"]],
|
|
29
|
-
dtype=numpy.float64,
|
|
30
|
-
),
|
|
31
|
-
verbose=True,
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
def __setitem__(self, name, value):
|
|
35
|
-
z, _, _ = name
|
|
36
|
-
Z, Y, X = self.dataset.shape
|
|
37
|
-
|
|
38
|
-
# Verify data type compatibility
|
|
39
|
-
if value.dtype not in [numpy.float32, numpy.float64, numpy.uint16]:
|
|
40
|
-
raise ValueError(f"Unsupported dtype: {value.dtype}")
|
|
41
|
-
|
|
42
|
-
b2im = blosc2.asarray(
|
|
43
|
-
value.reshape(1, Y, X),
|
|
44
|
-
chunks=(1, Y, X),
|
|
45
|
-
blocks=(1, Y, X),
|
|
46
|
-
cparams=self.compression_params,
|
|
47
|
-
)
|
|
48
|
-
cframe = b2im.schunk.to_cframe()
|
|
49
|
-
self.dataset.id.write_direct_chunk((z, 0, 0), cframe, filter_mask=0)
|
|
50
|
-
|
|
51
|
-
@classmethod
|
|
52
|
-
def get_default_compression_params(cls) -> dict:
|
|
53
|
-
if _has_blosc2:
|
|
54
|
-
return {
|
|
55
|
-
"codec": blosc2.Codec.GROK,
|
|
56
|
-
"filters": [],
|
|
57
|
-
"splitmode": blosc2.SplitMode.NEVER_SPLIT,
|
|
58
|
-
"nthreads": 4,
|
|
59
|
-
"cratio": 10,
|
|
60
|
-
"verbose": True,
|
|
61
|
-
}
|
|
62
|
-
else:
|
|
63
|
-
return {}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|