NeuNorm 2.2.0__tar.gz → 2.2.2__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 (240) hide show
  1. {neunorm-2.2.0 → neunorm-2.2.2}/.grype.yaml +4 -0
  2. {neunorm-2.2.0 → neunorm-2.2.2}/CHANGELOG.md +44 -1
  3. {neunorm-2.2.0 → neunorm-2.2.2}/PKG-INFO +1 -1
  4. {neunorm-2.2.0 → neunorm-2.2.2}/docs/migration.md +1 -1
  5. {neunorm-2.2.0 → neunorm-2.2.2}/pixi.lock +5411 -4016
  6. {neunorm-2.2.0 → neunorm-2.2.2}/pyproject.toml +2 -2
  7. neunorm-2.2.2/src/neunorm/_version.py +1 -0
  8. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/data_models/roi.py +14 -0
  9. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/exporters/tiff_writer.py +31 -6
  10. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/pipelines/mars_ccd.py +15 -7
  11. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/pipelines/mars_tpx3.py +10 -7
  12. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/pipelines/venus_ccd.py +15 -7
  13. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/normalizer.py +234 -93
  14. neunorm-2.2.2/tests/unit/test_background_roi_pooled.py +251 -0
  15. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_mars_ccd.py +43 -4
  16. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_mars_tpx3.py +3 -3
  17. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_normalizer.py +131 -3
  18. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_roi.py +12 -0
  19. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_tiff_writer.py +67 -2
  20. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_venus_ccd.py +4 -4
  21. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_venus_tpx1.py +6 -5
  22. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_venus_tpx3_event.py +4 -3
  23. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_venus_tpx3_histogram.py +6 -5
  24. neunorm-2.2.0/src/neunorm/_version.py +0 -1
  25. {neunorm-2.2.0 → neunorm-2.2.2}/.claude/agents/bug-hunter.md +0 -0
  26. {neunorm-2.2.0 → neunorm-2.2.2}/.claude/skills/bughunt/SKILL.md +0 -0
  27. {neunorm-2.2.0 → neunorm-2.2.2}/.claude/skills/post-merge/SKILL.md +0 -0
  28. {neunorm-2.2.0 → neunorm-2.2.2}/.claude/skills/release/SKILL.md +0 -0
  29. {neunorm-2.2.0 → neunorm-2.2.2}/.claude/skills/review-pipeline/SKILL.md +0 -0
  30. {neunorm-2.2.0 → neunorm-2.2.2}/.claude/workflows/bughunt-deep.js +0 -0
  31. {neunorm-2.2.0 → neunorm-2.2.2}/.claude/workflows/dual-family-review.js +0 -0
  32. {neunorm-2.2.0 → neunorm-2.2.2}/.gitattributes +0 -0
  33. {neunorm-2.2.0 → neunorm-2.2.2}/.github/CODEOWNERS +0 -0
  34. {neunorm-2.2.0 → neunorm-2.2.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  35. {neunorm-2.2.0 → neunorm-2.2.2}/.github/dependabot.yml +0 -0
  36. {neunorm-2.2.0 → neunorm-2.2.2}/.github/release.yml +0 -0
  37. {neunorm-2.2.0 → neunorm-2.2.2}/.github/workflows/codeql.yml +0 -0
  38. {neunorm-2.2.0 → neunorm-2.2.2}/.github/workflows/dependency-scan.yml +0 -0
  39. {neunorm-2.2.0 → neunorm-2.2.2}/.github/workflows/test_and_deploy.yaml +0 -0
  40. {neunorm-2.2.0 → neunorm-2.2.2}/.github/workflows/update-lockfiles.yml +0 -0
  41. {neunorm-2.2.0 → neunorm-2.2.2}/.gitignore +0 -0
  42. {neunorm-2.2.0 → neunorm-2.2.2}/.pre-commit-config.yaml +0 -0
  43. {neunorm-2.2.0 → neunorm-2.2.2}/.readthedocs.yaml +0 -0
  44. {neunorm-2.2.0 → neunorm-2.2.2}/.zenodo.json +0 -0
  45. {neunorm-2.2.0 → neunorm-2.2.2}/AGENTS.md +0 -0
  46. {neunorm-2.2.0 → neunorm-2.2.2}/CITATION.cff +0 -0
  47. {neunorm-2.2.0 → neunorm-2.2.2}/CLAUDE.md +0 -0
  48. {neunorm-2.2.0 → neunorm-2.2.2}/CONTRIBUTING.md +0 -0
  49. {neunorm-2.2.0 → neunorm-2.2.2}/LICENSE +0 -0
  50. {neunorm-2.2.0 → neunorm-2.2.2}/README.md +0 -0
  51. {neunorm-2.2.0 → neunorm-2.2.2}/SECURITY.md +0 -0
  52. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/NeuNorm/__init__.py +0 -0
  53. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/NeuNorm/_utilities.py +0 -0
  54. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/NeuNorm/exporter.py +0 -0
  55. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/NeuNorm/loader.py +0 -0
  56. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/NeuNorm/normalization.py +0 -0
  57. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/NeuNorm/roi.py +0 -0
  58. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/README.md +0 -0
  59. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/conda.recipe/meta.yaml +0 -0
  60. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/df/DC0000.tif +0 -0
  61. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/df/DC0001.tif +0 -0
  62. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/df/DC0002.tif +0 -0
  63. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0001.tif +0 -0
  64. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0002.tif +0 -0
  65. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0003.tif +0 -0
  66. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0004.tif +0 -0
  67. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0005.tif +0 -0
  68. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0006.tif +0 -0
  69. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0007.tif +0 -0
  70. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0008.tif +0 -0
  71. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0009.tif +0 -0
  72. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0010.tif +0 -0
  73. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0011.tif +0 -0
  74. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0012.tif +0 -0
  75. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0013.tif +0 -0
  76. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0014.tif +0 -0
  77. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/ob/0015.tif +0 -0
  78. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0002.tif +0 -0
  79. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0003.tif +0 -0
  80. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0004.tif +0 -0
  81. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0005.tif +0 -0
  82. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0006.tif +0 -0
  83. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0007.tif +0 -0
  84. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0008.tif +0 -0
  85. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0009.tif +0 -0
  86. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0010.tif +0 -0
  87. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0011.tif +0 -0
  88. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0012.tif +0 -0
  89. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0013.tif +0 -0
  90. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0014.tif +0 -0
  91. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/data/sample/0015.tif +0 -0
  92. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/Makefile +0 -0
  93. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/readthedocs-environment.yml +0 -0
  94. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/_static/normalization_equation.png +0 -0
  95. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/_static/normalization_principle.png +0 -0
  96. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/_static/progress_bar_loading.png +0 -0
  97. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/_static/progress_bar_normalization.png +0 -0
  98. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/conf.py +0 -0
  99. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/cropping_data.rst +0 -0
  100. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/dark_field_correction.rst +0 -0
  101. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/export_data.rst +0 -0
  102. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/index.rst +0 -0
  103. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/installation.rst +0 -0
  104. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/loading.rst +0 -0
  105. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/normalization.rst +0 -0
  106. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/notebook.rst +0 -0
  107. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/retrieve_normalized_data.rst +0 -0
  108. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/tutorial_normalization_with_fewer_ob_than_sample.ipynb +0 -0
  109. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/tutorial_using_array_input.ipynb +0 -0
  110. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/documentation/source/tutorial_using_folder_input.ipynb +0 -0
  111. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/environment.yml +0 -0
  112. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/debugging_multi_roi_bug.ipynb +0 -0
  113. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/notebook_display_with_time_estimation.ipynb +0 -0
  114. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/testing_new_auto_gamma_filtering.ipynb +0 -0
  115. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/tutorial_normalization_with_fewer_ob_than_sample.ipynb +0 -0
  116. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/tutorial_normalization_with_fewer_ob_than_sample_MAYBE_BUG.ipynb +0 -0
  117. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/tutorial_using_array_input.ipynb +0 -0
  118. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/tutorial_using_array_input_and_export_array.ipynb +0 -0
  119. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/tutorial_using_array_input_and_several_roi.ipynb +0 -0
  120. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/notebooks/tutorial_using_folder_input.ipynb +0 -0
  121. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/paper/paper.bib +0 -0
  122. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/paper/paper.md +0 -0
  123. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/scripts/clean_build_artifacts.sh +0 -0
  124. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/NeuNorm/normalizing_test.py +0 -0
  125. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/NeuNorm/test_cropping.py +0 -0
  126. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/NeuNorm/test_export.py +0 -0
  127. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/NeuNorm/test_loading.py +0 -0
  128. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/NeuNorm/test_roi.py +0 -0
  129. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/NeuNorm/test_utilities.py +0 -0
  130. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/different_format/df001_4_by_4.tif +0 -0
  131. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/different_format/image001_4_by_4.tif +0 -0
  132. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/different_format/image001_with_gamma.tif +0 -0
  133. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/different_format/not_supported_file.fake +0 -0
  134. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/different_format/ob001_4_by_4.tif +0 -0
  135. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/fits/df/df001.fits +0 -0
  136. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/fits/ob/ob001.fits +0 -0
  137. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/fits/ob/ob002.fits +0 -0
  138. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/fits/ob/ob003.fits +0 -0
  139. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/fits/test_roi/ob.fits +0 -0
  140. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/fits/test_roi/sample.fits +0 -0
  141. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/format_not_suppored.txt +0 -0
  142. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/hdf5/dump_file.hdf5 +0 -0
  143. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/ob001.fits +0 -0
  144. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/df/df001.tif +0 -0
  145. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/df/df002.tif +0 -0
  146. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/df/df003.tif +0 -0
  147. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/ob/ob001.tif +0 -0
  148. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/ob/ob002.tif +0 -0
  149. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/ob/ob003.tif +0 -0
  150. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/sample_with_gamma/image001.tif +0 -0
  151. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/special_ob/ob_0001_2rois.tiff +0 -0
  152. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/special_sample/image_0001_2rois.tiff +0 -0
  153. {neunorm-2.2.0 → neunorm-2.2.2}/archive/neunorm-1.x/tests/data/tif/special_sample/image_0001_roi_no_ob.tiff +0 -0
  154. {neunorm-2.2.0 → neunorm-2.2.2}/codecov.yaml +0 -0
  155. {neunorm-2.2.0 → neunorm-2.2.2}/docs/api.rst +0 -0
  156. {neunorm-2.2.0 → neunorm-2.2.2}/docs/conf.py +0 -0
  157. {neunorm-2.2.0 → neunorm-2.2.2}/docs/development/DEVELOPMENT_PLAN.md +0 -0
  158. {neunorm-2.2.0 → neunorm-2.2.2}/docs/index.md +0 -0
  159. {neunorm-2.2.0 → neunorm-2.2.2}/docs/workflows/README.md +0 -0
  160. {neunorm-2.2.0 → neunorm-2.2.2}/docs/workflows/mars_ccd_cmos.md +0 -0
  161. {neunorm-2.2.0 → neunorm-2.2.2}/docs/workflows/mars_tpx3.md +0 -0
  162. {neunorm-2.2.0 → neunorm-2.2.2}/docs/workflows/venus_ccd_cmos.md +0 -0
  163. {neunorm-2.2.0 → neunorm-2.2.2}/docs/workflows/venus_tpx1.md +0 -0
  164. {neunorm-2.2.0 → neunorm-2.2.2}/docs/workflows/venus_tpx3.md +0 -0
  165. {neunorm-2.2.0 → neunorm-2.2.2}/examples/pulse_reconstruction_explained.ipynb +0 -0
  166. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/__init__.py +0 -0
  167. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/data_models/__init__.py +0 -0
  168. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/data_models/core.py +0 -0
  169. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/data_models/tof.py +0 -0
  170. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/exporters/__init__.py +0 -0
  171. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/exporters/hdf5_writer.py +0 -0
  172. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/filters/__init__.py +0 -0
  173. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/filters/gamma_filter.py +0 -0
  174. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/loaders/__init__.py +0 -0
  175. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/loaders/event_loader.py +0 -0
  176. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/loaders/fits_loader.py +0 -0
  177. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/loaders/metadata_loader.py +0 -0
  178. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/loaders/stack_loader.py +0 -0
  179. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/loaders/tiff_loader.py +0 -0
  180. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/pipelines/__init__.py +0 -0
  181. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/pipelines/venus_tpx1.py +0 -0
  182. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/pipelines/venus_tpx3_event.py +0 -0
  183. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/pipelines/venus_tpx3_histogram.py +0 -0
  184. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/__init__.py +0 -0
  185. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/air_region_corrector.py +0 -0
  186. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/dark_corrector.py +0 -0
  187. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/reference_preparer.py +0 -0
  188. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/roi_clipper.py +0 -0
  189. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/run_combiner.py +0 -0
  190. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/spatial_rebinner.py +0 -0
  191. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/processing/uncertainty_calculator.py +0 -0
  192. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/__init__.py +0 -0
  193. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/binning.py +0 -0
  194. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/coordinate_converter.py +0 -0
  195. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/event_converter.py +0 -0
  196. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/histogram_rebinner.py +0 -0
  197. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/pixel_detector.py +0 -0
  198. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/pulse_reconstruction.py +0 -0
  199. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/resonance.py +0 -0
  200. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/tof/statistics_analyzer.py +0 -0
  201. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/utils/__init__.py +0 -0
  202. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/utils/_numba_compat.py +0 -0
  203. {neunorm-2.2.0 → neunorm-2.2.2}/src/neunorm/utils/constants.py +0 -0
  204. {neunorm-2.2.0 → neunorm-2.2.2}/tests/data/fits/sample/image001.fits +0 -0
  205. {neunorm-2.2.0 → neunorm-2.2.2}/tests/data/fits/sample/image002.fits +0 -0
  206. {neunorm-2.2.0 → neunorm-2.2.2}/tests/data/fits/sample/image003.fits +0 -0
  207. {neunorm-2.2.0 → neunorm-2.2.2}/tests/data/tif/sample/image001.tif +0 -0
  208. {neunorm-2.2.0 → neunorm-2.2.2}/tests/data/tif/sample/image002.tif +0 -0
  209. {neunorm-2.2.0 → neunorm-2.2.2}/tests/data/tif/sample/image003.tif +0 -0
  210. {neunorm-2.2.0 → neunorm-2.2.2}/tests/integration/test_tof_pipeline.py +0 -0
  211. {neunorm-2.2.0 → neunorm-2.2.2}/tests/neunorm/test_version.py +0 -0
  212. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_air_region_corrector.py +0 -0
  213. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_analyze_statistics.py +0 -0
  214. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_binning_config.py +0 -0
  215. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_binning_conversions.py +0 -0
  216. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_constants.py +0 -0
  217. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_dark_corrector.py +0 -0
  218. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_division_by_zero_guards.py +0 -0
  219. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_event_converter.py +0 -0
  220. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_event_loader.py +0 -0
  221. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_eventdata_auto_validation.py +0 -0
  222. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_fits_loader.py +0 -0
  223. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_gamma_filter.py +0 -0
  224. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_hdf5_writer.py +0 -0
  225. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_metadata_loader.py +0 -0
  226. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_numba_compat.py +0 -0
  227. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_parallel_processing.py +0 -0
  228. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_pixel_detector.py +0 -0
  229. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_pulse_reconstruction.py +0 -0
  230. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_rebin_spatial.py +0 -0
  231. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_rebin_tof.py +0 -0
  232. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_reference_preparer.py +0 -0
  233. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_refine_boundaries_jit.py +0 -0
  234. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_remaining_jit.py +0 -0
  235. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_resonance_detection.py +0 -0
  236. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_roi_clipper.py +0 -0
  237. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_run_combiner.py +0 -0
  238. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_tiff_loader.py +0 -0
  239. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_uncertainty.py +0 -0
  240. {neunorm-2.2.0 → neunorm-2.2.2}/tests/unit/test_variance_propagation_fix.py +0 -0
@@ -28,3 +28,7 @@ ignore:
28
28
  - vulnerability: CVE-2026-7774
29
29
  package:
30
30
  name: python
31
+ # medium; fixed in the 3.13 line + 3.15 beta, not the 3.14 line the build uses
32
+ - vulnerability: CVE-2026-12003
33
+ package:
34
+ name: python
@@ -5,7 +5,48 @@ All notable changes to NeuNorm are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [2.2.2] - 2026-07-02
9
+
10
+ ### Fixed
11
+
12
+ - **`background_roi` can now reproduce legacy 1.x zero-count-ROI semantics** (completes the
13
+ downstream-superset goal of
14
+ [#172](https://github.com/ornlneutronimaging/NeuNorm/issues/172) /
15
+ [#159](https://github.com/ornlneutronimaging/NeuNorm/issues/159)): the pooled-mean
16
+ strictly-positive/finite guard can be opted out with
17
+ `apply_background_roi(..., strict=False)` or
18
+ `normalize_transmission(...)` / `normalize_with_dark(..., background_roi_strict=False)`,
19
+ letting a zero-count background ROI propagate `inf`/`nan` through the division exactly as
20
+ NeuNorm 1.x did (iBeatles pins this behavior). The default stays strict — a
21
+ non-positive/non-finite pooled mean raises `ValueError` — and structural errors (bad ROI
22
+ bounds, missing dims) always raise.
23
+
24
+ ## [2.2.1] - 2026-07-01
25
+
26
+ ### Added
27
+
28
+ - **`background_roi` now supports pooled multiple ROIs, inclusive extents, and an open-beam-less
29
+ mode.** `normalize_transmission(..., background_roi=)` — and the MARS CCD/TPX3 and VENUS CCD
30
+ pipelines — accept a **sequence** of ROIs, pooled as `sum(counts) / sum(pixels)` per image;
31
+ `ROI(..., inclusive=True)` opts into legacy inclusive extents (a width-`w` ROI spans `w+1`
32
+ pixels); and the new `neunorm.processing.normalizer.apply_background_roi(data, background_roi)`
33
+ applies the flux proxy to a sample stack with no open beam. A single ROI / bare tuple is
34
+ unchanged. This makes `background_roi` a superset of the downstream (iBeatles) pooled-inclusive
35
+ re-implementation so it can be removed.
36
+ ([#172](https://github.com/ornlneutronimaging/NeuNorm/issues/172),
37
+ [#159](https://github.com/ornlneutronimaging/NeuNorm/issues/159))
38
+ - **Python 3.14 support.** NeuNorm builds, installs, and passes its full test suite on
39
+ CPython 3.14; the development/CI pixi environments and `pixi.lock` move to 3.14
40
+ (`requires-python` stays `>=3.11`).
41
+
42
+ ### Fixed
43
+
44
+ - **TIFF export is compatible with scitiff ≥ 26.6.** scitiff 26.6 tightened its metadata schema
45
+ to reject object-dtype (`PyObject`) scipp variables. `write_tiff_stack` now JSON-encodes
46
+ sequence metadata (mirroring the HDF5 writer's provenance convention — read it back with
47
+ `json.loads`) and drops object-dtype coords/masks (e.g. tuple-valued TIFF header tags carried
48
+ over from the input files) that scitiff cannot serialize. HDF5 output and the written image
49
+ data are unchanged.
9
50
 
10
51
  ## [2.2.0] - 2026-06-30
11
52
 
@@ -171,6 +212,8 @@ documentation are archived under
171
212
  [`archive/neunorm-1.x/`](archive/neunorm-1.x/); released 1.x versions remain
172
213
  available on PyPI and the `conda-forge` channel (`pip install "NeuNorm<2"`).
173
214
 
215
+ [2.2.2]: https://github.com/ornlneutronimaging/NeuNorm/releases/tag/v2.2.2
216
+ [2.2.1]: https://github.com/ornlneutronimaging/NeuNorm/releases/tag/v2.2.1
174
217
  [2.2.0]: https://github.com/ornlneutronimaging/NeuNorm/releases/tag/v2.2.0
175
218
  [2.1.0]: https://github.com/ornlneutronimaging/NeuNorm/releases/tag/v2.1.0
176
219
  [2.0.0]: https://github.com/ornlneutronimaging/NeuNorm/releases/tag/v2.0.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: NeuNorm
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: Neutron imaging normalization and TOF data processing for ORNL facilities
5
5
  Project-URL: homepage, https://github.com/ornlneutronimaging/NeuNorm
6
6
  Project-URL: repository, https://github.com/ornlneutronimaging/NeuNorm
@@ -106,7 +106,7 @@ transmission = normalize_transmission(sample, ob) # T = sample / ob, variances
106
106
  | `Normalization()` (stateful object) | a `run_*_pipeline(...)` call, or composable functions |
107
107
  | `.load(..., data_type="sample"/"ob")` | pipeline `sample_paths` / `ob_paths`, or `neunorm.loaders.stack_loader.load_stack` / `tiff_loader.load_tiff_stack` / `fits_loader.load_fits_stack` |
108
108
  | `.load(..., data_type="df")` (dark/"df") | pipeline `dark_paths`, or `neunorm.processing.dark_corrector.subtract_dark(data, dark)` |
109
- | `.normalization(roi=...)` | Flux normalization by a background ROI: `normalize_transmission(..., background_roi=(x0, y0, x1, y1))`, or pass `background_roi=` to `run_mars_ccd_pipeline` / `run_mars_tpx3_pipeline` / `run_venus_ccd_pipeline` ([#159](https://github.com/ornlneutronimaging/NeuNorm/issues/159)). A proton-charge proxy for when proton charge is unavailable; mutually exclusive with it. Note: 2.x `roi=` is a spatial **crop** (`apply_roi`), not this. |
109
+ | `.normalization(roi=...)` | Flux normalization by a background ROI: `normalize_transmission(..., background_roi=(x0, y0, x1, y1))`, or pass `background_roi=` to `run_mars_ccd_pipeline` / `run_mars_tpx3_pipeline` / `run_venus_ccd_pipeline` ([#159](https://github.com/ornlneutronimaging/NeuNorm/issues/159)). A proton-charge proxy for when proton charge is unavailable; mutually exclusive with it. Accepts one ROI or a **pooled sequence** of ROIs; use `ROI(..., inclusive=True)` for the 1.x inclusive extents, and `apply_background_roi(data, background_roi)` for the open-beam-less form. Note: 2.x `roi=` is a spatial **crop** (`apply_roi`), not this. |
110
110
  | `.df_correction()` | `neunorm.processing.dark_corrector.subtract_dark(data, dark)` |
111
111
  | `.crop(roi=ROI(...))` | `neunorm.processing.roi_clipper.apply_roi(data, ROI(x0=.., y0=.., x1=.., y1=..))` (or a bare `(x0, y0, x1, y1)` tuple) |
112
112
  | auto/manual gamma filtering on `load()` | `neunorm.filters.gamma_filter.apply_gamma_filter(...)`, or pipeline `gamma_filter=True` |