dkist-processing-visp 5.4.4__tar.gz → 5.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/CHANGELOG.rst +9 -0
  2. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/PKG-INFO +9 -9
  3. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_quality.py +64 -37
  4. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp.egg-info/PKG-INFO +9 -9
  5. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp.egg-info/requires.txt +8 -8
  6. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/pyproject.toml +10 -10
  7. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/.gitignore +0 -0
  8. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/.pre-commit-config.yaml +0 -0
  9. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/.readthedocs.yml +0 -0
  10. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/.snyk +0 -0
  11. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/README.rst +0 -0
  12. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/SCIENCE_CHANGELOG.rst +0 -0
  13. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/bitbucket-pipelines.yml +0 -0
  14. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/changelog/.gitempty +0 -0
  15. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/__init__.py +0 -0
  16. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/config.py +0 -0
  17. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  18. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/__init__.py +0 -0
  19. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/constants.py +0 -0
  20. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/dataset_extras.py +0 -0
  21. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/fits_access.py +0 -0
  22. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/metric_code.py +0 -0
  23. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/parameters.py +0 -0
  24. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/tags.py +0 -0
  25. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/models/task_name.py +0 -0
  26. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/__init__.py +0 -0
  27. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  28. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/modulator_states.py +0 -0
  29. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  30. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/raster_step.py +0 -0
  31. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/spectrograph_configuration.py +0 -0
  32. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/time.py +0 -0
  33. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
  34. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
  35. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/__init__.py +0 -0
  36. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  37. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/background_light.py +0 -0
  38. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/dark.py +0 -0
  39. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/geometric.py +0 -0
  40. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/instrument_polarization.py +0 -0
  41. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  42. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/lamp.py +0 -0
  43. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  44. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  45. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  46. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
  47. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  48. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/parse.py +0 -0
  49. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/polcal_as_science.py +0 -0
  50. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  51. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/science.py +0 -0
  52. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/solar.py +0 -0
  53. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/visp_base.py +0 -0
  54. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/wavelength_calibration.py +0 -0
  55. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/write_dataset_extras.py +0 -0
  56. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tasks/write_l1.py +0 -0
  57. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/README.rst +0 -0
  58. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/__init__.py +0 -0
  59. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/conftest.py +0 -0
  60. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/header_models.py +0 -0
  61. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  62. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  63. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  64. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  65. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  66. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  67. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  68. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  69. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_background_light.py +0 -0
  70. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_dark.py +0 -0
  71. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_downsample.py +0 -0
  72. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_fits_access.py +0 -0
  73. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_geometric.py +0 -0
  74. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  75. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_lamp.py +0 -0
  76. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  77. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
  78. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_parameters.py +0 -0
  79. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_parse.py +0 -0
  80. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_polcal_as_science.py +0 -0
  81. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_science.py +0 -0
  82. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_solar.py +0 -0
  83. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  84. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
  85. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_wavelength_calibration.py +0 -0
  86. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_workflows.py +0 -0
  87. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_write_dataset_extras.py +0 -0
  88. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  89. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/workflows/__init__.py +0 -0
  90. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/workflows/l0_processing.py +0 -0
  91. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  92. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
  93. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp.egg-info/SOURCES.txt +0 -0
  94. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  95. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  96. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/Makefile +0 -0
  97. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/background_light.rst +0 -0
  98. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/changelog.rst +0 -0
  99. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/conf.py +0 -0
  100. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/dataset_extras.rst +0 -0
  101. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/gain_correction.rst +0 -0
  102. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/geometric.rst +0 -0
  103. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/index.rst +0 -0
  104. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/l0_to_l1_visp.rst +0 -0
  105. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  106. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/landing_page.rst +0 -0
  107. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/make.bat +0 -0
  108. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/polarization_calibration.rst +0 -0
  109. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/requirements.txt +0 -0
  110. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/requirements_table.rst +0 -0
  111. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/science_calibration.rst +0 -0
  112. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/scientific_changelog.rst +0 -0
  113. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/docs/wavelength_calibration.rst +0 -0
  114. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/licenses/LICENSE.rst +0 -0
  115. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/science_towncrier.sh +0 -0
  116. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/setup.cfg +0 -0
  117. {dkist_processing_visp-5.4.4 → dkist_processing_visp-5.5.0}/towncrier_science.toml +0 -0
@@ -1,3 +1,12 @@
1
+ v5.5.0 (2026-04-02)
2
+ ===================
3
+
4
+ Features
5
+ --------
6
+
7
+ - Simplify the production of L0 quality metrics. Update dkist-processing-common to 12.10.0. (`#285 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/285>`__)
8
+
9
+
1
10
  v5.4.4 (2026-04-01)
2
11
  ===================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.4.4
3
+ Version: 5.5.0
4
4
  Summary: Science processing code for the ViSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==12.9.0
16
+ Requires-Dist: dkist-processing-common==12.10.0
17
17
  Requires-Dist: dkist-processing-math==2.2.1
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.3.0
@@ -111,13 +111,13 @@ Requires-Dist: asyncpg==0.31.0; extra == "frozen"
111
111
  Requires-Dist: attrs==26.1.0; extra == "frozen"
112
112
  Requires-Dist: babel==2.18.0; extra == "frozen"
113
113
  Requires-Dist: billiard==4.2.4; extra == "frozen"
114
- Requires-Dist: boto3==1.42.80; extra == "frozen"
115
- Requires-Dist: botocore==1.42.80; extra == "frozen"
114
+ Requires-Dist: boto3==1.42.82; extra == "frozen"
115
+ Requires-Dist: botocore==1.42.82; extra == "frozen"
116
116
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
117
117
  Requires-Dist: celery==5.6.3; extra == "frozen"
118
118
  Requires-Dist: certifi==2026.2.25; extra == "frozen"
119
119
  Requires-Dist: cffi==2.0.0; extra == "frozen"
120
- Requires-Dist: charset-normalizer==3.4.6; extra == "frozen"
120
+ Requires-Dist: charset-normalizer==3.4.7; extra == "frozen"
121
121
  Requires-Dist: click==8.3.1; extra == "frozen"
122
122
  Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
123
123
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
@@ -132,11 +132,11 @@ Requires-Dist: dacite==1.9.2; extra == "frozen"
132
132
  Requires-Dist: decorator==5.2.1; extra == "frozen"
133
133
  Requires-Dist: dill==0.4.1; extra == "frozen"
134
134
  Requires-Dist: dkist-header-validator==5.3.0; extra == "frozen"
135
- Requires-Dist: dkist-processing-common==12.9.0; extra == "frozen"
135
+ Requires-Dist: dkist-processing-common==12.10.0; extra == "frozen"
136
136
  Requires-Dist: dkist-processing-core==7.1.0; extra == "frozen"
137
137
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
138
138
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
139
- Requires-Dist: dkist-processing-visp==5.4.4; extra == "frozen"
139
+ Requires-Dist: dkist-processing-visp==5.5.0; extra == "frozen"
140
140
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
141
141
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
142
142
  Requires-Dist: dkist_fits_specifications==4.23.0; extra == "frozen"
@@ -150,7 +150,7 @@ Requires-Dist: fonttools==4.62.1; extra == "frozen"
150
150
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
151
151
  Requires-Dist: fsspec==2026.3.0; extra == "frozen"
152
152
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
153
- Requires-Dist: googleapis-common-protos==1.73.1; extra == "frozen"
153
+ Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
154
154
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
155
155
  Requires-Dist: greenback==1.3.0; extra == "frozen"
156
156
  Requires-Dist: greenlet==3.3.2; extra == "frozen"
@@ -182,7 +182,7 @@ Requires-Dist: markdown-it-py==4.0.0; extra == "frozen"
182
182
  Requires-Dist: matplotlib==3.10.8; extra == "frozen"
183
183
  Requires-Dist: mdurl==0.1.2; extra == "frozen"
184
184
  Requires-Dist: methodtools==0.4.7; extra == "frozen"
185
- Requires-Dist: more-itertools==10.8.0; extra == "frozen"
185
+ Requires-Dist: more-itertools==11.0.1; extra == "frozen"
186
186
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
187
187
  Requires-Dist: msgspec==0.20.0; extra == "frozen"
188
188
  Requires-Dist: multidict==6.7.1; extra == "frozen"
@@ -1,9 +1,12 @@
1
1
  import json
2
+ from pathlib import Path
2
3
 
3
4
  import numpy as np
4
5
  import pytest
5
6
  from dkist_processing_common._util.scratch import WorkflowFileSystem
7
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
6
8
  from dkist_processing_common.codecs.fits import fits_array_encoder
9
+ from dkist_processing_common.models.quality import QualityMetric
7
10
  from dkist_processing_common.models.tags import Tag
8
11
  from dkist_processing_common.models.task_name import TaskName
9
12
 
@@ -15,15 +18,40 @@ from dkist_processing_visp.tests.conftest import write_calibrated_frames_to_task
15
18
  from dkist_processing_visp.tests.header_models import VispHeaders
16
19
 
17
20
 
21
+ @pytest.fixture()
22
+ def l0_quality_task_types() -> list[str]:
23
+ # The task types we want to build l0 metrics for
24
+ return [TaskName.lamp_gain.value, TaskName.dark.value]
25
+
26
+
27
+ @pytest.fixture()
28
+ def dataset_task_types(l0_quality_task_types: list[str]) -> list[str]:
29
+ # The task types that exist in the dataset, i.e. a larger set than we want to build metrics for.
30
+ return l0_quality_task_types + [TaskName.solar_gain.value, TaskName.observe.value]
31
+
32
+
18
33
  @pytest.fixture
19
- def visp_l0_quality_task(recipe_run_id, num_modstates, init_visp_constants_db, tmp_path):
34
+ def visp_l0_quality_task(
35
+ recipe_run_id: int,
36
+ num_modstates: int,
37
+ init_visp_constants_db,
38
+ tmp_path: Path,
39
+ l0_quality_task_types: list[str],
40
+ ) -> VispL0QualityMetrics:
20
41
  constants = VispConstantsDb(
21
42
  NUM_MODSTATES=num_modstates,
22
43
  POLARIMETER_MODE="observe_polarimetric" if num_modstates > 1 else "observe_intensity",
23
44
  )
24
45
  init_visp_constants_db(recipe_run_id, constants)
25
46
 
26
- with VispL0QualityMetrics(
47
+ class TestVispL0QualityMetrics(VispL0QualityMetrics):
48
+ """Only process l0_quality_task_types"""
49
+
50
+ @property
51
+ def quality_task_types(self) -> list[str]:
52
+ return l0_quality_task_types
53
+
54
+ with TestVispL0QualityMetrics(
27
55
  recipe_run_id=recipe_run_id,
28
56
  workflow_name="workflow_name",
29
57
  workflow_version="workflow_version",
@@ -34,20 +62,8 @@ def visp_l0_quality_task(recipe_run_id, num_modstates, init_visp_constants_db, t
34
62
  task._purge()
35
63
 
36
64
 
37
- @pytest.fixture()
38
- def l0_quality_task_types() -> list[str]:
39
- # The tasks types we want to build l0 metrics for
40
- return [TaskName.lamp_gain.value, TaskName.dark.value]
41
-
42
-
43
- @pytest.fixture()
44
- def dataset_task_types(l0_quality_task_types) -> list[str]:
45
- # The task types that exist in the dataset. I.e., a larger set than we want to build metrics for.
46
- return l0_quality_task_types + [TaskName.solar_gain.value, TaskName.observe.value]
47
-
48
-
49
65
  @pytest.fixture
50
- def write_l0_task_frames_to_task(num_modstates, dataset_task_types):
66
+ def write_l0_task_frames_to_task(num_modstates: int, dataset_task_types: list[str]):
51
67
  array_shape = (1, 4, 4)
52
68
  data = np.ones(array_shape)
53
69
 
@@ -60,15 +76,13 @@ def write_l0_task_frames_to_task(num_modstates, dataset_task_types):
60
76
  )
61
77
  for modstate, frame in enumerate(ds, start=1):
62
78
  header = frame.header()
79
+ tags = [VispTag.input(), VispTag.frame(), VispTag.task(task_type)]
80
+ if num_modstates > 1:
81
+ tags.append(VispTag.modstate(modstate))
63
82
  task.write(
64
83
  data=data,
65
84
  header=header,
66
- tags=[
67
- VispTag.input(),
68
- VispTag.frame(),
69
- VispTag.task(task_type),
70
- VispTag.modstate(modstate),
71
- ],
85
+ tags=tags,
72
86
  encoder=fits_array_encoder,
73
87
  )
74
88
 
@@ -76,7 +90,7 @@ def write_l0_task_frames_to_task(num_modstates, dataset_task_types):
76
90
 
77
91
 
78
92
  @pytest.fixture(scope="function")
79
- def visp_l1_quality_task(tmp_path, pol_mode, recipe_run_id, init_visp_constants_db):
93
+ def visp_l1_quality_task(tmp_path: Path, pol_mode, recipe_run_id: int, init_visp_constants_db):
80
94
  num_map_scans = 3
81
95
  num_raster_steps = 2
82
96
  num_stokes = 4
@@ -101,7 +115,10 @@ def visp_l1_quality_task(tmp_path, pol_mode, recipe_run_id, init_visp_constants_
101
115
  "num_modstates", [pytest.param(4, id="polarimetric"), pytest.param(1, id="intensity")]
102
116
  )
103
117
  def test_l0_quality_task(
104
- visp_l0_quality_task, num_modstates, write_l0_task_frames_to_task, l0_quality_task_types
118
+ visp_l0_quality_task: VispL0QualityMetrics,
119
+ num_modstates: int,
120
+ write_l0_task_frames_to_task,
121
+ l0_quality_task_types: list[str],
105
122
  ):
106
123
  """
107
124
  Given: A `VispL0QualityMetrics` task and some INPUT frames tagged with their task type and modstate
@@ -109,25 +126,35 @@ def test_l0_quality_task(
109
126
  Then: The expected L0 quality metric files exist
110
127
  """
111
128
  # NOTE: We rely on the unit tests in `*-common` to verify the correct format/data of the metric files
129
+ # Given
112
130
  task = visp_l0_quality_task
113
131
  write_l0_task_frames_to_task(task)
114
132
 
133
+ # When
115
134
  task()
116
135
 
117
- task_metric_names = ["FRAME_RMS", "FRAME_AVERAGE"]
118
- for metric_name in task_metric_names:
119
- for modstate in range(1, num_modstates + 1):
120
- for task_type in l0_quality_task_types:
121
- tags = [VispTag.quality(metric_name), VispTag.quality_task(task_type)]
122
- if num_modstates > 1:
123
- tags.append(VispTag.modstate(modstate))
124
- files = list(task.read(tags))
125
- assert len(files) == 1
126
-
127
- global_metric_names = ["DATASET_AVERAGE", "DATASET_RMS"]
128
- for metric_name in global_metric_names:
129
- files = list(task.read(tags=[VispTag.quality(metric_name)]))
130
- assert len(files) > 0
136
+ # Then
137
+ tags = [Tag.quality("GENERIC")]
138
+ metrics: list[QualityMetric] = list(
139
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
140
+ )
141
+ dataset_metric_codes = ["DATASET_AVERAGE", "DATASET_RMS"]
142
+ frame_metric_codes = ["FRAME_AVERAGE", "FRAME_RMS"]
143
+ dataset_metrics = [metric for metric in metrics if metric.metric_code in dataset_metric_codes]
144
+ frame_metrics = [metric for metric in metrics if metric.metric_code in frame_metric_codes]
145
+ # 2 metrics, no segregation by task
146
+ assert len(dataset_metrics) == 2
147
+ for metric_code in dataset_metric_codes:
148
+ # make sure one metric code of each type
149
+ assert len([metric for metric in dataset_metrics if metric.metric_code == metric_code]) == 1
150
+ # 2 metrics, 2 task types (LAMP_GAIN and DARK)
151
+ assert len(frame_metrics) == 2 * 2
152
+ for metric_code in frame_metric_codes:
153
+ # make sure two metric codes of each type
154
+ assert len([metric for metric in frame_metrics if metric.metric_code == metric_code]) == 2
155
+ for facet in l0_quality_task_types:
156
+ # make sure two facets of each type
157
+ assert len([metric for metric in frame_metrics if metric.facet == facet]) == 2
131
158
 
132
159
 
133
160
  @pytest.mark.parametrize("pol_mode", ["observe_polarimetric", "observe_intensity"])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.4.4
3
+ Version: 5.5.0
4
4
  Summary: Science processing code for the ViSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==12.9.0
16
+ Requires-Dist: dkist-processing-common==12.10.0
17
17
  Requires-Dist: dkist-processing-math==2.2.1
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.3.0
@@ -111,13 +111,13 @@ Requires-Dist: asyncpg==0.31.0; extra == "frozen"
111
111
  Requires-Dist: attrs==26.1.0; extra == "frozen"
112
112
  Requires-Dist: babel==2.18.0; extra == "frozen"
113
113
  Requires-Dist: billiard==4.2.4; extra == "frozen"
114
- Requires-Dist: boto3==1.42.80; extra == "frozen"
115
- Requires-Dist: botocore==1.42.80; extra == "frozen"
114
+ Requires-Dist: boto3==1.42.82; extra == "frozen"
115
+ Requires-Dist: botocore==1.42.82; extra == "frozen"
116
116
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
117
117
  Requires-Dist: celery==5.6.3; extra == "frozen"
118
118
  Requires-Dist: certifi==2026.2.25; extra == "frozen"
119
119
  Requires-Dist: cffi==2.0.0; extra == "frozen"
120
- Requires-Dist: charset-normalizer==3.4.6; extra == "frozen"
120
+ Requires-Dist: charset-normalizer==3.4.7; extra == "frozen"
121
121
  Requires-Dist: click==8.3.1; extra == "frozen"
122
122
  Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
123
123
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
@@ -132,11 +132,11 @@ Requires-Dist: dacite==1.9.2; extra == "frozen"
132
132
  Requires-Dist: decorator==5.2.1; extra == "frozen"
133
133
  Requires-Dist: dill==0.4.1; extra == "frozen"
134
134
  Requires-Dist: dkist-header-validator==5.3.0; extra == "frozen"
135
- Requires-Dist: dkist-processing-common==12.9.0; extra == "frozen"
135
+ Requires-Dist: dkist-processing-common==12.10.0; extra == "frozen"
136
136
  Requires-Dist: dkist-processing-core==7.1.0; extra == "frozen"
137
137
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
138
138
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
139
- Requires-Dist: dkist-processing-visp==5.4.4; extra == "frozen"
139
+ Requires-Dist: dkist-processing-visp==5.5.0; extra == "frozen"
140
140
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
141
141
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
142
142
  Requires-Dist: dkist_fits_specifications==4.23.0; extra == "frozen"
@@ -150,7 +150,7 @@ Requires-Dist: fonttools==4.62.1; extra == "frozen"
150
150
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
151
151
  Requires-Dist: fsspec==2026.3.0; extra == "frozen"
152
152
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
153
- Requires-Dist: googleapis-common-protos==1.73.1; extra == "frozen"
153
+ Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
154
154
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
155
155
  Requires-Dist: greenback==1.3.0; extra == "frozen"
156
156
  Requires-Dist: greenlet==3.3.2; extra == "frozen"
@@ -182,7 +182,7 @@ Requires-Dist: markdown-it-py==4.0.0; extra == "frozen"
182
182
  Requires-Dist: matplotlib==3.10.8; extra == "frozen"
183
183
  Requires-Dist: mdurl==0.1.2; extra == "frozen"
184
184
  Requires-Dist: methodtools==0.4.7; extra == "frozen"
185
- Requires-Dist: more-itertools==10.8.0; extra == "frozen"
185
+ Requires-Dist: more-itertools==11.0.1; extra == "frozen"
186
186
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
187
187
  Requires-Dist: msgspec==0.20.0; extra == "frozen"
188
188
  Requires-Dist: multidict==6.7.1; extra == "frozen"
@@ -1,4 +1,4 @@
1
- dkist-processing-common==12.9.0
1
+ dkist-processing-common==12.10.0
2
2
  dkist-processing-math==2.2.1
3
3
  dkist-processing-pac==3.1.1
4
4
  dkist-header-validator==5.3.0
@@ -77,13 +77,13 @@ asyncpg==0.31.0
77
77
  attrs==26.1.0
78
78
  babel==2.18.0
79
79
  billiard==4.2.4
80
- boto3==1.42.80
81
- botocore==1.42.80
80
+ boto3==1.42.82
81
+ botocore==1.42.82
82
82
  cadwyn==5.4.6
83
83
  celery==5.6.3
84
84
  certifi==2026.2.25
85
85
  cffi==2.0.0
86
- charset-normalizer==3.4.6
86
+ charset-normalizer==3.4.7
87
87
  click==8.3.1
88
88
  click-didyoumean==0.3.1
89
89
  click-plugins==1.1.1.2
@@ -98,11 +98,11 @@ dacite==1.9.2
98
98
  decorator==5.2.1
99
99
  dill==0.4.1
100
100
  dkist-header-validator==5.3.0
101
- dkist-processing-common==12.9.0
101
+ dkist-processing-common==12.10.0
102
102
  dkist-processing-core==7.1.0
103
103
  dkist-processing-math==2.2.1
104
104
  dkist-processing-pac==3.1.1
105
- dkist-processing-visp==5.4.4
105
+ dkist-processing-visp==5.5.0
106
106
  dkist-service-configuration==4.3.0
107
107
  dkist-spectral-lines==3.0.0
108
108
  dkist_fits_specifications==4.23.0
@@ -116,7 +116,7 @@ fonttools==4.62.1
116
116
  frozenlist==1.8.0
117
117
  fsspec==2026.3.0
118
118
  globus-sdk==4.5.0
119
- googleapis-common-protos==1.73.1
119
+ googleapis-common-protos==1.74.0
120
120
  gqlclient==1.2.3
121
121
  greenback==1.3.0
122
122
  greenlet==3.3.2
@@ -148,7 +148,7 @@ markdown-it-py==4.0.0
148
148
  matplotlib==3.10.8
149
149
  mdurl==0.1.2
150
150
  methodtools==0.4.7
151
- more-itertools==10.8.0
151
+ more-itertools==11.0.1
152
152
  moviepy==2.1.2
153
153
  msgspec==0.20.0
154
154
  multidict==6.7.1
@@ -9,8 +9,8 @@ exclude = ["build*"]
9
9
 
10
10
  [tool.dkist-dev-tools]
11
11
  # Most recently frozen version by dkist-dev-tools
12
- version = "5.4.4"
13
- date = 2026-04-01T12:09:31.587252
12
+ version = "5.5.0"
13
+ date = 2026-04-02T20:13:54.506252
14
14
 
15
15
  [project]
16
16
  dynamic = ["version"]
@@ -26,7 +26,7 @@ classifiers = [
26
26
  "Programming Language :: Python :: 3.13",
27
27
  ]
28
28
  dependencies = [
29
- "dkist-processing-common == 12.9.0",
29
+ "dkist-processing-common == 12.10.0",
30
30
  "dkist-processing-math == 2.2.1",
31
31
  "dkist-processing-pac == 3.1.1",
32
32
  "dkist-header-validator == 5.3.0",
@@ -139,13 +139,13 @@ frozen = [
139
139
  "attrs == 26.1.0",
140
140
  "babel == 2.18.0",
141
141
  "billiard == 4.2.4",
142
- "boto3 == 1.42.80",
143
- "botocore == 1.42.80",
142
+ "boto3 == 1.42.82",
143
+ "botocore == 1.42.82",
144
144
  "cadwyn == 5.4.6",
145
145
  "celery == 5.6.3",
146
146
  "certifi == 2026.2.25",
147
147
  "cffi == 2.0.0",
148
- "charset-normalizer == 3.4.6",
148
+ "charset-normalizer == 3.4.7",
149
149
  "click == 8.3.1",
150
150
  "click-didyoumean == 0.3.1",
151
151
  "click-plugins == 1.1.1.2",
@@ -160,11 +160,11 @@ frozen = [
160
160
  "decorator == 5.2.1",
161
161
  "dill == 0.4.1",
162
162
  "dkist-header-validator == 5.3.0",
163
- "dkist-processing-common == 12.9.0",
163
+ "dkist-processing-common == 12.10.0",
164
164
  "dkist-processing-core == 7.1.0",
165
165
  "dkist-processing-math == 2.2.1",
166
166
  "dkist-processing-pac == 3.1.1",
167
- "dkist-processing-visp == 5.4.4",
167
+ "dkist-processing-visp == 5.5.0",
168
168
  "dkist-service-configuration == 4.3.0",
169
169
  "dkist-spectral-lines == 3.0.0",
170
170
  "dkist_fits_specifications == 4.23.0",
@@ -178,7 +178,7 @@ frozen = [
178
178
  "frozenlist == 1.8.0",
179
179
  "fsspec == 2026.3.0",
180
180
  "globus-sdk == 4.5.0",
181
- "googleapis-common-protos == 1.73.1",
181
+ "googleapis-common-protos == 1.74.0",
182
182
  "gqlclient == 1.2.3",
183
183
  "greenback == 1.3.0",
184
184
  "greenlet == 3.3.2",
@@ -210,7 +210,7 @@ frozen = [
210
210
  "matplotlib == 3.10.8",
211
211
  "mdurl == 0.1.2",
212
212
  "methodtools == 0.4.7",
213
- "more-itertools == 10.8.0",
213
+ "more-itertools == 11.0.1",
214
214
  "moviepy == 2.1.2",
215
215
  "msgspec == 0.20.0",
216
216
  "multidict == 6.7.1",