dkist-processing-vbi 1.25.1rc3__tar.gz → 1.25.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 (81) hide show
  1. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/CHANGELOG.rst +28 -0
  2. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/PKG-INFO +69 -68
  3. dkist_processing_vbi-1.25.3/dkist_processing_vbi/models/fits_access.py +13 -0
  4. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/parsers/spatial_step_pattern.py +2 -1
  5. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/parsers/vbi_l0_fits_access.py +9 -5
  6. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/parsers/vbi_l1_fits_access.py +4 -2
  7. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/parse.py +5 -3
  8. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/write_l1.py +11 -6
  9. dkist_processing_vbi-1.25.3/dkist_processing_vbi/tests/test_fits_access.py +41 -0
  10. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_make_movie_frames.py +6 -4
  11. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_write_l1.py +19 -14
  12. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi.egg-info/PKG-INFO +69 -68
  13. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi.egg-info/SOURCES.txt +2 -1
  14. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi.egg-info/requires.txt +68 -67
  15. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/pyproject.toml +70 -69
  16. dkist_processing_vbi-1.25.1rc3/changelog/155.misc.rst +0 -1
  17. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/.gitignore +0 -0
  18. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/.pre-commit-config.yaml +0 -0
  19. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/.readthedocs.yml +0 -0
  20. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/.snyk +0 -0
  21. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/README.rst +0 -0
  22. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/SCIENCE_CHANGELOG.rst +0 -0
  23. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/bitbucket-pipelines.yml +0 -0
  24. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/changelog/.gitempty +0 -0
  25. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/__init__.py +0 -0
  26. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/config.py +0 -0
  27. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/models/__init__.py +0 -0
  28. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/models/constants.py +0 -0
  29. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/models/filter.py +0 -0
  30. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/models/parameters.py +0 -0
  31. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/models/tags.py +0 -0
  32. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/parsers/__init__.py +0 -0
  33. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/parsers/mosaic_repeats.py +0 -0
  34. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/__init__.py +0 -0
  35. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/assemble_movie.py +0 -0
  36. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/dark.py +0 -0
  37. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/gain.py +0 -0
  38. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/make_movie_frames.py +0 -0
  39. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/process_summit_processed.py +0 -0
  40. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/quality_metrics.py +0 -0
  41. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/science.py +0 -0
  42. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tasks/vbi_base.py +0 -0
  43. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/__init__.py +0 -0
  44. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/conftest.py +0 -0
  45. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/local_trial_workflows/__init__.py +0 -0
  46. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/local_trial_workflows/l0_to_l1.py +0 -0
  47. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_assemble_movie.py +0 -0
  48. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_dark.py +0 -0
  49. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_gain.py +0 -0
  50. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_parse_l0.py +0 -0
  51. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_parse_summit.py +0 -0
  52. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_process_summit.py +0 -0
  53. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_quality_metrics.py +0 -0
  54. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_science.py +0 -0
  55. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_spatial_step_pattern.py +0 -0
  56. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_vbi_base.py +0 -0
  57. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_vbi_constants.py +0 -0
  58. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/tests/test_workflows.py +0 -0
  59. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/workflows/__init__.py +0 -0
  60. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/workflows/l0_processing.py +0 -0
  61. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/workflows/summit_data_processing.py +0 -0
  62. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi/workflows/trial_workflows.py +0 -0
  63. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi.egg-info/dependency_links.txt +0 -0
  64. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/dkist_processing_vbi.egg-info/top_level.txt +0 -0
  65. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/Makefile +0 -0
  66. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/changelog.rst +0 -0
  67. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/conf.py +0 -0
  68. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/index.rst +0 -0
  69. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/l0_to_l1_vbi_no-speckle-full-trial.rst +0 -0
  70. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/l0_to_l1_vbi_no-speckle.rst +0 -0
  71. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/l0_to_l1_vbi_summit-calibrated-full-trial.rst +0 -0
  72. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/l0_to_l1_vbi_summit-calibrated.rst +0 -0
  73. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/landing_page.rst +0 -0
  74. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/make.bat +0 -0
  75. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/requirements.txt +0 -0
  76. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/requirements_table.rst +0 -0
  77. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/docs/scientific_changelog.rst +0 -0
  78. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/licenses/LICENSE.rst +0 -0
  79. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/science_towncrier.sh +0 -0
  80. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/setup.cfg +0 -0
  81. {dkist_processing_vbi-1.25.1rc3 → dkist_processing_vbi-1.25.3}/towncrier_science.toml +0 -0
@@ -1,3 +1,31 @@
1
+ v1.25.3 (2025-11-04)
2
+ ====================
3
+
4
+ Misc
5
+ ----
6
+
7
+ - Replace metadata key strings with members of the string enum VbiMetadataKey. (`#152 <https://bitbucket.org/dkistdc/dkist-processing-vbi/pull-requests/152>`__)
8
+
9
+
10
+ v1.25.2 (2025-11-03)
11
+ ====================
12
+
13
+ Misc
14
+ ----
15
+
16
+ - Update dkist-processing-common to v11.8.0, which adds parameters to the ASDF files.
17
+ Update dkist-inventory to v1.11.1, which adds parameters to the ASDF file generation. (`#156 <https://bitbucket.org/dkistdc/dkist-processing-vbi/pull-requests/156>`__)
18
+
19
+
20
+ v1.25.1 (2025-10-09)
21
+ ====================
22
+
23
+ Misc
24
+ ----
25
+
26
+ - Update `dkist-processing-common` to v11.7.0, which makes constants for the dataset extras. (`#155 <https://bitbucket.org/dkistdc/dkist-processing-vbi/pull-requests/155>`__)
27
+
28
+
1
29
  v1.25.0 (2025-09-26)
2
30
  ====================
3
31
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-vbi
3
- Version: 1.25.1rc3
3
+ Version: 1.25.3
4
4
  Summary: Processing code for the VBI 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.12
14
14
  Requires-Python: >=3.12
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==11.7.0rc6
16
+ Requires-Dist: dkist-processing-common==11.8.0
17
17
  Requires-Dist: dkist-processing-math==2.2.1
18
18
  Requires-Dist: dkist-header-validator==5.2.1
19
19
  Requires-Dist: dkist-fits-specifications==4.17.0
@@ -37,10 +37,10 @@ Requires-Dist: dkist-processing-vbi[asdf]; extra == "test"
37
37
  Requires-Dist: dkist-processing-vbi[quality]; extra == "test"
38
38
  Provides-Extra: inventory
39
39
  Requires-Dist: dkist-processing-common[inventory]; extra == "inventory"
40
- Requires-Dist: dkist-inventory==1.10.0; extra == "inventory"
40
+ Requires-Dist: dkist-inventory==1.11.1; extra == "inventory"
41
41
  Provides-Extra: asdf
42
42
  Requires-Dist: dkist-processing-common[asdf]; extra == "asdf"
43
- Requires-Dist: dkist-inventory[asdf]==1.10.0; extra == "asdf"
43
+ Requires-Dist: dkist-inventory[asdf]==1.11.1; extra == "asdf"
44
44
  Provides-Extra: quality
45
45
  Requires-Dist: dkist-quality==2.0.0; extra == "quality"
46
46
  Provides-Extra: grogu
@@ -57,7 +57,7 @@ Requires-Dist: towncrier; extra == "docs"
57
57
  Requires-Dist: dkist-sphinx-theme; extra == "docs"
58
58
  Provides-Extra: frozen
59
59
  Requires-Dist: ConfigUpdater==3.2; extra == "frozen"
60
- Requires-Dist: Deprecated==1.2.18; extra == "frozen"
60
+ Requires-Dist: Deprecated==1.3.1; extra == "frozen"
61
61
  Requires-Dist: Flask==2.2.5; extra == "frozen"
62
62
  Requires-Dist: Flask-AppBuilder==4.5.3; extra == "frozen"
63
63
  Requires-Dist: Flask-Babel==2.0.0; extra == "frozen"
@@ -68,6 +68,7 @@ Requires-Dist: Flask-Login==0.6.3; extra == "frozen"
68
68
  Requires-Dist: Flask-SQLAlchemy==2.5.1; extra == "frozen"
69
69
  Requires-Dist: Flask-Session==0.5.0; extra == "frozen"
70
70
  Requires-Dist: Flask-WTF==1.2.2; extra == "frozen"
71
+ Requires-Dist: ImageIO==2.37.2; extra == "frozen"
71
72
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
72
73
  Requires-Dist: Mako==1.3.10; extra == "frozen"
73
74
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
@@ -82,68 +83,68 @@ Requires-Dist: WTForms==3.2.1; extra == "frozen"
82
83
  Requires-Dist: Werkzeug==2.2.3; extra == "frozen"
83
84
  Requires-Dist: aioftp==0.27.2; extra == "frozen"
84
85
  Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
85
- Requires-Dist: aiohttp==3.13.0; extra == "frozen"
86
+ Requires-Dist: aiohttp==3.13.2; extra == "frozen"
86
87
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
87
- Requires-Dist: aiosmtplib==4.0.2; extra == "frozen"
88
- Requires-Dist: alembic==1.16.5; extra == "frozen"
88
+ Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
89
+ Requires-Dist: alembic==1.17.1; extra == "frozen"
89
90
  Requires-Dist: amqp==5.3.1; extra == "frozen"
90
91
  Requires-Dist: annotated-types==0.7.0; extra == "frozen"
91
92
  Requires-Dist: anyio==4.11.0; extra == "frozen"
92
93
  Requires-Dist: apache-airflow==2.11.0; extra == "frozen"
93
94
  Requires-Dist: apache-airflow-providers-celery==3.10.0; extra == "frozen"
94
- Requires-Dist: apache-airflow-providers-common-compat==1.7.4; extra == "frozen"
95
- Requires-Dist: apache-airflow-providers-common-io==1.6.3; extra == "frozen"
96
- Requires-Dist: apache-airflow-providers-common-sql==1.28.1; extra == "frozen"
95
+ Requires-Dist: apache-airflow-providers-common-compat==1.8.0; extra == "frozen"
96
+ Requires-Dist: apache-airflow-providers-common-io==1.6.4; extra == "frozen"
97
+ Requires-Dist: apache-airflow-providers-common-sql==1.28.2; extra == "frozen"
97
98
  Requires-Dist: apache-airflow-providers-fab==1.5.3; extra == "frozen"
98
99
  Requires-Dist: apache-airflow-providers-ftp==3.13.2; extra == "frozen"
99
- Requires-Dist: apache-airflow-providers-http==5.3.4; extra == "frozen"
100
- Requires-Dist: apache-airflow-providers-imap==3.9.2; extra == "frozen"
101
- Requires-Dist: apache-airflow-providers-postgres==6.3.0; extra == "frozen"
100
+ Requires-Dist: apache-airflow-providers-http==5.4.0; extra == "frozen"
101
+ Requires-Dist: apache-airflow-providers-imap==3.9.3; extra == "frozen"
102
+ Requires-Dist: apache-airflow-providers-postgres==6.4.0; extra == "frozen"
102
103
  Requires-Dist: apache-airflow-providers-smtp==2.3.1; extra == "frozen"
103
104
  Requires-Dist: apache-airflow-providers-sqlite==4.1.2; extra == "frozen"
104
105
  Requires-Dist: apispec==6.8.4; extra == "frozen"
105
- Requires-Dist: argcomplete==3.6.2; extra == "frozen"
106
+ Requires-Dist: argcomplete==3.6.3; extra == "frozen"
106
107
  Requires-Dist: asdf==3.5.0; extra == "frozen"
107
108
  Requires-Dist: asdf_standard==1.4.0; extra == "frozen"
108
109
  Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
109
110
  Requires-Dist: asgiref==3.10.0; extra == "frozen"
110
111
  Requires-Dist: asteval==1.0.6; extra == "frozen"
111
112
  Requires-Dist: astropy==7.0.2; extra == "frozen"
112
- Requires-Dist: astropy-iers-data==0.2025.10.6.0.35.25; extra == "frozen"
113
+ Requires-Dist: astropy-iers-data==0.2025.11.3.0.38.37; extra == "frozen"
113
114
  Requires-Dist: asyncpg==0.30.0; extra == "frozen"
114
115
  Requires-Dist: attrs==25.4.0; extra == "frozen"
115
116
  Requires-Dist: babel==2.17.0; extra == "frozen"
116
117
  Requires-Dist: billiard==4.2.2; extra == "frozen"
117
118
  Requires-Dist: blinker==1.9.0; extra == "frozen"
118
- Requires-Dist: boto3==1.40.48; extra == "frozen"
119
- Requires-Dist: botocore==1.40.48; extra == "frozen"
119
+ Requires-Dist: boto3==1.40.65; extra == "frozen"
120
+ Requires-Dist: botocore==1.40.65; extra == "frozen"
120
121
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
121
122
  Requires-Dist: celery==5.3.1; extra == "frozen"
122
123
  Requires-Dist: certifi==2025.10.5; extra == "frozen"
123
124
  Requires-Dist: cffi==2.0.0; extra == "frozen"
124
- Requires-Dist: charset-normalizer==3.4.3; extra == "frozen"
125
+ Requires-Dist: charset-normalizer==3.4.4; extra == "frozen"
125
126
  Requires-Dist: click==8.3.0; extra == "frozen"
126
127
  Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
127
128
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
128
129
  Requires-Dist: click-repl==0.3.0; extra == "frozen"
129
130
  Requires-Dist: clickclick==20.10.2; extra == "frozen"
130
131
  Requires-Dist: colorama==0.4.6; extra == "frozen"
131
- Requires-Dist: colorlog==6.9.0; extra == "frozen"
132
+ Requires-Dist: colorlog==6.10.1; extra == "frozen"
132
133
  Requires-Dist: connexion==2.14.2; extra == "frozen"
133
134
  Requires-Dist: contourpy==1.3.3; extra == "frozen"
134
135
  Requires-Dist: cron_descriptor==2.0.6; extra == "frozen"
135
136
  Requires-Dist: croniter==6.0.0; extra == "frozen"
136
- Requires-Dist: cryptography==46.0.2; extra == "frozen"
137
+ Requires-Dist: cryptography==46.0.3; extra == "frozen"
137
138
  Requires-Dist: cycler==0.12.1; extra == "frozen"
138
139
  Requires-Dist: dacite==1.9.2; extra == "frozen"
139
140
  Requires-Dist: decorator==5.2.1; extra == "frozen"
140
141
  Requires-Dist: dill==0.4.0; extra == "frozen"
141
142
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
142
- Requires-Dist: dkist-processing-common==11.7.0rc6; extra == "frozen"
143
+ Requires-Dist: dkist-processing-common==11.8.0; extra == "frozen"
143
144
  Requires-Dist: dkist-processing-core==6.0.0; extra == "frozen"
144
145
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
145
146
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
146
- Requires-Dist: dkist-processing-vbi==1.25.1rc3; extra == "frozen"
147
+ Requires-Dist: dkist-processing-vbi==1.25.3; extra == "frozen"
147
148
  Requires-Dist: dkist-service-configuration==4.1.7; extra == "frozen"
148
149
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
149
150
  Requires-Dist: dkist_fits_specifications==4.17.0; extra == "frozen"
@@ -153,19 +154,19 @@ Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
153
154
  Requires-Dist: flower==2.0.1; extra == "frozen"
154
155
  Requires-Dist: fonttools==4.60.1; extra == "frozen"
155
156
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
156
- Requires-Dist: fsspec==2025.9.0; extra == "frozen"
157
+ Requires-Dist: fsspec==2025.10.0; extra == "frozen"
157
158
  Requires-Dist: globus-sdk==3.65.0; extra == "frozen"
158
159
  Requires-Dist: google-re2==1.1.20250805; extra == "frozen"
159
- Requires-Dist: googleapis-common-protos==1.70.0; extra == "frozen"
160
+ Requires-Dist: googleapis-common-protos==1.71.0; extra == "frozen"
160
161
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
161
- Requires-Dist: grpcio==1.75.1; extra == "frozen"
162
+ Requires-Dist: greenlet==3.2.4; extra == "frozen"
163
+ Requires-Dist: grpcio==1.76.0; extra == "frozen"
162
164
  Requires-Dist: gunicorn==23.0.0; extra == "frozen"
163
165
  Requires-Dist: h11==0.16.0; extra == "frozen"
164
166
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
165
167
  Requires-Dist: httpx==0.28.1; extra == "frozen"
166
- Requires-Dist: humanize==4.13.0; extra == "frozen"
167
- Requires-Dist: idna==3.10; extra == "frozen"
168
- Requires-Dist: imageio==2.37.0; extra == "frozen"
168
+ Requires-Dist: humanize==4.14.0; extra == "frozen"
169
+ Requires-Dist: idna==3.11; extra == "frozen"
169
170
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
170
171
  Requires-Dist: importlib_metadata==8.7.0; extra == "frozen"
171
172
  Requires-Dist: inflection==0.5.1; extra == "frozen"
@@ -173,9 +174,9 @@ Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
173
174
  Requires-Dist: jmespath==1.0.1; extra == "frozen"
174
175
  Requires-Dist: jsonschema==4.25.1; extra == "frozen"
175
176
  Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
176
- Requires-Dist: jupyter_core==5.8.1; extra == "frozen"
177
+ Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
177
178
  Requires-Dist: kiwisolver==1.4.9; extra == "frozen"
178
- Requires-Dist: kombu==5.5.4; extra == "frozen"
179
+ Requires-Dist: kombu==5.6.0; extra == "frozen"
179
180
  Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
180
181
  Requires-Dist: lazy_loader==0.4; extra == "frozen"
181
182
  Requires-Dist: limits==5.6.0; extra == "frozen"
@@ -198,40 +199,40 @@ Requires-Dist: nbformat==5.10.4; extra == "frozen"
198
199
  Requires-Dist: networkx==3.5; extra == "frozen"
199
200
  Requires-Dist: numpy==2.2.5; extra == "frozen"
200
201
  Requires-Dist: object-clerk==1.0.0; extra == "frozen"
201
- Requires-Dist: opentelemetry-api==1.37.0; extra == "frozen"
202
- Requires-Dist: opentelemetry-exporter-otlp==1.37.0; extra == "frozen"
203
- Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.37.0; extra == "frozen"
204
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.37.0; extra == "frozen"
205
- Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.37.0; extra == "frozen"
206
- Requires-Dist: opentelemetry-instrumentation==0.58b0; extra == "frozen"
207
- Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.58b0; extra == "frozen"
208
- Requires-Dist: opentelemetry-instrumentation-asgi==0.58b0; extra == "frozen"
209
- Requires-Dist: opentelemetry-instrumentation-botocore==0.58b0; extra == "frozen"
210
- Requires-Dist: opentelemetry-instrumentation-celery==0.58b0; extra == "frozen"
211
- Requires-Dist: opentelemetry-instrumentation-dbapi==0.58b0; extra == "frozen"
212
- Requires-Dist: opentelemetry-instrumentation-fastapi==0.58b0; extra == "frozen"
213
- Requires-Dist: opentelemetry-instrumentation-pika==0.58b0; extra == "frozen"
214
- Requires-Dist: opentelemetry-instrumentation-psycopg2==0.58b0; extra == "frozen"
215
- Requires-Dist: opentelemetry-instrumentation-pymongo==0.58b0; extra == "frozen"
216
- Requires-Dist: opentelemetry-instrumentation-redis==0.58b0; extra == "frozen"
217
- Requires-Dist: opentelemetry-instrumentation-requests==0.58b0; extra == "frozen"
218
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.58b0; extra == "frozen"
219
- Requires-Dist: opentelemetry-instrumentation-system-metrics==0.58b0; extra == "frozen"
202
+ Requires-Dist: opentelemetry-api==1.38.0; extra == "frozen"
203
+ Requires-Dist: opentelemetry-exporter-otlp==1.38.0; extra == "frozen"
204
+ Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.38.0; extra == "frozen"
205
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.38.0; extra == "frozen"
206
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.38.0; extra == "frozen"
207
+ Requires-Dist: opentelemetry-instrumentation==0.59b0; extra == "frozen"
208
+ Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.59b0; extra == "frozen"
209
+ Requires-Dist: opentelemetry-instrumentation-asgi==0.59b0; extra == "frozen"
210
+ Requires-Dist: opentelemetry-instrumentation-botocore==0.59b0; extra == "frozen"
211
+ Requires-Dist: opentelemetry-instrumentation-celery==0.59b0; extra == "frozen"
212
+ Requires-Dist: opentelemetry-instrumentation-dbapi==0.59b0; extra == "frozen"
213
+ Requires-Dist: opentelemetry-instrumentation-fastapi==0.59b0; extra == "frozen"
214
+ Requires-Dist: opentelemetry-instrumentation-pika==0.59b0; extra == "frozen"
215
+ Requires-Dist: opentelemetry-instrumentation-psycopg2==0.59b0; extra == "frozen"
216
+ Requires-Dist: opentelemetry-instrumentation-pymongo==0.59b0; extra == "frozen"
217
+ Requires-Dist: opentelemetry-instrumentation-redis==0.59b0; extra == "frozen"
218
+ Requires-Dist: opentelemetry-instrumentation-requests==0.59b0; extra == "frozen"
219
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.59b0; extra == "frozen"
220
+ Requires-Dist: opentelemetry-instrumentation-system-metrics==0.59b0; extra == "frozen"
220
221
  Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
221
- Requires-Dist: opentelemetry-proto==1.37.0; extra == "frozen"
222
- Requires-Dist: opentelemetry-sdk==1.37.0; extra == "frozen"
223
- Requires-Dist: opentelemetry-semantic-conventions==0.58b0; extra == "frozen"
224
- Requires-Dist: opentelemetry-util-http==0.58b0; extra == "frozen"
222
+ Requires-Dist: opentelemetry-proto==1.38.0; extra == "frozen"
223
+ Requires-Dist: opentelemetry-sdk==1.38.0; extra == "frozen"
224
+ Requires-Dist: opentelemetry-semantic-conventions==0.59b0; extra == "frozen"
225
+ Requires-Dist: opentelemetry-util-http==0.59b0; extra == "frozen"
225
226
  Requires-Dist: ordered-set==4.1.0; extra == "frozen"
226
227
  Requires-Dist: packaging==25.0; extra == "frozen"
227
228
  Requires-Dist: pandas==2.3.3; extra == "frozen"
228
229
  Requires-Dist: parfive==2.2.0; extra == "frozen"
229
- Requires-Dist: pathlib_abc==0.5.1; extra == "frozen"
230
+ Requires-Dist: pathlib_abc==0.5.2; extra == "frozen"
230
231
  Requires-Dist: pathspec==0.12.1; extra == "frozen"
231
232
  Requires-Dist: pendulum==3.1.0; extra == "frozen"
232
233
  Requires-Dist: pika==1.3.2; extra == "frozen"
233
234
  Requires-Dist: pillow==10.4.0; extra == "frozen"
234
- Requires-Dist: pip==25.2; extra == "frozen"
235
+ Requires-Dist: pip==25.3; extra == "frozen"
235
236
  Requires-Dist: platformdirs==4.5.0; extra == "frozen"
236
237
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
237
238
  Requires-Dist: pooch==1.8.2; extra == "frozen"
@@ -240,29 +241,29 @@ Requires-Dist: proglog==0.1.12; extra == "frozen"
240
241
  Requires-Dist: prometheus_client==0.23.1; extra == "frozen"
241
242
  Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
242
243
  Requires-Dist: propcache==0.4.1; extra == "frozen"
243
- Requires-Dist: protobuf==6.32.1; extra == "frozen"
244
- Requires-Dist: psutil==7.1.0; extra == "frozen"
245
- Requires-Dist: psycopg2-binary==2.9.10; extra == "frozen"
244
+ Requires-Dist: protobuf==6.33.0; extra == "frozen"
245
+ Requires-Dist: psutil==7.1.3; extra == "frozen"
246
+ Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
246
247
  Requires-Dist: pycparser==2.23; extra == "frozen"
247
- Requires-Dist: pydantic==2.12.0; extra == "frozen"
248
+ Requires-Dist: pydantic==2.12.3; extra == "frozen"
248
249
  Requires-Dist: pydantic-settings==2.11.0; extra == "frozen"
249
- Requires-Dist: pydantic_core==2.41.1; extra == "frozen"
250
+ Requires-Dist: pydantic_core==2.41.4; extra == "frozen"
250
251
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
251
252
  Requires-Dist: pyparsing==3.2.5; extra == "frozen"
252
253
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
253
254
  Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
254
- Requires-Dist: python-dotenv==1.1.1; extra == "frozen"
255
+ Requires-Dist: python-dotenv==1.2.1; extra == "frozen"
255
256
  Requires-Dist: python-nvd3==0.16.0; extra == "frozen"
256
257
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
257
258
  Requires-Dist: pytz==2025.2; extra == "frozen"
258
259
  Requires-Dist: redis==6.4.0; extra == "frozen"
259
- Requires-Dist: referencing==0.36.2; extra == "frozen"
260
+ Requires-Dist: referencing==0.37.0; extra == "frozen"
260
261
  Requires-Dist: requests==2.32.5; extra == "frozen"
261
262
  Requires-Dist: requests-toolbelt==1.0.0; extra == "frozen"
262
263
  Requires-Dist: rfc3339-validator==0.1.4; extra == "frozen"
263
264
  Requires-Dist: rich==13.9.4; extra == "frozen"
264
- Requires-Dist: rich-argparse==1.7.1; extra == "frozen"
265
- Requires-Dist: rpds-py==0.27.1; extra == "frozen"
265
+ Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
266
+ Requires-Dist: rpds-py==0.28.0; extra == "frozen"
266
267
  Requires-Dist: s3transfer==0.14.0; extra == "frozen"
267
268
  Requires-Dist: scikit-image==0.25.2; extra == "frozen"
268
269
  Requires-Dist: scipy==1.15.3; extra == "frozen"
@@ -277,9 +278,9 @@ Requires-Dist: sunpy==6.1.1; extra == "frozen"
277
278
  Requires-Dist: tabulate==0.9.0; extra == "frozen"
278
279
  Requires-Dist: talus==1.3.4; extra == "frozen"
279
280
  Requires-Dist: tenacity==8.5.0; extra == "frozen"
280
- Requires-Dist: termcolor==3.1.0; extra == "frozen"
281
+ Requires-Dist: termcolor==3.2.0; extra == "frozen"
281
282
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
282
- Requires-Dist: tifffile==2025.10.4; extra == "frozen"
283
+ Requires-Dist: tifffile==2025.10.16; extra == "frozen"
283
284
  Requires-Dist: tornado==6.5.2; extra == "frozen"
284
285
  Requires-Dist: tqdm==4.67.1; extra == "frozen"
285
286
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
@@ -288,7 +289,7 @@ Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
288
289
  Requires-Dist: tzdata==2025.2; extra == "frozen"
289
290
  Requires-Dist: uc-micro-py==1.0.3; extra == "frozen"
290
291
  Requires-Dist: uncertainties==3.2.3; extra == "frozen"
291
- Requires-Dist: universal_pathlib==0.3.3; extra == "frozen"
292
+ Requires-Dist: universal_pathlib==0.3.4; extra == "frozen"
292
293
  Requires-Dist: urllib3==2.5.0; extra == "frozen"
293
294
  Requires-Dist: vine==5.1.0; extra == "frozen"
294
295
  Requires-Dist: voluptuous==0.15.2; extra == "frozen"
@@ -0,0 +1,13 @@
1
+ """VBI control of FITS key names and values."""
2
+
3
+ from enum import StrEnum
4
+
5
+
6
+ class VbiMetadataKey(StrEnum):
7
+ """Controlled list of names for FITS metadata header keys."""
8
+
9
+ spatial_step_pattern = "VBISTPAT"
10
+ number_of_spatial_steps = "VBINSTP"
11
+ current_spatial_step = "VBISTP"
12
+ number_of_exp_per_mosaic_step = "VBINFRAM"
13
+ current_mosaic_step_exp = "VBICFRAM"
@@ -4,6 +4,7 @@ from dkist_processing_common.models.task_name import TaskName
4
4
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
5
5
 
6
6
  from dkist_processing_vbi.models.constants import VbiBudName
7
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
7
8
 
8
9
 
9
10
  class SpatialStepPatternBud(TaskUniqueBud):
@@ -23,7 +24,7 @@ class SpatialStepPatternBud(TaskUniqueBud):
23
24
  def __init__(self):
24
25
  super().__init__(
25
26
  constant_name=VbiBudName.spatial_step_pattern.value,
26
- metadata_key="spatial_step_pattern",
27
+ metadata_key=VbiMetadataKey.spatial_step_pattern,
27
28
  ip_task_types=TaskName.observe.value,
28
29
  )
29
30
 
@@ -3,6 +3,8 @@
3
3
  from astropy.io import fits
4
4
  from dkist_processing_common.parsers.l0_fits_access import L0FitsAccess
5
5
 
6
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
7
+
6
8
 
7
9
  class VbiL0FitsAccess(L0FitsAccess):
8
10
  """
@@ -30,8 +32,10 @@ class VbiL0FitsAccess(L0FitsAccess):
30
32
  ):
31
33
  super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
32
34
 
33
- self.spatial_step_pattern: str = self.header["VBISTPAT"]
34
- self.number_of_spatial_steps: int = self.header.get("VBINSTP")
35
- self.current_spatial_step: int = self.header.get("VBISTP")
36
- self.number_of_exp_per_mosaic_step: int = self.header.get("VBINFRAM")
37
- self.current_mosaic_step_exp: int = self.header.get("VBICFRAM")
35
+ self.spatial_step_pattern: str = self.header[VbiMetadataKey.spatial_step_pattern]
36
+ self.number_of_spatial_steps: int = self.header.get(VbiMetadataKey.number_of_spatial_steps)
37
+ self.current_spatial_step: int = self.header.get(VbiMetadataKey.current_spatial_step)
38
+ self.number_of_exp_per_mosaic_step: int = self.header.get(
39
+ VbiMetadataKey.number_of_exp_per_mosaic_step
40
+ )
41
+ self.current_mosaic_step_exp: int = self.header.get(VbiMetadataKey.current_mosaic_step_exp)
@@ -3,6 +3,8 @@
3
3
  from astropy.io import fits
4
4
  from dkist_processing_common.parsers.l1_fits_access import L1FitsAccess
5
5
 
6
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
7
+
6
8
 
7
9
  class VbiL1FitsAccess(L1FitsAccess):
8
10
  """
@@ -30,5 +32,5 @@ class VbiL1FitsAccess(L1FitsAccess):
30
32
  ):
31
33
  super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
32
34
 
33
- self.number_of_spatial_steps: int = self.header.get("VBINSTP")
34
- self.current_spatial_step: int = self.header.get("VBISTP")
35
+ self.number_of_spatial_steps: int = self.header.get(VbiMetadataKey.number_of_spatial_steps)
36
+ self.current_spatial_step: int = self.header.get(VbiMetadataKey.current_spatial_step)
@@ -1,5 +1,6 @@
1
1
  """VBI parse task."""
2
2
 
3
+ from dkist_processing_common.models.fits_access import MetadataKey
3
4
  from dkist_processing_common.models.tags import StemName
4
5
  from dkist_processing_common.models.task_name import TaskName
5
6
  from dkist_processing_common.parsers.single_value_single_key_flower import (
@@ -13,6 +14,7 @@ from dkist_processing_common.tasks import ParseL0InputDataBase
13
14
  from dkist_processing_common.tasks.parse_l0_input_data import S
14
15
 
15
16
  from dkist_processing_vbi.models.constants import VbiBudName
17
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
16
18
  from dkist_processing_vbi.models.tags import VbiStemName
17
19
  from dkist_processing_vbi.parsers.mosaic_repeats import MosaicRepeatNumberFlower
18
20
  from dkist_processing_vbi.parsers.mosaic_repeats import TotalMosaicRepeatsBud
@@ -50,7 +52,7 @@ class ParseL0VbiInputData(ParseL0InputDataBase):
50
52
  return super().constant_buds + [
51
53
  UniqueBud(
52
54
  constant_name=VbiBudName.num_spatial_steps.value,
53
- metadata_key="number_of_spatial_steps",
55
+ metadata_key=VbiMetadataKey.number_of_spatial_steps,
54
56
  ),
55
57
  SpatialStepPatternBud(),
56
58
  ObsIpStartTimeBud(),
@@ -69,10 +71,10 @@ class ParseL0VbiInputData(ParseL0InputDataBase):
69
71
  return super().tag_flowers + [
70
72
  SingleValueSingleKeyFlower(
71
73
  tag_stem_name=VbiStemName.current_spatial_step.value,
72
- metadata_key="current_spatial_step",
74
+ metadata_key=VbiMetadataKey.current_spatial_step,
73
75
  ),
74
76
  SingleValueSingleKeyFlower(
75
- tag_stem_name=StemName.task.value, metadata_key="ip_task_type"
77
+ tag_stem_name=StemName.task.value, metadata_key=MetadataKey.ip_task_type
76
78
  ),
77
79
  MosaicRepeatNumberFlower(),
78
80
  ExposureTimeFlower(),
@@ -9,6 +9,7 @@ from astropy.io import fits
9
9
  from astropy.time import Time
10
10
  from astropy.time import TimeDelta
11
11
  from dkist_processing_common.models.constants import ConstantsBase
12
+ from dkist_processing_common.models.fits_access import MetadataKey
12
13
  from dkist_processing_common.tasks.write_l1 import WavelengthRange
13
14
  from dkist_processing_common.tasks.write_l1 import WriteL1Frame
14
15
  from dkist_service_configuration.logging import logger
@@ -19,6 +20,8 @@ from dkist_processing_vbi.models.filter import find_associated_filter
19
20
 
20
21
  __all__ = ["VbiWriteL1Frame"]
21
22
 
23
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
24
+
22
25
 
23
26
  class VbiWriteL1Frame(WriteL1Frame):
24
27
  """
@@ -85,7 +88,7 @@ class VbiWriteL1Frame(WriteL1Frame):
85
88
 
86
89
  # ---Temporal---
87
90
  if self.constants.num_mosaic_repeats > 1:
88
- num_exp_per_dsp = header["VBINFRAM"]
91
+ num_exp_per_dsp = header[VbiMetadataKey.number_of_exp_per_mosaic_step]
89
92
  header["DNAXIS3"] = self.constants.num_mosaic_repeats * num_exp_per_dsp
90
93
  header["DTYPE3"] = "TEMPORAL"
91
94
  header["DPNAME3"] = "time"
@@ -93,7 +96,7 @@ class VbiWriteL1Frame(WriteL1Frame):
93
96
  header["DUNIT3"] = "s"
94
97
  # Temporal position in dataset
95
98
  current_mosaic_number = header["VBICMOSC"]
96
- current_exposure = header["VBICFRAM"]
99
+ current_exposure = header[VbiMetadataKey.current_mosaic_step_exp]
97
100
  header["DINDEX3"] = (current_mosaic_number - 1) * num_exp_per_dsp + current_exposure
98
101
 
99
102
  # ---Wavelength Info---
@@ -101,8 +104,8 @@ class VbiWriteL1Frame(WriteL1Frame):
101
104
  header["WAVEREF"] = "Air"
102
105
 
103
106
  # --- Mosaic ---
104
- number_of_spatial_steps = int(header["VBINSTP"])
105
- current_step = int(header["VBISTP"])
107
+ number_of_spatial_steps = int(header[VbiMetadataKey.number_of_spatial_steps])
108
+ current_step = int(header[VbiMetadataKey.current_spatial_step])
106
109
  if number_of_spatial_steps not in [1, 4, 5, 9]: # not a known number of spatial steps
107
110
  raise ValueError(
108
111
  f"Mosaic grid must be a known configuration (steps in 1, 4, 5, 9). "
@@ -151,7 +154,9 @@ class VbiWriteL1Frame(WriteL1Frame):
151
154
  """
152
155
  return (
153
156
  Time(header["DATE-BEG"], format="isot", precision=6)
154
- + TimeDelta(float(header["TEXPOSUR"]) / 1000, format="sec")
157
+ + TimeDelta(
158
+ float(header[MetadataKey.sensor_readout_exposure_time_ms]) / 1000, format="sec"
159
+ )
155
160
  ).to_value("isot")
156
161
 
157
162
  def get_wavelength_range(self, header: fits.Header) -> WavelengthRange:
@@ -160,7 +165,7 @@ class VbiWriteL1Frame(WriteL1Frame):
160
165
 
161
166
  Range is the wavelengths at the edges of the filter bandpass.
162
167
  """
163
- vbi_filter = find_associated_filter(wavelength=header["LINEWAV"] * u.nm)
168
+ vbi_filter = find_associated_filter(wavelength=header[MetadataKey.wavelength] * u.nm)
164
169
  return WavelengthRange(min=vbi_filter.min, max=vbi_filter.max)
165
170
 
166
171
  def get_waveband(self, wavelength: u.Quantity, wavelength_range: WavelengthRange) -> str:
@@ -0,0 +1,41 @@
1
+ import pytest
2
+ from astropy.io import fits
3
+ from dkist_header_validator import spec122_validator
4
+
5
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
6
+ from dkist_processing_vbi.parsers.vbi_l0_fits_access import VbiL0FitsAccess
7
+ from dkist_processing_vbi.parsers.vbi_l1_fits_access import VbiL1FitsAccess
8
+ from dkist_processing_vbi.tests.conftest import Vbi122ObserveFrames
9
+
10
+
11
+ @pytest.fixture(scope="function")
12
+ def header():
13
+ ds = Vbi122ObserveFrames(array_shape=(1, 2, 2), num_steps=1)
14
+ header_list = [
15
+ spec122_validator.validate_and_translate_to_214_l0(d.header(), return_type=fits.HDUList)[
16
+ 0
17
+ ].header
18
+ for d in ds
19
+ ]
20
+ return header_list[0]
21
+
22
+
23
+ def test_metadata_keys_in_access_bases(header):
24
+ """
25
+ Given: the set of metadata key names in VbiMetadataKey
26
+ When: the VBI FITS access classes define a set of new attributes
27
+ Then: the sets are the same the attributes have the correct values
28
+ """
29
+ vbi_metadata_key_names = {vmk.name for vmk in VbiMetadataKey}
30
+ all_vbi_fits_access_attrs = set()
31
+ for access_class in [VbiL0FitsAccess, VbiL1FitsAccess]:
32
+ fits_obj = access_class.from_header(header)
33
+ vbi_instance_attrs = set(vars(fits_obj).keys())
34
+ parent_class = access_class.mro()[1]
35
+ parent_fits_obj = parent_class.from_header(header)
36
+ parent_instance_attrs = set(vars(parent_fits_obj).keys())
37
+ vbi_fits_access_attrs = vbi_instance_attrs - parent_instance_attrs
38
+ for attr in vbi_fits_access_attrs:
39
+ assert getattr(fits_obj, attr) == fits_obj.header[VbiMetadataKey[attr]]
40
+ all_vbi_fits_access_attrs |= vbi_fits_access_attrs
41
+ assert vbi_metadata_key_names == all_vbi_fits_access_attrs
@@ -9,8 +9,10 @@ from dkist_processing_common.codecs.fits import fits_access_decoder
9
9
  from dkist_processing_common.codecs.fits import fits_array_decoder
10
10
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
11
11
  from dkist_processing_common.models.fits_access import FitsAccessBase
12
+ from dkist_processing_common.models.fits_access import MetadataKey
12
13
 
13
14
  from dkist_processing_vbi.models.constants import VbiConstants
15
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
14
16
  from dkist_processing_vbi.models.tags import VbiTag
15
17
  from dkist_processing_vbi.parsers.vbi_l1_fits_access import VbiL1FitsAccess
16
18
  from dkist_processing_vbi.tasks.make_movie_frames import MakeVbiMovieFrames
@@ -57,8 +59,8 @@ def raw_make_movie_frames_task(tmp_path, recipe_run_id, init_vbi_constants_db):
57
59
  hdl[1].header["CDELT2"] = 1.0
58
60
  hdl[1].header["CRPIX1"] = (s % 2) * 7
59
61
  hdl[1].header["CRPIX2"] = -1 * ((s - 1) // 2 - 1) * 7
60
- hdl[1].header["DSPSNUM"] = m
61
- hdl[1].header["VBISTP"] = s
62
+ hdl[1].header[MetadataKey.current_dsps_repeat] = m
63
+ hdl[1].header[VbiMetadataKey.current_spatial_step] = s
62
64
  task.write(
63
65
  data=hdl,
64
66
  tags=[
@@ -116,8 +118,8 @@ def make_movie_frames_task_with_averages(tmp_path_factory):
116
118
  hdl[1].header["CDELT2"] = 1.0
117
119
  hdl[1].header["CRPIX1"] = (s % 2) * 7
118
120
  hdl[1].header["CRPIX2"] = -1 * ((s - 1) // 2 - 1) * 7
119
- hdl[1].header["DSPSNUM"] = m
120
- hdl[1].header["VBISTP"] = s
121
+ hdl[1].header[MetadataKey.current_dsps_repeat] = m
122
+ hdl[1].header[VbiMetadataKey.current_spatial_step] = s
121
123
  task.write(
122
124
  data=hdl,
123
125
  tags=[
@@ -9,10 +9,12 @@ from dkist_fits_specifications import __version__ as spec_version
9
9
  from dkist_header_validator import spec122_validator
10
10
  from dkist_header_validator import spec214_validator
11
11
  from dkist_processing_common.codecs.fits import fits_array_encoder
12
+ from dkist_processing_common.models.fits_access import MetadataKey
12
13
  from dkist_processing_common.models.tags import Tag
13
14
  from dkist_service_configuration.logging import logger
14
15
 
15
16
  from dkist_processing_vbi.models.constants import VbiConstants
17
+ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
16
18
  from dkist_processing_vbi.tasks.write_l1 import VbiWriteL1Frame
17
19
  from dkist_processing_vbi.tests.conftest import Vbi122ObserveFrames
18
20
  from dkist_processing_vbi.tests.conftest import VbiConstantsDb
@@ -34,25 +36,25 @@ def calibrated_header(is_mosaic: bool, camera_str: Literal["red", "blue", "red_a
34
36
  header["CUNIT3"] = "s"
35
37
  if is_mosaic:
36
38
  if camera_str == "blue":
37
- header["VBINSTP"] = 9
38
- header["VBISTP"] = 5
39
+ header[VbiMetadataKey.number_of_spatial_steps] = 9
40
+ header[VbiMetadataKey.current_spatial_step] = 5
39
41
  elif camera_str == "red_all":
40
- header["VBINSTP"] = 5
41
- header["VBISTP"] = 5
42
+ header[VbiMetadataKey.number_of_spatial_steps] = 5
43
+ header[VbiMetadataKey.current_spatial_step] = 5
42
44
  else:
43
- header["VBINSTP"] = 4
44
- header["VBISTP"] = 3
45
+ header[VbiMetadataKey.number_of_spatial_steps] = 4
46
+ header[VbiMetadataKey.current_spatial_step] = 3
45
47
  else:
46
- header["VBINSTP"] = 1
47
- header["VBISTP"] = 1
48
- header["VBISTPAT"] = "5"
49
- header["VBINFRAM"] = 3
50
- header["VBICFRAM"] = 2
48
+ header[VbiMetadataKey.number_of_spatial_steps] = 1
49
+ header[VbiMetadataKey.current_spatial_step] = 1
50
+ header[VbiMetadataKey.spatial_step_pattern] = "5"
51
+ header[VbiMetadataKey.number_of_exp_per_mosaic_step] = 3
52
+ header[VbiMetadataKey.current_mosaic_step_exp] = 2
51
53
  header["VBINMOSC"] = 3
52
54
  header["VBICMOSC"] = 2
53
- header["DSPSNUM"] = 1002 # To mimic a large offset
55
+ header[MetadataKey.current_dsps_repeat] = 1002 # To mimic a large offset
54
56
  header["DATE-BEG"] = "2025-07-11T00:00:00"
55
- header["TEXPOSUR"] = 100
57
+ header[MetadataKey.sensor_readout_exposure_time_ms] = 100
56
58
  return header
57
59
 
58
60
 
@@ -141,7 +143,10 @@ def test_write_l1_frame(
141
143
 
142
144
  if num_mosaic_repeats > 1:
143
145
  assert header["DEAXES"] == 1
144
- assert header["DNAXIS3"] == header["VBINFRAM"] * header["VBINMOSC"]
146
+ assert (
147
+ header["DNAXIS3"]
148
+ == header[VbiMetadataKey.number_of_exp_per_mosaic_step] * header["VBINMOSC"]
149
+ )
145
150
  assert header["DTYPE3"] == "TEMPORAL"
146
151
  assert header["DUNIT3"] == "s"
147
152
  assert header["DPNAME3"] == "time"