dkist-processing-visp 5.6.8rc2__tar.gz → 5.7.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 (118) hide show
  1. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/CHANGELOG.rst +22 -0
  2. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/PKG-INFO +7 -7
  3. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/visp_l0_fits_access.py +12 -6
  4. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/visp_l1_fits_access.py +12 -6
  5. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/instrument_polarization.py +4 -2
  6. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/science.py +10 -4
  7. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_background_light.py +10 -8
  8. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_fits_access.py +4 -3
  9. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_map_repeats.py +6 -2
  10. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_science.py +9 -5
  11. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp.egg-info/PKG-INFO +7 -7
  12. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp.egg-info/SOURCES.txt +0 -1
  13. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp.egg-info/requires.txt +6 -6
  14. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/pyproject.toml +8 -8
  15. dkist_processing_visp-5.6.8rc2/changelog/303.misc.rst +0 -2
  16. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/.gitignore +0 -0
  17. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/.pre-commit-config.yaml +0 -0
  18. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/.readthedocs.yml +0 -0
  19. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/.snyk +0 -0
  20. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/README.rst +0 -0
  21. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/SCIENCE_CHANGELOG.rst +0 -0
  22. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/bitbucket-pipelines.yml +0 -0
  23. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/changelog/.gitempty +0 -0
  24. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/__init__.py +0 -0
  25. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/config.py +0 -0
  26. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  27. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/__init__.py +0 -0
  28. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/constants.py +0 -0
  29. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/dataset_extras.py +0 -0
  30. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/fits_access.py +0 -0
  31. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/metric_code.py +0 -0
  32. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/parameters.py +0 -0
  33. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/tags.py +0 -0
  34. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/models/task_name.py +0 -0
  35. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/__init__.py +0 -0
  36. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  37. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/modulator_states.py +0 -0
  38. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  39. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/raster_step.py +0 -0
  40. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/spectrograph_configuration.py +0 -0
  41. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/parsers/time.py +0 -0
  42. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/__init__.py +0 -0
  43. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  44. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/background_light.py +0 -0
  45. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/dark.py +0 -0
  46. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/geometric.py +0 -0
  47. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  48. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/lamp.py +0 -0
  49. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  50. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  51. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  52. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
  53. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  54. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/parse.py +0 -0
  55. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/polcal_as_science.py +0 -0
  56. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  57. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/solar.py +0 -0
  58. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/visp_base.py +0 -0
  59. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/wavelength_calibration.py +0 -0
  60. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/write_dataset_extras.py +0 -0
  61. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tasks/write_l1.py +0 -0
  62. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/README.rst +0 -0
  63. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/__init__.py +0 -0
  64. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/conftest.py +0 -0
  65. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/header_models.py +0 -0
  66. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  67. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  68. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  69. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  70. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  71. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  72. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  73. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  74. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_dark.py +0 -0
  75. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_downsample.py +0 -0
  76. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_geometric.py +0 -0
  77. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  78. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_lamp.py +0 -0
  79. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  80. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_parameters.py +0 -0
  81. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_parse.py +0 -0
  82. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_polcal_as_science.py +0 -0
  83. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_quality.py +0 -0
  84. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_solar.py +0 -0
  85. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  86. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
  87. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_wavelength_calibration.py +0 -0
  88. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_workflows.py +0 -0
  89. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_write_dataset_extras.py +0 -0
  90. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  91. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/workflows/__init__.py +0 -0
  92. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/workflows/l0_processing.py +0 -0
  93. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  94. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
  95. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  96. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  97. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/Makefile +0 -0
  98. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/background_light.rst +0 -0
  99. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/changelog.rst +0 -0
  100. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/conf.py +0 -0
  101. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/dataset_extras.rst +0 -0
  102. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/gain_correction.rst +0 -0
  103. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/geometric.rst +0 -0
  104. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/index.rst +0 -0
  105. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/l0_to_l1_visp.rst +0 -0
  106. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  107. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/landing_page.rst +0 -0
  108. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/make.bat +0 -0
  109. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/polarization_calibration.rst +0 -0
  110. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/requirements.txt +0 -0
  111. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/requirements_table.rst +0 -0
  112. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/science_calibration.rst +0 -0
  113. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/scientific_changelog.rst +0 -0
  114. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/docs/wavelength_calibration.rst +0 -0
  115. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/licenses/LICENSE.rst +0 -0
  116. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/science_towncrier.sh +0 -0
  117. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/setup.cfg +0 -0
  118. {dkist_processing_visp-5.6.8rc2 → dkist_processing_visp-5.7.0}/towncrier_science.toml +0 -0
@@ -1,3 +1,25 @@
1
+ v5.7.0 (2026-04-21)
2
+ ===================
3
+
4
+ Misc
5
+ ----
6
+
7
+ - Move to `dkist-processing-common` v14.0.0 and update usage of the modernized `*FitsAccess` classes. (`#298 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/298>`__)
8
+ - Strip CALIBRATED file headers of PrimaryHDU-only keys prior to writing as a compressed file. This skirts a bug in `astropy` that
9
+ causes L1 frames to be incompatible with the `funpack` utility. Previously, this was a side-effect of using `FitsAccessBase.from_header`,
10
+ but that construction method no longer exists. (`#298 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/298>`__)
11
+
12
+
13
+ v5.6.8 (2026-04-21)
14
+ ===================
15
+
16
+ Misc
17
+ ----
18
+
19
+ - Update dkist-processing-common to v13.0.6, which uses gqlclient v2.0 and provides a
20
+ better error for reading/writing with tags=None. (`#303 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/303>`__)
21
+
22
+
1
23
  v5.6.7 (2026-04-20)
2
24
  ===================
3
25
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.6.8rc2
3
+ Version: 5.7.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,7 +13,7 @@ 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==13.0.6rc2
16
+ Requires-Dist: dkist-processing-common==14.0.0
17
17
  Requires-Dist: dkist-processing-math==2.2.2
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.3.1
@@ -131,11 +131,11 @@ Requires-Dist: cycler==0.12.1; extra == "frozen"
131
131
  Requires-Dist: decorator==5.2.1; extra == "frozen"
132
132
  Requires-Dist: dill==0.4.1; extra == "frozen"
133
133
  Requires-Dist: dkist-header-validator==5.3.1; extra == "frozen"
134
- Requires-Dist: dkist-processing-common==13.0.6rc2; extra == "frozen"
134
+ Requires-Dist: dkist-processing-common==14.0.0; extra == "frozen"
135
135
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
136
136
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
137
137
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
138
- Requires-Dist: dkist-processing-visp==5.6.8rc2; extra == "frozen"
138
+ Requires-Dist: dkist-processing-visp==5.7.0; extra == "frozen"
139
139
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
140
140
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
141
141
  Requires-Dist: dkist_fits_specifications==4.24.1; extra == "frozen"
@@ -159,7 +159,7 @@ Requires-Dist: httpcore==1.0.9; extra == "frozen"
159
159
  Requires-Dist: httptools==0.7.1; extra == "frozen"
160
160
  Requires-Dist: httpx==0.28.1; extra == "frozen"
161
161
  Requires-Dist: humanize==4.15.0; extra == "frozen"
162
- Requires-Dist: idna==3.11; extra == "frozen"
162
+ Requires-Dist: idna==3.12; extra == "frozen"
163
163
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
164
164
  Requires-Dist: importlib_metadata==8.7.1; extra == "frozen"
165
165
  Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
@@ -232,7 +232,7 @@ Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
232
232
  Requires-Dist: propcache==0.4.1; extra == "frozen"
233
233
  Requires-Dist: protobuf==6.33.6; extra == "frozen"
234
234
  Requires-Dist: psutil==7.2.2; extra == "frozen"
235
- Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
235
+ Requires-Dist: psycopg2-binary==2.9.12; extra == "frozen"
236
236
  Requires-Dist: pycparser==3.0; extra == "frozen"
237
237
  Requires-Dist: pydantic==2.13.3; extra == "frozen"
238
238
  Requires-Dist: pydantic-settings==2.14.0; extra == "frozen"
@@ -289,7 +289,7 @@ Requires-Dist: uncertainties==3.2.3; extra == "frozen"
289
289
  Requires-Dist: universal_pathlib==0.2.6; extra == "frozen"
290
290
  Requires-Dist: urllib3==2.6.3; extra == "frozen"
291
291
  Requires-Dist: uuid6==2025.0.1; extra == "frozen"
292
- Requires-Dist: uvicorn==0.44.0; extra == "frozen"
292
+ Requires-Dist: uvicorn==0.45.0; extra == "frozen"
293
293
  Requires-Dist: uvloop==0.22.1; extra == "frozen"
294
294
  Requires-Dist: vine==5.1.0; extra == "frozen"
295
295
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
@@ -1,5 +1,6 @@
1
1
  """ViSP FITS access for L0 data."""
2
2
 
3
+ import numpy as np
3
4
  from astropy.io import fits
4
5
  from dkist_processing_common.parsers.l0_fits_access import L0FitsAccess
5
6
 
@@ -14,23 +15,28 @@ class VispL0FitsAccess(L0FitsAccess):
14
15
 
15
16
  Parameters
16
17
  ----------
17
- hdu :
18
- Fits L0 header object
18
+ header
19
+ The header from which to parse higher-level properties
19
20
 
20
- name : str
21
+ data
22
+ A data array to associate with the current instance
23
+
24
+ name
21
25
  The name of the file that was loaded into this FitsAccess object
22
26
 
23
- auto_squeeze : bool
27
+ auto_squeeze
24
28
  When set to True, dimensions of length 1 will be removed from the array
25
29
  """
26
30
 
27
31
  def __init__(
28
32
  self,
29
- hdu: fits.ImageHDU | fits.PrimaryHDU | fits.CompImageHDU,
33
+ *,
34
+ header: fits.Header,
35
+ data: np.ndarray | None = None,
30
36
  name: str | None = None,
31
37
  auto_squeeze: bool = True,
32
38
  ):
33
- super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
39
+ super().__init__(header=header, data=data, name=name, auto_squeeze=auto_squeeze)
34
40
 
35
41
  self.arm_id: int = self.header[VispMetadataKey.arm_id]
36
42
  self.number_of_modulator_states: int = self.header[
@@ -1,5 +1,6 @@
1
1
  """ViSP FITS access for L1 data."""
2
2
 
3
+ import numpy as np
3
4
  from astropy.io import fits
4
5
  from dkist_processing_common.parsers.l1_fits_access import L1FitsAccess
5
6
 
@@ -12,20 +13,25 @@ class VispL1FitsAccess(L1FitsAccess):
12
13
 
13
14
  Parameters
14
15
  ----------
15
- hdu :
16
- Fits L1 header object
16
+ header
17
+ The header from which to parse higher-level properties
17
18
 
18
- name : str
19
+ data
20
+ A data array to associate with the current instance
21
+
22
+ name
19
23
  The name of the file that was loaded into this FitsAccess object
20
24
 
21
- auto_squeeze : bool
25
+ auto_squeeze
22
26
  When set to True, dimensions of length 1 will be removed from the array
23
27
  """
24
28
 
25
29
  def __init__(
26
30
  self,
27
- hdu: fits.ImageHDU | fits.PrimaryHDU | fits.CompImageHDU,
31
+ *,
32
+ header: fits.Header,
33
+ data: np.ndarray | None = None,
28
34
  name: str | None = None,
29
35
  auto_squeeze: bool = True,
30
36
  ):
31
- super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
37
+ super().__init__(header=header, data=data, name=name, auto_squeeze=auto_squeeze)
@@ -391,12 +391,14 @@ class InstrumentPolarizationCalibration(
391
391
 
392
392
  with self.telemetry_span(f"Create reduced VispL0FitsAccess for {apm_str}"):
393
393
  local_result = VispL0FitsAccess(
394
- fits.ImageHDU(local_array, avg_inst_pol_cal_header),
394
+ header=avg_inst_pol_cal_header,
395
+ data=local_array,
395
396
  auto_squeeze=False,
396
397
  )
397
398
 
398
399
  global_result = VispL0FitsAccess(
399
- fits.ImageHDU(global_binned_array, avg_inst_pol_cal_header),
400
+ header=avg_inst_pol_cal_header,
401
+ data=global_binned_array,
400
402
  auto_squeeze=False,
401
403
  )
402
404
 
@@ -445,8 +445,7 @@ class ScienceCalibration(
445
445
  logger.info(f"Trimming non-overlapping beam edges by ({x_slice}, {y_slice})")
446
446
  cut_array = avg_array[x_slice, y_slice]
447
447
 
448
- hdu = fits.ImageHDU(data=cut_array, header=headers[0])
449
- obj = VispL0FitsAccess(hdu=hdu, auto_squeeze=False)
448
+ obj = VispL0FitsAccess(header=headers[0], data=cut_array, auto_squeeze=False)
450
449
 
451
450
  return obj
452
451
 
@@ -773,7 +772,7 @@ class ScienceCalibration(
773
772
  headers = [headers]
774
773
 
775
774
  sorted_obj_list = sorted(
776
- [VispL0FitsAccess.from_header(h) for h in headers], key=lambda x: Time(x.time_obs)
775
+ [VispL0FitsAccess(header=h) for h in headers], key=lambda x: Time(x.time_obs)
777
776
  )
778
777
  date_beg = sorted_obj_list[0].time_obs
779
778
  exp_time = TimeDelta(sorted_obj_list[-1].fpa_exposure_time_ms / 1000.0, format="sec")
@@ -964,10 +963,17 @@ class ScienceCalibration(
964
963
  None
965
964
 
966
965
  """
966
+ # Run the header through an `ImageHDU` to strip out any `PrimaryHDU`-only keys. This is to get around an
967
+ # `astropy` bug (since 7.0) that produces bad headers if a `CompImageHDU` is populated with a header
968
+ # from a `PrimaryHDU`.
969
+ cleaned_header = fits.ImageHDU(header=header).header
970
+
971
+ hdul = fits.HDUList(
972
+ [fits.PrimaryHDU(), fits.CompImageHDU(header=cleaned_header, data=data)]
973
+ )
967
974
  tags = self.build_calibrated_frame_tags(
968
975
  stokes=stokes, raster_step=raster_step, map_scan=map_scan
969
976
  )
970
- hdul = fits.HDUList([fits.PrimaryHDU(), fits.CompImageHDU(header=header, data=data)])
971
977
  self.write(data=hdul, tags=tags, encoder=fits_hdulist_encoder)
972
978
 
973
979
  filename = next(self.read(tags=tags))
@@ -207,15 +207,17 @@ def cs_with_correct_geometry():
207
207
  )[0].header
208
208
  for d in ds
209
209
  ]
210
- hdu_list = []
210
+ fits_obj_list = []
211
211
  for m in range(ds.num_mod):
212
- hdu_list.append(
213
- fits.PrimaryHDU(
214
- data=np.ones(data_shape) * 1e3, header=fits.Header(header_list.pop(0))
212
+ fits_obj_list.append(
213
+ VispL0FitsAccess(
214
+ header=fits.Header(header_list.pop(0)),
215
+ data=np.ones(data_shape) * 1e3,
216
+ auto_squeeze=False,
215
217
  )
216
218
  )
217
219
 
218
- out_dict[n] = [VispL0FitsAccess(h, auto_squeeze=False) for h in hdu_list]
220
+ out_dict[n] = fits_obj_list
219
221
  start_time = ds.start_time + datetime.timedelta(seconds=60)
220
222
 
221
223
  return out_dict, data_shape
@@ -309,10 +311,10 @@ def write_background_input_files_to_task(background_full_beam_shape, fully_reali
309
311
  num_mod = len(fully_realistic_cs[0])
310
312
  for n in range(num_steps):
311
313
  for m in range(num_mod):
312
- hdu = fully_realistic_cs[n][m]._hdu
313
- translated_header = translate_spec122_to_spec214_l0(hdu.header)
314
+ fits_obj = fully_realistic_cs[n][m]
315
+ translated_header = translate_spec122_to_spec214_l0(fits_obj.header)
314
316
  task.write(
315
- data=hdu.data,
317
+ data=fits_obj.data,
316
318
  header=fits.Header(translated_header),
317
319
  tags=[
318
320
  VispTag.input(),
@@ -1,4 +1,5 @@
1
1
  import pytest
2
+ from astropy.io import fits
2
3
  from dkist_header_validator.translator import translate_spec122_to_spec214_l0
3
4
 
4
5
  from dkist_processing_visp.models.fits_access import VispMetadataKey
@@ -17,7 +18,7 @@ def complete_header():
17
18
  num_modstates=1,
18
19
  )
19
20
  header = translate_spec122_to_spec214_l0(dataset.header())
20
- return header
21
+ return fits.Header(header)
21
22
 
22
23
 
23
24
  def test_metadata_keys_in_access_bases(complete_header):
@@ -31,10 +32,10 @@ def test_metadata_keys_in_access_bases(complete_header):
31
32
  # When
32
33
  all_visp_fits_access_attrs = set()
33
34
  for access_class in [VispL0FitsAccess, VispL1FitsAccess]:
34
- fits_obj = access_class.from_header(complete_header)
35
+ fits_obj = access_class(header=complete_header)
35
36
  visp_instance_attrs = set(vars(fits_obj).keys())
36
37
  parent_class = access_class.mro()[1]
37
- parent_fits_obj = parent_class.from_header(complete_header)
38
+ parent_fits_obj = parent_class(header=complete_header)
38
39
  parent_instance_attrs = set(vars(parent_fits_obj).keys())
39
40
  visp_fits_access_attrs = visp_instance_attrs - parent_instance_attrs
40
41
  for attr in visp_fits_access_attrs:
@@ -8,6 +8,7 @@ from astropy.io import fits
8
8
  from astropy.time import Time
9
9
  from dkist_header_validator.translator import translate_spec122_to_spec214_l0
10
10
  from dkist_processing_common._util.scratch import WorkflowFileSystem
11
+ from dkist_processing_common.codecs.fits import fits_access_decoder
11
12
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
12
13
  from dkist_processing_common.parsers.single_value_single_key_flower import (
13
14
  SingleValueSingleKeyFlower,
@@ -50,7 +51,7 @@ def organized_fits_access_dict(complete_map_headers):
50
51
  all_dict = defaultdict(lambda: defaultdict(list))
51
52
 
52
53
  for header in complete_map_headers[0]:
53
- fits_obj = VispL0FitsAccess.from_header(header)
54
+ fits_obj = VispL0FitsAccess(header=fits.Header(header))
54
55
  all_dict[fits_obj.raster_scan_step][fits_obj.modulator_state].append(fits_obj)
55
56
 
56
57
  return all_dict
@@ -179,7 +180,10 @@ def test_parse_map_repeats(map_only_parse_task, complete_map_headers):
179
180
  ][0]
180
181
  for f in files
181
182
  ]
182
- time_list = [Time(VispL0FitsAccess.from_path(f).time_obs) for f in files]
183
+ time_list = [
184
+ Time(fits_access_decoder(f, fits_access_class=VispL0FitsAccess).time_obs)
185
+ for f in files
186
+ ]
183
187
  map_idx = np.argsort(map_scan_tags)
184
188
  time_idx = np.argsort(time_list)
185
189
  assert np.array_equal(time_idx, map_idx)
@@ -187,7 +187,7 @@ def dummy_calibration_collection():
187
187
  return collection, input_shape, intermediate_shape
188
188
 
189
189
 
190
- @pytest.fixture(scope="session")
190
+ @pytest.fixture
191
191
  def headers_with_dates() -> tuple[list[fits.Header], str, int, int]:
192
192
  num_headers = 5
193
193
  start_time = "1969-12-06T18:00:00"
@@ -232,7 +232,7 @@ def calibration_collection_with_geo_shifts(shifts) -> CalibrationCollection:
232
232
  )
233
233
 
234
234
 
235
- @pytest.fixture(scope="session")
235
+ @pytest.fixture
236
236
  def calibrated_array_and_header_dicts(
237
237
  headers_with_dates,
238
238
  ) -> tuple[dict[str, np.ndarray], dict[str, fits.Header]]:
@@ -383,6 +383,7 @@ def test_science_calibration_task(
383
383
  assert type(hdul[0]) is fits.PrimaryHDU
384
384
  assert type(hdul[1]) is fits.CompImageHDU
385
385
  assert hdul[1].data.shape == expected_final_shape
386
+ assert "SIMPLE" not in header
386
387
  assert "DATE-BEG" in header.keys()
387
388
  assert "DATE-END" in header.keys()
388
389
  if polarization_mode == "observe_polarimetric":
@@ -488,11 +489,14 @@ def test_compute_date_keys(headers_with_dates, recipe_run_id, init_visp_constant
488
489
  headers, start_time, exp_time, time_delta = headers_with_dates
489
490
  constants_db = VispConstantsDb()
490
491
  init_visp_constants_db(recipe_run_id, constants_db)
492
+
493
+ # Copy because we're going to call the method twice and headers are updated in-place
494
+ first_header = headers[0].copy()
491
495
  with ScienceCalibration(
492
496
  recipe_run_id=recipe_run_id, workflow_name="science_calibration", workflow_version="VX.Y"
493
497
  ) as task:
494
498
  final_header = task.compute_date_keys(headers)
495
- final_header_from_single = task.compute_date_keys(headers[0])
499
+ final_header_from_single = task.compute_date_keys(first_header)
496
500
 
497
501
  date_end = (
498
502
  Time(start_time)
@@ -504,12 +508,12 @@ def test_compute_date_keys(headers_with_dates, recipe_run_id, init_visp_constant
504
508
  assert final_header["DATE-END"] == date_end
505
509
 
506
510
  date_end_from_single = (
507
- Time(headers[0]["DATE-BEG"])
511
+ Time(first_header["DATE-BEG"])
508
512
  # + TimeDelta(time_delta, format="sec")
509
513
  + TimeDelta(exp_time / 1000.0, format="sec")
510
514
  ).isot
511
515
 
512
- assert final_header_from_single["DATE-BEG"] == headers[0]["DATE-BEG"]
516
+ assert final_header_from_single["DATE-BEG"] == first_header["DATE-BEG"]
513
517
  assert final_header_from_single["DATE-END"] == date_end_from_single
514
518
 
515
519
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.6.8rc2
3
+ Version: 5.7.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,7 +13,7 @@ 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==13.0.6rc2
16
+ Requires-Dist: dkist-processing-common==14.0.0
17
17
  Requires-Dist: dkist-processing-math==2.2.2
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.3.1
@@ -131,11 +131,11 @@ Requires-Dist: cycler==0.12.1; extra == "frozen"
131
131
  Requires-Dist: decorator==5.2.1; extra == "frozen"
132
132
  Requires-Dist: dill==0.4.1; extra == "frozen"
133
133
  Requires-Dist: dkist-header-validator==5.3.1; extra == "frozen"
134
- Requires-Dist: dkist-processing-common==13.0.6rc2; extra == "frozen"
134
+ Requires-Dist: dkist-processing-common==14.0.0; extra == "frozen"
135
135
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
136
136
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
137
137
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
138
- Requires-Dist: dkist-processing-visp==5.6.8rc2; extra == "frozen"
138
+ Requires-Dist: dkist-processing-visp==5.7.0; extra == "frozen"
139
139
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
140
140
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
141
141
  Requires-Dist: dkist_fits_specifications==4.24.1; extra == "frozen"
@@ -159,7 +159,7 @@ Requires-Dist: httpcore==1.0.9; extra == "frozen"
159
159
  Requires-Dist: httptools==0.7.1; extra == "frozen"
160
160
  Requires-Dist: httpx==0.28.1; extra == "frozen"
161
161
  Requires-Dist: humanize==4.15.0; extra == "frozen"
162
- Requires-Dist: idna==3.11; extra == "frozen"
162
+ Requires-Dist: idna==3.12; extra == "frozen"
163
163
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
164
164
  Requires-Dist: importlib_metadata==8.7.1; extra == "frozen"
165
165
  Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
@@ -232,7 +232,7 @@ Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
232
232
  Requires-Dist: propcache==0.4.1; extra == "frozen"
233
233
  Requires-Dist: protobuf==6.33.6; extra == "frozen"
234
234
  Requires-Dist: psutil==7.2.2; extra == "frozen"
235
- Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
235
+ Requires-Dist: psycopg2-binary==2.9.12; extra == "frozen"
236
236
  Requires-Dist: pycparser==3.0; extra == "frozen"
237
237
  Requires-Dist: pydantic==2.13.3; extra == "frozen"
238
238
  Requires-Dist: pydantic-settings==2.14.0; extra == "frozen"
@@ -289,7 +289,7 @@ Requires-Dist: uncertainties==3.2.3; extra == "frozen"
289
289
  Requires-Dist: universal_pathlib==0.2.6; extra == "frozen"
290
290
  Requires-Dist: urllib3==2.6.3; extra == "frozen"
291
291
  Requires-Dist: uuid6==2025.0.1; extra == "frozen"
292
- Requires-Dist: uvicorn==0.44.0; extra == "frozen"
292
+ Requires-Dist: uvicorn==0.45.0; extra == "frozen"
293
293
  Requires-Dist: uvloop==0.22.1; extra == "frozen"
294
294
  Requires-Dist: vine==5.1.0; extra == "frozen"
295
295
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
@@ -10,7 +10,6 @@ pyproject.toml
10
10
  science_towncrier.sh
11
11
  towncrier_science.toml
12
12
  changelog/.gitempty
13
- changelog/303.misc.rst
14
13
  dkist_processing_visp/__init__.py
15
14
  dkist_processing_visp/config.py
16
15
  dkist_processing_visp.egg-info/PKG-INFO
@@ -1,4 +1,4 @@
1
- dkist-processing-common==13.0.6rc2
1
+ dkist-processing-common==14.0.0
2
2
  dkist-processing-math==2.2.2
3
3
  dkist-processing-pac==3.1.1
4
4
  dkist-header-validator==5.3.1
@@ -97,11 +97,11 @@ cycler==0.12.1
97
97
  decorator==5.2.1
98
98
  dill==0.4.1
99
99
  dkist-header-validator==5.3.1
100
- dkist-processing-common==13.0.6rc2
100
+ dkist-processing-common==14.0.0
101
101
  dkist-processing-core==7.2.1
102
102
  dkist-processing-math==2.2.2
103
103
  dkist-processing-pac==3.1.1
104
- dkist-processing-visp==5.6.8rc2
104
+ dkist-processing-visp==5.7.0
105
105
  dkist-service-configuration==4.3.0
106
106
  dkist-spectral-lines==3.0.1
107
107
  dkist_fits_specifications==4.24.1
@@ -125,7 +125,7 @@ httpcore==1.0.9
125
125
  httptools==0.7.1
126
126
  httpx==0.28.1
127
127
  humanize==4.15.0
128
- idna==3.11
128
+ idna==3.12
129
129
  imageio-ffmpeg==0.6.0
130
130
  importlib_metadata==8.7.1
131
131
  itsdangerous==2.2.0
@@ -198,7 +198,7 @@ prompt_toolkit==3.0.52
198
198
  propcache==0.4.1
199
199
  protobuf==6.33.6
200
200
  psutil==7.2.2
201
- psycopg2-binary==2.9.11
201
+ psycopg2-binary==2.9.12
202
202
  pycparser==3.0
203
203
  pydantic==2.13.3
204
204
  pydantic-settings==2.14.0
@@ -255,7 +255,7 @@ uncertainties==3.2.3
255
255
  universal_pathlib==0.2.6
256
256
  urllib3==2.6.3
257
257
  uuid6==2025.0.1
258
- uvicorn==0.44.0
258
+ uvicorn==0.45.0
259
259
  uvloop==0.22.1
260
260
  vine==5.1.0
261
261
  voluptuous==0.16.0
@@ -9,8 +9,8 @@ exclude = ["build*"]
9
9
 
10
10
  [tool.dkist-dev-tools]
11
11
  # Most recently frozen version by dkist-dev-tools
12
- version = "5.6.8rc2"
13
- date = 2026-04-20T15:59:04.076029
12
+ version = "5.7.0"
13
+ date = 2026-04-21T14:50:59.772614
14
14
 
15
15
  [project]
16
16
  dynamic = ["version"]
@@ -26,7 +26,7 @@ classifiers = [
26
26
  "Programming Language :: Python :: 3.13",
27
27
  ]
28
28
  dependencies = [
29
- "dkist-processing-common == 13.0.6rc2",
29
+ "dkist-processing-common == 14.0.0",
30
30
  "dkist-processing-math == 2.2.2",
31
31
  "dkist-processing-pac == 3.1.1",
32
32
  "dkist-header-validator == 5.3.1",
@@ -159,11 +159,11 @@ frozen = [
159
159
  "decorator == 5.2.1",
160
160
  "dill == 0.4.1",
161
161
  "dkist-header-validator == 5.3.1",
162
- "dkist-processing-common == 13.0.6rc2",
162
+ "dkist-processing-common == 14.0.0",
163
163
  "dkist-processing-core == 7.2.1",
164
164
  "dkist-processing-math == 2.2.2",
165
165
  "dkist-processing-pac == 3.1.1",
166
- "dkist-processing-visp == 5.6.8rc2",
166
+ "dkist-processing-visp == 5.7.0",
167
167
  "dkist-service-configuration == 4.3.0",
168
168
  "dkist-spectral-lines == 3.0.1",
169
169
  "dkist_fits_specifications == 4.24.1",
@@ -187,7 +187,7 @@ frozen = [
187
187
  "httptools == 0.7.1",
188
188
  "httpx == 0.28.1",
189
189
  "humanize == 4.15.0",
190
- "idna == 3.11",
190
+ "idna == 3.12",
191
191
  "imageio-ffmpeg == 0.6.0",
192
192
  "importlib_metadata == 8.7.1",
193
193
  "itsdangerous == 2.2.0",
@@ -260,7 +260,7 @@ frozen = [
260
260
  "propcache == 0.4.1",
261
261
  "protobuf == 6.33.6",
262
262
  "psutil == 7.2.2",
263
- "psycopg2-binary == 2.9.11",
263
+ "psycopg2-binary == 2.9.12",
264
264
  "pycparser == 3.0",
265
265
  "pydantic == 2.13.3",
266
266
  "pydantic-settings == 2.14.0",
@@ -317,7 +317,7 @@ frozen = [
317
317
  "universal_pathlib == 0.2.6",
318
318
  "urllib3 == 2.6.3",
319
319
  "uuid6 == 2025.0.1",
320
- "uvicorn == 0.44.0",
320
+ "uvicorn == 0.45.0",
321
321
  "uvloop == 0.22.1",
322
322
  "vine == 5.1.0",
323
323
  "voluptuous == 0.16.0",
@@ -1,2 +0,0 @@
1
- Update dkist-processing-common to v13.0.6, which uses gqlclient v2.0 and provides a
2
- better error for reading/writing with tags=None.