dkist-processing-dlnirsp 0.32.2__tar.gz → 0.32.3__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 (117) hide show
  1. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/CHANGELOG.rst +9 -0
  2. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/PKG-INFO +5 -5
  3. dkist_processing_dlnirsp-0.32.3/dkist_processing_dlnirsp/models/fits_access.py +32 -0
  4. dkist_processing_dlnirsp-0.32.3/dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py +99 -0
  5. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/parsers/task.py +2 -6
  6. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/parsers/time.py +2 -1
  7. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/parsers/wavelength.py +5 -1
  8. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/parse.py +21 -12
  9. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/science.py +7 -5
  10. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/write_l1.py +5 -4
  11. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py +18 -16
  12. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_helpers.py +2 -1
  13. dkist_processing_dlnirsp-0.32.3/dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py +129 -0
  14. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_linearity_correction.py +3 -2
  15. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_parse.py +2 -1
  16. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_science.py +7 -6
  17. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp.egg-info/PKG-INFO +5 -5
  18. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp.egg-info/SOURCES.txt +1 -0
  19. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp.egg-info/requires.txt +4 -4
  20. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/pyproject.toml +6 -6
  21. dkist_processing_dlnirsp-0.32.2/dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py +0 -87
  22. dkist_processing_dlnirsp-0.32.2/dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py +0 -76
  23. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/.gitignore +0 -0
  24. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/.pre-commit-config.yaml +0 -0
  25. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/.readthedocs.yml +0 -0
  26. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/.snyk +0 -0
  27. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/README.rst +0 -0
  28. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/SCIENCE_CHANGELOG.rst +0 -0
  29. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/bitbucket-pipelines.yml +0 -0
  30. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/changelog/.gitempty +0 -0
  31. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/__init__.py +0 -0
  32. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/config.py +0 -0
  33. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/dev_scripts/__init__.py +0 -0
  34. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/dev_scripts/test_slitbeam_group_assignment.py +0 -0
  35. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/models/__init__.py +0 -0
  36. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/models/constants.py +0 -0
  37. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/models/parameters.py +0 -0
  38. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/models/tags.py +0 -0
  39. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/models/task_name.py +0 -0
  40. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/parsers/__init__.py +0 -0
  41. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/parsers/dlnirsp_l1_fits_acess.py +0 -0
  42. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/parsers/mosaic.py +0 -0
  43. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/parsers/wcs_corrections.py +0 -0
  44. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/__init__.py +0 -0
  45. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/assemble_movie.py +0 -0
  46. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/bad_pixel_map.py +0 -0
  47. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/dark.py +0 -0
  48. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/dlnirsp_base.py +0 -0
  49. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/geometric.py +0 -0
  50. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/ifu_drift.py +0 -0
  51. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/instrument_polarization.py +0 -0
  52. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/l1_output_data.py +0 -0
  53. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/lamp.py +0 -0
  54. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/linearity_correction.py +0 -0
  55. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/make_movie_frames.py +0 -0
  56. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/mixin/__init__.py +0 -0
  57. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/mixin/corrections.py +0 -0
  58. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/mixin/group_id.py +0 -0
  59. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/quality_metrics.py +0 -0
  60. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/solar.py +0 -0
  61. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tasks/wavelength_calibration.py +0 -0
  62. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/__init__.py +0 -0
  63. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/conftest.py +0 -0
  64. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/__init__.py +0 -0
  65. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_linearize_only.py +0 -0
  66. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  67. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  68. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  69. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/translate_files.py +0 -0
  70. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_assemble_movie.py +0 -0
  71. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_assemble_quality.py +0 -0
  72. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_bad_pixel_map.py +0 -0
  73. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_corrections.py +0 -0
  74. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_dark.py +0 -0
  75. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_dlnirsp_base.py +0 -0
  76. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py +0 -0
  77. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_geometric.py +0 -0
  78. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_group_id.py +0 -0
  79. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_ifu_drift.py +0 -0
  80. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_instrument_polarization_calibration.py +0 -0
  81. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_lamp.py +0 -0
  82. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_make_movie_frames.py +0 -0
  83. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_parameters.py +0 -0
  84. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_quality.py +0 -0
  85. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_solar.py +0 -0
  86. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_trial_create_quality_report.py +0 -0
  87. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_wavelength_calibration.py +0 -0
  88. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_workflows.py +0 -0
  89. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/tests/test_write_l1.py +0 -0
  90. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/workflows/__init__.py +0 -0
  91. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/workflows/l0_processing.py +0 -0
  92. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp/workflows/trial_workflow.py +0 -0
  93. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp.egg-info/dependency_links.txt +0 -0
  94. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp.egg-info/entry_points.txt +0 -0
  95. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/dkist_processing_dlnirsp.egg-info/top_level.txt +0 -0
  96. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/Makefile +0 -0
  97. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/bad_pixel_calibration.rst +0 -0
  98. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/changelog.rst +0 -0
  99. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/conf.py +0 -0
  100. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/gain.rst +0 -0
  101. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/geometric.rst +0 -0
  102. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/ifu_drift.rst +0 -0
  103. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/index.rst +0 -0
  104. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/l0_to_l1_dlnirsp.rst +0 -0
  105. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/l0_to_l1_dlnirsp_full-trial.rst +0 -0
  106. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/landing_page.rst +0 -0
  107. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/linearization.rst +0 -0
  108. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/make.bat +0 -0
  109. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/polarization_calibration.rst +0 -0
  110. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/requirements_table.rst +0 -0
  111. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/science_calibration.rst +0 -0
  112. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/scientific_changelog.rst +0 -0
  113. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/docs/wavelength_calibration.rst +0 -0
  114. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/licenses/LICENSE.rst +0 -0
  115. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/science_towncrier.sh +0 -0
  116. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/setup.cfg +0 -0
  117. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.3}/towncrier_science.toml +0 -0
@@ -1,3 +1,12 @@
1
+ v0.32.3 (2025-11-04)
2
+ ====================
3
+
4
+ Misc
5
+ ----
6
+
7
+ - Replace metadata key strings with members of the string enum DlnirspMetadataKey. (`#111 <https://bitbucket.org/dkistdc/dkist-processing-dlnirsp/pull-requests/111>`__)
8
+
9
+
1
10
  v0.32.2 (2025-11-03)
2
11
  ====================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 0.32.2
3
+ Version: 0.32.3
4
4
  Summary: Science processing code for the DLNIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -76,6 +76,7 @@ Requires-Dist: Flask-Login==0.6.3; extra == "frozen"
76
76
  Requires-Dist: Flask-SQLAlchemy==2.5.1; extra == "frozen"
77
77
  Requires-Dist: Flask-Session==0.5.0; extra == "frozen"
78
78
  Requires-Dist: Flask-WTF==1.2.2; extra == "frozen"
79
+ Requires-Dist: ImageIO==2.37.2; extra == "frozen"
79
80
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
80
81
  Requires-Dist: Mako==1.3.10; extra == "frozen"
81
82
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
@@ -123,8 +124,8 @@ Requires-Dist: attrs==25.4.0; extra == "frozen"
123
124
  Requires-Dist: babel==2.17.0; extra == "frozen"
124
125
  Requires-Dist: billiard==4.2.2; extra == "frozen"
125
126
  Requires-Dist: blinker==1.9.0; extra == "frozen"
126
- Requires-Dist: boto3==1.40.64; extra == "frozen"
127
- Requires-Dist: botocore==1.40.64; extra == "frozen"
127
+ Requires-Dist: boto3==1.40.65; extra == "frozen"
128
+ Requires-Dist: botocore==1.40.65; extra == "frozen"
128
129
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
129
130
  Requires-Dist: celery==5.3.1; extra == "frozen"
130
131
  Requires-Dist: certifi==2025.10.5; extra == "frozen"
@@ -149,7 +150,7 @@ Requires-Dist: dill==0.4.0; extra == "frozen"
149
150
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
150
151
  Requires-Dist: dkist-processing-common==11.8.0; extra == "frozen"
151
152
  Requires-Dist: dkist-processing-core==6.0.0; extra == "frozen"
152
- Requires-Dist: dkist-processing-dlnirsp==0.32.2; extra == "frozen"
153
+ Requires-Dist: dkist-processing-dlnirsp==0.32.3; extra == "frozen"
153
154
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
154
155
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
155
156
  Requires-Dist: dkist-service-configuration==4.1.7; extra == "frozen"
@@ -174,7 +175,6 @@ Requires-Dist: httpcore==1.0.9; extra == "frozen"
174
175
  Requires-Dist: httpx==0.28.1; extra == "frozen"
175
176
  Requires-Dist: humanize==4.14.0; extra == "frozen"
176
177
  Requires-Dist: idna==3.11; extra == "frozen"
177
- Requires-Dist: imageio==2.37.0; extra == "frozen"
178
178
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
179
179
  Requires-Dist: importlib_metadata==8.7.0; extra == "frozen"
180
180
  Requires-Dist: inflection==0.5.1; extra == "frozen"
@@ -0,0 +1,32 @@
1
+ """DLNIRSP control of FITS key names and values."""
2
+
3
+ from enum import StrEnum
4
+
5
+ from dkist_processing_common.models.fits_access import MetadataKey
6
+
7
+
8
+ class DlnirspMetadataKey(StrEnum):
9
+ """Controlled list of names for FITS metadata header keys."""
10
+
11
+ crpix_1 = "CRPIX1"
12
+ crpix_2 = "CRPIX2"
13
+ modulator_spin_mode = "DLMOD"
14
+ camera_readout_mode = "DLCAMSMD"
15
+ num_frames_in_ramp = "DLCAMNS"
16
+ current_frame_in_ramp = "DLCAMCUR"
17
+ arm_id = "DLARMID"
18
+ camera_sample_sequence = "DLCAMSSQ"
19
+ polarimeter_mode = "DLPOLMD"
20
+ number_of_modulator_states = "DLNUMST"
21
+ modulator_state = "DLSTNUM"
22
+ num_mosaic_repeats = "DLMOSNRP"
23
+ mosaic_num = "DLCURMOS"
24
+ num_X_tiles = "DLNSSTPX"
25
+ X_tile_num = "DLCSTPX"
26
+ num_Y_tiles = "DLNSSTPY"
27
+ Y_tile_num = "DLCSTPY"
28
+ num_dither_steps = "DLDMODE"
29
+ dither_step = "DLCURSTP"
30
+ arm_position_mm = "DLARMPS"
31
+ grating_position_deg = "DLGRTAN"
32
+ grating_constant_inverse_mm = "DLGRTCN"
@@ -0,0 +1,99 @@
1
+ """DLNIRSP FitsAccess classes for raw and linearized data."""
2
+
3
+ from astropy.io import fits
4
+ from dkist_processing_common.parsers.l0_fits_access import L0FitsAccess
5
+
6
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
7
+
8
+
9
+ class DlnirspRampFitsAccess(L0FitsAccess):
10
+ """
11
+ Class to provide easy access to L0 headers for non-linearized (raw) DLNIRSP data.
12
+
13
+ i.e. instead of <DlnirspL0FitsAccess>.header['weird_key'] this class lets us use <DlnirspL0FitsAccess>.nice_key instead
14
+
15
+ Parameters
16
+ ----------
17
+ hdu :
18
+ Fits L0 header object
19
+
20
+ name : str
21
+ The name of the file that was loaded into this FitsAccess object
22
+
23
+ auto_squeeze : bool
24
+ When set to True, dimensions of length 1 will be removed from the array
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ hdu: fits.ImageHDU | fits.PrimaryHDU | fits.CompImageHDU,
30
+ name: str | None = None,
31
+ auto_squeeze: bool = True,
32
+ ):
33
+ super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
34
+
35
+ self.modulator_spin_mode: str = self.header[DlnirspMetadataKey.modulator_spin_mode]
36
+ self.camera_readout_mode: str = self.header.get(
37
+ DlnirspMetadataKey.camera_readout_mode, "DEFAULT_VISIBLE_CAMERA"
38
+ )
39
+ self.num_frames_in_ramp: int = self.header.get(DlnirspMetadataKey.num_frames_in_ramp, -99)
40
+ self.current_frame_in_ramp: int = self.header.get(
41
+ DlnirspMetadataKey.current_frame_in_ramp, -88
42
+ )
43
+ self.arm_id: str = self.header[DlnirspMetadataKey.arm_id]
44
+ self.camera_sample_sequence: str = self.header.get(
45
+ DlnirspMetadataKey.camera_sample_sequence, "VISIBLE_CAMERA_SEQUENCE"
46
+ )
47
+
48
+
49
+ class DlnirspL0FitsAccess(L0FitsAccess):
50
+ """
51
+ Class to provide easy access to L0 headers for linearized (ready for processing) DLNIRSP data.
52
+
53
+ i.e. instead of <DlnirspL0FitsAccess>.header['weird_key'] this class lets us use <DlnirspL0FitsAccess>.nice_key instead
54
+
55
+ Parameters
56
+ ----------
57
+ hdu :
58
+ Fits L0 header object
59
+
60
+ name : str
61
+ The name of the file that was loaded into this FitsAccess object
62
+
63
+ auto_squeeze : bool
64
+ When set to True, dimensions of length 1 will be removed from the array
65
+ """
66
+
67
+ def __init__(
68
+ self,
69
+ hdu: fits.ImageHDU | fits.PrimaryHDU | fits.CompImageHDU,
70
+ name: str | None = None,
71
+ auto_squeeze: bool = True,
72
+ ):
73
+ super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
74
+
75
+ self.crpix_1: float = self.header[DlnirspMetadataKey.crpix_1]
76
+ self.crpix_2: float = self.header[DlnirspMetadataKey.crpix_2]
77
+ self.arm_id: str = self.header[DlnirspMetadataKey.arm_id]
78
+ self.polarimeter_mode: str = self.header[DlnirspMetadataKey.polarimeter_mode]
79
+ self.number_of_modulator_states: int = self.header[
80
+ DlnirspMetadataKey.number_of_modulator_states
81
+ ]
82
+ self.modulator_state: int = self.header[DlnirspMetadataKey.modulator_state]
83
+ self.num_mosaic_repeats: int = self.header[DlnirspMetadataKey.num_mosaic_repeats]
84
+ self.mosaic_num: int = self.header[DlnirspMetadataKey.mosaic_num]
85
+ self.num_X_tiles: int = self.header[DlnirspMetadataKey.num_X_tiles]
86
+ self.X_tile_num: int = self.header[DlnirspMetadataKey.X_tile_num]
87
+ self.num_Y_tiles: int = self.header[DlnirspMetadataKey.num_Y_tiles]
88
+ self.Y_tile_num: int = self.header[DlnirspMetadataKey.Y_tile_num]
89
+ # DLDMODE is a bool in the header; the number of dither steps is either 1 or 2, corresponding to dither
90
+ # mode being True or False, respectively
91
+ self.num_dither_steps: int = int(self.header[DlnirspMetadataKey.num_dither_steps]) + 1
92
+ # Same with DLCURSTP. We'll index the dither loop at 0 so `False` is the first step and `True` is the second
93
+ # Use `get` because this key only exists if DLDMODE is `True`
94
+ self.dither_step: int = int(self.header.get(DlnirspMetadataKey.dither_step, False))
95
+ self.arm_position_mm: float = self.header[DlnirspMetadataKey.arm_position_mm]
96
+ self.grating_position_deg: float = self.header[DlnirspMetadataKey.grating_position_deg]
97
+ self.grating_constant_inverse_mm: float = self.header[
98
+ DlnirspMetadataKey.grating_constant_inverse_mm
99
+ ]
@@ -1,15 +1,11 @@
1
1
  """Custom parsers to identify task sub-groupings not captured by a single header key."""
2
2
 
3
- from typing import Callable
4
-
5
- from dkist_processing_common.models.flower_pot import SpilledDirt
3
+ from dkist_processing_common.models.fits_access import MetadataKey
6
4
  from dkist_processing_common.models.tags import StemName
7
5
  from dkist_processing_common.models.task_name import TaskName
8
- from dkist_processing_common.parsers.near_bud import NearFloatBud
9
6
  from dkist_processing_common.parsers.single_value_single_key_flower import (
10
7
  SingleValueSingleKeyFlower,
11
8
  )
12
- from dkist_processing_common.parsers.unique_bud import UniqueBud
13
9
 
14
10
  from dkist_processing_dlnirsp.parsers.dlnirsp_l0_fits_access import DlnirspL0FitsAccess
15
11
 
@@ -41,7 +37,7 @@ class DlnirspTaskTypeFlower(SingleValueSingleKeyFlower):
41
37
  """Flower to find the DLNIRSP task type."""
42
38
 
43
39
  def __init__(self):
44
- super().__init__(tag_stem_name=StemName.task.value, metadata_key="ip_task_type")
40
+ super().__init__(tag_stem_name=StemName.task.value, metadata_key=MetadataKey.ip_task_type)
45
41
 
46
42
  def setter(self, fits_obj: DlnirspL0FitsAccess):
47
43
  """
@@ -2,6 +2,7 @@
2
2
 
3
3
  from typing import Hashable
4
4
 
5
+ from dkist_processing_common.models.fits_access import MetadataKey
5
6
  from dkist_processing_common.models.flower_pot import Stem
6
7
  from dkist_processing_common.models.task_name import TaskName
7
8
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
@@ -17,7 +18,7 @@ class DLnirspSolarGainIpStartTimeBud(TaskUniqueBud):
17
18
  def __init__(self):
18
19
  super().__init__(
19
20
  constant_name=DlnirspBudName.solar_gain_ip_start_time.value,
20
- metadata_key="ip_start_time",
21
+ metadata_key=MetadataKey.ip_start_time,
21
22
  ip_task_types=TaskName.solar_gain.value,
22
23
  task_type_parsing_function=parse_header_ip_task,
23
24
  )
@@ -1,5 +1,6 @@
1
1
  """Bud to get the wavelength."""
2
2
 
3
+ from dkist_processing_common.models.fits_access import MetadataKey
3
4
  from dkist_processing_common.models.flower_pot import SpilledDirt
4
5
  from dkist_processing_common.parsers.unique_bud import UniqueBud
5
6
 
@@ -11,7 +12,10 @@ class ObserveWavelengthBud(UniqueBud):
11
12
  """Bud to find the wavelength."""
12
13
 
13
14
  def __init__(self):
14
- super().__init__(constant_name=DlnirspBudName.wavelength.value, metadata_key="wavelength")
15
+ super().__init__(
16
+ constant_name=DlnirspBudName.wavelength.value,
17
+ metadata_key=MetadataKey.wavelength,
18
+ )
15
19
 
16
20
  def setter(self, fits_obj: DlnirspL0FitsAccess):
17
21
  """
@@ -2,6 +2,7 @@
2
2
 
3
3
  from typing import TypeVar
4
4
 
5
+ from dkist_processing_common.models.fits_access import MetadataKey
5
6
  from dkist_processing_common.models.flower_pot import Stem
6
7
  from dkist_processing_common.models.task_name import TaskName
7
8
  from dkist_processing_common.parsers.cs_step import CSStepFlower
@@ -22,6 +23,7 @@ from dkist_processing_common.tasks import default_constant_bud_factory
22
23
  from dkist_processing_common.tasks import default_tag_flower_factory
23
24
 
24
25
  from dkist_processing_dlnirsp.models.constants import DlnirspBudName
26
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
25
27
  from dkist_processing_dlnirsp.models.parameters import DlnirspParsingParameters
26
28
  from dkist_processing_dlnirsp.models.tags import DlnirspStemName
27
29
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
@@ -72,7 +74,9 @@ class ParseL0DlnirspRampData(ParseDataBase):
72
74
  # Time Obs is the unique identifier for each ramp in the data set
73
75
  DlnirspTimeObsBud(),
74
76
  # This is used to determine whether we need to do any linearity correction at all.
75
- UniqueBud(constant_name=DlnirspBudName.arm_id.value, metadata_key="arm_id"),
77
+ UniqueBud(
78
+ constant_name=DlnirspBudName.arm_id.value, metadata_key=DlnirspMetadataKey.arm_id
79
+ ),
76
80
  ]
77
81
 
78
82
  @property
@@ -81,12 +85,12 @@ class ParseL0DlnirspRampData(ParseDataBase):
81
85
  return [
82
86
  SingleValueSingleKeyFlower(
83
87
  tag_stem_name=DlnirspStemName.current_frame_in_ramp.value,
84
- metadata_key="current_frame_in_ramp",
88
+ metadata_key=DlnirspMetadataKey.current_frame_in_ramp,
85
89
  ),
86
90
  # time_obs is a unique identifier for all raw frames in a single ramp
87
91
  SingleValueSingleKeyFlower(
88
92
  tag_stem_name=DlnirspStemName.time_obs.value,
89
- metadata_key="time_obs",
93
+ metadata_key=MetadataKey.time_obs,
90
94
  ),
91
95
  ]
92
96
 
@@ -144,12 +148,13 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
144
148
  DLnirspSolarGainIpStartTimeBud(),
145
149
  NumCSStepBud(max_cs_step_time_sec=self.parameters.max_cs_step_time_sec),
146
150
  UniqueBud(
147
- constant_name=DlnirspBudName.polarimeter_mode.value, metadata_key="polarimeter_mode"
151
+ constant_name=DlnirspBudName.polarimeter_mode.value,
152
+ metadata_key=DlnirspMetadataKey.polarimeter_mode,
148
153
  ),
149
154
  RetarderNameBud(),
150
155
  UniqueBud(
151
156
  constant_name=DlnirspBudName.num_modstates.value,
152
- metadata_key="number_of_modulator_states",
157
+ metadata_key=DlnirspMetadataKey.number_of_modulator_states,
153
158
  ),
154
159
  NumMosaicRepeatsBud(
155
160
  crpix_correction_method=self.parameters.wcs_crpix_correction_method,
@@ -189,20 +194,20 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
189
194
  ),
190
195
  TaskNearFloatBud(
191
196
  constant_name=DlnirspBudName.arm_position_mm.value,
192
- metadata_key="arm_position_mm",
197
+ metadata_key=DlnirspMetadataKey.arm_position_mm,
193
198
  ip_task_types=[TaskName.solar_gain.value, TaskName.observe.value],
194
199
  tolerance=0.01,
195
200
  task_type_parsing_function=parse_header_ip_task,
196
201
  ),
197
202
  TaskUniqueBud(
198
203
  constant_name=DlnirspBudName.grating_constant_inverse_mm.value,
199
- metadata_key="grating_constant_inverse_mm",
204
+ metadata_key=DlnirspMetadataKey.grating_constant_inverse_mm,
200
205
  ip_task_types=[TaskName.solar_gain.value, TaskName.observe.value],
201
206
  task_type_parsing_function=parse_header_ip_task,
202
207
  ),
203
208
  TaskNearFloatBud(
204
209
  constant_name=DlnirspBudName.grating_position_deg.value,
205
- metadata_key="grating_position_deg",
210
+ metadata_key=DlnirspMetadataKey.grating_position_deg,
206
211
  ip_task_types=[TaskName.solar_gain.value, TaskName.observe.value],
207
212
  tolerance=0.01,
208
213
  task_type_parsing_function=parse_header_ip_task,
@@ -216,14 +221,17 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
216
221
  DlnirspTaskTypeFlower(),
217
222
  PolcalTaskFlower(),
218
223
  SingleValueSingleKeyFlower(
219
- tag_stem_name=DlnirspStemName.arm_id.value, metadata_key="arm_id"
224
+ tag_stem_name=DlnirspStemName.arm_id.value,
225
+ metadata_key=DlnirspMetadataKey.arm_id,
220
226
  ),
221
227
  ExposureTimeFlower(),
222
228
  SingleValueSingleKeyFlower(
223
- tag_stem_name=DlnirspStemName.modstate.value, metadata_key="modulator_state"
229
+ tag_stem_name=DlnirspStemName.modstate.value,
230
+ metadata_key=DlnirspMetadataKey.modulator_state,
224
231
  ),
225
232
  SingleValueSingleKeyFlower(
226
- tag_stem_name=DlnirspStemName.mosaic_num.value, metadata_key="mosaic_num"
233
+ tag_stem_name=DlnirspStemName.mosaic_num.value,
234
+ metadata_key=DlnirspMetadataKey.mosaic_num,
227
235
  ),
228
236
  MosaicStepXFlower(
229
237
  crpix_correction_method=self.parameters.wcs_crpix_correction_method,
@@ -234,7 +242,8 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
234
242
  bin_crpix_to_multiple_of=self.parameters.parse_bin_crpix_to_multiple_of,
235
243
  ),
236
244
  SingleValueSingleKeyFlower(
237
- tag_stem_name=DlnirspStemName.dither_step.value, metadata_key="dither_step"
245
+ tag_stem_name=DlnirspStemName.dither_step.value,
246
+ metadata_key=DlnirspMetadataKey.dither_step,
238
247
  ),
239
248
  CSStepFlower(max_cs_step_time_sec=self.parameters.max_cs_step_time_sec),
240
249
  ]
@@ -18,6 +18,7 @@ from dkist_processing_common.codecs.fits import fits_access_decoder
18
18
  from dkist_processing_common.codecs.fits import fits_array_decoder
19
19
  from dkist_processing_common.codecs.fits import fits_array_encoder
20
20
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
21
+ from dkist_processing_common.models.fits_access import MetadataKey
21
22
  from dkist_processing_common.models.tags import EXP_TIME_ROUND_DIGITS
22
23
  from dkist_processing_common.models.task_name import TaskName
23
24
  from dkist_processing_common.tasks.mixin.quality import QualityMixin
@@ -29,6 +30,7 @@ from dkist_processing_pac.optics.telescope import Telescope
29
30
  from dkist_service_configuration.logging import logger
30
31
  from scipy.spatial import Delaunay
31
32
 
33
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
32
34
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
33
35
  from dkist_processing_dlnirsp.parsers.dlnirsp_l0_fits_access import DlnirspL0FitsAccess
34
36
  from dkist_processing_dlnirsp.parsers.wcs_corrections import correct_crpix_values
@@ -738,7 +740,7 @@ class ScienceCalibration(
738
740
  date_end = (Time(sorted_obj_list[-1].time_obs) + exp_time).isot
739
741
 
740
742
  header = sorted_obj_list[0].header
741
- header["DATE-BEG"] = date_beg
743
+ header[MetadataKey.time_obs] = date_beg
742
744
  header["DATE-END"] = date_end
743
745
 
744
746
  return header
@@ -773,13 +775,13 @@ class ScienceCalibration(
773
775
 
774
776
  crpix_correction_method = self.parameters.wcs_crpix_correction_method
775
777
  cached_info_logger(f"Applying CRPIX correction method '{crpix_correction_method}'")
776
- OG_crpix1 = header["CRPIX1"]
777
- OG_crpix2 = header["CRPIX2"]
778
+ OG_crpix1 = header[DlnirspMetadataKey.crpix_1]
779
+ OG_crpix2 = header[DlnirspMetadataKey.crpix_2]
778
780
 
779
781
  new_crpix1, new_crpix2 = correct_crpix_values(OG_crpix1, OG_crpix2, crpix_correction_method)
780
782
 
781
- header["CRPIX1"] = new_crpix1
782
- header["CRPIX2"] = new_crpix2
783
+ header[DlnirspMetadataKey.crpix_1] = new_crpix1
784
+ header[DlnirspMetadataKey.crpix_2] = new_crpix2
783
785
 
784
786
  return header
785
787
 
@@ -12,6 +12,7 @@ from dkist_processing_common.tasks import WriteL1Frame
12
12
  from dkist_service_configuration.logging import logger
13
13
 
14
14
  from dkist_processing_dlnirsp.models.constants import DlnirspConstants
15
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
15
16
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
16
17
 
17
18
  cached_info_logger = cache(logger.info)
@@ -83,7 +84,7 @@ class DlnirspWriteL1Frame(WriteL1Frame):
83
84
  header[f"DPNAME{axis_index}"] = "dither step"
84
85
  header[f"DWNAME{axis_index}"] = "time"
85
86
  header[f"DUNIT{axis_index}"] = "s"
86
- header[f"DINDEX{axis_index}"] = int(header["DLCURSTP"]) + 1
87
+ header[f"DINDEX{axis_index}"] = int(header[DlnirspMetadataKey.dither_step]) + 1
87
88
 
88
89
  if self.constants.correct_for_polarization:
89
90
  cached_info_logger("Polarimetric data detected")
@@ -211,7 +212,7 @@ class DlnirspWriteL1Frame(WriteL1Frame):
211
212
  tile_as_temporal_axis = False
212
213
  temporal_axis_size = num_mosaic_repeats
213
214
  pname = "mosaic repeat number"
214
- dindex = header["DLCURMOS"]
215
+ dindex = header[DlnirspMetadataKey.mosaic_num]
215
216
 
216
217
  elif num_mosaic_repeats == 1 and (
217
218
  (num_X_tiles == 1 and num_Y_tiles == 1) or (num_X_tiles > 1 and num_Y_tiles > 1)
@@ -224,14 +225,14 @@ class DlnirspWriteL1Frame(WriteL1Frame):
224
225
  tile_as_temporal_axis = True
225
226
  temporal_axis_size = num_X_tiles
226
227
  pname = "repeat number"
227
- dindex = header["DLCSTPX"]
228
+ dindex = header[DlnirspMetadataKey.X_tile_num]
228
229
 
229
230
  elif num_mosaic_repeats == 1 and num_X_tiles == 1 and num_Y_tiles > 1:
230
231
  has_temporal_axis = True
231
232
  tile_as_temporal_axis = True
232
233
  temporal_axis_size = num_Y_tiles
233
234
  pname = "repeat number"
234
- dindex = header["DLCSTPY"]
235
+ dindex = header[DlnirspMetadataKey.Y_tile_num]
235
236
 
236
237
  else:
237
238
  raise ValueError(
@@ -9,6 +9,7 @@ from dkist_processing_common.codecs.fits import fits_array_decoder
9
9
  from dkist_processing_common.codecs.fits import fits_array_encoder
10
10
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
11
11
  from dkist_processing_common.models.constants import BudName
12
+ from dkist_processing_common.models.fits_access import MetadataKey
12
13
  from dkist_processing_common.models.task_name import TaskName
13
14
  from dkist_processing_common.tasks import TransferTrialData
14
15
  from dkist_processing_common.tasks import WorkflowTaskBase
@@ -17,6 +18,7 @@ from dkist_processing_math.statistics import average_numpy_arrays
17
18
  from dkist_service_configuration.logging import logger
18
19
 
19
20
  from dkist_processing_dlnirsp.models.constants import DlnirspBudName
21
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
20
22
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
21
23
  from dkist_processing_dlnirsp.tasks import DlnirspWriteL1Frame
22
24
  from dkist_processing_dlnirsp.tasks.dlnirsp_base import DlnirspTaskBase
@@ -87,7 +89,7 @@ def permissive_write_l1_task(force_intensity_only: bool):
87
89
  self, header: fits.Header, stokes: Literal["I", "Q", "U", "V"]
88
90
  ) -> fits.Header:
89
91
  if force_intensity_only:
90
- header["DLPOLMD"] = "Stokes I"
92
+ header[MetadataKey.polarimeter_mode] = "Stokes I"
91
93
 
92
94
  return super().add_dataset_headers(header=header, stokes=stokes)
93
95
 
@@ -138,11 +140,11 @@ class TagPolcasAsScience(DlnirspTaskBase):
138
140
  avg_array = average_numpy_arrays(arrays=arrays)
139
141
 
140
142
  hdul = fits.HDUList([fits.PrimaryHDU(data=avg_array, header=first_header)])
141
- hdul[0].header["DLCSTPX"] = 1
142
- hdul[0].header["DLCSTPY"] = 1
143
- hdul[0].header["DLMOSNRP"] = self.constants.num_cs_steps
144
- hdul[0].header["DLCURMOS"] = cs_step
145
- hdul[0].header["XPOSURE"] = obs_exp_time
143
+ hdul[0].header[DlnirspMetadataKey.X_tile_num] = 1
144
+ hdul[0].header[DlnirspMetadataKey.Y_tile_num] = 1
145
+ hdul[0].header[DlnirspMetadataKey.num_mosaic_repeats] = self.constants.num_cs_steps
146
+ hdul[0].header[DlnirspMetadataKey.mosaic_num] = cs_step
147
+ hdul[0].header[MetadataKey.fpa_exposure_time_ms] = obs_exp_time
146
148
 
147
149
  new_tags = [
148
150
  DlnirspTag.task_observe(),
@@ -186,11 +188,11 @@ class TagSingleSolarGainAsScience(DlnirspTaskBase):
186
188
  avg_array = average_numpy_arrays(arrays=arrays)
187
189
 
188
190
  hdul = fits.HDUList([fits.PrimaryHDU(data=avg_array, header=first_header)])
189
- hdul[0].header["DLCSTPX"] = 1
190
- hdul[0].header["DLCSTPY"] = 1
191
- hdul[0].header["DLMOSNRP"] = 1
192
- hdul[0].header["DLCURMOS"] = 0
193
- hdul[0].header["DLDMODE"] = False
191
+ hdul[0].header[DlnirspMetadataKey.X_tile_num] = 1
192
+ hdul[0].header[DlnirspMetadataKey.Y_tile_num] = 1
193
+ hdul[0].header[DlnirspMetadataKey.num_mosaic_repeats] = 1
194
+ hdul[0].header[DlnirspMetadataKey.mosaic_num] = 0
195
+ hdul[0].header[DlnirspMetadataKey.num_dither_steps] = False
194
196
 
195
197
  new_tags = [
196
198
  DlnirspTag.task_observe(),
@@ -237,11 +239,11 @@ class TagModulatedSolarGainsAsScience(DlnirspTaskBase):
237
239
  avg_array = average_numpy_arrays(arrays=arrays)
238
240
 
239
241
  hdul = fits.HDUList([fits.PrimaryHDU(data=avg_array, header=first_header)])
240
- hdul[0].header["DLCSTPX"] = 1
241
- hdul[0].header["DLCSTPY"] = 1
242
- hdul[0].header["DLMOSNRP"] = 1
243
- hdul[0].header["DLCURMOS"] = 0
244
- hdul[0].header["DLDMODE"] = False
242
+ hdul[0].header[DlnirspMetadataKey.X_tile_num] = 1
243
+ hdul[0].header[DlnirspMetadataKey.Y_tile_num] = 1
244
+ hdul[0].header[DlnirspMetadataKey.num_mosaic_repeats] = 1
245
+ hdul[0].header[DlnirspMetadataKey.mosaic_num] = 0
246
+ hdul[0].header[DlnirspMetadataKey.num_dither_steps] = False
245
247
 
246
248
  new_tags = [
247
249
  DlnirspTag.task_observe(),
@@ -20,6 +20,7 @@ from loguru import logger
20
20
 
21
21
  from dkist_processing_dlnirsp.models.constants import DlnirspBudName
22
22
  from dkist_processing_dlnirsp.models.constants import DlnirspConstants
23
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
23
24
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
24
25
  from dkist_processing_dlnirsp.models.task_name import DlnirspTaskName
25
26
  from dkist_processing_dlnirsp.tasks.dlnirsp_base import DlnirspTaskBase
@@ -38,7 +39,7 @@ def get_camera_number(scratch_dir: Path, suffix: str = "FITS", data_ext: int = 1
38
39
  header_list = [fits.getheader(f, ext=data_ext) for f in file_list]
39
40
  table = Table(header_list)
40
41
 
41
- camera_IDs = np.unique(table["DLARMID"])
42
+ camera_IDs = np.unique(table[DlnirspMetadataKey.arm_id])
42
43
  if camera_IDs.size > 1:
43
44
  raise ValueError(f"Found more than one arm in scratch dir. Found {camera_IDs}")
44
45