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.
Files changed (328) hide show
  1. {nabu-2025.1.0.dev12/nabu.egg-info → nabu-2025.1.0.dev14}/PKG-INFO +1 -1
  2. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/__init__.py +1 -1
  3. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/cli_configs.py +1 -1
  4. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/multicor.py +25 -10
  5. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/cast_volume.py +3 -0
  6. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/processconfig.py +3 -2
  7. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_ctf.py +1 -1
  8. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_paganin.py +1 -3
  9. nabu-2025.1.0.dev14/nabu/processing/fft_cuda.py +115 -0
  10. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_fft.py +1 -63
  11. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/cone.py +5 -0
  12. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/mlem.py +11 -5
  13. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_deringer.py +2 -2
  14. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_fbp.py +3 -3
  15. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_halftomo.py +1 -1
  16. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_reconstructor.py +1 -1
  17. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14/nabu.egg-info}/PKG-INFO +1 -1
  18. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/SOURCES.txt +0 -2
  19. nabu-2025.1.0.dev12/doc/doc_config.py +0 -32
  20. nabu-2025.1.0.dev12/nabu/processing/fft_cuda.py +0 -284
  21. nabu-2025.1.0.dev12/nabu/reconstruction/astra.py +0 -245
  22. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/LICENSE +0 -0
  23. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/README.md +0 -0
  24. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/doc/conf.py +0 -0
  25. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/doc/create_conf_doc.py +0 -0
  26. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/doc/get_mathjax.py +0 -0
  27. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/__init__.py +0 -0
  28. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/bootstrap.py +0 -0
  29. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/bootstrap_stitching.py +0 -0
  30. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/cast_volume.py +0 -0
  31. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/compare_volumes.py +0 -0
  32. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/composite_cor.py +0 -0
  33. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/correct_rot.py +0 -0
  34. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/create_distortion_map_from_poly.py +0 -0
  35. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/diag_to_pix.py +0 -0
  36. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/diag_to_rot.py +0 -0
  37. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/double_flatfield.py +0 -0
  38. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/generate_header.py +0 -0
  39. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/histogram.py +0 -0
  40. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/nx_z_splitter.py +0 -0
  41. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/parse_reconstruction_log.py +0 -0
  42. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/prepare_weights_double.py +0 -0
  43. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/reconstruct.py +0 -0
  44. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/reconstruct_helical.py +0 -0
  45. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/reduce_dark_flat.py +0 -0
  46. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/rotate.py +0 -0
  47. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/shrink_dataset.py +0 -0
  48. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/stitching.py +0 -0
  49. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/tests/__init__.py +0 -0
  50. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/tests/test_reduce_dark_flat.py +0 -0
  51. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/utils.py +0 -0
  52. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/app/validator.py +0 -0
  53. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/__init__.py +0 -0
  54. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/convolution.py +0 -0
  55. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/fft.py +0 -0
  56. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/kernel.py +0 -0
  57. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/medfilt.py +0 -0
  58. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/padding.py +0 -0
  59. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/processing.py +0 -0
  60. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/ElementOp.cu +0 -0
  61. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/backproj.cu +0 -0
  62. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/backproj_polar.cu +0 -0
  63. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/boundary.h +0 -0
  64. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/cone.cu +0 -0
  65. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/convolution.cu +0 -0
  66. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/dfi_fftshift.cu +0 -0
  67. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/flatfield.cu +0 -0
  68. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/fourier_wavelets.cu +0 -0
  69. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/halftomo.cu +0 -0
  70. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/helical_padding.cu +0 -0
  71. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/hierarchical_backproj.cu +0 -0
  72. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/histogram.cu +0 -0
  73. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/interpolation.cu +0 -0
  74. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/medfilt.cu +0 -0
  75. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/normalization.cu +0 -0
  76. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/padding.cu +0 -0
  77. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/proj.cu +0 -0
  78. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/rotation.cu +0 -0
  79. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/src/transpose.cu +0 -0
  80. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/tests/__init__.py +0 -0
  81. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/cuda/utils.py +0 -0
  82. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/__init__.py +0 -0
  83. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/alignment.py +0 -0
  84. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/cor.py +0 -0
  85. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/cor_sino.py +0 -0
  86. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/distortion.py +0 -0
  87. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/focus.py +0 -0
  88. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/__init__.py +0 -0
  89. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_alignment.py +0 -0
  90. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_cor.py +0 -0
  91. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_focus.py +0 -0
  92. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_tilt.py +0 -0
  93. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tests/test_translation.py +0 -0
  94. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/tilt.py +0 -0
  95. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/translation.py +0 -0
  96. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/estimation/utils.py +0 -0
  97. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/__init__.py +0 -0
  98. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/detector_distortion.py +0 -0
  99. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/reader.py +0 -0
  100. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/reader_helical.py +0 -0
  101. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/__init__.py +0 -0
  102. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/test_cast_volume.py +0 -0
  103. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/test_readers.py +0 -0
  104. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/tests/test_writers.py +0 -0
  105. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/utils.py +0 -0
  106. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/io/writer.py +0 -0
  107. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/__init__.py +0 -0
  108. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/binning.py +0 -0
  109. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/fftshift.py +0 -0
  110. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/filters.py +0 -0
  111. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/fourier_filters.py +0 -0
  112. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/histogram.py +0 -0
  113. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/histogram_cuda.py +0 -0
  114. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/kernel_base.py +0 -0
  115. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/padding.py +0 -0
  116. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/padding_base.py +0 -0
  117. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/processing_base.py +0 -0
  118. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/rotation.py +0 -0
  119. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/rotation_cuda.py +0 -0
  120. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/tests/__init__.py +0 -0
  121. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/tests/test_binning.py +0 -0
  122. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/tests/test_interpolation.py +0 -0
  123. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/transpose.py +0 -0
  124. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/unsharp.py +0 -0
  125. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/unsharp_cuda.py +0 -0
  126. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/unsharp_opencl.py +0 -0
  127. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/misc/utils.py +0 -0
  128. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/__init__.py +0 -0
  129. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/fft.py +0 -0
  130. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/kernel.py +0 -0
  131. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/memcpy.py +0 -0
  132. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/padding.py +0 -0
  133. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/processing.py +0 -0
  134. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/ElementOp.cl +0 -0
  135. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/backproj.cl +0 -0
  136. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/fftshift.cl +0 -0
  137. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/halftomo.cl +0 -0
  138. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/padding.cl +0 -0
  139. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/roll.cl +0 -0
  140. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/src/transpose.cl +0 -0
  141. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/tests/__init__.py +0 -0
  142. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/opencl/utils.py +0 -0
  143. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/__init__.py +0 -0
  144. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/config.py +0 -0
  145. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/config_validators.py +0 -0
  146. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/datadump.py +0 -0
  147. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/dataset_validator.py +0 -0
  148. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/detector_distortion_provider.py +0 -0
  149. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/estimators.py +0 -0
  150. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/__init__.py +0 -0
  151. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/chunked.py +0 -0
  152. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/chunked_cuda.py +0 -0
  153. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/computations.py +0 -0
  154. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/dataset_validator.py +0 -0
  155. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/get_double_flatfield.py +0 -0
  156. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/nabu_config.py +0 -0
  157. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/fullfield/reconstruction.py +0 -0
  158. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/__init__.py +0 -0
  159. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/dataset_validator.py +0 -0
  160. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/fbp.py +0 -0
  161. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/filtering.py +0 -0
  162. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/gridded_accumulator.py +0 -0
  163. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_chunked_regridded.py +0 -0
  164. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_chunked_regridded_cuda.py +0 -0
  165. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_reconstruction.py +0 -0
  166. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/helical_utils.py +0 -0
  167. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/nabu_config.py +0 -0
  168. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/processconfig.py +0 -0
  169. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/span_strategy.py +0 -0
  170. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/tests/__init__.py +0 -0
  171. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/helical/weight_balancer.py +0 -0
  172. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/params.py +0 -0
  173. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/processconfig.py +0 -0
  174. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/reader.py +0 -0
  175. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/tests/__init__.py +0 -0
  176. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/tests/test_estimators.py +0 -0
  177. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/utils.py +0 -0
  178. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/writer.py +0 -0
  179. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/pipeline/xrdct/__init__.py +0 -0
  180. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/__init__.py +0 -0
  181. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/alignment.py +0 -0
  182. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ccd.py +0 -0
  183. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ccd_cuda.py +0 -0
  184. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ctf.py +0 -0
  185. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/ctf_cuda.py +0 -0
  186. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/distortion.py +0 -0
  187. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/double_flatfield.py +0 -0
  188. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/double_flatfield_cuda.py +0 -0
  189. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/double_flatfield_variable_region.py +0 -0
  190. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/flatfield.py +0 -0
  191. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/flatfield_cuda.py +0 -0
  192. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/flatfield_variable_region.py +0 -0
  193. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/phase.py +0 -0
  194. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/phase_cuda.py +0 -0
  195. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/shift.py +0 -0
  196. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/shift_cuda.py +0 -0
  197. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/__init__.py +0 -0
  198. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_ccd_corr.py +0 -0
  199. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_double_flatfield.py +0 -0
  200. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_flatfield.py +0 -0
  201. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/preproc/tests/test_vshift.py +0 -0
  202. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/__init__.py +0 -0
  203. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/azim.py +0 -0
  204. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/convolution_cuda.py +0 -0
  205. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/fft_base.py +0 -0
  206. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/fft_opencl.py +0 -0
  207. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/fftshift.py +0 -0
  208. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/histogram.py +0 -0
  209. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/histogram_cuda.py +0 -0
  210. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/kernel_base.py +0 -0
  211. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/medfilt_cuda.py +0 -0
  212. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/muladd.py +0 -0
  213. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/muladd_cuda.py +0 -0
  214. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/padding_base.py +0 -0
  215. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/padding_cuda.py +0 -0
  216. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/padding_opencl.py +0 -0
  217. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/processing_base.py +0 -0
  218. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/roll_opencl.py +0 -0
  219. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/rotation.py +0 -0
  220. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/rotation_cuda.py +0 -0
  221. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/__init__.py +0 -0
  222. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_fftshift.py +0 -0
  223. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_histogram.py +0 -0
  224. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_medfilt.py +0 -0
  225. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_muladd.py +0 -0
  226. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_padding.py +0 -0
  227. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_roll.py +0 -0
  228. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_rotation.py +0 -0
  229. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_transpose.py +0 -0
  230. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/tests/test_unsharp.py +0 -0
  231. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/transpose.py +0 -0
  232. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/unsharp.py +0 -0
  233. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/unsharp_cuda.py +0 -0
  234. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/processing/unsharp_opencl.py +0 -0
  235. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/__init__.py +0 -0
  236. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/fbp.py +0 -0
  237. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/fbp_base.py +0 -0
  238. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/fbp_opencl.py +0 -0
  239. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/filtering.py +0 -0
  240. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/filtering_cuda.py +0 -0
  241. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/filtering_opencl.py +0 -0
  242. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/hbp.py +0 -0
  243. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/projection.py +0 -0
  244. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/reconstructor.py +0 -0
  245. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/reconstructor_cuda.py +0 -0
  246. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/rings.py +0 -0
  247. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/rings_cuda.py +0 -0
  248. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/sinogram.py +0 -0
  249. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/sinogram_cuda.py +0 -0
  250. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/sinogram_opencl.py +0 -0
  251. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/__init__.py +0 -0
  252. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_cone.py +0 -0
  253. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_filtering.py +0 -0
  254. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_mlem.py +0 -0
  255. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_projector.py +0 -0
  256. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/reconstruction/tests/test_sino_normalization.py +0 -0
  257. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/__init__.py +0 -0
  258. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/cli/__init__.py +0 -0
  259. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/cor.py +0 -0
  260. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/dataset_analyzer.py +0 -0
  261. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/gpu.py +0 -0
  262. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/logger.py +0 -0
  263. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/nxflatfield.py +0 -0
  264. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/__init__.py +0 -0
  265. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/bm05_pag.conf +0 -0
  266. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id16_ctf.conf +0 -0
  267. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id16_holo.conf +0 -0
  268. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id16a_fluo.conf +0 -0
  269. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/templates/id19_pag.conf +0 -0
  270. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/__init__.py +0 -0
  271. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/test_extract.py +0 -0
  272. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/test_nxflatfield.py +0 -0
  273. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/tests/test_units.py +0 -0
  274. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/resources/utils.py +0 -0
  275. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/__init__.py +0 -0
  276. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/alignment.py +0 -0
  277. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/config.py +0 -0
  278. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/definitions.py +0 -0
  279. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/frame_composition.py +0 -0
  280. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/overlap.py +0 -0
  281. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/sample_normalization.py +0 -0
  282. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/single_axis_stitching.py +0 -0
  283. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/slurm_utils.py +0 -0
  284. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/__init__.py +0 -0
  285. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/base.py +0 -0
  286. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/__init__.py +0 -0
  287. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/base.py +0 -0
  288. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/postprocessing.py +0 -0
  289. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/dumper/preprocessing.py +0 -0
  290. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/post_processing.py +0 -0
  291. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/pre_processing.py +0 -0
  292. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/single_axis.py +0 -0
  293. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/stitcher.py +0 -0
  294. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/y_stitcher.py +0 -0
  295. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher/z_stitcher.py +0 -0
  296. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/stitcher_2D.py +0 -0
  297. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_alignment.py +0 -0
  298. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_config.py +0 -0
  299. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_frame_composition.py +0 -0
  300. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_overlap.py +0 -0
  301. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_sample_normalization.py +0 -0
  302. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_slurm_utils.py +0 -0
  303. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_utils.py +0 -0
  304. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_y_preprocessing_stitching.py +0 -0
  305. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_z_postprocessing_stitching.py +0 -0
  306. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/tests/test_z_preprocessing_stitching.py +0 -0
  307. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/__init__.py +0 -0
  308. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/post_processing.py +0 -0
  309. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/tests/__init__.py +0 -0
  310. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/tests/test_post-processing.py +0 -0
  311. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/utils/utils.py +0 -0
  312. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/y_stitching.py +0 -0
  313. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/stitching/z_stitching.py +0 -0
  314. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/tests.py +0 -0
  315. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/testutils.py +0 -0
  316. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/__init__.py +0 -0
  317. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/algotom_convert_sino.py +0 -0
  318. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/pore3d_deringer_munch.py +0 -0
  319. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/tomocupy_remove_stripe.py +0 -0
  320. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/tomopy_phase.py +0 -0
  321. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/thirdparty/tomwer_load_flats_darks.py +0 -0
  322. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu/utils.py +0 -0
  323. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/dependency_links.txt +0 -0
  324. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/entry_points.txt +0 -0
  325. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/requires.txt +0 -0
  326. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/nabu.egg-info/top_level.txt +0 -0
  327. {nabu-2025.1.0.dev12 → nabu-2025.1.0.dev14}/pyproject.toml +0 -0
  328. {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.dev12
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>
@@ -1,4 +1,4 @@
1
- __version__ = "2025.1.0-dev12"
1
+ __version__ = "2025.1.0-dev14"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
@@ -162,7 +162,7 @@ MultiCorConfig = ReconstructConfig.copy()
162
162
  MultiCorConfig.update(
163
163
  {
164
164
  "cor": {
165
- "help": "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.",
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
- # Get sinogram into contiguous array
72
- # TODO Can't do memcpy2D ?! It used to work in cuda 11.
73
- # For now: transfer to host... not optimal
74
- sino = pipeline._d_radios[:, pipeline._d_radios.shape[1] // 2, :].get() # pylint: disable=E1136
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
- rec = rec_instance.fbp(sino)
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 (scikit-cuda or vkfft)")
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 SKCUFFT, VKCUFFT, get_available_fft_implems
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 = np.zeros([self.n_angles, 2])
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.prj_geom_align = cct.models.ProjectionGeometry.get_default_parallel()
83
- # Vertical shifts were handled in pipeline. Set them to ZERO
84
- self.shifts_uv[:, 1] = 0.0
85
- self.prj_geom_align.set_detector_shifts_vu(self.shifts_uv.T[::-1])
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": ["skcuda", "vkfft"],
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 (scikit-cuda or pyvkfft) for this test",
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 has_skcuda, has_vkfft as has_vkfft_cu
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 (has_skcuda() or has_vkfft_cu())
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 + (scikit-cuda or pyvkfft)")
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 + scikit-cuda or vkfft")
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 (scikit-cuda or vkfft)")
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.dev12
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)