dkist-processing-visp 5.7.2__tar.gz → 5.7.4rc1__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 (120) hide show
  1. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/CHANGELOG.rst +9 -0
  2. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/PKG-INFO +51 -51
  3. dkist_processing_visp-5.7.4rc1/changelog/307.feature.rst +1 -0
  4. dkist_processing_visp-5.7.4rc1/changelog/307.misc.rst +1 -0
  5. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/background_light.py +1 -1
  6. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/dark.py +1 -1
  7. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/geometric.py +1 -1
  8. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/instrument_polarization.py +1 -1
  9. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/lamp.py +1 -1
  10. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/science.py +1 -1
  11. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/solar.py +1 -1
  12. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/visp_base.py +28 -0
  13. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_background_light.py +10 -8
  14. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_dark.py +13 -11
  15. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_geometric.py +13 -10
  16. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_lamp.py +13 -10
  17. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_science.py +13 -10
  18. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_solar.py +13 -9
  19. dkist_processing_visp-5.7.4rc1/dkist_processing_visp/tests/test_visp_base.py +63 -0
  20. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp.egg-info/PKG-INFO +51 -51
  21. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp.egg-info/SOURCES.txt +3 -0
  22. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp.egg-info/requires.txt +50 -50
  23. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/pyproject.toml +52 -52
  24. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/.gitignore +0 -0
  25. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/.pre-commit-config.yaml +0 -0
  26. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/.readthedocs.yml +0 -0
  27. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/.snyk +0 -0
  28. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/README.rst +0 -0
  29. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/SCIENCE_CHANGELOG.rst +0 -0
  30. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/bitbucket-pipelines.yml +0 -0
  31. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/changelog/.gitempty +0 -0
  32. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/__init__.py +0 -0
  33. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/config.py +0 -0
  34. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  35. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/__init__.py +0 -0
  36. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/constants.py +0 -0
  37. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/dataset_extras.py +0 -0
  38. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/fits_access.py +0 -0
  39. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/metric_code.py +0 -0
  40. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/parameters.py +0 -0
  41. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/tags.py +0 -0
  42. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/models/task_name.py +0 -0
  43. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/__init__.py +0 -0
  44. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  45. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/modulator_states.py +0 -0
  46. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  47. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/raster_step.py +0 -0
  48. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/spectrograph_configuration.py +0 -0
  49. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/time.py +0 -0
  50. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
  51. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
  52. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/__init__.py +0 -0
  53. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  54. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  55. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  56. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  57. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  58. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
  59. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  60. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/parse.py +0 -0
  61. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/polcal_as_science.py +0 -0
  62. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  63. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/wavelength_calibration.py +0 -0
  64. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/write_dataset_extras.py +0 -0
  65. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tasks/write_l1.py +0 -0
  66. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/README.rst +0 -0
  67. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/__init__.py +0 -0
  68. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/conftest.py +0 -0
  69. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/header_models.py +0 -0
  70. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  71. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  72. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  73. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  74. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  75. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  76. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  77. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  78. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_downsample.py +0 -0
  79. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_fits_access.py +0 -0
  80. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  81. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  82. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
  83. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_parameters.py +0 -0
  84. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_parse.py +0 -0
  85. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_polcal_as_science.py +0 -0
  86. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_quality.py +0 -0
  87. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  88. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
  89. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_wavelength_calibration.py +0 -0
  90. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_workflows.py +0 -0
  91. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_write_dataset_extras.py +0 -0
  92. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  93. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/workflows/__init__.py +0 -0
  94. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/workflows/l0_processing.py +0 -0
  95. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  96. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
  97. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  98. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  99. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/Makefile +0 -0
  100. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/background_light.rst +0 -0
  101. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/changelog.rst +0 -0
  102. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/conf.py +0 -0
  103. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/dataset_extras.rst +0 -0
  104. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/gain_correction.rst +0 -0
  105. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/geometric.rst +0 -0
  106. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/index.rst +0 -0
  107. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/l0_to_l1_visp.rst +0 -0
  108. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  109. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/landing_page.rst +0 -0
  110. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/make.bat +0 -0
  111. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/polarization_calibration.rst +0 -0
  112. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/requirements.txt +0 -0
  113. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/requirements_table.rst +0 -0
  114. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/science_calibration.rst +0 -0
  115. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/scientific_changelog.rst +0 -0
  116. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/docs/wavelength_calibration.rst +0 -0
  117. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/licenses/LICENSE.rst +0 -0
  118. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/science_towncrier.sh +0 -0
  119. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/setup.cfg +0 -0
  120. {dkist_processing_visp-5.7.2 → dkist_processing_visp-5.7.4rc1}/towncrier_science.toml +0 -0
@@ -1,3 +1,12 @@
1
+ v5.7.3 (2026-04-27)
2
+ ===================
3
+
4
+ Misc
5
+ ----
6
+
7
+ - Update dkist-fits-specifications to SPEC-0122 revision L. (`#306 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/306>`__)
8
+
9
+
1
10
  v5.7.2 (2026-04-23)
2
11
  ===================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.7.2
3
+ Version: 5.7.4rc1
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,11 +13,11 @@ 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==14.0.1
16
+ Requires-Dist: dkist-processing-common==14.0.2rc2
17
17
  Requires-Dist: dkist-processing-math==2.2.2
18
18
  Requires-Dist: dkist-processing-pac==3.1.2
19
19
  Requires-Dist: dkist-header-validator==5.3.1
20
- Requires-Dist: dkist-fits-specifications==4.24.1
20
+ Requires-Dist: dkist-fits-specifications==4.25.0
21
21
  Requires-Dist: solar-wavelength-calibration==2.0.3
22
22
  Requires-Dist: dkist-service-configuration==4.3.0
23
23
  Requires-Dist: dkist-spectral-lines==3.0.1
@@ -67,7 +67,7 @@ Provides-Extra: frozen
67
67
  Requires-Dist: Deprecated==1.3.1; extra == "frozen"
68
68
  Requires-Dist: ImageIO==2.37.3; extra == "frozen"
69
69
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
70
- Requires-Dist: Mako==1.3.11; extra == "frozen"
70
+ Requires-Dist: Mako==1.3.12; extra == "frozen"
71
71
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
72
72
  Requires-Dist: PeakUtils==1.3.5; extra == "frozen"
73
73
  Requires-Dist: PyJWT==2.12.1; extra == "frozen"
@@ -91,12 +91,12 @@ Requires-Dist: annotated-types==0.7.0; extra == "frozen"
91
91
  Requires-Dist: anyio==4.13.0; extra == "frozen"
92
92
  Requires-Dist: apache-airflow==3.1.8; extra == "frozen"
93
93
  Requires-Dist: apache-airflow-core==3.1.8; extra == "frozen"
94
- Requires-Dist: apache-airflow-providers-celery==3.18.0; extra == "frozen"
94
+ Requires-Dist: apache-airflow-providers-celery==3.19.0; extra == "frozen"
95
95
  Requires-Dist: apache-airflow-providers-common-compat==1.14.3; extra == "frozen"
96
96
  Requires-Dist: apache-airflow-providers-common-io==1.7.2; extra == "frozen"
97
- Requires-Dist: apache-airflow-providers-common-sql==1.34.0; extra == "frozen"
97
+ Requires-Dist: apache-airflow-providers-common-sql==1.35.0; extra == "frozen"
98
98
  Requires-Dist: apache-airflow-providers-postgres==6.6.3; extra == "frozen"
99
- Requires-Dist: apache-airflow-providers-smtp==2.4.5; extra == "frozen"
99
+ Requires-Dist: apache-airflow-providers-smtp==3.0.0; extra == "frozen"
100
100
  Requires-Dist: apache-airflow-providers-standard==1.12.3; extra == "frozen"
101
101
  Requires-Dist: apache-airflow-task-sdk==1.1.8; extra == "frozen"
102
102
  Requires-Dist: argcomplete==3.6.3; extra == "frozen"
@@ -106,13 +106,13 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
106
106
  Requires-Dist: asgiref==3.11.1; extra == "frozen"
107
107
  Requires-Dist: asteval==1.0.8; extra == "frozen"
108
108
  Requires-Dist: astropy==7.0.2; extra == "frozen"
109
- Requires-Dist: astropy-iers-data==0.2026.4.20.0.58.15; extra == "frozen"
109
+ Requires-Dist: astropy-iers-data==0.2026.5.4.1.4.54; extra == "frozen"
110
110
  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.95; extra == "frozen"
115
- Requires-Dist: botocore==1.42.95; extra == "frozen"
114
+ Requires-Dist: boto3==1.43.3; extra == "frozen"
115
+ Requires-Dist: botocore==1.43.3; 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.4.22; extra == "frozen"
@@ -126,19 +126,19 @@ Requires-Dist: colorlog==6.10.1; extra == "frozen"
126
126
  Requires-Dist: contourpy==1.3.3; extra == "frozen"
127
127
  Requires-Dist: cron_descriptor==2.0.8; extra == "frozen"
128
128
  Requires-Dist: croniter==6.2.2; extra == "frozen"
129
- Requires-Dist: cryptography==46.0.7; extra == "frozen"
129
+ Requires-Dist: cryptography==47.0.0; extra == "frozen"
130
130
  Requires-Dist: cycler==0.12.1; extra == "frozen"
131
131
  Requires-Dist: decorator==5.2.1; extra == "frozen"
132
132
  Requires-Dist: dill==0.4.1; extra == "frozen"
133
133
  Requires-Dist: dkist-header-validator==5.3.1; extra == "frozen"
134
- Requires-Dist: dkist-processing-common==14.0.1; extra == "frozen"
134
+ Requires-Dist: dkist-processing-common==14.0.2rc2; extra == "frozen"
135
135
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
136
136
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
137
137
  Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
138
- Requires-Dist: dkist-processing-visp==5.7.2; extra == "frozen"
138
+ Requires-Dist: dkist-processing-visp==5.7.4rc1; extra == "frozen"
139
139
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
140
140
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
141
- Requires-Dist: dkist_fits_specifications==4.24.1; extra == "frozen"
141
+ Requires-Dist: dkist_fits_specifications==4.25.0; extra == "frozen"
142
142
  Requires-Dist: dnspython==2.8.0; extra == "frozen"
143
143
  Requires-Dist: email-validator==2.3.0; extra == "frozen"
144
144
  Requires-Dist: fastapi==0.117.1; extra == "frozen"
@@ -147,12 +147,12 @@ Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
147
147
  Requires-Dist: flower==2.0.1; extra == "frozen"
148
148
  Requires-Dist: fonttools==4.62.1; extra == "frozen"
149
149
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
150
- Requires-Dist: fsspec==2026.3.0; extra == "frozen"
150
+ Requires-Dist: fsspec==2026.4.0; extra == "frozen"
151
151
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
152
152
  Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
153
153
  Requires-Dist: gqlclient==2.0.0; extra == "frozen"
154
154
  Requires-Dist: greenback==1.3.0; extra == "frozen"
155
- Requires-Dist: greenlet==3.4.0; extra == "frozen"
155
+ Requires-Dist: greenlet==3.5.0; extra == "frozen"
156
156
  Requires-Dist: grpcio==1.80.0; extra == "frozen"
157
157
  Requires-Dist: h11==0.16.0; extra == "frozen"
158
158
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
@@ -178,7 +178,7 @@ Requires-Dist: lmfit==1.3.4; extra == "frozen"
178
178
  Requires-Dist: lockfile==0.12.2; extra == "frozen"
179
179
  Requires-Dist: loguru==0.7.3; extra == "frozen"
180
180
  Requires-Dist: markdown-it-py==4.0.0; extra == "frozen"
181
- Requires-Dist: matplotlib==3.10.8; extra == "frozen"
181
+ Requires-Dist: matplotlib==3.10.9; extra == "frozen"
182
182
  Requires-Dist: mdurl==0.1.2; extra == "frozen"
183
183
  Requires-Dist: methodtools==0.4.7; extra == "frozen"
184
184
  Requires-Dist: more-itertools==11.0.2; extra == "frozen"
@@ -190,39 +190,39 @@ Requires-Dist: nbformat==5.10.4; extra == "frozen"
190
190
  Requires-Dist: networkx==3.6.1; extra == "frozen"
191
191
  Requires-Dist: numpy==2.2.5; extra == "frozen"
192
192
  Requires-Dist: object-clerk==1.0.0; extra == "frozen"
193
- Requires-Dist: opentelemetry-api==1.41.0; extra == "frozen"
194
- Requires-Dist: opentelemetry-exporter-otlp==1.41.0; extra == "frozen"
195
- Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.41.0; extra == "frozen"
196
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.41.0; extra == "frozen"
197
- Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.41.0; extra == "frozen"
198
- Requires-Dist: opentelemetry-instrumentation==0.62b0; extra == "frozen"
199
- Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.62b0; extra == "frozen"
200
- Requires-Dist: opentelemetry-instrumentation-asgi==0.62b0; extra == "frozen"
201
- Requires-Dist: opentelemetry-instrumentation-botocore==0.62b0; extra == "frozen"
202
- Requires-Dist: opentelemetry-instrumentation-celery==0.62b0; extra == "frozen"
203
- Requires-Dist: opentelemetry-instrumentation-dbapi==0.62b0; extra == "frozen"
204
- Requires-Dist: opentelemetry-instrumentation-fastapi==0.62b0; extra == "frozen"
205
- Requires-Dist: opentelemetry-instrumentation-pika==0.62b0; extra == "frozen"
206
- Requires-Dist: opentelemetry-instrumentation-psycopg2==0.62b0; extra == "frozen"
207
- Requires-Dist: opentelemetry-instrumentation-pymongo==0.62b0; extra == "frozen"
208
- Requires-Dist: opentelemetry-instrumentation-redis==0.62b0; extra == "frozen"
209
- Requires-Dist: opentelemetry-instrumentation-requests==0.62b0; extra == "frozen"
210
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.62b0; extra == "frozen"
211
- Requires-Dist: opentelemetry-instrumentation-system-metrics==0.62b0; extra == "frozen"
193
+ Requires-Dist: opentelemetry-api==1.41.1; extra == "frozen"
194
+ Requires-Dist: opentelemetry-exporter-otlp==1.41.1; extra == "frozen"
195
+ Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.41.1; extra == "frozen"
196
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.41.1; extra == "frozen"
197
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.41.1; extra == "frozen"
198
+ Requires-Dist: opentelemetry-instrumentation==0.62b1; extra == "frozen"
199
+ Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.62b1; extra == "frozen"
200
+ Requires-Dist: opentelemetry-instrumentation-asgi==0.62b1; extra == "frozen"
201
+ Requires-Dist: opentelemetry-instrumentation-botocore==0.62b1; extra == "frozen"
202
+ Requires-Dist: opentelemetry-instrumentation-celery==0.62b1; extra == "frozen"
203
+ Requires-Dist: opentelemetry-instrumentation-dbapi==0.62b1; extra == "frozen"
204
+ Requires-Dist: opentelemetry-instrumentation-fastapi==0.62b1; extra == "frozen"
205
+ Requires-Dist: opentelemetry-instrumentation-pika==0.62b1; extra == "frozen"
206
+ Requires-Dist: opentelemetry-instrumentation-psycopg2==0.62b1; extra == "frozen"
207
+ Requires-Dist: opentelemetry-instrumentation-pymongo==0.62b1; extra == "frozen"
208
+ Requires-Dist: opentelemetry-instrumentation-redis==0.62b1; extra == "frozen"
209
+ Requires-Dist: opentelemetry-instrumentation-requests==0.62b1; extra == "frozen"
210
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.62b1; extra == "frozen"
211
+ Requires-Dist: opentelemetry-instrumentation-system-metrics==0.62b1; extra == "frozen"
212
212
  Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
213
- Requires-Dist: opentelemetry-proto==1.41.0; extra == "frozen"
214
- Requires-Dist: opentelemetry-sdk==1.41.0; extra == "frozen"
215
- Requires-Dist: opentelemetry-semantic-conventions==0.62b0; extra == "frozen"
216
- Requires-Dist: opentelemetry-util-http==0.62b0; extra == "frozen"
213
+ Requires-Dist: opentelemetry-proto==1.41.1; extra == "frozen"
214
+ Requires-Dist: opentelemetry-sdk==1.41.1; extra == "frozen"
215
+ Requires-Dist: opentelemetry-semantic-conventions==0.62b1; extra == "frozen"
216
+ Requires-Dist: opentelemetry-util-http==0.62b1; extra == "frozen"
217
217
  Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
218
- Requires-Dist: packaging==26.1; extra == "frozen"
218
+ Requires-Dist: packaging==26.2; extra == "frozen"
219
219
  Requires-Dist: pandas==3.0.2; extra == "frozen"
220
220
  Requires-Dist: parfive==2.3.1; extra == "frozen"
221
- Requires-Dist: pathspec==1.1.0; extra == "frozen"
221
+ Requires-Dist: pathspec==1.1.1; extra == "frozen"
222
222
  Requires-Dist: pendulum==3.2.0; extra == "frozen"
223
223
  Requires-Dist: pika==1.3.2; extra == "frozen"
224
224
  Requires-Dist: pillow==10.4.0; extra == "frozen"
225
- Requires-Dist: pip==26.0.1; extra == "frozen"
225
+ Requires-Dist: pip==26.1.1; extra == "frozen"
226
226
  Requires-Dist: platformdirs==4.9.6; extra == "frozen"
227
227
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
228
228
  Requires-Dist: pooch==1.9.0; extra == "frozen"
@@ -243,17 +243,17 @@ Requires-Dist: pyparsing==3.3.2; extra == "frozen"
243
243
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
244
244
  Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
245
245
  Requires-Dist: python-dotenv==1.2.2; extra == "frozen"
246
- Requires-Dist: python-multipart==0.0.26; extra == "frozen"
246
+ Requires-Dist: python-multipart==0.0.27; extra == "frozen"
247
247
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
248
- Requires-Dist: pytz==2026.1.post1; extra == "frozen"
248
+ Requires-Dist: pytz==2026.2; extra == "frozen"
249
249
  Requires-Dist: redis==6.4.0; extra == "frozen"
250
250
  Requires-Dist: referencing==0.37.0; extra == "frozen"
251
251
  Requires-Dist: requests==2.33.1; extra == "frozen"
252
252
  Requires-Dist: rich==15.0.0; extra == "frozen"
253
- Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
253
+ Requires-Dist: rich-argparse==1.8.0; extra == "frozen"
254
254
  Requires-Dist: rich-toolkit==0.19.7; extra == "frozen"
255
255
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
256
- Requires-Dist: s3transfer==0.16.1; extra == "frozen"
256
+ Requires-Dist: s3transfer==0.17.0; extra == "frozen"
257
257
  Requires-Dist: scikit-image==0.25.2; extra == "frozen"
258
258
  Requires-Dist: scikit-learn==1.6.1; extra == "frozen"
259
259
  Requires-Dist: scipy==1.15.3; extra == "frozen"
@@ -275,14 +275,14 @@ Requires-Dist: tenacity==8.5.0; extra == "frozen"
275
275
  Requires-Dist: termcolor==3.3.0; extra == "frozen"
276
276
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
277
277
  Requires-Dist: threadpoolctl==3.6.0; extra == "frozen"
278
- Requires-Dist: tifffile==2026.4.11; extra == "frozen"
278
+ Requires-Dist: tifffile==2026.5.2; extra == "frozen"
279
279
  Requires-Dist: tornado==6.5.5; extra == "frozen"
280
280
  Requires-Dist: tqdm==4.67.3; extra == "frozen"
281
281
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
282
- Requires-Dist: typer==0.24.2; extra == "frozen"
282
+ Requires-Dist: typer==0.25.1; extra == "frozen"
283
283
  Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
284
284
  Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
285
- Requires-Dist: tzdata==2026.1; extra == "frozen"
285
+ Requires-Dist: tzdata==2026.2; extra == "frozen"
286
286
  Requires-Dist: tzlocal==5.3.1; extra == "frozen"
287
287
  Requires-Dist: uc-micro-py==2.0.0; extra == "frozen"
288
288
  Requires-Dist: uncertainties==3.2.3; extra == "frozen"
@@ -294,7 +294,7 @@ Requires-Dist: uvloop==0.22.1; extra == "frozen"
294
294
  Requires-Dist: vine==5.1.0; extra == "frozen"
295
295
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
296
296
  Requires-Dist: watchfiles==1.1.1; extra == "frozen"
297
- Requires-Dist: wcwidth==0.6.0; extra == "frozen"
297
+ Requires-Dist: wcwidth==0.7.0; extra == "frozen"
298
298
  Requires-Dist: websockets==16.0; extra == "frozen"
299
299
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
300
300
  Requires-Dist: wrapt==2.1.2; extra == "frozen"
@@ -0,0 +1 @@
1
+ Add `quality_write_intermediate_task_type_counts` method to `VispTaskBase` workflow task.
@@ -0,0 +1 @@
1
+ Update dkist-processing-common to 14.0.2 which converts TASK_TYPES quality metric to the new methodology.
@@ -116,7 +116,7 @@ class BackgroundLightCalibration(
116
116
  gc.collect()
117
117
 
118
118
  with self.telemetry_span("Computing and logging quality metrics"):
119
- self.quality_store_task_type_counts(
119
+ self.quality_write_intermediate_task_type_counts(
120
120
  task_type=VispTaskName.background.value,
121
121
  total_frames=num_used_polcal_files,
122
122
  )
@@ -102,7 +102,7 @@ class DarkCalibration(VispTaskBase, BeamAccessMixin, QualityMixin):
102
102
  ],
103
103
  )
104
104
  unused_count = int(no_of_raw_dark_frames - (total_dark_frames_used / 2))
105
- self.quality_store_task_type_counts(
105
+ self.quality_write_intermediate_task_type_counts(
106
106
  task_type=TaskName.dark.value,
107
107
  total_frames=no_of_raw_dark_frames,
108
108
  frames_not_used=unused_count,
@@ -140,7 +140,7 @@ class GeometricCalibration(
140
140
  ],
141
141
  )
142
142
 
143
- self.quality_store_task_type_counts(
143
+ self.quality_write_intermediate_task_type_counts(
144
144
  task_type=TaskName.geometric.value, total_frames=no_of_raw_geo_frames
145
145
  )
146
146
 
@@ -172,7 +172,7 @@ class InstrumentPolarizationCalibration(
172
172
  ],
173
173
  )
174
174
 
175
- self.quality_store_task_type_counts(
175
+ self.quality_write_intermediate_task_type_counts(
176
176
  task_type=TaskName.polcal.value, total_frames=no_of_raw_polcal_frames
177
177
  )
178
178
 
@@ -121,6 +121,6 @@ class LampCalibration(
121
121
  ],
122
122
  )
123
123
 
124
- self.quality_store_task_type_counts(
124
+ self.quality_write_intermediate_task_type_counts(
125
125
  task_type=TaskName.lamp_gain.value, total_frames=no_of_raw_lamp_frames
126
126
  )
@@ -159,7 +159,7 @@ class ScienceCalibration(
159
159
  ],
160
160
  )
161
161
 
162
- self.quality_store_task_type_counts(
162
+ self.quality_write_intermediate_task_type_counts(
163
163
  task_type=TaskName.observe.value, total_frames=no_of_raw_science_frames
164
164
  )
165
165
 
@@ -311,7 +311,7 @@ class SolarCalibration(
311
311
  ],
312
312
  )
313
313
 
314
- self.quality_store_task_type_counts(
314
+ self.quality_write_intermediate_task_type_counts(
315
315
  task_type=TaskName.solar_gain.value, total_frames=no_of_raw_solar_frames
316
316
  )
317
317
 
@@ -2,10 +2,14 @@
2
2
 
3
3
  from abc import ABC
4
4
 
5
+ from dkist_processing_common.codecs.basemodel import basemodel_encoder
6
+ from dkist_processing_common.models.metric_code import MetricCode
7
+ from dkist_processing_common.models.quality import TaskCount
5
8
  from dkist_processing_common.tasks import WorkflowTaskBase
6
9
 
7
10
  from dkist_processing_visp.models.constants import VispConstants
8
11
  from dkist_processing_visp.models.parameters import VispParameters
12
+ from dkist_processing_visp.models.tags import VispTag
9
13
 
10
14
 
11
15
  class VispTaskBase(WorkflowTaskBase, ABC):
@@ -47,3 +51,27 @@ class VispTaskBase(WorkflowTaskBase, ABC):
47
51
  wavelength=self.constants.wavelength,
48
52
  arm_id=self.constants.arm_id,
49
53
  )
54
+
55
+ def quality_write_intermediate_task_type_counts(
56
+ self, task_type: str, total_frames: int, frames_not_used: int = 0
57
+ ):
58
+ """
59
+ Write intermediate task type data.
60
+
61
+ Parameters
62
+ ----------
63
+ task_type:
64
+ task type as listed in the headers
65
+ total_frames:
66
+ total number of frames supplied of the given task type
67
+ frames_not_used:
68
+ if some frames aren't used, how many
69
+ """
70
+ task_count = TaskCount(
71
+ task_type=task_type,
72
+ total_frames=total_frames,
73
+ frames_not_used=frames_not_used,
74
+ )
75
+ self.write(
76
+ task_count, tags=VispTag.quality(MetricCode.task_types), encoder=basemodel_encoder
77
+ )
@@ -1,5 +1,4 @@
1
1
  import datetime
2
- import json
3
2
  from typing import Callable
4
3
 
5
4
  import numpy as np
@@ -10,7 +9,9 @@ from dkist_data_simulator.spec122 import Spec122Dataset
10
9
  from dkist_header_validator import spec122_validator
11
10
  from dkist_header_validator.translator import translate_spec122_to_spec214_l0
12
11
  from dkist_processing_common._util.scratch import WorkflowFileSystem
12
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
13
13
  from dkist_processing_common.codecs.fits import fits_array_encoder
14
+ from dkist_processing_common.models.quality import TaskCount
14
15
  from dkist_processing_common.models.task_name import TaskName
15
16
  from dkist_processing_pac.fitter.fitter_parameters import PolcalDresserParameters
16
17
  from dkist_processing_pac.input_data.drawer import Drawer
@@ -425,13 +426,14 @@ def test_background_light_calibration_task(
425
426
  assert len(beam_2_bg) == 1
426
427
  assert beam_2_bg[0].exists()
427
428
 
428
- quality_record = list(task.read(tags=[VispTag.quality("TASK_TYPES")]))
429
- assert len(quality_record) == 1
430
- with open(quality_record[0], "r") as f:
431
- data = json.load(f)
432
- assert data["task_type"] == VispTaskName.background.value
433
- assert data["total_frames"] == total_polcal_files - num_polcal_dark_files
434
- assert data["frames_not_used"] == 0
429
+ task_counts: list[TaskCount] = list(
430
+ task.read(tags=VispTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
431
+ )
432
+ assert isinstance(task_counts, list)
433
+ assert len(task_counts) == 1
434
+ assert task_counts[0].task_type == VispTaskName.background.value
435
+ assert task_counts[0].total_frames == total_polcal_files - num_polcal_dark_files
436
+ assert task_counts[0].frames_not_used == 0
435
437
 
436
438
  # We don't currently test the actual accuracy of the calibration. We might never want to do this
437
439
  # beam_1_data = fits.open(beam_1_bg[0])[0].data
@@ -1,11 +1,11 @@
1
- import json
2
1
  from functools import partial
3
2
 
4
3
  import numpy as np
5
4
  import pytest
6
5
  from astropy.io import fits
7
6
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
- from dkist_processing_common.models.tags import Tag
7
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
8
+ from dkist_processing_common.models.quality import TaskCount
9
9
 
10
10
  from dkist_processing_visp.models.tags import VispTag
11
11
  from dkist_processing_visp.tasks.dark import DarkCalibration
@@ -156,12 +156,14 @@ def test_dark_calibration_task(
156
156
  )
157
157
  assert len(list(unused_time_read)) == 0
158
158
 
159
- quality_files = task.read(tags=[Tag.quality("TASK_TYPES")])
160
- for file in quality_files:
161
- with file.open() as f:
162
- data = json.load(f)
163
- assert isinstance(data, dict)
164
- assert data["total_frames"] == task.scratch.count_all(
165
- tags=[VispTag.input(), VispTag.frame(), VispTag.task_dark()]
166
- )
167
- assert data["frames_not_used"] == num_frames_per
159
+ task_counts: list[TaskCount] = list(
160
+ task.read(tags=VispTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
161
+ )
162
+ assert isinstance(task_counts, list)
163
+ assert len(task_counts) == 1
164
+ assert task_counts[0].task_type == "DARK"
165
+ total_frames = task.scratch.count_all(
166
+ tags=[VispTag.input(), VispTag.frame(), VispTag.task_dark()]
167
+ )
168
+ assert task_counts[0].total_frames == total_frames
169
+ assert task_counts[0].frames_not_used == num_frames_per
@@ -1,12 +1,12 @@
1
- import json
2
1
  from functools import partial
3
2
  from typing import Callable
4
3
 
5
4
  import numpy as np
6
5
  import pytest
7
6
  from dkist_processing_common._util.scratch import WorkflowFileSystem
7
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
8
8
  from dkist_processing_common.codecs.fits import fits_array_decoder
9
- from dkist_processing_common.models.tags import Tag
9
+ from dkist_processing_common.models.quality import TaskCount
10
10
  from dkist_processing_math import transform
11
11
 
12
12
  from dkist_processing_visp.models.tags import VispTag
@@ -286,14 +286,17 @@ def test_geometric_task(
286
286
  )
287
287
  assert array.shape == (2,)
288
288
 
289
- quality_files = task.read(tags=[Tag.quality("TASK_TYPES")])
290
- for file in quality_files:
291
- with file.open() as f:
292
- data = json.load(f)
293
- assert isinstance(data, dict)
294
- assert data["total_frames"] == task.scratch.count_all(
295
- tags=[VispTag.input(), VispTag.frame(), VispTag.task_solar_gain()]
296
- )
289
+ task_counts: list[TaskCount] = list(
290
+ task.read(tags=VispTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
291
+ )
292
+ assert isinstance(task_counts, list)
293
+ assert len(task_counts) == 1
294
+ assert task_counts[0].task_type == "GEOMETRIC"
295
+ total_frames = task.scratch.count_all(
296
+ tags=[VispTag.input(), VispTag.frame(), VispTag.task_solar_gain()]
297
+ )
298
+ assert task_counts[0].total_frames == total_frames
299
+ assert task_counts[0].frames_not_used == 0
297
300
 
298
301
 
299
302
  def test_basic_corrections(geometric_calibration_task, assign_input_dataset_doc_to_task):
@@ -1,11 +1,11 @@
1
- import json
2
1
  from functools import partial
3
2
 
4
3
  import numpy as np
5
4
  import pytest
6
5
  from astropy.io import fits
7
6
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
- from dkist_processing_common.models.tags import Tag
7
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
8
+ from dkist_processing_common.models.quality import TaskCount
9
9
 
10
10
  from dkist_processing_visp.models.tags import VispTag
11
11
  from dkist_processing_visp.tasks.lamp import LampCalibration
@@ -150,11 +150,14 @@ def test_lamp_calibration_task(
150
150
  hdu = hdul[0]
151
151
  np.testing.assert_allclose(hdu.data, np.ones(intermediate_shape) * expected_signal)
152
152
 
153
- quality_files = task.read(tags=[Tag.quality("TASK_TYPES")])
154
- for file in quality_files:
155
- with file.open() as f:
156
- data = json.load(f)
157
- assert isinstance(data, dict)
158
- assert data["total_frames"] == task.scratch.count_all(
159
- tags=[VispTag.input(), VispTag.frame(), VispTag.task_lamp_gain()]
160
- )
153
+ task_counts: list[TaskCount] = list(
154
+ task.read(tags=VispTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
155
+ )
156
+ assert isinstance(task_counts, list)
157
+ assert len(task_counts) == 1
158
+ assert task_counts[0].task_type == "LAMP_GAIN"
159
+ total_frames = task.scratch.count_all(
160
+ tags=[VispTag.input(), VispTag.frame(), VispTag.task_lamp_gain()]
161
+ )
162
+ assert task_counts[0].total_frames == total_frames
163
+ assert task_counts[0].frames_not_used == 0
@@ -1,4 +1,3 @@
1
- import json
2
1
  import random
3
2
  from datetime import datetime
4
3
  from typing import Literal
@@ -10,11 +9,12 @@ from astropy.time import Time
10
9
  from astropy.time import TimeDelta
11
10
  from dkist_header_validator import spec122_validator
12
11
  from dkist_processing_common._util.scratch import WorkflowFileSystem
12
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
13
13
  from dkist_processing_common.codecs.fits import fits_array_encoder
14
14
  from dkist_processing_common.codecs.fits import fits_hdu_decoder
15
15
  from dkist_processing_common.codecs.json import json_encoder
16
16
  from dkist_processing_common.models.fits_access import MetadataKey
17
- from dkist_processing_common.models.tags import Tag
17
+ from dkist_processing_common.models.quality import TaskCount
18
18
 
19
19
  from dkist_processing_visp.models.tags import VispStemName
20
20
  from dkist_processing_visp.models.tags import VispTag
@@ -415,14 +415,17 @@ def test_science_calibration_task(
415
415
  f"CRPIX{spatial_axis_num}A"
416
416
  ] - np.ceil(-offsets[1, 0, 1])
417
417
 
418
- quality_files = task.read(tags=[Tag.quality("TASK_TYPES")])
419
- for file in quality_files:
420
- with file.open() as f:
421
- data = json.load(f)
422
- assert isinstance(data, dict)
423
- assert data["total_frames"] == task.scratch.count_all(
424
- tags=[VispTag.input(), VispTag.frame(), VispTag.task_observe()]
425
- )
418
+ task_counts: list[TaskCount] = list(
419
+ task.read(tags=VispTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
420
+ )
421
+ assert isinstance(task_counts, list)
422
+ assert len(task_counts) == 1
423
+ assert task_counts[0].task_type == "OBSERVE"
424
+ total_frames = task.scratch.count_all(
425
+ tags=[VispTag.input(), VispTag.frame(), VispTag.task_observe()]
426
+ )
427
+ assert task_counts[0].total_frames == total_frames
428
+ assert task_counts[0].frames_not_used == 0
426
429
 
427
430
 
428
431
  @pytest.mark.parametrize("swap_wcs_axes", [pytest.param(False, id="no_swap")])
@@ -1,4 +1,3 @@
1
- import json
2
1
  from functools import partial
3
2
  from typing import Callable
4
3
 
@@ -12,8 +11,10 @@ from astropy.coordinates import EarthLocation
12
11
  from astropy.stats import gaussian_fwhm_to_sigma
13
12
  from astropy.time import Time
14
13
  from dkist_processing_common._util.scratch import WorkflowFileSystem
14
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
15
15
  from dkist_processing_common.codecs.fits import fits_array_decoder
16
16
  from dkist_processing_common.codecs.fits import fits_array_encoder
17
+ from dkist_processing_common.models.quality import TaskCount
17
18
  from dkist_processing_common.models.tags import Tag
18
19
  from scipy.ndimage import gaussian_filter1d
19
20
  from sunpy.coordinates import HeliocentricInertial
@@ -405,14 +406,17 @@ def test_solar_gain_task(
405
406
  # Testing that the ratio is close to 1.0 give us a bit more leeway in the deviation
406
407
  np.testing.assert_allclose(expected_signal / solar_gain, 1.0, atol=1e-2, rtol=1e-2)
407
408
 
408
- quality_files = task.read(tags=[Tag.quality("TASK_TYPES")])
409
- for file in quality_files:
410
- with file.open() as f:
411
- data = json.load(f)
412
- assert isinstance(data, dict)
413
- assert data["total_frames"] == task.scratch.count_all(
414
- tags=[VispTag.input(), VispTag.frame(), VispTag.task_solar_gain()]
415
- )
409
+ task_counts: list[TaskCount] = list(
410
+ task.read(tags=VispTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
411
+ )
412
+ assert isinstance(task_counts, list)
413
+ assert len(task_counts) == 1
414
+ assert task_counts[0].task_type == "SOLAR_GAIN"
415
+ total_frames = task.scratch.count_all(
416
+ tags=[VispTag.input(), VispTag.frame(), VispTag.task_solar_gain()]
417
+ )
418
+ assert task_counts[0].total_frames == total_frames
419
+ assert task_counts[0].frames_not_used == 0
416
420
 
417
421
  first_vignette_quality_files = list(task.read(tags=[Tag.quality("SOLAR_CAL_FIRST_VIGNETTE")]))
418
422
  assert len(first_vignette_quality_files) == 2