nabu 2025.1.0.dev12__tar.gz → 2025.1.0.dev14__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.
- {nabu-2025.1.0.dev12/nabu.egg-info → nabu-2025.1.0.dev14}/PKG-INFO +1 -1
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/__init__.py +1 -1
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/cli_configs.py +1 -1
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/multicor.py +25 -10
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/cast_volume.py +3 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/processconfig.py +3 -2
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_ctf.py +1 -1
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_paganin.py +1 -3
- nabu-2025.1.0.dev14/nabu/processing/fft_cuda.py +115 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_fft.py +1 -63
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/cone.py +5 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/mlem.py +11 -5
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_deringer.py +2 -2
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_fbp.py +3 -3
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_halftomo.py +1 -1
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_reconstructor.py +1 -1
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14/nabu.egg-info}/PKG-INFO +1 -1
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/SOURCES.txt +0 -2
- nabu-2025.1.0.dev12/doc/doc_config.py +0 -32
- nabu-2025.1.0.dev12/nabu/processing/fft_cuda.py +0 -284
- nabu-2025.1.0.dev12/nabu/reconstruction/astra.py +0 -245
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/LICENSE +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/README.md +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/doc/conf.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/doc/create_conf_doc.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/doc/get_mathjax.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/bootstrap.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/bootstrap_stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/cast_volume.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/compare_volumes.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/composite_cor.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/correct_rot.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/create_distortion_map_from_poly.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/diag_to_pix.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/diag_to_rot.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/double_flatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/generate_header.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/histogram.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/nx_z_splitter.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/parse_reconstruction_log.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/prepare_weights_double.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/reconstruct.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/reconstruct_helical.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/reduce_dark_flat.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/rotate.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/shrink_dataset.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/tests/test_reduce_dark_flat.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/validator.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/convolution.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/fft.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/kernel.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/medfilt.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/padding.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/processing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/ElementOp.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/backproj.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/backproj_polar.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/boundary.h +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/cone.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/convolution.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/dfi_fftshift.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/flatfield.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/fourier_wavelets.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/halftomo.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/helical_padding.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/hierarchical_backproj.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/histogram.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/interpolation.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/medfilt.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/normalization.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/padding.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/proj.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/rotation.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/transpose.cu +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/alignment.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/cor.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/cor_sino.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/distortion.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/focus.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_alignment.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_cor.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_focus.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_tilt.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_translation.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tilt.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/translation.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/detector_distortion.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/reader.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/reader_helical.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/test_cast_volume.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/test_readers.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/test_writers.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/writer.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/binning.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/fftshift.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/filters.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/fourier_filters.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/histogram.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/histogram_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/kernel_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/padding.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/padding_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/processing_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/rotation.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/rotation_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/tests/test_binning.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/tests/test_interpolation.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/transpose.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/unsharp.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/unsharp_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/unsharp_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/fft.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/kernel.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/memcpy.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/padding.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/processing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/ElementOp.cl +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/backproj.cl +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/fftshift.cl +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/halftomo.cl +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/padding.cl +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/roll.cl +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/transpose.cl +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/config.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/config_validators.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/datadump.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/dataset_validator.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/detector_distortion_provider.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/estimators.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/chunked.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/chunked_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/computations.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/dataset_validator.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/get_double_flatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/nabu_config.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/reconstruction.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/dataset_validator.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/fbp.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/filtering.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/gridded_accumulator.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_chunked_regridded.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_chunked_regridded_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_reconstruction.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/nabu_config.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/processconfig.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/span_strategy.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/weight_balancer.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/params.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/processconfig.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/reader.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/tests/test_estimators.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/writer.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/xrdct/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/alignment.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ccd.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ccd_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ctf.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ctf_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/distortion.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/double_flatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/double_flatfield_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/double_flatfield_variable_region.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/flatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/flatfield_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/flatfield_variable_region.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/phase.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/phase_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/shift.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/shift_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_ccd_corr.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_double_flatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_flatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_vshift.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/azim.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/convolution_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/fft_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/fft_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/fftshift.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/histogram.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/histogram_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/kernel_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/medfilt_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/muladd.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/muladd_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/padding_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/padding_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/padding_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/processing_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/roll_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/rotation.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/rotation_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_fftshift.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_histogram.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_medfilt.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_muladd.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_padding.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_roll.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_rotation.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_transpose.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_unsharp.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/transpose.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/unsharp.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/unsharp_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/unsharp_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/fbp.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/fbp_base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/fbp_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/filtering.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/filtering_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/filtering_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/hbp.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/projection.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/reconstructor.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/reconstructor_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/rings.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/rings_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/sinogram.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/sinogram_cuda.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/sinogram_opencl.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_cone.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_filtering.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_mlem.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_projector.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_sino_normalization.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/cli/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/cor.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/dataset_analyzer.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/gpu.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/logger.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/nxflatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/bm05_pag.conf +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id16_ctf.conf +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id16_holo.conf +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id16a_fluo.conf +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id19_pag.conf +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/test_extract.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/test_nxflatfield.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/test_units.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/alignment.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/config.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/definitions.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/frame_composition.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/overlap.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/sample_normalization.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/single_axis_stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/slurm_utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/base.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/postprocessing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/preprocessing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/post_processing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/pre_processing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/single_axis.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/stitcher.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/y_stitcher.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/z_stitcher.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher_2D.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_alignment.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_config.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_frame_composition.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_overlap.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_sample_normalization.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_slurm_utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_y_preprocessing_stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_z_postprocessing_stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_z_preprocessing_stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/post_processing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/tests/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/tests/test_post-processing.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/y_stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/z_stitching.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/tests.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/testutils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/__init__.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/algotom_convert_sino.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/pore3d_deringer_munch.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/tomocupy_remove_stripe.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/tomopy_phase.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/tomwer_load_flats_darks.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/utils.py +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/dependency_links.txt +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/entry_points.txt +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/requires.txt +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/top_level.txt +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/pyproject.toml +0 -0
- {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: nabu
|
3
|
-
Version: 2025.1.0.
|
3
|
+
Version: 2025.1.0.dev14
|
4
4
|
Summary: Nabu - Tomography software
|
5
5
|
Author-email: Pierre Paleo <pierre.paleo@esrf.fr>, Henri Payno <henri.payno@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>
|
6
6
|
Maintainer-email: Pierre Paleo <pierre.paleo@esrf.fr>
|
@@ -162,7 +162,7 @@ MultiCorConfig = ReconstructConfig.copy()
|
|
162
162
|
MultiCorConfig.update(
|
163
163
|
{
|
164
164
|
"cor": {
|
165
|
-
"help": "
|
165
|
+
"help": "Absolute positions of the center of rotation. It must be a list of comma-separated scalars, or in the form start:stop:step, where start, stop and step can all be floating-point values.",
|
166
166
|
"default": "",
|
167
167
|
"mandatory": True,
|
168
168
|
},
|
@@ -59,23 +59,34 @@ def main():
|
|
59
59
|
######
|
60
60
|
|
61
61
|
cors = get_user_cors(args["cor"])
|
62
|
+
options = reconstructor.process_config.processing_options["reconstruction"]
|
63
|
+
reconstruct_from_sinos_stack = (options["method"].lower() == "cone") or (
|
64
|
+
options["method"].lower() == "mlem" and options["implementation"].lower() == "corrct"
|
65
|
+
)
|
66
|
+
do_halftomo = pipeline.process_config.do_halftomo
|
62
67
|
|
63
68
|
rec_instance = pipeline.reconstruction
|
64
69
|
|
70
|
+
# Get sinogram
|
71
|
+
if reconstruct_from_sinos_stack:
|
72
|
+
sino = pipeline._d_radios.transpose(axes=(1, 0, 2))
|
73
|
+
else:
|
74
|
+
# Get sinogram into contiguous array
|
75
|
+
# TODO Can't do memcpy2D ?! It used to work in cuda 11.
|
76
|
+
# For now: transfer to host... not optimal
|
77
|
+
sino = pipeline._d_radios[:, pipeline._d_radios.shape[1] // 2, :].get() # pylint: disable=E1136
|
78
|
+
|
65
79
|
for cor in cors:
|
66
80
|
# Re-configure with new CoR
|
67
81
|
pipeline.processing_options["reconstruction"]["rotation_axis_position"] = cor
|
68
82
|
pipeline.processing_options["save"]["file_prefix"] = file_prefix + "_%.03f" % cor
|
69
83
|
pipeline._init_writer(create_subfolder=False, single_output_file_initialized=False)
|
70
84
|
|
71
|
-
#
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
if pipeline.process_config.do_halftomo:
|
85
|
+
# Reconfigure center of rotation
|
86
|
+
if not (do_halftomo):
|
87
|
+
pipeline.reconstruction.reset_rot_center(cor)
|
88
|
+
else:
|
77
89
|
# re-initialize FBP object, because in half-tomography the output slice size is a function of CoR
|
78
|
-
options = pipeline.processing_options["reconstruction"]
|
79
90
|
rec_instance = pipeline.FBPClass(
|
80
91
|
sino.shape,
|
81
92
|
angles=options["angles"],
|
@@ -92,11 +103,15 @@ def main():
|
|
92
103
|
"filter_cutoff": options["fbp_filter_cutoff"],
|
93
104
|
},
|
94
105
|
)
|
95
|
-
else:
|
96
|
-
pipeline.reconstruction.reset_rot_center(cor)
|
97
106
|
|
98
107
|
# Run reconstruction
|
99
|
-
|
108
|
+
if reconstruct_from_sinos_stack:
|
109
|
+
# Need to copy the sino each time, as it is modified by FDK
|
110
|
+
rec = rec_instance.reconstruct(sino.copy())
|
111
|
+
# take the middle slice
|
112
|
+
rec = rec[rec.shape[0] // 2]
|
113
|
+
else:
|
114
|
+
rec = rec_instance.fbp(sino)
|
100
115
|
# if return_all_recs:
|
101
116
|
# all_recs.append(rec)
|
102
117
|
rec_3D = view_as_images_stack(rec) # writer wants 3D data
|
@@ -206,6 +206,9 @@ def cast_volume(
|
|
206
206
|
data_min = data_min if data_min is not None else found_data_min
|
207
207
|
data_max = data_max if data_max is not None else found_data_max
|
208
208
|
|
209
|
+
if isinstance(output_volume, JP2KVolume):
|
210
|
+
output_volume.rescale_data = False
|
211
|
+
|
209
212
|
data = []
|
210
213
|
for input_slice, frame_dumper in zip(
|
211
214
|
input_volume.browse_slices(),
|
@@ -577,6 +577,7 @@ class ProcessConfig(ProcessConfigBase):
|
|
577
577
|
self.rec_params,
|
578
578
|
[
|
579
579
|
"method",
|
580
|
+
"iterations",
|
580
581
|
"implementation",
|
581
582
|
"fbp_filter_type",
|
582
583
|
"fbp_filter_cutoff",
|
@@ -613,8 +614,6 @@ class ProcessConfig(ProcessConfigBase):
|
|
613
614
|
voxel_size,
|
614
615
|
) # pix size is in microns in dataset_info
|
615
616
|
|
616
|
-
rec_options["iterations"] = nabu_config["reconstruction"]["iterations"]
|
617
|
-
|
618
617
|
# x/y/z position information
|
619
618
|
def get_mean_pos(position_array):
|
620
619
|
if position_array is None:
|
@@ -636,6 +635,8 @@ class ProcessConfig(ProcessConfigBase):
|
|
636
635
|
rec_options["position"] = mean_positions_xyz
|
637
636
|
if rec_options["method"] == "cone" and rec_options["sample_detector_dist"] is None:
|
638
637
|
rec_options["sample_detector_dist"] = self.dataset_info.distance # was checked to be not None earlier
|
638
|
+
if rec_options["method"].lower() == "mlem" and rec_options["implementation"] in [None, ""]:
|
639
|
+
rec_options["implementation"] = "corrct"
|
639
640
|
|
640
641
|
# New key
|
641
642
|
rec_options["cor_estimated_auto"] = isinstance(nabu_config["reconstruction"]["rotation_axis_position"], str)
|
@@ -223,7 +223,7 @@ class TestCtf:
|
|
223
223
|
# phase_fft = ctf_fft.retrieve_phase(img)
|
224
224
|
self.check_result(phase_r2c, self.ref_plain, "Something wrong with CtfFilter-FFT")
|
225
225
|
|
226
|
-
@pytest.mark.skipif(not (__has_pycuda__ and __has_cufft__), reason="pycuda and (
|
226
|
+
@pytest.mark.skipif(not (__has_pycuda__ and __has_cufft__), reason="pycuda and (cupy? or vkfft)")
|
227
227
|
def test_cuda_ctf(self):
|
228
228
|
data = nabu_get_data("brain_phantom.npz")["data"]
|
229
229
|
delta_beta = 50.0
|
@@ -77,9 +77,7 @@ class TestPaganin:
|
|
77
77
|
errmax = np.max(np.abs(res - res_tomopy) / np.max(res_tomopy))
|
78
78
|
assert errmax < self.rtol_pag, "Max error is too high"
|
79
79
|
|
80
|
-
@pytest.mark.skipif(
|
81
|
-
not (__has_pycuda__ and __has_cufft__), reason="Need pycuda and (scikit-cuda or vkfft) for this test"
|
82
|
-
)
|
80
|
+
@pytest.mark.skipif(not (__has_pycuda__ and __has_cufft__), reason="Need pycuda and (cupy? or vkfft) for this test")
|
83
81
|
@pytest.mark.parametrize("config", scenarios)
|
84
82
|
def test_gpu_paganin(self, config):
|
85
83
|
paganin, data, pag_kwargs = self.get_paganin_instance_and_data(config, self.data)
|
@@ -0,0 +1,115 @@
|
|
1
|
+
import os
|
2
|
+
import warnings
|
3
|
+
from functools import lru_cache
|
4
|
+
from multiprocessing import get_context
|
5
|
+
from multiprocessing.pool import Pool
|
6
|
+
from ..utils import BaseClassError, check_supported, no_decorator
|
7
|
+
from .fft_base import _BaseVKFFT
|
8
|
+
|
9
|
+
try:
|
10
|
+
from pyvkfft.cuda import VkFFTApp as CudaVkFFTApp
|
11
|
+
|
12
|
+
__has_vkfft__ = True
|
13
|
+
except (ImportError, OSError):
|
14
|
+
__has_vkfft__ = False
|
15
|
+
CudaVkFFTApp = BaseClassError
|
16
|
+
from ..cuda.processing import CudaProcessing
|
17
|
+
|
18
|
+
n_cached_ffts = int(os.getenv("NABU_FFT_CACHE", "0"))
|
19
|
+
|
20
|
+
|
21
|
+
maybe_cached = lru_cache(maxsize=n_cached_ffts) if n_cached_ffts > 0 else no_decorator
|
22
|
+
|
23
|
+
|
24
|
+
@maybe_cached
|
25
|
+
def _get_vkfft_cuda(*args, **kwargs):
|
26
|
+
return CudaVkFFTApp(*args, **kwargs)
|
27
|
+
|
28
|
+
|
29
|
+
def get_vkfft_cuda(slf, *args, **kwargs):
|
30
|
+
return _get_vkfft_cuda(*args, **kwargs)
|
31
|
+
|
32
|
+
|
33
|
+
class VKCUFFT(_BaseVKFFT):
|
34
|
+
"""
|
35
|
+
Cuda FFT, using VKFFT backend
|
36
|
+
"""
|
37
|
+
|
38
|
+
implem = "vkfft"
|
39
|
+
backend = "cuda"
|
40
|
+
ProcessingCls = CudaProcessing
|
41
|
+
get_fft_obj = get_vkfft_cuda
|
42
|
+
|
43
|
+
def _init_backend(self, backend_options):
|
44
|
+
super()._init_backend(backend_options)
|
45
|
+
self._vkfft_other_init_kwargs = {"stream": self.processing.stream}
|
46
|
+
|
47
|
+
|
48
|
+
def _has_vkfft(x):
|
49
|
+
# should be run from within a Process
|
50
|
+
try:
|
51
|
+
from nabu.processing.fft_cuda import VKCUFFT, __has_vkfft__
|
52
|
+
|
53
|
+
if not __has_vkfft__:
|
54
|
+
return False
|
55
|
+
_ = VKCUFFT((16,), "f")
|
56
|
+
avail = True
|
57
|
+
except (ImportError, RuntimeError, OSError, NameError):
|
58
|
+
avail = False
|
59
|
+
return avail
|
60
|
+
|
61
|
+
|
62
|
+
@lru_cache(maxsize=2)
|
63
|
+
def has_vkfft(safe=True):
|
64
|
+
"""
|
65
|
+
Determine whether pyvkfft is available.
|
66
|
+
For Cuda GPUs, vkfft relies on nvrtc which supports a narrow range of Cuda devices.
|
67
|
+
Unfortunately, it's not possible to determine whether vkfft is available before creating a Cuda context.
|
68
|
+
So we create a process (from scratch, i.e no fork), do the test within, and exit.
|
69
|
+
This function cannot be tested from a notebook/console, a proper entry point has to be created (if __name__ == "__main__").
|
70
|
+
"""
|
71
|
+
if not safe:
|
72
|
+
return _has_vkfft(None)
|
73
|
+
try:
|
74
|
+
ctx = get_context("spawn")
|
75
|
+
with Pool(1, context=ctx) as p:
|
76
|
+
v = p.map(_has_vkfft, [1])[0]
|
77
|
+
except AssertionError:
|
78
|
+
# Can get AssertionError: daemonic processes are not allowed to have children
|
79
|
+
# if the calling code is already a subprocess
|
80
|
+
return _has_vkfft(None)
|
81
|
+
return v
|
82
|
+
|
83
|
+
|
84
|
+
@lru_cache(maxsize=2)
|
85
|
+
def get_fft_class(backend="vkfft"):
|
86
|
+
backends = {
|
87
|
+
"vkfft": VKCUFFT,
|
88
|
+
"pyvkfft": VKCUFFT,
|
89
|
+
}
|
90
|
+
|
91
|
+
def get_fft_cls(asked_fft_backend):
|
92
|
+
asked_fft_backend = asked_fft_backend.lower()
|
93
|
+
check_supported(asked_fft_backend, list(backends.keys()), "Cuda FFT backend name")
|
94
|
+
return backends[asked_fft_backend]
|
95
|
+
|
96
|
+
asked_fft_backend_env = os.environ.get("NABU_FFT_BACKEND", "")
|
97
|
+
if asked_fft_backend_env != "":
|
98
|
+
return get_fft_cls(asked_fft_backend_env)
|
99
|
+
|
100
|
+
avail_fft_implems = get_available_fft_implems()
|
101
|
+
if len(avail_fft_implems) == 0:
|
102
|
+
raise RuntimeError("Could not any Cuda FFT implementation. Please install pyvkfft")
|
103
|
+
if backend not in avail_fft_implems:
|
104
|
+
warnings.warn("Could not get FFT backend '%s'" % backend, RuntimeWarning)
|
105
|
+
backend = avail_fft_implems[0]
|
106
|
+
|
107
|
+
return get_fft_cls(backend)
|
108
|
+
|
109
|
+
|
110
|
+
@lru_cache(maxsize=1)
|
111
|
+
def get_available_fft_implems():
|
112
|
+
avail_implems = []
|
113
|
+
if has_vkfft(safe=True):
|
114
|
+
avail_implems.append("vkfft")
|
115
|
+
return avail_implems
|
@@ -4,14 +4,13 @@ import numpy as np
|
|
4
4
|
from scipy.fft import fftn, ifftn, rfftn, irfftn
|
5
5
|
from nabu.testutils import generate_tests_scenarios, get_data, get_array_of_given_shape, __do_long_tests__
|
6
6
|
from nabu.cuda.utils import get_cuda_context, __has_pycuda__
|
7
|
-
from nabu.processing.fft_cuda import
|
7
|
+
from nabu.processing.fft_cuda import VKCUFFT, get_available_fft_implems
|
8
8
|
from nabu.opencl.utils import __has_pyopencl__, get_opencl_context
|
9
9
|
from nabu.processing.fft_opencl import VKCLFFT, has_vkfft as has_cl_vkfft
|
10
10
|
from nabu.processing.fft_base import is_fast_axes
|
11
11
|
|
12
12
|
available_cuda_fft = get_available_fft_implems()
|
13
13
|
__has_vkfft__ = "vkfft" in available_cuda_fft
|
14
|
-
__has_skcuda__ = "skcuda" in available_cuda_fft
|
15
14
|
|
16
15
|
|
17
16
|
scenarios = {
|
@@ -113,67 +112,6 @@ class TestFFT:
|
|
113
112
|
ref = ref_ifft_func(data, axes=axes)
|
114
113
|
return ref
|
115
114
|
|
116
|
-
@pytest.mark.skipif(
|
117
|
-
not (__has_skcuda__ and __has_pycuda__), reason="Need pycuda and (scikit-cuda or vkfft) for this test"
|
118
|
-
)
|
119
|
-
@pytest.mark.parametrize("config", scenarios)
|
120
|
-
def test_sckcuda(self, config):
|
121
|
-
r2c = config["r2c"]
|
122
|
-
shape = config["shape"]
|
123
|
-
precision = config["precision"]
|
124
|
-
ndim = len(shape)
|
125
|
-
if ndim == 3 and not (__do_long_tests__):
|
126
|
-
pytest.skip("3D FFTs are done only for long tests - use NABU_LONG_TESTS=1")
|
127
|
-
|
128
|
-
data = self._get_data_array(config)
|
129
|
-
|
130
|
-
res, cufft = self._do_fft(data, r2c, return_fft_obj=True, backend_cls=SKCUFFT)
|
131
|
-
ref = self._do_reference_fft(data, r2c)
|
132
|
-
|
133
|
-
tol = self.abs_tol[precision][ndim]
|
134
|
-
self.check_result(res, ref, config, tol, name="skcuda")
|
135
|
-
|
136
|
-
# Complex-to-complex can also be performed on real data (as in numpy.fft.fft(real_data))
|
137
|
-
if not (r2c):
|
138
|
-
res = self._do_fft(data, False, backend_cls=SKCUFFT)
|
139
|
-
ref = self._do_reference_fft(data, False)
|
140
|
-
self.check_result(res, ref, config, tol, name="skcuda")
|
141
|
-
|
142
|
-
# IFFT
|
143
|
-
res = cufft.ifft(cufft.output_fft).get()
|
144
|
-
self.check_result(res, data, config, tol, name="skcuda")
|
145
|
-
# Perhaps we should also check against numpy/scipy ifft,
|
146
|
-
# but it does not yield the good shape for R2C on odd-sized data
|
147
|
-
|
148
|
-
@pytest.mark.skipif(
|
149
|
-
not (__has_skcuda__ and __has_pycuda__), reason="Need pycuda and (scikit-cuda or vkfft) for this test"
|
150
|
-
)
|
151
|
-
@pytest.mark.parametrize("config", scenarios)
|
152
|
-
def test_skcuda_batched(self, config):
|
153
|
-
shape = config["shape"]
|
154
|
-
if len(shape) == 1:
|
155
|
-
return
|
156
|
-
elif len(shape) == 3 and not (__do_long_tests__):
|
157
|
-
pytest.skip("3D FFTs are done only for long tests - use NABU_LONG_TESTS=1")
|
158
|
-
r2c = config["r2c"]
|
159
|
-
tol = self.abs_tol[config["precision"]][len(shape)]
|
160
|
-
|
161
|
-
data = self._get_data_array(config)
|
162
|
-
|
163
|
-
if data.ndim == 2:
|
164
|
-
axes_to_test = [(0,), (1,)]
|
165
|
-
elif data.ndim == 3:
|
166
|
-
# axes_to_test = [(1, 2), (2, 1), (2,)] # See fft.py: works for C2C but not R2C ?
|
167
|
-
axes_to_test = [(2,)]
|
168
|
-
|
169
|
-
for axes in axes_to_test:
|
170
|
-
res, cufft = self._do_fft(data, r2c, axes=axes, return_fft_obj=True, backend_cls=SKCUFFT)
|
171
|
-
ref = self._do_reference_fft(data, r2c, axes=axes)
|
172
|
-
self.check_result(res, ref, config, tol, name="skcuda batched axes=%s" % (str(axes)))
|
173
|
-
# IFFT
|
174
|
-
res = cufft.ifft(cufft.output_fft).get()
|
175
|
-
self.check_result(res, data, config, tol, name="skcuda")
|
176
|
-
|
177
115
|
@pytest.mark.parametrize("config", scenarios)
|
178
116
|
def test_vkfft(self, config):
|
179
117
|
backend = config["backend"]
|
@@ -292,6 +292,11 @@ class ConebeamReconstructor:
|
|
292
292
|
# The translation is exactly the amount that brought the detector up or down, but in the opposite direction.
|
293
293
|
vecs[:, 2] = -self.relative_z_position
|
294
294
|
|
295
|
+
def reset_rot_center(self, rot_center):
|
296
|
+
self.rot_center = rot_center
|
297
|
+
self._cor_shift = (self.sinos_shape[-1] - 1) / 2.0 - rot_center
|
298
|
+
self._create_astra_proj_geometry(self.relative_z_position)
|
299
|
+
|
295
300
|
def _set_output(self, volume):
|
296
301
|
if volume is not None:
|
297
302
|
expected_shape = self.vol_shape # if not (self._crop_data) else self._output_cropped_shape
|
@@ -57,7 +57,7 @@ class MLEMReconstructor:
|
|
57
57
|
|
58
58
|
def _set_shifts(self, shifts_uv, cor):
|
59
59
|
if shifts_uv is None:
|
60
|
-
self.shifts_uv =
|
60
|
+
self.shifts_uv = None
|
61
61
|
else:
|
62
62
|
if shifts_uv.shape[0] != self.n_angles:
|
63
63
|
raise ValueError(
|
@@ -66,6 +66,9 @@ class MLEMReconstructor:
|
|
66
66
|
self.shifts_uv = shifts_uv.copy()
|
67
67
|
self.cor = cor
|
68
68
|
|
69
|
+
def reset_rot_center(self, cor):
|
70
|
+
self.cor = cor - (self.sinos_shape[-1] - 1) // 2
|
71
|
+
|
69
72
|
def reconstruct(self, data_vwu):
|
70
73
|
"""
|
71
74
|
data_align_vwu: numpy.ndarray or pycuda.gpuarray
|
@@ -79,10 +82,13 @@ class MLEMReconstructor:
|
|
79
82
|
|
80
83
|
# MLEM recons
|
81
84
|
self.vol_geom_align = cct.models.VolumeGeometry.get_default_from_data(data_vwu)
|
82
|
-
self.
|
83
|
-
|
84
|
-
|
85
|
-
|
85
|
+
if self.shifts_uv is not None:
|
86
|
+
self.prj_geom_align = cct.models.ProjectionGeometry.get_default_parallel()
|
87
|
+
# Vertical shifts were handled in pipeline. Set them to ZERO
|
88
|
+
self.shifts_uv[:, 1] = 0.0
|
89
|
+
self.prj_geom_align.set_detector_shifts_vu(self.shifts_uv.T[::-1])
|
90
|
+
else:
|
91
|
+
self.prj_geom_align = None
|
86
92
|
|
87
93
|
variances_align = cct.processing.compute_variance_poisson(data_vwu)
|
88
94
|
self.weights_align = cct.processing.compute_variance_weight(variances_align, normalized=True) # , use_std=True
|
@@ -38,7 +38,7 @@ if __do_long_tests__:
|
|
38
38
|
"sigma": [1.0, 2.0],
|
39
39
|
"wname": ["db15", "haar", "rbio4.4"],
|
40
40
|
"padding": [None, (100, 100), (50, 71)],
|
41
|
-
"fft_implem": ["
|
41
|
+
"fft_implem": ["vkfft"],
|
42
42
|
}
|
43
43
|
)
|
44
44
|
|
@@ -107,7 +107,7 @@ class TestDeringer:
|
|
107
107
|
|
108
108
|
@pytest.mark.skipif(
|
109
109
|
not (__has_cuda_deringer__) or munchetal_filter is None,
|
110
|
-
reason="Need pycuda, pycudwt and (
|
110
|
+
reason="Need pycuda, pycudwt and (cupy? or pyvkfft) for this test",
|
111
111
|
)
|
112
112
|
@pytest.mark.parametrize("config", fw_scenarios)
|
113
113
|
def test_cuda_munch_deringer(self, config):
|
@@ -7,10 +7,10 @@ from nabu.testutils import get_data, generate_tests_scenarios, __do_long_tests__
|
|
7
7
|
from nabu.cuda.utils import get_cuda_context, __has_pycuda__
|
8
8
|
from nabu.opencl.utils import get_opencl_context, __has_pyopencl__
|
9
9
|
|
10
|
-
from nabu.processing.fft_cuda import
|
10
|
+
from nabu.processing.fft_cuda import has_vkfft as has_vkfft_cu
|
11
11
|
from nabu.processing.fft_opencl import has_vkfft as has_vkfft_cl
|
12
12
|
|
13
|
-
__has_pycuda__ = __has_pycuda__ and
|
13
|
+
__has_pycuda__ = __has_pycuda__ and has_vkfft_cu()
|
14
14
|
__has_pyopencl__ = __has_pyopencl__ and has_vkfft_cl()
|
15
15
|
|
16
16
|
if __has_pycuda__:
|
@@ -62,7 +62,7 @@ class TestFBP:
|
|
62
62
|
def _get_backprojector(self, config, *bp_args, **bp_kwargs):
|
63
63
|
if config["backend"] == "cuda":
|
64
64
|
if not (__has_pycuda__):
|
65
|
-
pytest.skip("Need pycuda + (
|
65
|
+
pytest.skip("Need pycuda + (cupy? or pyvkfft)")
|
66
66
|
Backprojector = CudaBackprojector
|
67
67
|
ctx = self.cuda_ctx
|
68
68
|
else:
|
@@ -42,7 +42,7 @@ class TestHalftomo:
|
|
42
42
|
def _get_backprojector(self, config, *bp_args, **bp_kwargs):
|
43
43
|
if config["backend"] == "cuda":
|
44
44
|
if not (__has_pycuda__):
|
45
|
-
pytest.skip("Need pycuda +
|
45
|
+
pytest.skip("Need pycuda + cupy? or vkfft")
|
46
46
|
Backprojector = CudaBackprojector
|
47
47
|
ctx = self.cuda_ctx
|
48
48
|
else:
|
@@ -48,7 +48,7 @@ def bootstrap(request):
|
|
48
48
|
)
|
49
49
|
@pytest.mark.usefixtures("bootstrap")
|
50
50
|
class TestReconstructor:
|
51
|
-
@pytest.mark.skipif(not (__has_cuda_fbp__), reason="need pycuda and (
|
51
|
+
@pytest.mark.skipif(not (__has_cuda_fbp__), reason="need pycuda and (cupy? or vkfft)")
|
52
52
|
@pytest.mark.parametrize("config", scenarios)
|
53
53
|
def test_cuda_reconstructor(self, config):
|
54
54
|
data = self.projs
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: nabu
|
3
|
-
Version: 2025.1.0.
|
3
|
+
Version: 2025.1.0.dev14
|
4
4
|
Summary: Nabu - Tomography software
|
5
5
|
Author-email: Pierre Paleo <pierre.paleo@esrf.fr>, Henri Payno <henri.payno@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>
|
6
6
|
Maintainer-email: Pierre Paleo <pierre.paleo@esrf.fr>
|
@@ -3,7 +3,6 @@ README.md
|
|
3
3
|
pyproject.toml
|
4
4
|
doc/conf.py
|
5
5
|
doc/create_conf_doc.py
|
6
|
-
doc/doc_config.py
|
7
6
|
doc/get_mathjax.py
|
8
7
|
nabu/__init__.py
|
9
8
|
nabu/tests.py
|
@@ -232,7 +231,6 @@ nabu/processing/tests/test_rotation.py
|
|
232
231
|
nabu/processing/tests/test_transpose.py
|
233
232
|
nabu/processing/tests/test_unsharp.py
|
234
233
|
nabu/reconstruction/__init__.py
|
235
|
-
nabu/reconstruction/astra.py
|
236
234
|
nabu/reconstruction/cone.py
|
237
235
|
nabu/reconstruction/fbp.py
|
238
236
|
nabu/reconstruction/fbp_base.py
|
@@ -1,32 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
|
3
|
-
from nabu.resources.nabu_config import nabu_config
|
4
|
-
|
5
|
-
|
6
|
-
def generate(file_):
|
7
|
-
def write(content):
|
8
|
-
print(content, file=file_)
|
9
|
-
for section, values in nabu_config.items():
|
10
|
-
if section == "about":
|
11
|
-
continue
|
12
|
-
write("## %s\n" % section)
|
13
|
-
for key, val in values.items():
|
14
|
-
if val["type"] == "unsupported":
|
15
|
-
continue
|
16
|
-
write(val["help"] + "\n")
|
17
|
-
write(
|
18
|
-
"```ini\n%s = %s\n```"
|
19
|
-
% (key, val["default"])
|
20
|
-
)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
if __name__ == "__main__":
|
25
|
-
|
26
|
-
import sys, os
|
27
|
-
print(os.path.abspath(__file__))
|
28
|
-
exit(0)
|
29
|
-
|
30
|
-
fname = "/tmp/test.md"
|
31
|
-
with open(fname, "w") as f:
|
32
|
-
generate(f)
|