dkist-processing-visp 5.8.0__tar.gz → 5.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/CHANGELOG.rst +9 -0
  2. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/PKG-INFO +17 -17
  3. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/constants.py +4 -4
  4. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/tags.py +11 -0
  5. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/task_name.py +1 -0
  6. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/time.py +41 -0
  7. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/parse.py +4 -6
  8. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/solar.py +290 -119
  9. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/wavelength_calibration.py +14 -2
  10. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/conftest.py +3 -4
  11. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +5 -8
  12. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_parse.py +26 -14
  13. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_solar.py +61 -18
  14. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_visp_constants.py +4 -1
  15. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_wavelength_calibration.py +36 -3
  16. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp.egg-info/PKG-INFO +17 -17
  17. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp.egg-info/requires.txt +16 -16
  18. dkist_processing_visp-5.8.1/dkist_processing_visp.egg-info/scm_version.json +8 -0
  19. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/pyproject.toml +18 -18
  20. dkist_processing_visp-5.8.0/dkist_processing_visp.egg-info/scm_version.json +0 -8
  21. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/.gitignore +0 -0
  22. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/.pre-commit-config.yaml +0 -0
  23. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/.readthedocs.yml +0 -0
  24. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/.rovodev/.review-agent.md +0 -0
  25. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/.snyk +0 -0
  26. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/README.rst +0 -0
  27. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/SCIENCE_CHANGELOG.rst +0 -0
  28. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/bitbucket-pipelines.yml +0 -0
  29. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/changelog/.gitempty +0 -0
  30. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/__init__.py +0 -0
  31. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/config.py +0 -0
  32. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  33. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/__init__.py +0 -0
  34. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/dataset_extras.py +0 -0
  35. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/fits_access.py +0 -0
  36. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/metric_code.py +0 -0
  37. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/models/parameters.py +0 -0
  38. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/__init__.py +0 -0
  39. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  40. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/modulator_states.py +0 -0
  41. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  42. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/raster_step.py +0 -0
  43. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/spectrograph_configuration.py +0 -0
  44. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
  45. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
  46. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/__init__.py +0 -0
  47. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  48. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/background_light.py +0 -0
  49. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/dark.py +0 -0
  50. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/geometric.py +0 -0
  51. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/instrument_polarization.py +0 -0
  52. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  53. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/lamp.py +0 -0
  54. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  55. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  56. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  57. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
  58. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  59. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/polcal_as_science.py +0 -0
  60. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  61. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/science.py +0 -0
  62. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/visp_base.py +0 -0
  63. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/write_dataset_extras.py +0 -0
  64. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tasks/write_l1.py +0 -0
  65. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/README.rst +0 -0
  66. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/__init__.py +0 -0
  67. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/header_models.py +0 -0
  68. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  69. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  70. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  71. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  72. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  73. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  74. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  75. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_background_light.py +0 -0
  76. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_dark.py +0 -0
  77. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_downsample.py +0 -0
  78. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_fits_access.py +0 -0
  79. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_geometric.py +0 -0
  80. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  81. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_lamp.py +0 -0
  82. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  83. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
  84. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_parameters.py +0 -0
  85. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_polcal_as_science.py +0 -0
  86. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_quality.py +0 -0
  87. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_science.py +0 -0
  88. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  89. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_visp_base.py +0 -0
  90. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_workflows.py +0 -0
  91. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_write_dataset_extras.py +0 -0
  92. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  93. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/workflows/__init__.py +0 -0
  94. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/workflows/l0_processing.py +0 -0
  95. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  96. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
  97. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp.egg-info/SOURCES.txt +0 -0
  98. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  99. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp.egg-info/scm_file_list.json +0 -0
  100. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  101. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/Makefile +0 -0
  102. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/background_light.rst +0 -0
  103. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/changelog.rst +0 -0
  104. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/conf.py +0 -0
  105. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/dataset_extras.rst +0 -0
  106. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/gain_correction.rst +0 -0
  107. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/geometric.rst +0 -0
  108. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/index.rst +0 -0
  109. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/l0_to_l1_visp.rst +0 -0
  110. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  111. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/landing_page.rst +0 -0
  112. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/make.bat +0 -0
  113. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/polarization_calibration.rst +0 -0
  114. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/requirements.txt +0 -0
  115. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/requirements_table.rst +0 -0
  116. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/science_calibration.rst +0 -0
  117. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/scientific_changelog.rst +0 -0
  118. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/docs/wavelength_calibration.rst +0 -0
  119. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/licenses/LICENSE.rst +0 -0
  120. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/science_towncrier.sh +0 -0
  121. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/setup.cfg +0 -0
  122. {dkist_processing_visp-5.8.0 → dkist_processing_visp-5.8.1}/towncrier_science.toml +0 -0
@@ -1,3 +1,12 @@
1
+ v5.8.1 (2026-08-28)
2
+ ===================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Allow multiple solar gain observations to contribute to solar gain calibration while using only the observation nearest in time to the science frames for wavelength calibration. (`#332 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/332>`__)
8
+
9
+
1
10
  v5.8.0 (2026-08-25)
2
11
  ===================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.8.0
3
+ Version: 5.8.1
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
@@ -118,15 +118,15 @@ Requires-Dist: babel==2.18.0; extra == "frozen"
118
118
  Requires-Dist: beautifulsoup4==4.15.0; extra == "frozen"
119
119
  Requires-Dist: billiard==4.2.4; extra == "frozen"
120
120
  Requires-Dist: bleach==6.4.0; extra == "frozen"
121
- Requires-Dist: boto3==1.43.79; extra == "frozen"
122
- Requires-Dist: botocore==1.43.79; extra == "frozen"
121
+ Requires-Dist: boto3==1.43.82; extra == "frozen"
122
+ Requires-Dist: botocore==1.43.82; extra == "frozen"
123
123
  Requires-Dist: cachetools==7.1.7; extra == "frozen"
124
124
  Requires-Dist: cadwyn==7.0.0; extra == "frozen"
125
125
  Requires-Dist: celery==5.6.3; extra == "frozen"
126
126
  Requires-Dist: certifi==2026.7.22; extra == "frozen"
127
127
  Requires-Dist: cffi==2.1.1; extra == "frozen"
128
128
  Requires-Dist: charset-normalizer==3.5.1; extra == "frozen"
129
- Requires-Dist: click==8.4.2; extra == "frozen"
129
+ Requires-Dist: click==8.5.0; extra == "frozen"
130
130
  Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
131
131
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
132
132
  Requires-Dist: click-repl==0.3.0; extra == "frozen"
@@ -135,7 +135,7 @@ Requires-Dist: comm==0.2.3; extra == "frozen"
135
135
  Requires-Dist: contourpy==1.3.3; extra == "frozen"
136
136
  Requires-Dist: cron_descriptor==2.1.0; extra == "frozen"
137
137
  Requires-Dist: croniter==6.2.4; extra == "frozen"
138
- Requires-Dist: cryptography==50.0.0; extra == "frozen"
138
+ Requires-Dist: cryptography==50.0.1; extra == "frozen"
139
139
  Requires-Dist: cycler==0.12.1; extra == "frozen"
140
140
  Requires-Dist: debugpy==1.8.21; extra == "frozen"
141
141
  Requires-Dist: decorator==5.3.1; extra == "frozen"
@@ -146,7 +146,7 @@ Requires-Dist: dkist-processing-common==14.4.0; extra == "frozen"
146
146
  Requires-Dist: dkist-processing-core==7.5.0; extra == "frozen"
147
147
  Requires-Dist: dkist-processing-math==2.2.3; extra == "frozen"
148
148
  Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
149
- Requires-Dist: dkist-processing-visp==5.8.0; extra == "frozen"
149
+ Requires-Dist: dkist-processing-visp==5.8.1; extra == "frozen"
150
150
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
151
151
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
152
152
  Requires-Dist: dkist_fits_specifications==4.28.1; extra == "frozen"
@@ -162,11 +162,11 @@ Requires-Dist: fqdn==1.5.1; extra == "frozen"
162
162
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
163
163
  Requires-Dist: fsspec==2026.7.0; extra == "frozen"
164
164
  Requires-Dist: globus-sdk==4.9.0; extra == "frozen"
165
- Requires-Dist: googleapis-common-protos==1.75.1; extra == "frozen"
165
+ Requires-Dist: googleapis-common-protos==1.75.2; extra == "frozen"
166
166
  Requires-Dist: gqlclient==2.0.0; extra == "frozen"
167
167
  Requires-Dist: greenback==1.3.0; extra == "frozen"
168
168
  Requires-Dist: greenlet==3.5.5; extra == "frozen"
169
- Requires-Dist: grpcio==1.83.0; extra == "frozen"
169
+ Requires-Dist: grpcio==1.83.1; extra == "frozen"
170
170
  Requires-Dist: h11==0.16.0; extra == "frozen"
171
171
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
172
172
  Requires-Dist: httptools==0.8.0; extra == "frozen"
@@ -176,7 +176,7 @@ Requires-Dist: idna==3.19; extra == "frozen"
176
176
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
177
177
  Requires-Dist: importlib_metadata==9.0.0; extra == "frozen"
178
178
  Requires-Dist: ipykernel==7.3.0; extra == "frozen"
179
- Requires-Dist: ipython==9.16.1; extra == "frozen"
179
+ Requires-Dist: ipython==9.17.0; extra == "frozen"
180
180
  Requires-Dist: ipython_pygments_lexers==1.1.1; extra == "frozen"
181
181
  Requires-Dist: isoduration==20.11.0; extra == "frozen"
182
182
  Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
@@ -190,14 +190,14 @@ Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
190
190
  Requires-Dist: jupyter-events==0.12.1; extra == "frozen"
191
191
  Requires-Dist: jupyter-lsp==2.3.1; extra == "frozen"
192
192
  Requires-Dist: jupyter_builder==1.2.2; extra == "frozen"
193
- Requires-Dist: jupyter_client==8.9.1; extra == "frozen"
193
+ Requires-Dist: jupyter_client==8.10.0; extra == "frozen"
194
194
  Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
195
- Requires-Dist: jupyter_server==2.20.0; extra == "frozen"
195
+ Requires-Dist: jupyter_server==2.21.0; extra == "frozen"
196
196
  Requires-Dist: jupyter_server_terminals==0.5.4; extra == "frozen"
197
197
  Requires-Dist: jupyterlab==4.6.3; extra == "frozen"
198
198
  Requires-Dist: jupyterlab_pygments==0.3.0; extra == "frozen"
199
199
  Requires-Dist: jupyterlab_server==2.28.0; extra == "frozen"
200
- Requires-Dist: kiwisolver==1.5.0; extra == "frozen"
200
+ Requires-Dist: kiwisolver==1.5.1; extra == "frozen"
201
201
  Requires-Dist: kombu==5.6.2; extra == "frozen"
202
202
  Requires-Dist: lark==1.3.1; extra == "frozen"
203
203
  Requires-Dist: lazy-loader==0.5; extra == "frozen"
@@ -264,7 +264,7 @@ Requires-Dist: pexpect==4.9.0; extra == "frozen"
264
264
  Requires-Dist: pika==1.4.4; extra == "frozen"
265
265
  Requires-Dist: pillow==10.4.0; extra == "frozen"
266
266
  Requires-Dist: pip==26.2.1; extra == "frozen"
267
- Requires-Dist: platformdirs==4.11.4; extra == "frozen"
267
+ Requires-Dist: platformdirs==4.11.5; extra == "frozen"
268
268
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
269
269
  Requires-Dist: pooch==1.9.0; extra == "frozen"
270
270
  Requires-Dist: proglog==0.1.12; extra == "frozen"
@@ -279,10 +279,10 @@ Requires-Dist: psycopg2-binary==2.9.12; extra == "frozen"
279
279
  Requires-Dist: ptyprocess==0.7.0; extra == "frozen"
280
280
  Requires-Dist: pure_eval==0.2.3; extra == "frozen"
281
281
  Requires-Dist: pycparser==3.0; extra == "frozen"
282
- Requires-Dist: pydantic==2.13.4; extra == "frozen"
282
+ Requires-Dist: pydantic==2.13.5; extra == "frozen"
283
283
  Requires-Dist: pydantic-extra-types==2.11.1; extra == "frozen"
284
284
  Requires-Dist: pydantic-settings==2.15.0; extra == "frozen"
285
- Requires-Dist: pydantic_core==2.46.4; extra == "frozen"
285
+ Requires-Dist: pydantic_core==2.46.5; extra == "frozen"
286
286
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
287
287
  Requires-Dist: pygtrie==2.5.0; extra == "frozen"
288
288
  Requires-Dist: pyparsing==3.3.2; extra == "frozen"
@@ -334,7 +334,7 @@ Requires-Dist: tinycss2==1.5.1; extra == "frozen"
334
334
  Requires-Dist: tornado==6.5.8; extra == "frozen"
335
335
  Requires-Dist: tqdm==4.70.0; extra == "frozen"
336
336
  Requires-Dist: traitlets==5.16.1; extra == "frozen"
337
- Requires-Dist: typer==0.27.1; extra == "frozen"
337
+ Requires-Dist: typer==0.27.2; extra == "frozen"
338
338
  Requires-Dist: typing-inspection==0.4.4; extra == "frozen"
339
339
  Requires-Dist: typing_extensions==4.16.0; extra == "frozen"
340
340
  Requires-Dist: tzdata==2026.3; extra == "frozen"
@@ -354,7 +354,7 @@ Requires-Dist: wcwidth==0.8.2; extra == "frozen"
354
354
  Requires-Dist: webcolors==25.10.0; extra == "frozen"
355
355
  Requires-Dist: webencodings==0.6.1; extra == "frozen"
356
356
  Requires-Dist: websocket-client==1.9.0; extra == "frozen"
357
- Requires-Dist: websockets==17.0.1; extra == "frozen"
357
+ Requires-Dist: websockets==17.1; extra == "frozen"
358
358
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
359
359
  Requires-Dist: wrapt==2.3.0; extra == "frozen"
360
360
  Requires-Dist: yamale==6.1.0; extra == "frozen"
@@ -28,7 +28,7 @@ class VispBudName(Enum):
28
28
  incident_light_angle_deg = "INCIDENT_LIGHT_ANGLE_DEG"
29
29
  reflected_light_angle_deg = "REFLECTED_LIGHT_ANGLE_DEG"
30
30
  grating_constant_inverse_mm = "GRATING_CONSTANT_INVERSE_MM"
31
- solar_gain_ip_start_time = "SOLAR_GAIN_IP_START_TIME"
31
+ solar_gain_ip_start_times = "SOLAR_GAIN_IP_START_TIMES"
32
32
  axis_1_type = "AXIS_1_TYPE"
33
33
  axis_2_type = "AXIS_2_TYPE"
34
34
  axis_3_type = "AXIS_3_TYPE"
@@ -171,9 +171,9 @@ class VispConstants(ConstantsBase):
171
171
  return self._db_dict[VispBudName.grating_constant_inverse_mm] / u.mm
172
172
 
173
173
  @property
174
- def solar_gain_ip_start_time(self) -> str:
175
- """Return the start time of the SOLAR GAIN Instrument Program."""
176
- return self._db_dict[VispBudName.solar_gain_ip_start_time]
174
+ def solar_gain_ip_start_times(self) -> list[str]:
175
+ """Return the start times of the SOLAR GAIN Instrument Programs."""
176
+ return list(self._db_dict[VispBudName.solar_gain_ip_start_times])
177
177
 
178
178
  @property
179
179
  def axis_1_type(self) -> str:
@@ -16,6 +16,7 @@ class VispStemName(str, Enum):
16
16
  modstate = "MODSTATE"
17
17
  file_id = "FILE_ID"
18
18
  map_scan = "MAP_SCAN"
19
+ solar_gain_ip_start_time = "SOLAR_GAIN_IP_START_TIME"
19
20
 
20
21
 
21
22
  class VispTag(Tag):
@@ -64,11 +65,21 @@ class VispTag(Tag):
64
65
  """
65
66
  return cls.format_tag(VispStemName.map_scan, map_scan_num)
66
67
 
68
+ @classmethod
69
+ def solar_gain_ip_start_time(cls, ip_start_time: str) -> str:
70
+ """Tag a solar gain frame or intermediate by its IP start time."""
71
+ return cls.format_tag(VispStemName.solar_gain_ip_start_time, ip_start_time)
72
+
67
73
  @classmethod
68
74
  def task_characteristic_spectra(cls) -> str:
69
75
  """Tags intermediate characteristic spectra."""
70
76
  return cls.format_tag(StemName.task, VispTaskName.solar_char_spec.value)
71
77
 
78
+ @classmethod
79
+ def task_wavecal_characteristic_spectra(cls) -> str:
80
+ """Tag the characteristic spectra derived for wavelength calibration."""
81
+ return cls.format_tag(StemName.task, VispTaskName.wavecal_solar_char_spec.value)
82
+
72
83
  @classmethod
73
84
  def task_wavelength_calibration(cls) -> str:
74
85
  """Tags wavelength calibration."""
@@ -8,4 +8,5 @@ class VispTaskName(str, Enum):
8
8
 
9
9
  background = "BACKGROUND"
10
10
  solar_char_spec = "SOLAR_CHAR_SPEC"
11
+ wavecal_solar_char_spec = "WAVECAL_SOLAR_CHAR_SPEC"
11
12
  wavelength_calibration = "WAVELENGTH_CALIBRATION"
@@ -13,10 +13,15 @@ from dkist_processing_common.models.flower_pot import SpilledDirt
13
13
  from dkist_processing_common.models.flower_pot import Thorn
14
14
  from dkist_processing_common.models.tags import EXP_TIME_ROUND_DIGITS
15
15
  from dkist_processing_common.models.task_name import TaskName
16
+ from dkist_processing_common.parsers.single_value_single_key_flower import (
17
+ SingleValueSingleKeyFlower,
18
+ )
19
+ from dkist_processing_common.parsers.task import parse_header_ip_task_with_gains
16
20
  from dkist_processing_common.parsers.task import passthrough_header_ip_task
17
21
  from dkist_processing_common.parsers.time import TaskDatetimeBudBase
18
22
 
19
23
  from dkist_processing_visp.models.constants import VispBudName
24
+ from dkist_processing_visp.models.tags import VispStemName
20
25
  from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
21
26
 
22
27
 
@@ -133,6 +138,42 @@ class DarkReadoutExpTimePickyBud(ListStem):
133
138
  return Thorn
134
139
 
135
140
 
141
+ class SolarGainIpStartTimesBud(SetStem):
142
+ """Collect the unique IP start times from all solar gain observations."""
143
+
144
+ def __init__(self):
145
+ super().__init__(stem_name=VispBudName.solar_gain_ip_start_times.value)
146
+ self.metadata_key = MetadataKey.ip_start_time.name
147
+
148
+ def setter(self, fits_obj: VispL0FitsAccess) -> str | Type[SpilledDirt]:
149
+ """Collect start times only from frames parsed as solar gains."""
150
+ task = parse_header_ip_task_with_gains(fits_obj)
151
+ if task.casefold() == TaskName.solar_gain.value.casefold():
152
+ return getattr(fits_obj, self.metadata_key)
153
+ return SpilledDirt
154
+
155
+ def getter(self) -> tuple[str, ...]:
156
+ """Return the unique start times in chronological order."""
157
+ return tuple(sorted(self.value_set))
158
+
159
+
160
+ class SolarGainIpStartTimeFlower(SingleValueSingleKeyFlower):
161
+ """Tag each input solar gain frame with its IP start time."""
162
+
163
+ def __init__(self):
164
+ super().__init__(
165
+ tag_stem_name=VispStemName.solar_gain_ip_start_time,
166
+ metadata_key=MetadataKey.ip_start_time,
167
+ )
168
+
169
+ def setter(self, fits_obj: VispL0FitsAccess) -> str | Type[SpilledDirt]:
170
+ """Apply the tag only to frames parsed as solar gains."""
171
+ task = parse_header_ip_task_with_gains(fits_obj)
172
+ if task.casefold() == TaskName.solar_gain.value.casefold():
173
+ return super().setter(fits_obj)
174
+ return SpilledDirt
175
+
176
+
136
177
  class TaskDateEndBud(TaskDatetimeBudBase):
137
178
  """Class for the date end task Bud."""
138
179
 
@@ -39,6 +39,8 @@ from dkist_processing_visp.parsers.spectrograph_configuration import IncidentLig
39
39
  from dkist_processing_visp.parsers.spectrograph_configuration import ReflectedLightAngleBud
40
40
  from dkist_processing_visp.parsers.time import DarkReadoutExpTimePickyBud
41
41
  from dkist_processing_visp.parsers.time import NonDarkNonPolcalTaskReadoutExpTimesBud
42
+ from dkist_processing_visp.parsers.time import SolarGainIpStartTimeFlower
43
+ from dkist_processing_visp.parsers.time import SolarGainIpStartTimesBud
42
44
  from dkist_processing_visp.parsers.time import TaskDateEndBud
43
45
  from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
44
46
 
@@ -105,12 +107,7 @@ class ParseL0VispInputData(ParseL0InputDataBase):
105
107
  ip_task_types=[TaskName.observe.value, TaskName.solar_gain.value],
106
108
  task_type_parsing_function=parse_header_ip_task_with_gains,
107
109
  ),
108
- TaskUniqueBud(
109
- constant_name=VispBudName.solar_gain_ip_start_time.value,
110
- metadata_key=MetadataKey.ip_start_time,
111
- ip_task_types=TaskName.solar_gain,
112
- task_type_parsing_function=parse_header_ip_task_with_gains,
113
- ),
110
+ SolarGainIpStartTimesBud(),
114
111
  TaskExposureTimesBud(
115
112
  stem_name=VispBudName.lamp_exposure_times.value,
116
113
  ip_task_types=TaskName.lamp_gain.value,
@@ -199,4 +196,5 @@ class ParseL0VispInputData(ParseL0InputDataBase):
199
196
  ModulatorStateFlower(),
200
197
  ExposureTimeFlower(),
201
198
  ReadoutExpTimeFlower(),
199
+ SolarGainIpStartTimeFlower(),
202
200
  ]