nabu 2024.1.5__tar.gz → 2024.1.7__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 (333) hide show
  1. {nabu-2024.1.5/nabu.egg-info → nabu-2024.1.7}/PKG-INFO +2 -22
  2. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/__init__.py +1 -1
  3. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/cast_volume.py +34 -11
  4. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/tests/test_cast_volume.py +18 -10
  5. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fullfield/chunked.py +11 -8
  6. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fullfield/dataset_validator.py +5 -1
  7. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fullfield/processconfig.py +1 -1
  8. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/tests/test_accumulator.py +2 -1
  9. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/processconfig.py +4 -1
  10. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_fftshift.py +1 -0
  11. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_deringer.py +3 -3
  12. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_halftomo.py +2 -1
  13. nabu-2024.1.7/nabu/thirdparty/__init__.py +0 -0
  14. {nabu-2024.1.5 → nabu-2024.1.7/nabu.egg-info}/PKG-INFO +2 -22
  15. {nabu-2024.1.5 → nabu-2024.1.7}/nabu.egg-info/SOURCES.txt +2 -33
  16. {nabu-2024.1.5 → nabu-2024.1.7}/nabu.egg-info/top_level.txt +2 -0
  17. nabu-2024.1.5/doc/doc_config.py +0 -32
  18. nabu-2024.1.5/sandbox/align_test.py +0 -61
  19. nabu-2024.1.5/sandbox/app.py +0 -123
  20. nabu-2024.1.5/sandbox/binning_cython.py +0 -37
  21. nabu-2024.1.5/sandbox/circ_sm.py +0 -195
  22. nabu-2024.1.5/sandbox/composite_image.py +0 -90
  23. nabu-2024.1.5/sandbox/convert_id15.py +0 -148
  24. nabu-2024.1.5/sandbox/do_test_ctf.py +0 -40
  25. nabu-2024.1.5/sandbox/esrf_envs.py +0 -36
  26. nabu-2024.1.5/sandbox/fbp_polar.py +0 -39
  27. nabu-2024.1.5/sandbox/fbp_tilt.py +0 -340
  28. nabu-2024.1.5/sandbox/interleaved.py +0 -129
  29. nabu-2024.1.5/sandbox/interp_sinos_halftomo.py +0 -31
  30. nabu-2024.1.5/sandbox/linear_interp.py +0 -14
  31. nabu-2024.1.5/sandbox/merge_recs.py +0 -56
  32. nabu-2024.1.5/sandbox/moduleutils.py +0 -50
  33. nabu-2024.1.5/sandbox/nbreconstruct.py +0 -246
  34. nabu-2024.1.5/sandbox/pag_margin.py +0 -38
  35. nabu-2024.1.5/sandbox/parse.py +0 -132
  36. nabu-2024.1.5/sandbox/plot.py +0 -49
  37. nabu-2024.1.5/sandbox/proj3D.py +0 -75
  38. nabu-2024.1.5/sandbox/rec_bm05.py +0 -71
  39. nabu-2024.1.5/sandbox/rec_thread.py +0 -133
  40. nabu-2024.1.5/sandbox/shift_bilinear2.py +0 -42
  41. nabu-2024.1.5/sandbox/sinotilt.py +0 -181
  42. nabu-2024.1.5/sandbox/sysutils.py +0 -63
  43. nabu-2024.1.5/sandbox/test_mp_queue.py +0 -73
  44. nabu-2024.1.5/sandbox/tilt.py +0 -251
  45. nabu-2024.1.5/sandbox/utils.py +0 -54
  46. nabu-2024.1.5/sandbox/vo.py +0 -204
  47. nabu-2024.1.5/sandbox/workers.py +0 -123
  48. nabu-2024.1.5/sandbox/xrdrec_pyFAI_data.py +0 -212
  49. {nabu-2024.1.5 → nabu-2024.1.7}/LICENSE +0 -0
  50. {nabu-2024.1.5 → nabu-2024.1.7}/README.md +0 -0
  51. {nabu-2024.1.5 → nabu-2024.1.7}/doc/conf.py +0 -0
  52. {nabu-2024.1.5 → nabu-2024.1.7}/doc/create_conf_doc.py +0 -0
  53. {nabu-2024.1.5 → nabu-2024.1.7}/doc/get_mathjax.py +0 -0
  54. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/__init__.py +0 -0
  55. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/bootstrap.py +0 -0
  56. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/bootstrap_stitching.py +0 -0
  57. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/cast_volume.py +0 -0
  58. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/cli_configs.py +0 -0
  59. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/compare_volumes.py +0 -0
  60. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/composite_cor.py +0 -0
  61. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/correct_rot.py +0 -0
  62. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/create_distortion_map_from_poly.py +0 -0
  63. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/diag_to_pix.py +0 -0
  64. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/diag_to_rot.py +0 -0
  65. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/double_flatfield.py +0 -0
  66. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/generate_header.py +0 -0
  67. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/histogram.py +0 -0
  68. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/multicor.py +0 -0
  69. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/nx_z_splitter.py +0 -0
  70. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/parse_reconstruction_log.py +0 -0
  71. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/prepare_weights_double.py +0 -0
  72. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/reconstruct.py +0 -0
  73. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/reconstruct_helical.py +0 -0
  74. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/reduce_dark_flat.py +0 -0
  75. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/rotate.py +0 -0
  76. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/shrink_dataset.py +0 -0
  77. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/stitching.py +0 -0
  78. {nabu-2024.1.5/nabu/cuda → nabu-2024.1.7/nabu/app/tests}/__init__.py +0 -0
  79. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/tests/test_reduce_dark_flat.py +0 -0
  80. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/utils.py +0 -0
  81. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/app/validator.py +0 -0
  82. {nabu-2024.1.5/nabu/estimation/tests → nabu-2024.1.7/nabu/cuda}/__init__.py +0 -0
  83. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/convolution.py +0 -0
  84. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/fft.py +0 -0
  85. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/kernel.py +0 -0
  86. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/medfilt.py +0 -0
  87. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/padding.py +0 -0
  88. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/processing.py +0 -0
  89. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/ElementOp.cu +0 -0
  90. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/backproj.cu +0 -0
  91. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/backproj_polar.cu +0 -0
  92. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/boundary.h +0 -0
  93. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/convolution.cu +0 -0
  94. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/dfi_fftshift.cu +0 -0
  95. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/flatfield.cu +0 -0
  96. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/fourier_wavelets.cu +0 -0
  97. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/halftomo.cu +0 -0
  98. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/helical_padding.cu +0 -0
  99. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/histogram.cu +0 -0
  100. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/interpolation.cu +0 -0
  101. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/medfilt.cu +0 -0
  102. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/normalization.cu +0 -0
  103. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/padding.cu +0 -0
  104. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/proj.cu +0 -0
  105. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/rotation.cu +0 -0
  106. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/src/transpose.cu +0 -0
  107. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/tests/__init__.py +0 -0
  108. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/cuda/utils.py +0 -0
  109. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/__init__.py +0 -0
  110. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/alignment.py +0 -0
  111. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/cor.py +0 -0
  112. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/cor_sino.py +0 -0
  113. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/distortion.py +0 -0
  114. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/focus.py +0 -0
  115. {nabu-2024.1.5/nabu/io → nabu-2024.1.7/nabu/estimation}/tests/__init__.py +0 -0
  116. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/tests/test_alignment.py +0 -0
  117. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/tests/test_cor.py +0 -0
  118. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/tests/test_focus.py +0 -0
  119. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/tests/test_tilt.py +0 -0
  120. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/tests/test_translation.py +0 -0
  121. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/tilt.py +0 -0
  122. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/translation.py +0 -0
  123. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/estimation/utils.py +0 -0
  124. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/__init__.py +0 -0
  125. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/detector_distortion.py +0 -0
  126. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/reader.py +0 -0
  127. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/reader_helical.py +0 -0
  128. {nabu-2024.1.5/nabu/misc → nabu-2024.1.7/nabu/io/tests}/__init__.py +0 -0
  129. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/tests/test_detector_distortion.py +0 -0
  130. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/tests/test_writers.py +0 -0
  131. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/tiffwriter_zmm.py +0 -0
  132. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/utils.py +0 -0
  133. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/io/writer.py +0 -0
  134. {nabu-2024.1.5/nabu/opencl → nabu-2024.1.7/nabu/misc}/__init__.py +0 -0
  135. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/binning.py +0 -0
  136. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/fftshift.py +0 -0
  137. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/filters.py +0 -0
  138. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/fourier_filters.py +0 -0
  139. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/histogram.py +0 -0
  140. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/histogram_cuda.py +0 -0
  141. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/kernel_base.py +0 -0
  142. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/padding.py +0 -0
  143. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/padding_base.py +0 -0
  144. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/processing_base.py +0 -0
  145. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/rotation.py +0 -0
  146. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/rotation_cuda.py +0 -0
  147. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/tests/__init__.py +0 -0
  148. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/tests/test_binning.py +0 -0
  149. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/tests/test_interpolation.py +0 -0
  150. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/transpose.py +0 -0
  151. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/unsharp.py +0 -0
  152. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/unsharp_cuda.py +0 -0
  153. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/unsharp_opencl.py +0 -0
  154. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/misc/utils.py +0 -0
  155. {nabu-2024.1.5/nabu/opencl/tests → nabu-2024.1.7/nabu/opencl}/__init__.py +0 -0
  156. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/fft.py +0 -0
  157. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/kernel.py +0 -0
  158. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/memcpy.py +0 -0
  159. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/padding.py +0 -0
  160. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/processing.py +0 -0
  161. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/src/ElementOp.cl +0 -0
  162. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/src/backproj.cl +0 -0
  163. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/src/fftshift.cl +0 -0
  164. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/src/halftomo.cl +0 -0
  165. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/src/padding.cl +0 -0
  166. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/src/roll.cl +0 -0
  167. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/src/transpose.cl +0 -0
  168. {nabu-2024.1.5/nabu/pipeline → nabu-2024.1.7/nabu/opencl/tests}/__init__.py +0 -0
  169. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/opencl/utils.py +0 -0
  170. {nabu-2024.1.5/nabu/pipeline/fullfield → nabu-2024.1.7/nabu/pipeline}/__init__.py +0 -0
  171. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/config.py +0 -0
  172. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/config_validators.py +0 -0
  173. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/datadump.py +0 -0
  174. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/dataset_validator.py +0 -0
  175. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/detector_distortion_provider.py +0 -0
  176. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/estimators.py +0 -0
  177. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fallback_utils.py +0 -0
  178. {nabu-2024.1.5/nabu/pipeline/helical → nabu-2024.1.7/nabu/pipeline/fullfield}/__init__.py +0 -0
  179. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fullfield/chunked_cuda.py +0 -0
  180. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fullfield/computations.py +0 -0
  181. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fullfield/nabu_config.py +0 -0
  182. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/fullfield/reconstruction.py +0 -0
  183. {nabu-2024.1.5/nabu/pipeline/helical/tests → nabu-2024.1.7/nabu/pipeline/helical}/__init__.py +0 -0
  184. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/dataset_validator.py +0 -0
  185. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/fbp.py +0 -0
  186. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/filtering.py +0 -0
  187. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/gridded_accumulator.py +0 -0
  188. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/helical_chunked_regridded.py +0 -0
  189. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/helical_chunked_regridded_cuda.py +0 -0
  190. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/helical_reconstruction.py +0 -0
  191. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/helical_utils.py +0 -0
  192. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/nabu_config.py +0 -0
  193. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/processconfig.py +0 -0
  194. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/span_strategy.py +0 -0
  195. {nabu-2024.1.5/nabu/pipeline/xrdct → nabu-2024.1.7/nabu/pipeline/helical/tests}/__init__.py +0 -0
  196. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/tests/test_pipeline_elements_full.py +0 -0
  197. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/tests/test_strategy.py +0 -0
  198. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/utils.py +0 -0
  199. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/helical/weight_balancer.py +0 -0
  200. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/params.py +0 -0
  201. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/tests/test_chunk_reader.py +0 -0
  202. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/tests/test_estimators.py +0 -0
  203. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/utils.py +0 -0
  204. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/pipeline/writer.py +0 -0
  205. {nabu-2024.1.5/nabu/processing → nabu-2024.1.7/nabu/pipeline/xrdct}/__init__.py +0 -0
  206. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/__init__.py +0 -0
  207. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/alignment.py +0 -0
  208. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/ccd.py +0 -0
  209. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/ccd_cuda.py +0 -0
  210. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/ctf.py +0 -0
  211. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/ctf_cuda.py +0 -0
  212. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/distortion.py +0 -0
  213. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/double_flatfield.py +0 -0
  214. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/double_flatfield_cuda.py +0 -0
  215. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/double_flatfield_variable_region.py +0 -0
  216. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/flatfield.py +0 -0
  217. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/flatfield_cuda.py +0 -0
  218. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/flatfield_variable_region.py +0 -0
  219. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/phase.py +0 -0
  220. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/phase_cuda.py +0 -0
  221. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/shift.py +0 -0
  222. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/shift_cuda.py +0 -0
  223. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/tests/__init__.py +0 -0
  224. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/tests/test_ccd_corr.py +0 -0
  225. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/tests/test_ctf.py +0 -0
  226. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/tests/test_double_flatfield.py +0 -0
  227. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/tests/test_flatfield.py +0 -0
  228. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/tests/test_paganin.py +0 -0
  229. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/preproc/tests/test_vshift.py +0 -0
  230. {nabu-2024.1.5/nabu/processing/tests → nabu-2024.1.7/nabu/processing}/__init__.py +0 -0
  231. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/convolution_cuda.py +0 -0
  232. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/fft_base.py +0 -0
  233. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/fft_cuda.py +0 -0
  234. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/fft_opencl.py +0 -0
  235. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/fftshift.py +0 -0
  236. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/histogram.py +0 -0
  237. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/histogram_cuda.py +0 -0
  238. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/kernel_base.py +0 -0
  239. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/medfilt_cuda.py +0 -0
  240. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/muladd.py +0 -0
  241. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/muladd_cuda.py +0 -0
  242. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/padding_base.py +0 -0
  243. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/padding_cuda.py +0 -0
  244. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/padding_opencl.py +0 -0
  245. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/processing_base.py +0 -0
  246. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/roll_opencl.py +0 -0
  247. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/rotation.py +0 -0
  248. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/rotation_cuda.py +0 -0
  249. {nabu-2024.1.5/nabu/resources → nabu-2024.1.7/nabu/processing/tests}/__init__.py +0 -0
  250. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_fft.py +0 -0
  251. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_histogram.py +0 -0
  252. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_medfilt.py +0 -0
  253. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_muladd.py +0 -0
  254. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_padding.py +0 -0
  255. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_roll.py +0 -0
  256. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_rotation.py +0 -0
  257. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_transpose.py +0 -0
  258. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/tests/test_unsharp.py +0 -0
  259. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/transpose.py +0 -0
  260. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/unsharp.py +0 -0
  261. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/unsharp_cuda.py +0 -0
  262. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/processing/unsharp_opencl.py +0 -0
  263. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/__init__.py +0 -0
  264. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/cone.py +0 -0
  265. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/fbp.py +0 -0
  266. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/fbp_base.py +0 -0
  267. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/fbp_opencl.py +0 -0
  268. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/filtering.py +0 -0
  269. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/filtering_cuda.py +0 -0
  270. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/filtering_opencl.py +0 -0
  271. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/projection.py +0 -0
  272. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/reconstructor.py +0 -0
  273. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/reconstructor_cuda.py +0 -0
  274. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/rings.py +0 -0
  275. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/rings_cuda.py +0 -0
  276. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/sinogram.py +0 -0
  277. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/sinogram_cuda.py +0 -0
  278. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/sinogram_opencl.py +0 -0
  279. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/__init__.py +0 -0
  280. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_cone.py +0 -0
  281. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_fbp.py +0 -0
  282. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_filtering.py +0 -0
  283. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_projector.py +0 -0
  284. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_reconstructor.py +0 -0
  285. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/reconstruction/tests/test_sino_normalization.py +0 -0
  286. {nabu-2024.1.5/nabu/resources/cli → nabu-2024.1.7/nabu/resources}/__init__.py +0 -0
  287. {nabu-2024.1.5/nabu/resources/templates → nabu-2024.1.7/nabu/resources/cli}/__init__.py +0 -0
  288. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/cor.py +0 -0
  289. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/dataset_analyzer.py +0 -0
  290. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/gpu.py +0 -0
  291. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/logger.py +0 -0
  292. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/nxflatfield.py +0 -0
  293. {nabu-2024.1.5/nabu/resources/tests → nabu-2024.1.7/nabu/resources/templates}/__init__.py +0 -0
  294. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/templates/bm05_pag.conf +0 -0
  295. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/templates/id16_ctf.conf +0 -0
  296. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/templates/id16_holo.conf +0 -0
  297. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/templates/id19_pag.conf +0 -0
  298. {nabu-2024.1.5/nabu/stitching → nabu-2024.1.7/nabu/resources/tests}/__init__.py +0 -0
  299. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/tests/test_nxflatfield.py +0 -0
  300. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/tests/test_units.py +0 -0
  301. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/resources/utils.py +0 -0
  302. {nabu-2024.1.5/nabu/stitching/tests → nabu-2024.1.7/nabu/stitching}/__init__.py +0 -0
  303. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/alignment.py +0 -0
  304. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/config.py +0 -0
  305. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/definitions.py +0 -0
  306. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/frame_composition.py +0 -0
  307. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/overlap.py +0 -0
  308. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/sample_normalization.py +0 -0
  309. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/slurm_utils.py +0 -0
  310. {nabu-2024.1.5/nabu/thirdparty → nabu-2024.1.7/nabu/stitching/tests}/__init__.py +0 -0
  311. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_alignment.py +0 -0
  312. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_config.py +0 -0
  313. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_frame_composition.py +0 -0
  314. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_overlap.py +0 -0
  315. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_sample_normalization.py +0 -0
  316. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_slurm_utils.py +0 -0
  317. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_utils.py +0 -0
  318. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/tests/test_z_stitching.py +0 -0
  319. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/utils.py +0 -0
  320. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/stitching/z_stitching.py +0 -0
  321. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/tests.py +0 -0
  322. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/testutils.py +0 -0
  323. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/thirdparty/algotom_convert_sino.py +0 -0
  324. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/thirdparty/pore3d_deringer_munch.py +0 -0
  325. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/thirdparty/tomocupy_remove_stripe.py +0 -0
  326. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/thirdparty/tomopy_phase.py +0 -0
  327. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/thirdparty/tomwer_load_flats_darks.py +0 -0
  328. {nabu-2024.1.5 → nabu-2024.1.7}/nabu/utils.py +0 -0
  329. {nabu-2024.1.5 → nabu-2024.1.7}/nabu.egg-info/dependency_links.txt +0 -0
  330. {nabu-2024.1.5 → nabu-2024.1.7}/nabu.egg-info/entry_points.txt +0 -0
  331. {nabu-2024.1.5 → nabu-2024.1.7}/nabu.egg-info/requires.txt +0 -0
  332. {nabu-2024.1.5 → nabu-2024.1.7}/pyproject.toml +0 -0
  333. {nabu-2024.1.5 → nabu-2024.1.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.1.5
3
+ Version: 2024.1.7
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>
@@ -48,29 +48,9 @@ Classifier: Topic :: Scientific/Engineering :: Physics
48
48
  Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
49
49
  Requires-Python: >=3.7
50
50
  Description-Content-Type: text/markdown
51
- License-File: LICENSE
52
- Requires-Dist: numpy>1.9.0
53
- Requires-Dist: scipy
54
- Requires-Dist: h5py>=3.0
55
- Requires-Dist: silx>=0.15.0
56
- Requires-Dist: tomoscan>=2.0.4
57
- Requires-Dist: psutil
58
- Requires-Dist: pytest
59
- Requires-Dist: tifffile
60
51
  Provides-Extra: full
61
- Requires-Dist: scikit-image; extra == "full"
62
- Requires-Dist: PyWavelets; extra == "full"
63
- Requires-Dist: glymur; extra == "full"
64
- Requires-Dist: pycuda; extra == "full"
65
- Requires-Dist: scikit-cuda; extra == "full"
66
- Requires-Dist: pycudwt; extra == "full"
67
- Requires-Dist: sluurp>=0.3; extra == "full"
68
- Requires-Dist: pyvkfft; extra == "full"
69
52
  Provides-Extra: doc
70
- Requires-Dist: sphinx; extra == "doc"
71
- Requires-Dist: cloud_sptheme; extra == "doc"
72
- Requires-Dist: myst-parser; extra == "doc"
73
- Requires-Dist: nbsphinx; extra == "doc"
53
+ License-File: LICENSE
74
54
 
75
55
  # Nabu
76
56
 
@@ -1,4 +1,4 @@
1
- __version__ = "2024.1.5"
1
+ __version__ = "2024.1.7"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
@@ -293,25 +293,48 @@ def find_histogram(volume: VolumeBase, scan: Optional[TomoScanBase] = None) -> O
293
293
  data_path = volume.data_url.data_path().replace(HDF5Volume.DATA_DATASET_NAME, "histogram/results/data")
294
294
  elif isinstance(volume, (EDFVolume, JP2KVolume, TIFFVolume, MultiTIFFVolume)):
295
295
  if isinstance(volume, (EDFVolume, JP2KVolume, TIFFVolume)):
296
- # TODO: check with pierre what is the policy of histogram files names
297
296
  histogram_file = os.path.join(
298
297
  volume.data_url.file_path(),
299
- volume.get_volume_basename() + "histogram.hdf5",
298
+ volume.get_volume_basename() + "_histogram.hdf5",
300
299
  )
300
+ if not os.path.exists(histogram_file):
301
+ # legacy location
302
+ legacy_histogram_file = os.path.join(
303
+ volume.data_url.file_path(),
304
+ volume.get_volume_basename() + "histogram.hdf5",
305
+ )
306
+ if os.path.exists(legacy_histogram_file):
307
+ # only overwrite if exists. Else keep the older one to get a clearer information
308
+ histogram_file = legacy_histogram_file
301
309
  else:
302
- # TODO: check with pierre what is the policy of histogram files names
303
310
  file_path, _ = os.path.splitext(volume.data_url.file_path())
304
- histogram_file = os.path.join(file_path + "histogram.hdf5")
311
+ histogram_file = file_path + "_histogram.hdf5"
305
312
 
306
313
  if scan is not None:
307
- data_path = getattr(scan, "entry", "entry")
314
+ data_path = getattr(scan, "entry/histogram/results/data", "entry/histogram/results/data")
308
315
  else:
309
- # TODO: FIXME: how to get the entry name in every case ?
310
- # possible solutions are:
311
- # * look at the different entries and check for histogram: will work if only one histogram in the file
312
- # * Add a histogram request so the user can provide it (can be done at tomoscan level or nabu if we think this is specific to nabu)
313
- _logger.info("histogram file found but unable to find relevant histogram")
314
- return None
316
+
317
+ def get_file_entries(file_path: str) -> Optional[tuple]:
318
+ if os.path.exists(file_path):
319
+ with HDF5File(file_path, mode="r") as h5s:
320
+ return tuple(h5s.keys())
321
+ else:
322
+ return None
323
+
324
+ # in the case we only know about the volume to cast.
325
+ # in most of the cast the histogram.hdf5 file will only get a single entry. The exception could be
326
+ # for HDF5 if the user save volumes into the same file.
327
+ # we can find back the histogram
328
+ entries = get_file_entries(histogram_file)
329
+ if entries is not None and len(entries) == 1:
330
+ data_path = "/".join((entries[0], "histogram/results/data"))
331
+ else:
332
+ # TODO: FIXME: how to get the entry name in every case ?
333
+ # what to do if the histogram file has more than one entry.
334
+ # one option could be to request the entry from the user...
335
+ # or keep as today (in this case it will be recomputed)
336
+ _logger.info("histogram file found but unable to find relevant histogram")
337
+ return None
315
338
  else:
316
339
  raise NotImplementedError(f"volume {type(volume)} not handled")
317
340
 
@@ -70,9 +70,9 @@ def test_get_default_output_volume():
70
70
  )
71
71
  assert isinstance(output_volume, HDF5Volume)
72
72
  assert output_volume.data_url.file_path() == "vol_cast/my_file.hdf5"
73
- assert output_volume.data_url.data_path() == HDF5Volume.DATA_DATASET_NAME
73
+ assert output_volume.data_url.data_path() == "volume/" + HDF5Volume.DATA_DATASET_NAME
74
74
  assert output_volume.metadata_url.file_path() == "vol_cast/my_file.hdf5"
75
- assert output_volume.metadata_url.data_path() == HDF5Volume.METADATA_GROUP_NAME
75
+ assert output_volume.metadata_url.data_path() == "volume/" + HDF5Volume.METADATA_GROUP_NAME
76
76
 
77
77
  # test jp2 to hdf5
78
78
  input_volume = JP2KVolume(
@@ -119,19 +119,23 @@ def test_find_histogram_single_frame_volume(tmp_path):
119
119
  folder=tmp_path,
120
120
  volume_basename="volume",
121
121
  )
122
- histogram_file = os.path.join(tmp_path, "volumehistogram.hdf5")
122
+ histogram_file = os.path.join(tmp_path, "volume_histogram.hdf5")
123
123
  with h5py.File(histogram_file, mode="w") as h5f:
124
124
  h5f.require_group("entry/histogram/results/data")
125
125
 
126
126
  # check behavior
127
- assert find_histogram(volume=volume) == None
127
+ assert find_histogram(volume=volume) == DataUrl(
128
+ file_path=histogram_file,
129
+ data_path="entry/histogram/results/data",
130
+ scheme="silx",
131
+ )
128
132
 
129
133
  assert find_histogram(
130
134
  volume=volume,
131
135
  scan=EDFTomoScan(scan=str(tmp_path)),
132
136
  ) == DataUrl(
133
137
  file_path=histogram_file,
134
- data_path="entry",
138
+ data_path="entry/histogram/results/data",
135
139
  scheme="silx",
136
140
  )
137
141
 
@@ -140,7 +144,7 @@ def test_find_histogram_single_frame_volume(tmp_path):
140
144
  scan=NXtomoScan(scan=str(tmp_path), entry="entry"),
141
145
  ) == DataUrl(
142
146
  file_path=histogram_file,
143
- data_path="entry",
147
+ data_path="entry/histogram/results/data",
144
148
  scheme="silx",
145
149
  )
146
150
 
@@ -156,19 +160,23 @@ def test_find_histogram_multi_tiff_volume(tmp_path):
156
160
  volume = MultiTIFFVolume(
157
161
  file_path=tiff_file,
158
162
  )
159
- histogram_file = os.path.join(tmp_path, "my_tiffhistogram.hdf5")
163
+ histogram_file = os.path.join(tmp_path, "my_tiff_histogram.hdf5")
160
164
  with h5py.File(histogram_file, mode="w") as h5f:
161
165
  h5f.require_group("entry/histogram/results/data")
162
166
 
163
167
  # check behavior
164
- assert find_histogram(volume=volume) == None
168
+ assert find_histogram(volume=volume) == DataUrl(
169
+ file_path=histogram_file,
170
+ data_path="entry/histogram/results/data",
171
+ scheme="silx",
172
+ )
165
173
 
166
174
  assert find_histogram(
167
175
  volume=volume,
168
176
  scan=EDFTomoScan(scan=str(tmp_path)),
169
177
  ) == DataUrl(
170
178
  file_path=histogram_file,
171
- data_path="entry",
179
+ data_path="entry/histogram/results/data",
172
180
  scheme="silx",
173
181
  )
174
182
 
@@ -177,7 +185,7 @@ def test_find_histogram_multi_tiff_volume(tmp_path):
177
185
  scan=NXtomoScan(scan=str(tmp_path), entry="entry"),
178
186
  ) == DataUrl(
179
187
  file_path=histogram_file,
180
- data_path="entry",
188
+ data_path="entry/histogram/results/data",
181
189
  scheme="silx",
182
190
  )
183
191
 
@@ -548,7 +548,6 @@ class ChunkedPipeline:
548
548
 
549
549
  if options["method"] == "FBP":
550
550
  n_slices = self.n_slices
551
- radios_shape_for_sino_builder = self.radios_cropped_shape
552
551
  self.reconstruction = self.FBPClass(
553
552
  self.sinos_shape[1:],
554
553
  angles=options["angles"],
@@ -567,7 +566,6 @@ class ChunkedPipeline:
567
566
  )
568
567
 
569
568
  if options["method"] == "cone":
570
- radios_shape_for_sino_builder = self.radios_shape
571
569
  n_slices = self.n_slices + sum(self.margin[0])
572
570
  # For numerical stability, normalize all lengths with respect to detector pixel size
573
571
  pixel_size_m = self.dataset_info.pixel_size * 1e-6
@@ -586,8 +584,6 @@ class ChunkedPipeline:
586
584
  self._allocate_recs(*self.process_config.rec_shape, n_slices=n_slices)
587
585
  n_a, _, n_x = self.radios_cropped_shape
588
586
  self._tmp_sino = self._allocate_array((n_a, n_x), "f", name="tmp_sino")
589
- if options["method"] == "cone":
590
- self.sinos = self._allocate_array(self.sino_builder.output_shape, "f", name="sinos")
591
587
 
592
588
  @use_options("histogram", "histogram")
593
589
  def _init_histogram(self):
@@ -734,14 +730,21 @@ class ChunkedPipeline:
734
730
  """
735
731
  This reconstructs the entire sinograms stack at once
736
732
  """
737
- self.sino_builder.get_sinos(self.radios, output=self.sinos)
733
+
734
+ n_angles, n_z, n_x = self.radios.shape
735
+ # can't do a discontiguous single copy...
736
+ sinos_contig = self._allocate_array((n_z, n_angles, n_x), np.float32, "sinos_cone")
737
+ for i in range(n_z):
738
+ sinos_contig[i] = self.radios[:, i, :]
739
+ #
740
+
738
741
  z_min, z_max = self.sub_region_xz[2:]
739
- n_z = self.process_config.radio_shape(binning=True)[0]
742
+ n_z_tot = self.process_config.radio_shape(binning=True)[0]
740
743
 
741
744
  self.reconstruction.reconstruct( # pylint: disable=E1101
742
- self.sinos,
745
+ sinos_contig,
743
746
  output=self.recs,
744
- relative_z_position=((z_min + z_max) / self.process_config.binning_z / 2) - n_z / 2,
747
+ relative_z_position=((z_min + z_max) / self.process_config.binning_z / 2) - n_z_tot / 2,
745
748
  )
746
749
 
747
750
  @pipeline_step("histogram", "Computing histogram")
@@ -29,7 +29,7 @@ class FullFieldDatasetValidator(DatasetValidatorBase):
29
29
  def _check_slice_indices(self):
30
30
  nx, nz = self.dataset_info.radio_dims
31
31
  rec_params = self.rec_params
32
- if rec_params["enable_halftomo"]:
32
+ if self.is_halftomo:
33
33
  ny, nx = self._get_nx_ny()
34
34
  what = (("start_x", "end_x", nx), ("start_y", "end_y", nx), ("start_z", "end_z", nz))
35
35
  for start_name, end_name, numels in what:
@@ -61,3 +61,7 @@ class FullFieldDatasetValidator(DatasetValidatorBase):
61
61
  self.logger.warning(
62
62
  "Cone-beam reconstruction: 'sample_detector_dist' not provided, will use the one in dataset metadata"
63
63
  )
64
+ if self.is_halftomo:
65
+ err_msg = "Cone-beam reconstruction with half-acquisition is not supported yet"
66
+ self.logger.fatal(err_msg)
67
+ raise NotImplementedError(err_msg)
@@ -600,7 +600,7 @@ class ProcessConfig(ProcessConfigBase):
600
600
  )
601
601
  if all([m is not None for m in mean_positions_xyz]):
602
602
  rec_options["position"] = mean_positions_xyz
603
- if rec_options["sample_detector_dist"] is None:
603
+ if rec_options["method"] == "cone" and rec_options["sample_detector_dist"] is None:
604
604
  rec_options["sample_detector_dist"] = self.dataset_info.distance # was checked to be not None earlier
605
605
 
606
606
  # New key
@@ -1,5 +1,5 @@
1
1
  from nabu.pipeline.helical import gridded_accumulator, span_strategy
2
- from nabu.testutils import get_data
2
+ from nabu.testutils import get_data, __do_long_tests__
3
3
 
4
4
  import pytest
5
5
  import numpy as np
@@ -49,6 +49,7 @@ def bootstrap(request):
49
49
  cls.rtol_regridded = 1.0e-6
50
50
 
51
51
 
52
+ @pytest.mark.skipif(not (__do_long_tests__), reason="need environment variable NABU_LONG_TESTS=1")
52
53
  @pytest.mark.usefixtures("bootstrap")
53
54
  class TestGriddedAccumulator:
54
55
  """
@@ -181,7 +181,10 @@ class ProcessConfigBase:
181
181
  #
182
182
  if isinstance(tilt, str): # auto-tilt
183
183
  self.tilt_estimator = DetectorTiltEstimator(
184
- self.dataset_info, logger=self.logger, autotilt_options=self.nabu_config["preproc"]["autotilt_options"]
184
+ self.dataset_info,
185
+ do_flatfield=self.nabu_config["preproc"]["flatfield"],
186
+ logger=self.logger,
187
+ autotilt_options=self.nabu_config["preproc"]["autotilt_options"],
185
188
  )
186
189
  tilt = self.tilt_estimator.find_tilt(tilt_method=tilt)
187
190
  self.dataset_info.detector_tilt = tilt
@@ -31,6 +31,7 @@ def bootstrap(request):
31
31
  cls.cu_ctx.pop()
32
32
 
33
33
 
34
+ @pytest.mark.skip(reason="OpenCL fftshift is a prototype")
34
35
  @pytest.mark.usefixtures("bootstrap")
35
36
  class TestFFTshift:
36
37
  def _do_test_fftshift(self, config, fftshift_cls):
@@ -1,7 +1,7 @@
1
1
  import numpy as np
2
2
  import pytest
3
3
  from nabu.reconstruction.rings_cuda import CudaSinoMeanDeringer
4
- from nabu.testutils import compare_arrays, get_data, generate_tests_scenarios, __do_long_tests__
4
+ from nabu.testutils import compare_arrays, get_data, generate_tests_scenarios, __do_long_tests__, __do_large_mem_tests__
5
5
  from nabu.reconstruction.rings import MunchDeringer, SinoMeanDeringer, VoDeringer, __has_algotom__
6
6
  from nabu.thirdparty.pore3d_deringer_munch import munchetal_filter
7
7
  from nabu.cuda.utils import __has_pycuda__, get_cuda_context
@@ -144,8 +144,8 @@ class TestMunchDeringer:
144
144
  # TODO check result. The generated test sinogram is "too synthetic" for this kind of deringer
145
145
 
146
146
  @pytest.mark.skipif(
147
- not (__have_tomocupy_deringer__),
148
- reason="Need cupy for this test",
147
+ not (__have_tomocupy_deringer__ and __do_large_mem_tests__),
148
+ reason="Need cupy for this test, and use NABU_LARGE_MEM_TESTS",
149
149
  )
150
150
  def test_cuda_vo_deringer(self):
151
151
  # Beware, this deringer seems to be buggy for "too-small" sinograms
@@ -3,10 +3,11 @@ import pytest
3
3
  from nabu.testutils import get_data, generate_tests_scenarios, compare_shifted_images
4
4
  from nabu.cuda.utils import get_cuda_context, __has_pycuda__, __has_cufft__
5
5
  from nabu.opencl.utils import get_opencl_context, __has_pyopencl__
6
+ from nabu.processing.fft_opencl import has_vkfft as has_vkfft_cl
6
7
  from nabu.thirdparty.algotom_convert_sino import extend_sinogram
7
8
 
8
9
  __has_pycuda__ = __has_pycuda__ and __has_cufft__ # need both for using Cuda backprojector
9
-
10
+ __has_pyopencl__ = __has_pyopencl__ and has_vkfft_cl()
10
11
 
11
12
  if __has_pycuda__:
12
13
  from nabu.reconstruction.fbp import CudaBackprojector
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.1.5
3
+ Version: 2024.1.7
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>
@@ -48,29 +48,9 @@ Classifier: Topic :: Scientific/Engineering :: Physics
48
48
  Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
49
49
  Requires-Python: >=3.7
50
50
  Description-Content-Type: text/markdown
51
- License-File: LICENSE
52
- Requires-Dist: numpy>1.9.0
53
- Requires-Dist: scipy
54
- Requires-Dist: h5py>=3.0
55
- Requires-Dist: silx>=0.15.0
56
- Requires-Dist: tomoscan>=2.0.4
57
- Requires-Dist: psutil
58
- Requires-Dist: pytest
59
- Requires-Dist: tifffile
60
51
  Provides-Extra: full
61
- Requires-Dist: scikit-image; extra == "full"
62
- Requires-Dist: PyWavelets; extra == "full"
63
- Requires-Dist: glymur; extra == "full"
64
- Requires-Dist: pycuda; extra == "full"
65
- Requires-Dist: scikit-cuda; extra == "full"
66
- Requires-Dist: pycudwt; extra == "full"
67
- Requires-Dist: sluurp>=0.3; extra == "full"
68
- Requires-Dist: pyvkfft; extra == "full"
69
52
  Provides-Extra: doc
70
- Requires-Dist: sphinx; extra == "doc"
71
- Requires-Dist: cloud_sptheme; extra == "doc"
72
- Requires-Dist: myst-parser; extra == "doc"
73
- Requires-Dist: nbsphinx; extra == "doc"
53
+ License-File: LICENSE
74
54
 
75
55
  # Nabu
76
56
 
@@ -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
@@ -41,6 +40,7 @@ nabu/app/shrink_dataset.py
41
40
  nabu/app/stitching.py
42
41
  nabu/app/utils.py
43
42
  nabu/app/validator.py
43
+ nabu/app/tests/__init__.py
44
44
  nabu/app/tests/test_reduce_dark_flat.py
45
45
  nabu/cuda/__init__.py
46
46
  nabu/cuda/convolution.py
@@ -296,35 +296,4 @@ nabu/thirdparty/algotom_convert_sino.py
296
296
  nabu/thirdparty/pore3d_deringer_munch.py
297
297
  nabu/thirdparty/tomocupy_remove_stripe.py
298
298
  nabu/thirdparty/tomopy_phase.py
299
- nabu/thirdparty/tomwer_load_flats_darks.py
300
- sandbox/align_test.py
301
- sandbox/app.py
302
- sandbox/binning_cython.py
303
- sandbox/circ_sm.py
304
- sandbox/composite_image.py
305
- sandbox/convert_id15.py
306
- sandbox/do_test_ctf.py
307
- sandbox/esrf_envs.py
308
- sandbox/fbp_polar.py
309
- sandbox/fbp_tilt.py
310
- sandbox/interleaved.py
311
- sandbox/interp_sinos_halftomo.py
312
- sandbox/linear_interp.py
313
- sandbox/merge_recs.py
314
- sandbox/moduleutils.py
315
- sandbox/nbreconstruct.py
316
- sandbox/pag_margin.py
317
- sandbox/parse.py
318
- sandbox/plot.py
319
- sandbox/proj3D.py
320
- sandbox/rec_bm05.py
321
- sandbox/rec_thread.py
322
- sandbox/shift_bilinear2.py
323
- sandbox/sinotilt.py
324
- sandbox/sysutils.py
325
- sandbox/test_mp_queue.py
326
- sandbox/tilt.py
327
- sandbox/utils.py
328
- sandbox/vo.py
329
- sandbox/workers.py
330
- sandbox/xrdrec_pyFAI_data.py
299
+ nabu/thirdparty/tomwer_load_flats_darks.py
@@ -1,3 +1,5 @@
1
+ build
1
2
  dist
2
3
  doc
3
4
  nabu
5
+ scripts
@@ -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)
@@ -1,61 +0,0 @@
1
- import numpy as np
2
- from nabu.estimation.translation import DetectorTranslationAlongBeam
3
- from tomoscan.io import HDF5File
4
-
5
-
6
- def get_data(fname, h5_paths):
7
- with HDF5File(fname, "r") as f:
8
- align_data = f[h5_paths["align_data"]][()]
9
- dark = f[h5_paths["dark"]][0]
10
- pixel_size_um = f[h5_paths["pixel_size"]][()]
11
- positions_mm = f[h5_paths["positions"]][()]
12
-
13
- # Dark subtraction
14
- align_data = align_data - dark.astype("f")
15
-
16
- return align_data, pixel_size_um, positions_mm
17
-
18
-
19
-
20
- def get_alignment(align_data, pixel_size_um, positions_mm, plot=True):
21
-
22
- tr_calc = DetectorTranslationAlongBeam()
23
- if plot == True:
24
- tr_calc.verbose=True
25
-
26
- shifts_v, shifts_h = tr_calc.find_shift(align_data, positions_mm)
27
-
28
- # pixel_size is in microns, motor position is in mm
29
- tilt_v_deg = np.rad2deg(np.arctan(shifts_v * pixel_size_um / 1e3))
30
- tilt_h_deg = np.rad2deg(np.arctan(shifts_h * pixel_size_um / 1e3))
31
- print (f"\nVertical tilt to be applied in deg (thy): {tilt_v_deg}")
32
- print (f"Horizontal tilt to be applied in deg (thz): {tilt_h_deg}\n")
33
-
34
- return align_data, shifts_v, shifts_h, positions_mm
35
-
36
-
37
-
38
-
39
-
40
-
41
- if __name__ == "__main__":
42
- fname = "/data/id19/inhouse/id192201/id19/sample/sample_0001/sample_0001.h5"
43
- h5_paths = {
44
- "align_data": "11.1/measurement/pcolinux",
45
- "dark": "12.1/measurement/pcolinux",
46
- "pixel_size": "11.1/instrument/pcolinux/x_pixel_size",
47
- "positions": "11.1/measurement/hrxc"
48
- }
49
- align_data, pixel_size_um, positions_mm = get_data(fname, h5_paths)
50
- # align_data, shifts_v, shifts_h, positions_mm = get_alignment(align_data, pixel_size_um, positions_mm)
51
-
52
- D = DetectorTranslationAlongBeam()
53
- D. verbose = True
54
- sv, sh = D.find_shift(align_data, positions_mm)
55
- D.verbose = False
56
- sv, sh = D.find_shift(align_data, positions_mm)
57
- D.verbose = True
58
- sv, sh = D.find_shift(align_data, positions_mm)
59
-
60
-
61
-
@@ -1,123 +0,0 @@
1
- from time import sleep
2
- import pycuda.autoinit
3
- import pycuda.gpuarray as garray
4
- from nabu.resources.processconfig import ProcessConfig
5
- from nabu.resources.tasks import build_processing_steps
6
-
7
- from nabu.app.logger import Logger
8
-
9
- from nabu.app.chunkreader import ChunkReaderComponent
10
- from nabu.app.flatfield import FlatFieldComponent
11
- from nabu.app.phase import PhaseRetrievalComponent
12
- from nabu.app.opmap import NegativeLogComponent
13
- from nabu.app.ccdfilter import CCDFilterComponent
14
- from nabu.app.unsharp import UnsharpMaskComponent
15
- from nabu.app.reconstructor import ReconstructorComponent
16
-
17
-
18
- if __name__ == "__main__":
19
-
20
- conf = ProcessConfig("/home/pierre/workspace/data/nabu.conf")
21
- steps, options = build_processing_steps(conf)
22
- dataset_infos = conf.dataset_infos
23
- SUB_REGION = (None, None, None, 50)
24
-
25
- logger = Logger("nabu_processing", console=True)
26
-
27
- # Read chunk
28
- options["read_chunk"]["sub_region"] = SUB_REGION
29
- options["read_chunk"]["convert_float"] = True
30
- Ch = ChunkReaderComponent(options["read_chunk"], dataset_infos, logger=logger)
31
- Ch.execute()
32
- radios = Ch.chunk_reader.files_data
33
- d_radios = garray.to_gpu(radios)
34
-
35
- # Flat-field
36
- options["flatfield"]["sub_region"] = SUB_REGION
37
- options["flatfield"]["use_opencl"] = False
38
- options["flatfield"]["use_cuda"] = True
39
- F = FlatFieldComponent(d_radios, options["flatfield"], dataset_infos, logger=logger)
40
- F.execute()
41
-
42
- # CCD filter
43
- options["ccd_correction"]["use_cuda"] = True
44
- options["ccd_correction"]["use_opencl"] = False
45
- CCD = CCDFilterComponent(d_radios, options["ccd_correction"], dataset_infos, logger=logger)
46
- CCD.execute()
47
-
48
-
49
- # Phase retrieval
50
- options["phase"]["use_cuda"] = True
51
- options["phase"]["use_opencl"] = False
52
- P = PhaseRetrievalComponent(radios[0].shape, options["phase"], dataset_infos, logger=logger)
53
- P.execute(d_radios)
54
-
55
- # Unsharp
56
- # ~ options["unsharp_mask"]["use_cuda"] = True
57
- # ~ options["unsharp_mask"]["use_opencl"] = False
58
- # ~ U = UnsharpMaskComponent(radios[0].shape, options["unsharp_mask"], dataset_infos, logger=logger)
59
- # ~ U.execute(d_radios)
60
-
61
- # -log()
62
- options["take_log"]["use_cuda"] = True
63
- options["take_log"]["use_opencl"] = False
64
- L = NegativeLogComponent(d_radios, options["take_log"], dataset_infos, logger=logger)
65
- L.execute()
66
-
67
-
68
- # Test
69
- # ~ from spire.utils import ims
70
- # ~ r = d_radios.get()
71
- # ~ ims(r[:, 10, :])
72
-
73
-
74
- # Reconstruction
75
- options["reconstruction"]["use_cuda"] = True
76
-
77
- # Test ...
78
- if 1:
79
- options["reconstruction"]["start_x"] = 100
80
- options["reconstruction"]["end_x"] = -100
81
- options["reconstruction"]["start_y"] = 100
82
- options["reconstruction"]["end_y"] = -100
83
- options["reconstruction"]["start_z"] = 0
84
- options["reconstruction"]["end_z"] = SUB_REGION[-1]-1
85
- d_rec = garray.zeros((50, 1849, 1849), "f") # y
86
- #
87
- else:
88
- d_rec = garray.zeros((SUB_REGION[-1], 2048, 2048), "f")
89
- R = ReconstructorComponent(d_radios.shape, options["reconstruction"], dataset_infos, logger=logger)
90
- R.execute(d_radios, output=d_rec)
91
-
92
-
93
- # Write to file
94
- rec = d_rec.get()
95
- import numpy as np
96
- np.save("/home/pierre/tmp/crayon/recs_nabu_vertical.npy", rec)
97
-
98
- """from nabu.reconstruction.reconstructor_cuda import CudaReconstructor
99
- R = CudaReconstructor(
100
- radios.shape,
101
- [0, 1],
102
- vol_type="projections",
103
- extra_options={"padding_mode": conf.nabu_config["reconstruction"]["padding_type"]}
104
- )
105
- d_recs = garray.zeros((1, 2048, 2048), "f")
106
- R.reconstruct(d_radios, output=d_recs)
107
- recs = d_recs.get()
108
- ims(recs[0], cmap="gray")
109
- # save
110
- import numpy as np
111
- np.save("/tmp/rec0.npy", recs[0])
112
- """
113
-
114
-
115
- """
116
- Notes
117
- - If the cuda backend is used at step N, it should also be used at step N+1,
118
-
119
-
120
- otherwise we have to get() the data
121
-
122
- """
123
-