dkist-processing-visp 5.8.5__tar.gz → 5.9.0__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 (122) hide show
  1. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/.pre-commit-config.yaml +8 -2
  2. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/CHANGELOG.rst +20 -0
  3. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/PKG-INFO +77 -59
  4. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/README.rst +17 -0
  5. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/mixin/corrections.py +18 -83
  6. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_geometric.py +25 -7
  7. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp.egg-info/PKG-INFO +77 -59
  8. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp.egg-info/requires.txt +59 -58
  9. dkist_processing_visp-5.9.0/dkist_processing_visp.egg-info/scm_version.json +8 -0
  10. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/pyproject.toml +70 -60
  11. dkist_processing_visp-5.8.5/dkist_processing_visp.egg-info/scm_version.json +0 -8
  12. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/.gitignore +0 -0
  13. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/.readthedocs.yml +0 -0
  14. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/.rovodev/.review-agent.md +0 -0
  15. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/.snyk +0 -0
  16. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/SCIENCE_CHANGELOG.rst +0 -0
  17. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/bitbucket-pipelines.yml +0 -0
  18. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/changelog/.gitempty +0 -0
  19. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/__init__.py +0 -0
  20. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/config.py +0 -0
  21. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  22. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/__init__.py +0 -0
  23. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/constants.py +0 -0
  24. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/dataset_extras.py +0 -0
  25. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/fits_access.py +0 -0
  26. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/metric_code.py +0 -0
  27. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/parameters.py +0 -0
  28. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/tags.py +0 -0
  29. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/models/task_name.py +0 -0
  30. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/__init__.py +0 -0
  31. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  32. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/modulator_states.py +0 -0
  33. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  34. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/raster_step.py +0 -0
  35. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/spectrograph_configuration.py +0 -0
  36. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/time.py +0 -0
  37. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
  38. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
  39. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/__init__.py +0 -0
  40. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  41. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/background_light.py +0 -0
  42. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/dark.py +0 -0
  43. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/geometric.py +0 -0
  44. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/instrument_polarization.py +0 -0
  45. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  46. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/lamp.py +0 -0
  47. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  48. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  49. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  50. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  51. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/parse.py +0 -0
  52. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/polcal_as_science.py +0 -0
  53. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  54. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/science.py +0 -0
  55. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/solar.py +0 -0
  56. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/visp_base.py +0 -0
  57. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/wavelength_calibration.py +0 -0
  58. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/write_dataset_extras.py +0 -0
  59. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tasks/write_l1.py +0 -0
  60. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/README.rst +0 -0
  61. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/__init__.py +0 -0
  62. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/conftest.py +0 -0
  63. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/header_models.py +0 -0
  64. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  65. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  66. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  67. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  68. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  69. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  70. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  71. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  72. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_background_light.py +0 -0
  73. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_dark.py +0 -0
  74. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_downsample.py +0 -0
  75. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_fits_access.py +0 -0
  76. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  77. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_lamp.py +0 -0
  78. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  79. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
  80. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_parameters.py +0 -0
  81. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_parse.py +0 -0
  82. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_polcal_as_science.py +0 -0
  83. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_quality.py +0 -0
  84. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_science.py +0 -0
  85. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_solar.py +0 -0
  86. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  87. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_visp_base.py +0 -0
  88. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
  89. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_wavelength_calibration.py +0 -0
  90. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_workflows.py +0 -0
  91. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_write_dataset_extras.py +0 -0
  92. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  93. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/workflows/__init__.py +0 -0
  94. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/workflows/l0_processing.py +0 -0
  95. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  96. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
  97. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp.egg-info/SOURCES.txt +0 -0
  98. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  99. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp.egg-info/scm_file_list.json +0 -0
  100. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  101. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/Makefile +0 -0
  102. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/background_light.rst +0 -0
  103. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/changelog.rst +0 -0
  104. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/conf.py +0 -0
  105. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/dataset_extras.rst +0 -0
  106. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/gain_correction.rst +0 -0
  107. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/geometric.rst +0 -0
  108. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/index.rst +0 -0
  109. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/l0_to_l1_visp.rst +0 -0
  110. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  111. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/landing_page.rst +0 -0
  112. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/make.bat +0 -0
  113. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/polarization_calibration.rst +0 -0
  114. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/requirements.txt +0 -0
  115. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/requirements_table.rst +0 -0
  116. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/science_calibration.rst +0 -0
  117. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/scientific_changelog.rst +0 -0
  118. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/docs/wavelength_calibration.rst +0 -0
  119. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/licenses/LICENSE.rst +0 -0
  120. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/science_towncrier.sh +0 -0
  121. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/setup.cfg +0 -0
  122. {dkist_processing_visp-5.8.5 → dkist_processing_visp-5.9.0}/towncrier_science.toml +0 -0
@@ -27,7 +27,13 @@ repos:
27
27
  args:
28
28
  - --convention=numpy
29
29
  - --add-ignore=D105
30
- - repo: https://bitbucket.org/dkistdc/pre-commit-hooks
31
- rev: v1.0.2
30
+ - repo: https://bitbucket.org/dkistdc/pre-commit-hooks.git
31
+ rev: v1.1.0
32
32
  hooks:
33
33
  - id: calibration-workflow-name
34
+ - id: dkist-env-table
35
+ language_version: python3.13
36
+ require_serial: true
37
+ additional_dependencies:
38
+ - dkist-processing-common
39
+ - dkist-service-configuration
@@ -1,3 +1,23 @@
1
+ v5.9.0 (2026-10-12)
2
+ ===================
3
+
4
+ Misc
5
+ ----
6
+
7
+ - Remove ``_geometry_inverse_transform`` and updated ``corrections_correct_geometry`` to delegate directly to ``dkist-processing-math``'s ``apply_affine_transform`` which handles array application, non-finite value replacement, and matrix caching. Corrected output is numerically unchanged. (`#331 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/331>`__)
8
+
9
+
10
+ v5.8.6 (2026-10-08)
11
+ ===================
12
+
13
+ Misc
14
+ ----
15
+
16
+ - Integrated the ``dkist-env-table`` pre-commit hook and updated the README environment-variable table to match the current configuration. (`#337 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/337>`__)
17
+ - Bump `dkist-processing-common` to v14.6.0. No major changes. (`#341 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/341>`__)
18
+ - Bump `dkist-fits-specifications` to v4.30.0, which adds support for the BEAM BOUNDARIES dataset extra. (`#341 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/341>`__)
19
+
20
+
1
21
  v5.8.5 (2026-10-06)
2
22
  ===================
3
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.8.5
3
+ Version: 5.9.0
4
4
  Summary: Science processing code for the ViSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -13,11 +13,11 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==14.5.2
17
- Requires-Dist: dkist-processing-math==2.2.3
16
+ Requires-Dist: dkist-processing-common==14.6.0
17
+ Requires-Dist: dkist-processing-math==3.0.0
18
18
  Requires-Dist: dkist-processing-pac==3.1.2
19
19
  Requires-Dist: dkist-header-validator==6.0.0
20
- Requires-Dist: dkist-fits-specifications==4.29.0
20
+ Requires-Dist: dkist-fits-specifications==4.30.0
21
21
  Requires-Dist: solar-wavelength-calibration==2.0.4
22
22
  Requires-Dist: dkist-service-configuration==4.3.0
23
23
  Requires-Dist: dkist-spectral-lines==3.0.1
@@ -66,7 +66,7 @@ Requires-Dist: dkist-sphinx-theme; extra == "docs"
66
66
  Requires-Dist: packaging; extra == "docs"
67
67
  Provides-Extra: frozen
68
68
  Requires-Dist: Deprecated==3.0.0; extra == "frozen"
69
- Requires-Dist: ImageIO==2.38.0; extra == "frozen"
69
+ Requires-Dist: ImageIO==2.38.1; extra == "frozen"
70
70
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
71
71
  Requires-Dist: Mako==1.4.3; extra == "frozen"
72
72
  Requires-Dist: MarkupSafe==3.0.4; extra == "frozen"
@@ -75,12 +75,12 @@ Requires-Dist: PyJWT==2.15.1; extra == "frozen"
75
75
  Requires-Dist: PyYAML==6.0.3; extra == "frozen"
76
76
  Requires-Dist: PyYAML-ft==8.0.0; extra == "frozen"
77
77
  Requires-Dist: Pygments==2.21.0; extra == "frozen"
78
- Requires-Dist: SQLAlchemy==2.1.3; extra == "frozen"
78
+ Requires-Dist: SQLAlchemy==2.1.4; extra == "frozen"
79
79
  Requires-Dist: Send2Trash==2.1.0; extra == "frozen"
80
80
  Requires-Dist: a2wsgi==1.10.10; extra == "frozen"
81
81
  Requires-Dist: aioftp==0.28.3; extra == "frozen"
82
82
  Requires-Dist: aiohappyeyeballs==2.7.1; extra == "frozen"
83
- Requires-Dist: aiohttp==3.14.4; extra == "frozen"
83
+ Requires-Dist: aiohttp==3.14.5; extra == "frozen"
84
84
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
85
85
  Requires-Dist: aiosmtplib==5.1.3; extra == "frozen"
86
86
  Requires-Dist: aiosqlite==0.22.1; extra == "frozen"
@@ -99,6 +99,7 @@ Requires-Dist: apache-airflow-providers-postgres==7.1.0; extra == "frozen"
99
99
  Requires-Dist: apache-airflow-providers-smtp==3.1.0; extra == "frozen"
100
100
  Requires-Dist: apache-airflow-providers-standard==1.20.0; extra == "frozen"
101
101
  Requires-Dist: apache-airflow-task-sdk==1.3.1; extra == "frozen"
102
+ Requires-Dist: appnope==1.0.0; extra == "frozen"
102
103
  Requires-Dist: argcomplete==3.7.2; extra == "frozen"
103
104
  Requires-Dist: argon2-cffi==25.1.0; extra == "frozen"
104
105
  Requires-Dist: argon2-cffi-bindings==26.1.0; extra == "frozen"
@@ -108,17 +109,17 @@ Requires-Dist: asdf_standard==1.5.0; extra == "frozen"
108
109
  Requires-Dist: asgiref==3.12.1; extra == "frozen"
109
110
  Requires-Dist: asteval==1.0.10; extra == "frozen"
110
111
  Requires-Dist: astropy==7.0.2; extra == "frozen"
111
- Requires-Dist: astropy-iers-data==0.2026.10.5.1.0.7; extra == "frozen"
112
+ Requires-Dist: astropy-iers-data==0.2026.10.12.1.3.27; extra == "frozen"
112
113
  Requires-Dist: asttokens==3.0.2; extra == "frozen"
113
- Requires-Dist: async-lru==2.3.0; extra == "frozen"
114
- Requires-Dist: asyncpg==0.31.0; extra == "frozen"
114
+ Requires-Dist: async-lru==2.4.0; extra == "frozen"
115
+ Requires-Dist: asyncpg==0.32.0; extra == "frozen"
115
116
  Requires-Dist: attrs==26.1.0; extra == "frozen"
116
117
  Requires-Dist: babel==2.18.0; extra == "frozen"
117
118
  Requires-Dist: beautifulsoup4==4.15.0; extra == "frozen"
118
119
  Requires-Dist: billiard==4.3.1; extra == "frozen"
119
120
  Requires-Dist: bleach==6.4.0; extra == "frozen"
120
- Requires-Dist: boto3==1.43.108; extra == "frozen"
121
- Requires-Dist: botocore==1.43.108; extra == "frozen"
121
+ Requires-Dist: boto3==1.43.112; extra == "frozen"
122
+ Requires-Dist: botocore==1.43.112; extra == "frozen"
122
123
  Requires-Dist: cachetools==7.2.1; extra == "frozen"
123
124
  Requires-Dist: cadwyn==7.0.0; extra == "frozen"
124
125
  Requires-Dist: celery==5.6.3; extra == "frozen"
@@ -142,17 +143,17 @@ Requires-Dist: decorator==5.3.1; extra == "frozen"
142
143
  Requires-Dist: defusedxml==0.7.1; extra == "frozen"
143
144
  Requires-Dist: dill==0.4.1; extra == "frozen"
144
145
  Requires-Dist: dkist-header-validator==6.0.0; extra == "frozen"
145
- Requires-Dist: dkist-processing-common==14.5.2; extra == "frozen"
146
+ Requires-Dist: dkist-processing-common==14.6.0; extra == "frozen"
146
147
  Requires-Dist: dkist-processing-core==7.5.0; extra == "frozen"
147
- Requires-Dist: dkist-processing-math==2.2.3; extra == "frozen"
148
+ Requires-Dist: dkist-processing-math==3.0.0; extra == "frozen"
148
149
  Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
149
- Requires-Dist: dkist-processing-visp==5.8.5; extra == "frozen"
150
+ Requires-Dist: dkist-processing-visp==5.9.0; extra == "frozen"
150
151
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
151
152
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
152
- Requires-Dist: dkist_fits_specifications==4.29.0; extra == "frozen"
153
- Requires-Dist: dnspython==2.8.0; extra == "frozen"
153
+ Requires-Dist: dkist_fits_specifications==4.30.0; extra == "frozen"
154
+ Requires-Dist: dnspython==2.9.0; extra == "frozen"
154
155
  Requires-Dist: email-validator==2.3.0; extra == "frozen"
155
- Requires-Dist: executing==2.2.1; extra == "frozen"
156
+ Requires-Dist: executing==2.3.0; extra == "frozen"
156
157
  Requires-Dist: fastapi==0.136.3; extra == "frozen"
157
158
  Requires-Dist: fastapi-cli==0.0.32; extra == "frozen"
158
159
  Requires-Dist: fastjsonschema==2.22.2; extra == "frozen"
@@ -169,7 +170,7 @@ Requires-Dist: greenlet==3.5.6; extra == "frozen"
169
170
  Requires-Dist: grpcio==1.84.0; extra == "frozen"
170
171
  Requires-Dist: h11==0.16.0; extra == "frozen"
171
172
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
172
- Requires-Dist: httptools==0.8.0; extra == "frozen"
173
+ Requires-Dist: httptools==0.9.0; extra == "frozen"
173
174
  Requires-Dist: httpx==0.28.1; extra == "frozen"
174
175
  Requires-Dist: humanize==4.16.0; extra == "frozen"
175
176
  Requires-Dist: idna==3.20; extra == "frozen"
@@ -180,11 +181,11 @@ Requires-Dist: ipython==9.17.1; extra == "frozen"
180
181
  Requires-Dist: ipython_pygments_lexers==1.1.1; extra == "frozen"
181
182
  Requires-Dist: isoduration==20.11.0; extra == "frozen"
182
183
  Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
183
- Requires-Dist: jedi==0.20.0; extra == "frozen"
184
+ Requires-Dist: jedi==0.20.1; extra == "frozen"
184
185
  Requires-Dist: jmespath==1.1.0; extra == "frozen"
185
186
  Requires-Dist: joblib==1.6.0; extra == "frozen"
186
- Requires-Dist: json5==0.15.0; extra == "frozen"
187
- Requires-Dist: jsonpointer==3.1.1; extra == "frozen"
187
+ Requires-Dist: json5==0.17.3; extra == "frozen"
188
+ Requires-Dist: jsonpointer==3.2.1; extra == "frozen"
188
189
  Requires-Dist: jsonschema==4.26.0; extra == "frozen"
189
190
  Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
190
191
  Requires-Dist: jupyter-events==0.12.1; extra == "frozen"
@@ -216,43 +217,43 @@ Requires-Dist: mistune==3.3.4; extra == "frozen"
216
217
  Requires-Dist: more-itertools==11.1.0; extra == "frozen"
217
218
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
218
219
  Requires-Dist: msgspec==0.22.0; extra == "frozen"
219
- Requires-Dist: multidict==6.9.1; extra == "frozen"
220
+ Requires-Dist: multidict==7.1.0; extra == "frozen"
220
221
  Requires-Dist: natsort==8.4.0; extra == "frozen"
221
222
  Requires-Dist: nbclient==0.11.0; extra == "frozen"
222
- Requires-Dist: nbconvert==7.17.1; extra == "frozen"
223
+ Requires-Dist: nbconvert==7.17.2; extra == "frozen"
223
224
  Requires-Dist: nbformat==5.11.1; extra == "frozen"
224
- Requires-Dist: nest-asyncio2==1.7.3; extra == "frozen"
225
+ Requires-Dist: nest-asyncio2==1.7.4; extra == "frozen"
225
226
  Requires-Dist: networkx==3.7; extra == "frozen"
226
227
  Requires-Dist: notebook==7.6.3; extra == "frozen"
227
228
  Requires-Dist: notebook_shim==0.2.4; extra == "frozen"
228
229
  Requires-Dist: numpy==2.2.5; extra == "frozen"
229
230
  Requires-Dist: object-clerk==1.0.0; extra == "frozen"
230
- Requires-Dist: opentelemetry-api==1.45.0; extra == "frozen"
231
- Requires-Dist: opentelemetry-exporter-http-transport==0.66b0; extra == "frozen"
232
- Requires-Dist: opentelemetry-exporter-otlp==1.45.0; extra == "frozen"
233
- Requires-Dist: opentelemetry-exporter-otlp-common==0.66b0; extra == "frozen"
234
- Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.45.0; extra == "frozen"
235
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.45.0; extra == "frozen"
236
- Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.45.0; extra == "frozen"
237
- Requires-Dist: opentelemetry-instrumentation==0.66b0; extra == "frozen"
238
- Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.66b0; extra == "frozen"
239
- Requires-Dist: opentelemetry-instrumentation-asgi==0.66b0; extra == "frozen"
240
- Requires-Dist: opentelemetry-instrumentation-botocore==0.66b0; extra == "frozen"
241
- Requires-Dist: opentelemetry-instrumentation-celery==0.66b0; extra == "frozen"
242
- Requires-Dist: opentelemetry-instrumentation-dbapi==0.66b0; extra == "frozen"
243
- Requires-Dist: opentelemetry-instrumentation-fastapi==0.66b0; extra == "frozen"
244
- Requires-Dist: opentelemetry-instrumentation-pika==0.66b0; extra == "frozen"
245
- Requires-Dist: opentelemetry-instrumentation-psycopg2==0.66b0; extra == "frozen"
246
- Requires-Dist: opentelemetry-instrumentation-pymongo==0.66b0; extra == "frozen"
247
- Requires-Dist: opentelemetry-instrumentation-redis==0.66b0; extra == "frozen"
248
- Requires-Dist: opentelemetry-instrumentation-requests==0.66b0; extra == "frozen"
249
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.66b0; extra == "frozen"
250
- Requires-Dist: opentelemetry-instrumentation-system-metrics==0.66b0; extra == "frozen"
231
+ Requires-Dist: opentelemetry-api==1.45.1; extra == "frozen"
232
+ Requires-Dist: opentelemetry-exporter-http-transport==0.66b1; extra == "frozen"
233
+ Requires-Dist: opentelemetry-exporter-otlp==1.45.1; extra == "frozen"
234
+ Requires-Dist: opentelemetry-exporter-otlp-common==0.66b1; extra == "frozen"
235
+ Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.45.1; extra == "frozen"
236
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.45.1; extra == "frozen"
237
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.45.1; extra == "frozen"
238
+ Requires-Dist: opentelemetry-instrumentation==0.66b1; extra == "frozen"
239
+ Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.66b1; extra == "frozen"
240
+ Requires-Dist: opentelemetry-instrumentation-asgi==0.66b1; extra == "frozen"
241
+ Requires-Dist: opentelemetry-instrumentation-botocore==0.66b1; extra == "frozen"
242
+ Requires-Dist: opentelemetry-instrumentation-celery==0.66b1; extra == "frozen"
243
+ Requires-Dist: opentelemetry-instrumentation-dbapi==0.66b1; extra == "frozen"
244
+ Requires-Dist: opentelemetry-instrumentation-fastapi==0.66b1; extra == "frozen"
245
+ Requires-Dist: opentelemetry-instrumentation-pika==0.66b1; extra == "frozen"
246
+ Requires-Dist: opentelemetry-instrumentation-psycopg2==0.66b1; extra == "frozen"
247
+ Requires-Dist: opentelemetry-instrumentation-pymongo==0.66b1; extra == "frozen"
248
+ Requires-Dist: opentelemetry-instrumentation-redis==0.66b1; extra == "frozen"
249
+ Requires-Dist: opentelemetry-instrumentation-requests==0.66b1; extra == "frozen"
250
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.66b1; extra == "frozen"
251
+ Requires-Dist: opentelemetry-instrumentation-system-metrics==0.66b1; extra == "frozen"
251
252
  Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
252
- Requires-Dist: opentelemetry-proto==1.45.0; extra == "frozen"
253
- Requires-Dist: opentelemetry-sdk==1.45.0; extra == "frozen"
254
- Requires-Dist: opentelemetry-semantic-conventions==0.66b0; extra == "frozen"
255
- Requires-Dist: opentelemetry-util-http==0.66b0; extra == "frozen"
253
+ Requires-Dist: opentelemetry-proto==1.45.1; extra == "frozen"
254
+ Requires-Dist: opentelemetry-sdk==1.45.1; extra == "frozen"
255
+ Requires-Dist: opentelemetry-semantic-conventions==0.66b1; extra == "frozen"
256
+ Requires-Dist: opentelemetry-util-http==0.66b1; extra == "frozen"
256
257
  Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
257
258
  Requires-Dist: packaging==26.3; extra == "frozen"
258
259
  Requires-Dist: pandas==3.0.6; extra == "frozen"
@@ -261,12 +262,12 @@ Requires-Dist: parfive==2.3.1; extra == "frozen"
261
262
  Requires-Dist: parso==0.8.7; extra == "frozen"
262
263
  Requires-Dist: pathlib_abc==0.5.2; extra == "frozen"
263
264
  Requires-Dist: pathspec==1.1.1; extra == "frozen"
264
- Requires-Dist: pendulum==3.2.0; extra == "frozen"
265
+ Requires-Dist: pendulum==3.3.0; extra == "frozen"
265
266
  Requires-Dist: pexpect==4.9.0; extra == "frozen"
266
267
  Requires-Dist: pika==1.4.4; extra == "frozen"
267
268
  Requires-Dist: pillow==10.4.0; extra == "frozen"
268
269
  Requires-Dist: pip==26.2.1; extra == "frozen"
269
- Requires-Dist: platformdirs==4.12.3; extra == "frozen"
270
+ Requires-Dist: platformdirs==4.13.0; extra == "frozen"
270
271
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
271
272
  Requires-Dist: pooch==1.9.0; extra == "frozen"
272
273
  Requires-Dist: proglog==0.1.12; extra == "frozen"
@@ -280,11 +281,11 @@ Requires-Dist: psycopg-binary==3.3.6; extra == "frozen"
280
281
  Requires-Dist: psycopg2-binary==2.9.13; extra == "frozen"
281
282
  Requires-Dist: ptyprocess==0.7.0; extra == "frozen"
282
283
  Requires-Dist: pure_eval==0.2.4; extra == "frozen"
283
- Requires-Dist: pycparser==3.0; extra == "frozen"
284
- Requires-Dist: pydantic==2.13.5; extra == "frozen"
284
+ Requires-Dist: pycparser==3.11; extra == "frozen"
285
+ Requires-Dist: pydantic==2.14.1; extra == "frozen"
285
286
  Requires-Dist: pydantic-extra-types==2.11.1; extra == "frozen"
286
287
  Requires-Dist: pydantic-settings==2.15.0; extra == "frozen"
287
- Requires-Dist: pydantic_core==2.46.5; extra == "frozen"
288
+ Requires-Dist: pydantic_core==2.50.1; extra == "frozen"
288
289
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
289
290
  Requires-Dist: pygtrie==2.6.2; extra == "frozen"
290
291
  Requires-Dist: pyparsing==3.3.3; extra == "frozen"
@@ -293,7 +294,7 @@ Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
293
294
  Requires-Dist: python-dotenv==1.2.4; extra == "frozen"
294
295
  Requires-Dist: python-json-logger==4.2.0; extra == "frozen"
295
296
  Requires-Dist: python-multipart==0.0.32; extra == "frozen"
296
- Requires-Dist: python-slugify==9.1.2; extra == "frozen"
297
+ Requires-Dist: python-slugify==9.1.3; extra == "frozen"
297
298
  Requires-Dist: pytz==2026.5; extra == "frozen"
298
299
  Requires-Dist: pyzmq==27.2.0; extra == "frozen"
299
300
  Requires-Dist: redis==6.4.0; extra == "frozen"
@@ -304,7 +305,7 @@ Requires-Dist: rfc3986-validator==0.1.1; extra == "frozen"
304
305
  Requires-Dist: rfc3987-syntax==1.1.0; extra == "frozen"
305
306
  Requires-Dist: rich==15.0.0; extra == "frozen"
306
307
  Requires-Dist: rich-argparse==1.8.0; extra == "frozen"
307
- Requires-Dist: rich-toolkit==0.20.5; extra == "frozen"
308
+ Requires-Dist: rich-toolkit==0.20.6; extra == "frozen"
308
309
  Requires-Dist: rpds-py==2026.9.1; extra == "frozen"
309
310
  Requires-Dist: s3transfer==0.19.2; extra == "frozen"
310
311
  Requires-Dist: scikit-image==0.25.2; extra == "frozen"
@@ -316,7 +317,7 @@ Requires-Dist: shellingham==1.5.4; extra == "frozen"
316
317
  Requires-Dist: six==1.17.0; extra == "frozen"
317
318
  Requires-Dist: sniffio==1.3.1; extra == "frozen"
318
319
  Requires-Dist: solar-wavelength-calibration==2.0.4; extra == "frozen"
319
- Requires-Dist: soupsieve==2.10; extra == "frozen"
320
+ Requires-Dist: soupsieve==3.0.3; extra == "frozen"
320
321
  Requires-Dist: sqids==0.5.1; extra == "frozen"
321
322
  Requires-Dist: sqlparse==0.6.0; extra == "frozen"
322
323
  Requires-Dist: stack-data==0.6.3; extra == "frozen"
@@ -336,7 +337,7 @@ Requires-Dist: tinycss2==1.5.1; extra == "frozen"
336
337
  Requires-Dist: tornado==6.5.10; extra == "frozen"
337
338
  Requires-Dist: tqdm==4.70.1; extra == "frozen"
338
339
  Requires-Dist: traitlets==5.16.1; extra == "frozen"
339
- Requires-Dist: typer==0.27.2; extra == "frozen"
340
+ Requires-Dist: typer==0.27.3; extra == "frozen"
340
341
  Requires-Dist: typing-inspection==0.4.4; extra == "frozen"
341
342
  Requires-Dist: typing_extensions==4.16.0; extra == "frozen"
342
343
  Requires-Dist: tzdata==2026.5; extra == "frozen"
@@ -379,6 +380,8 @@ in their own package facilitates using the build_utils to test the integrity of
379
380
  Environment Variables
380
381
  ---------------------
381
382
 
383
+ .. dkist-env-table: start
384
+
382
385
  .. list-table::
383
386
  :widths: 10 90
384
387
  :header-rows: 1
@@ -470,6 +473,21 @@ Environment Variables
470
473
  * - FTS_ATLAS_DATA_DIR
471
474
  - annotation=Union[str, NoneType] required=False default=None description='Common cached directory for downloaded FTS Atlas.'
472
475
 
476
+ .. dkist-env-table: end
477
+
478
+ Maintaining the generated table
479
+ ###############################
480
+
481
+ The hook's additional dependencies are intentionally unpinned to avoid duplicating
482
+ versions maintained in ``pyproject.toml``. Consequently, the generated table may
483
+ temporarily reflect a newer published parent configuration than the version pinned
484
+ by this project.
485
+
486
+ When developing against an upstream release candidate that changes configuration
487
+ fields, temporarily pin the relevant hook dependency in
488
+ ``.pre-commit-config.yaml`` to that RC. Remove the temporary pin after the final
489
+ upstream release is available.
490
+
473
491
  Development
474
492
  -----------
475
493
  .. code-block:: bash
@@ -15,6 +15,8 @@ in their own package facilitates using the build_utils to test the integrity of
15
15
  Environment Variables
16
16
  ---------------------
17
17
 
18
+ .. dkist-env-table: start
19
+
18
20
  .. list-table::
19
21
  :widths: 10 90
20
22
  :header-rows: 1
@@ -106,6 +108,21 @@ Environment Variables
106
108
  * - FTS_ATLAS_DATA_DIR
107
109
  - annotation=Union[str, NoneType] required=False default=None description='Common cached directory for downloaded FTS Atlas.'
108
110
 
111
+ .. dkist-env-table: end
112
+
113
+ Maintaining the generated table
114
+ ###############################
115
+
116
+ The hook's additional dependencies are intentionally unpinned to avoid duplicating
117
+ versions maintained in ``pyproject.toml``. Consequently, the generated table may
118
+ temporarily reflect a newer published parent configuration than the version pinned
119
+ by this project.
120
+
121
+ When developing against an upstream release candidate that changes configuration
122
+ fields, temporarily pin the relevant hook dependency in
123
+ ``.pre-commit-config.yaml`` to that RC. Remove the temporary pin after the final
124
+ upstream release is available.
125
+
109
126
  Development
110
127
  -----------
111
128
  .. code-block:: bash
@@ -1,40 +1,16 @@
1
1
  """Helper for ViSP array corrections."""
2
2
 
3
- from typing import Generator
4
- from typing import Iterable
3
+ from collections.abc import Generator
4
+ from collections.abc import Iterable
5
5
 
6
6
  import numpy as np
7
7
  import scipy.ndimage as spnd
8
- from scipy.ndimage import affine_transform
8
+ from dkist_processing_math.transform import apply_affine_transform
9
9
 
10
10
 
11
11
  class CorrectionsMixin:
12
12
  """Mixin to provide support for various array corrections used by the workflow tasks."""
13
13
 
14
- @staticmethod
15
- def _geometry_inverse_transform(
16
- array_shape: tuple[int, ...], shift: np.ndarray, angle: float
17
- ) -> tuple[np.ndarray, np.ndarray]:
18
- """
19
- Build the inverse transform used by `scipy.ndimage.affine_transform`.
20
-
21
- The forward correction translates by `-shift` and then rotates by `-angle`
22
- about the array center. `affine_transform` instead wants the mapping from
23
- output coordinates back to input coordinates, so we supply the inverse
24
- rotation matrix and the corresponding center-preserving offset here.
25
- """
26
- cosine_angle = np.cos(angle)
27
- sine_angle = np.sin(angle)
28
- inverse_rotation_matrix = np.array(
29
- [[cosine_angle, -sine_angle], [sine_angle, cosine_angle]],
30
- dtype=np.float64,
31
- )
32
-
33
- rotation_center = 0.5 * (np.asarray(array_shape, dtype=np.float64) - 1.0)
34
- transform_offset = rotation_center + shift - inverse_rotation_matrix @ rotation_center
35
-
36
- return inverse_rotation_matrix, transform_offset
37
-
38
14
  @staticmethod
39
15
  def corrections_correct_geometry(
40
16
  arrays: Iterable[np.ndarray] | np.ndarray,
@@ -47,7 +23,8 @@ class CorrectionsMixin:
47
23
  """
48
24
  Shift and then rotate data.
49
25
 
50
- This method applies the inverse of the given shift and angle.
26
+ This method applies the inverse of the given shift and angle in a single interpolation
27
+ pass via `dkist_processing_math.transform.apply_affine_transform`.
51
28
 
52
29
  Parameters
53
30
  ----------
@@ -55,8 +32,8 @@ class CorrectionsMixin:
55
32
  2D array(s) containing the data for the un-shifted beam
56
33
 
57
34
  shift : np.ndarray
58
- The shift in the spectral dimension needed to "straighten" the spectra
59
- so a single wavelength is at the same pixel for all slit positions.
35
+ The (row, col) shift, in pixels, needed to bring this array into alignment with the
36
+ other modstates and beams.
60
37
 
61
38
  angle : float
62
39
  The angle (in radians) between slit hairlines and pixel axes.
@@ -78,65 +55,23 @@ class CorrectionsMixin:
78
55
  Used in conjunction with mode 'constant', the value outside
79
56
  the image boundaries.
80
57
 
81
-
82
58
  Returns
83
59
  -------
84
60
  Generator
85
61
  2D array(s) containing the data of the rotated and shifted beam
86
62
  """
87
- uncorrected_arrays = (arrays,) if isinstance(arrays, np.ndarray) else arrays
63
+ # `-shift` and `-angle` because the pipeline defines shift/angle as the distortion to
64
+ # correct for; the forward correction moves content in the opposite direction.
88
65
  shift = np.asarray(shift, dtype=np.float64)
89
-
90
- previous_array_shape = None
91
- inverse_transform_matrix = None
92
- transform_offset = None
93
-
94
- for array in uncorrected_arrays:
95
- input_array = np.asarray(array, dtype=np.float64)
96
-
97
- # `affine_transform` does not handle NaN and inf values well, so normalize them
98
- # before interpolation. We identify the finite pixels once and reuse those
99
- # results instead of rescanning the full array for each replacement case.
100
- finite_pixel_mask = np.isfinite(input_array)
101
- if not finite_pixel_mask.all():
102
- finite_pixel_values = input_array[finite_pixel_mask]
103
-
104
- if finite_pixel_values.size == 0:
105
- input_array.fill(cval if np.isfinite(cval) else np.nan)
106
- else:
107
- # Replace +inf, -inf, and NaN using the finite pixels we already
108
- # collected, and only computing the replacement values if necessary.
109
- positive_infinity_mask = np.isposinf(input_array)
110
- if positive_infinity_mask.any():
111
- input_array[positive_infinity_mask] = finite_pixel_values.max()
112
-
113
- negative_infinity_mask = np.isneginf(input_array)
114
- if negative_infinity_mask.any():
115
- input_array[negative_infinity_mask] = finite_pixel_values.min()
116
-
117
- nan_pixel_mask = np.isnan(input_array)
118
- if nan_pixel_mask.any():
119
- input_array[nan_pixel_mask] = np.nanmedian(input_array)
120
-
121
- if input_array.shape != previous_array_shape:
122
- inverse_transform_matrix, transform_offset = (
123
- CorrectionsMixin._geometry_inverse_transform(
124
- array_shape=input_array.shape,
125
- shift=shift,
126
- angle=angle,
127
- )
128
- )
129
- previous_array_shape = input_array.shape
130
-
131
- yield affine_transform(
132
- input_array,
133
- matrix=inverse_transform_matrix,
134
- offset=transform_offset,
135
- order=order,
136
- mode=mode,
137
- cval=cval,
138
- prefilter=(order > 1),
139
- )
66
+ yield from apply_affine_transform(
67
+ arrays,
68
+ shift=-shift,
69
+ angle=-angle,
70
+ order="shift_then_rotate",
71
+ interp_order=order,
72
+ mode=mode,
73
+ cval=cval,
74
+ )
140
75
 
141
76
  @staticmethod
142
77
  def corrections_remove_spec_geometry(
@@ -7,7 +7,7 @@ from dkist_processing_common._util.scratch import WorkflowFileSystem
7
7
  from dkist_processing_common.codecs.basemodel import basemodel_decoder
8
8
  from dkist_processing_common.codecs.fits import fits_array_decoder
9
9
  from dkist_processing_common.models.quality import TaskCount
10
- from dkist_processing_math import transform
10
+ from dkist_processing_math.transform import apply_affine_transform
11
11
 
12
12
  from dkist_processing_visp.models.tags import VispTag
13
13
  from dkist_processing_visp.tasks.geometric import GeometricCalibration
@@ -33,9 +33,13 @@ def make_solar_array_data(
33
33
  beam_list = []
34
34
  for beam in [1, 2]:
35
35
  true_solar = 10 * (np.ones(intermediate_shape) + modstate + beam)
36
+
36
37
  translated_solar = next(
37
- transform.translate_arrays(
38
- arrays=true_solar, translation=offsets[beam - 1][modstate - 1]
38
+ apply_affine_transform(
39
+ true_solar,
40
+ shift=np.asarray(offsets[beam - 1][modstate - 1]),
41
+ angle=0.0,
42
+ order="shift_then_rotate",
39
43
  )
40
44
  )
41
45
  translated_solar[translated_solar == 0] = 10 * (modstate + beam + 1)
@@ -44,7 +48,12 @@ def make_solar_array_data(
44
48
  translated_solar[:, 30] = 5.0
45
49
  translated_solar[:, 70] = 5.0
46
50
  distorted_solar = next(
47
- transform.rotate_arrays_about_point(arrays=translated_solar, angle=angles[beam - 1])
51
+ apply_affine_transform(
52
+ translated_solar,
53
+ shift=np.zeros(2),
54
+ angle=angles[beam - 1],
55
+ order="shift_then_rotate",
56
+ )
48
57
  )
49
58
  beam_list.append((distorted_solar + dark_signal) * num_raw_per_fpa)
50
59
 
@@ -111,9 +120,13 @@ def make_lamp_array_data(
111
120
  beam_list = []
112
121
  for beam in [1, 2]:
113
122
  true_lamp = 10 * (np.ones(intermediate_shape) + modstate + beam)
123
+
114
124
  translated_lamp = next(
115
- transform.translate_arrays(
116
- arrays=true_lamp, translation=offsets[beam - 1][modstate - 1]
125
+ apply_affine_transform(
126
+ true_lamp,
127
+ shift=np.asarray(offsets[beam - 1][modstate - 1]),
128
+ angle=0.0,
129
+ order="shift_then_rotate",
117
130
  )
118
131
  )
119
132
  translated_lamp[translated_lamp == 0] = 10 * (modstate + beam + 1)
@@ -124,7 +137,12 @@ def make_lamp_array_data(
124
137
  # Chop out part of the second hairline so the fitter has to skip over these pixels
125
138
  translated_lamp[5:9, 70] = 10 * (modstate + beam + 1)
126
139
  distorted_lamp = next(
127
- transform.rotate_arrays_about_point(arrays=translated_lamp, angle=angles[beam - 1])
140
+ apply_affine_transform(
141
+ translated_lamp,
142
+ shift=np.zeros(2),
143
+ angle=angles[beam - 1],
144
+ order="shift_then_rotate",
145
+ )
128
146
  )
129
147
  beam_list.append((distorted_lamp + dark_signal) * num_raw_per_fpa)
130
148