dkist-processing-dlnirsp 1.4.6__tar.gz → 1.4.8rc2__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 (119) hide show
  1. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/CHANGELOG.rst +15 -0
  2. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/PKG-INFO +11 -12
  3. dkist_processing_dlnirsp-1.4.8rc2/changelog/178.misc.rst +2 -0
  4. dkist_processing_dlnirsp-1.4.8rc2/dkist_processing_dlnirsp/tasks/quality_metrics.py +52 -0
  5. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_quality.py +0 -87
  6. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp.egg-info/PKG-INFO +11 -12
  7. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp.egg-info/SOURCES.txt +1 -0
  8. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp.egg-info/requires.txt +10 -11
  9. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/pyproject.toml +12 -13
  10. dkist_processing_dlnirsp-1.4.6/dkist_processing_dlnirsp/tasks/quality_metrics.py +0 -173
  11. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/.gitignore +0 -0
  12. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/.pre-commit-config.yaml +0 -0
  13. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/.readthedocs.yml +0 -0
  14. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/.snyk +0 -0
  15. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/README.rst +0 -0
  16. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/SCIENCE_CHANGELOG.rst +0 -0
  17. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/bitbucket-pipelines.yml +0 -0
  18. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/changelog/.gitempty +0 -0
  19. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/__init__.py +0 -0
  20. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/config.py +0 -0
  21. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/dev_scripts/__init__.py +0 -0
  22. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/dev_scripts/test_slitbeam_group_assignment.py +0 -0
  23. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/models/__init__.py +0 -0
  24. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/models/constants.py +0 -0
  25. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/models/fits_access.py +0 -0
  26. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/models/parameters.py +0 -0
  27. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/models/tags.py +0 -0
  28. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/models/task_name.py +0 -0
  29. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/parsers/__init__.py +0 -0
  30. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py +0 -0
  31. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/parsers/dlnirsp_l1_fits_acess.py +0 -0
  32. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/parsers/mosaic.py +0 -0
  33. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/parsers/task.py +0 -0
  34. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/parsers/time.py +0 -0
  35. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/parsers/wcs_corrections.py +0 -0
  36. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/__init__.py +0 -0
  37. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/bad_pixel_map.py +0 -0
  38. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/dark.py +0 -0
  39. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/dlnirsp_base.py +0 -0
  40. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/geometric.py +0 -0
  41. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/ifu_drift.py +0 -0
  42. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/instrument_polarization.py +0 -0
  43. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/l1_output_data.py +0 -0
  44. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/lamp.py +0 -0
  45. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/linearity_correction.py +0 -0
  46. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/mixin/__init__.py +0 -0
  47. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/mixin/corrections.py +0 -0
  48. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/mixin/group_id.py +0 -0
  49. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/movie.py +0 -0
  50. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/parse.py +0 -0
  51. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/polcal_as_science.py +0 -0
  52. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/science.py +0 -0
  53. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/solar.py +0 -0
  54. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/wavelength_calibration.py +0 -0
  55. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/write_dataset_extras.py +0 -0
  56. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tasks/write_l1.py +0 -0
  57. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/__init__.py +0 -0
  58. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/conftest.py +0 -0
  59. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/__init__.py +0 -0
  60. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_linearize_only.py +0 -0
  61. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  62. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  63. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  64. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py +0 -0
  65. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  66. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/local_trial_workflows/translate_files.py +0 -0
  67. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_assemble_quality.py +0 -0
  68. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_bad_pixel_map.py +0 -0
  69. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_corrections.py +0 -0
  70. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_dark.py +0 -0
  71. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_dlnirsp_base.py +0 -0
  72. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py +0 -0
  73. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py +0 -0
  74. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_geometric.py +0 -0
  75. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_group_id.py +0 -0
  76. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_ifu_drift.py +0 -0
  77. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_instrument_polarization_calibration.py +0 -0
  78. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_lamp.py +0 -0
  79. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_linearity_correction.py +0 -0
  80. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_movie.py +0 -0
  81. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_parameters.py +0 -0
  82. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_parse.py +0 -0
  83. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_polcal_as_science.py +0 -0
  84. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_science.py +0 -0
  85. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_solar.py +0 -0
  86. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_trial_create_quality_report.py +0 -0
  87. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_wavelength_calibration.py +0 -0
  88. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_workflows.py +0 -0
  89. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_write_dataset_extras.py +0 -0
  90. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/tests/test_write_l1.py +0 -0
  91. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/workflows/__init__.py +0 -0
  92. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/workflows/l0_processing.py +0 -0
  93. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp/workflows/trial_workflow.py +0 -0
  94. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp.egg-info/dependency_links.txt +0 -0
  95. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp.egg-info/entry_points.txt +0 -0
  96. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/dkist_processing_dlnirsp.egg-info/top_level.txt +0 -0
  97. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/Makefile +0 -0
  98. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/bad_pixel_calibration.rst +0 -0
  99. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/changelog.rst +0 -0
  100. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/conf.py +0 -0
  101. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/dataset_extras.rst +0 -0
  102. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/gain.rst +0 -0
  103. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/geometric.rst +0 -0
  104. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/ifu_drift.rst +0 -0
  105. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/index.rst +0 -0
  106. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/l0_to_l1_dlnirsp.rst +0 -0
  107. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/l0_to_l1_dlnirsp_full-trial.rst +0 -0
  108. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/landing_page.rst +0 -0
  109. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/linearization.rst +0 -0
  110. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/make.bat +0 -0
  111. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/polarization_calibration.rst +0 -0
  112. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/requirements_table.rst +0 -0
  113. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/science_calibration.rst +0 -0
  114. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/scientific_changelog.rst +0 -0
  115. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/docs/wavelength_calibration.rst +0 -0
  116. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/licenses/LICENSE.rst +0 -0
  117. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/science_towncrier.sh +0 -0
  118. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/setup.cfg +0 -0
  119. {dkist_processing_dlnirsp-1.4.6 → dkist_processing_dlnirsp-1.4.8rc2}/towncrier_science.toml +0 -0
@@ -1,3 +1,18 @@
1
+ v1.4.7 (2026-04-20)
2
+ ===================
3
+
4
+ Features
5
+ --------
6
+
7
+ - Remove `DlnirspL1QualityMetrics` workflow task. (`#176 <https://bitbucket.org/dkistdc/dkist-processing-dlnirsp/pull-requests/176>`__)
8
+
9
+
10
+ Misc
11
+ ----
12
+
13
+ - Update dkist-processing-common to 13.0.5, which removes 4 unused quality metric codes: RANGE, NOISE, SENSITIVITY, HISTORICAL. (`#176 <https://bitbucket.org/dkistdc/dkist-processing-dlnirsp/pull-requests/176>`__)
14
+
15
+
1
16
  v1.4.6 (2026-04-17)
2
17
  ===================
3
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 1.4.6
3
+ Version: 1.4.8rc2
4
4
  Summary: Science processing code for the DLNIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -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==13.0.4
16
+ Requires-Dist: dkist-processing-common==13.0.6rc2
17
17
  Requires-Dist: dkist-processing-math==2.2.2
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.3.1
@@ -107,14 +107,14 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
107
107
  Requires-Dist: asgiref==3.11.1; extra == "frozen"
108
108
  Requires-Dist: asteval==1.0.8; extra == "frozen"
109
109
  Requires-Dist: astropy==7.0.2; extra == "frozen"
110
- Requires-Dist: astropy-iers-data==0.2026.4.13.0.58.2; extra == "frozen"
110
+ Requires-Dist: astropy-iers-data==0.2026.4.20.0.58.15; extra == "frozen"
111
111
  Requires-Dist: astropy_healpix==1.1.3; extra == "frozen"
112
112
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
113
113
  Requires-Dist: attrs==26.1.0; extra == "frozen"
114
114
  Requires-Dist: babel==2.18.0; extra == "frozen"
115
115
  Requires-Dist: billiard==4.2.4; extra == "frozen"
116
- Requires-Dist: boto3==1.42.91; extra == "frozen"
117
- Requires-Dist: botocore==1.42.91; extra == "frozen"
116
+ Requires-Dist: boto3==1.42.92; extra == "frozen"
117
+ Requires-Dist: botocore==1.42.92; extra == "frozen"
118
118
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
119
119
  Requires-Dist: celery==5.6.3; extra == "frozen"
120
120
  Requires-Dist: certifi==2026.2.25; extra == "frozen"
@@ -131,15 +131,14 @@ Requires-Dist: cron_descriptor==2.0.8; extra == "frozen"
131
131
  Requires-Dist: croniter==6.2.2; extra == "frozen"
132
132
  Requires-Dist: cryptography==46.0.7; extra == "frozen"
133
133
  Requires-Dist: cycler==0.12.1; extra == "frozen"
134
- Requires-Dist: dacite==1.9.2; extra == "frozen"
135
134
  Requires-Dist: dask==2026.3.0; extra == "frozen"
136
135
  Requires-Dist: dask-image==2025.11.0; extra == "frozen"
137
136
  Requires-Dist: decorator==5.2.1; extra == "frozen"
138
137
  Requires-Dist: dill==0.4.1; extra == "frozen"
139
138
  Requires-Dist: dkist-header-validator==5.3.1; extra == "frozen"
140
- Requires-Dist: dkist-processing-common==13.0.4; extra == "frozen"
139
+ Requires-Dist: dkist-processing-common==13.0.6rc2; extra == "frozen"
141
140
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
142
- Requires-Dist: dkist-processing-dlnirsp==1.4.6; extra == "frozen"
141
+ Requires-Dist: dkist-processing-dlnirsp==1.4.8rc2; extra == "frozen"
143
142
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
144
143
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
145
144
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
@@ -158,7 +157,7 @@ Requires-Dist: fsspec==2026.3.0; extra == "frozen"
158
157
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
159
158
  Requires-Dist: google-crc32c==1.8.0; extra == "frozen"
160
159
  Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
161
- Requires-Dist: gqlclient==1.2.3; extra == "frozen"
160
+ Requires-Dist: gqlclient==2.0.0; extra == "frozen"
162
161
  Requires-Dist: greenback==1.3.0; extra == "frozen"
163
162
  Requires-Dist: greenlet==3.4.0; extra == "frozen"
164
163
  Requires-Dist: grpcio==1.80.0; extra == "frozen"
@@ -247,9 +246,9 @@ Requires-Dist: psutil==7.2.2; extra == "frozen"
247
246
  Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
248
247
  Requires-Dist: pyarrow==23.0.1; extra == "frozen"
249
248
  Requires-Dist: pycparser==3.0; extra == "frozen"
250
- Requires-Dist: pydantic==2.13.2; extra == "frozen"
251
- Requires-Dist: pydantic-settings==2.13.1; extra == "frozen"
252
- Requires-Dist: pydantic_core==2.46.2; extra == "frozen"
249
+ Requires-Dist: pydantic==2.13.3; extra == "frozen"
250
+ Requires-Dist: pydantic-settings==2.14.0; extra == "frozen"
251
+ Requires-Dist: pydantic_core==2.46.3; extra == "frozen"
253
252
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
254
253
  Requires-Dist: pygtrie==2.5.0; extra == "frozen"
255
254
  Requires-Dist: pyparsing==3.3.2; extra == "frozen"
@@ -0,0 +1,2 @@
1
+ Update dkist-processing-common to v13.0.6, which uses gqlclient v2.0 and provides a
2
+ better error for reading/writing with tags=None.
@@ -0,0 +1,52 @@
1
+ """Tasks for computing dataset-wide quality metrics."""
2
+
3
+ from typing import Iterable
4
+
5
+ from dkist_processing_common.tasks import QualityL0Metrics
6
+
7
+ from dkist_processing_dlnirsp.models.constants import DlnirspConstants
8
+ from dkist_processing_dlnirsp.models.tags import DlnirspTag
9
+
10
+ __all__ = ["DlnirspL0QualityMetrics"]
11
+
12
+
13
+ class DlnirspL0QualityMetrics(QualityL0Metrics):
14
+ """
15
+ Task class for collection of DLNIRSP L0 specific quality metrics.
16
+
17
+ Parameters
18
+ ----------
19
+ recipe_run_id : int
20
+ id of the recipe run used to identify the workflow run this task is part of
21
+ workflow_name : str
22
+ name of the workflow to which this instance of the task belongs
23
+ workflow_version : str
24
+ version of the workflow to which this instance of the task belongs
25
+
26
+ """
27
+
28
+ @property
29
+ def constants_model_class(self):
30
+ """Class for DLNIRSP constants."""
31
+ return DlnirspConstants
32
+
33
+ @property
34
+ def raw_frame_tag(self) -> str:
35
+ """
36
+ Define tag corresponding to L0 data.
37
+
38
+ For DL it's LINEARIZED.
39
+ """
40
+ return DlnirspTag.linearized()
41
+
42
+ @property
43
+ def modstate_list(self) -> Iterable[int] | None:
44
+ """
45
+ Define the list of modstates over which to compute L0 quality metrics.
46
+
47
+ If the dataset is non-polarimetric then we just compute all metrics over all modstates at once.
48
+ """
49
+ if self.constants.correct_for_polarization:
50
+ return list(range(1, self.constants.num_modstates + 1))
51
+
52
+ return None
@@ -5,18 +5,15 @@ import numpy as np
5
5
  import pytest
6
6
  from dkist_processing_common._util.scratch import WorkflowFileSystem
7
7
  from dkist_processing_common.codecs.basemodel import basemodel_decoder
8
- from dkist_processing_common.codecs.json import json_decoder
9
8
  from dkist_processing_common.models.quality import QualityMetric
10
9
  from dkist_processing_common.models.tags import Tag
11
10
  from dkist_processing_common.models.task_name import TaskName
12
11
 
13
12
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
14
13
  from dkist_processing_dlnirsp.tasks.quality_metrics import DlnirspL0QualityMetrics
15
- from dkist_processing_dlnirsp.tasks.quality_metrics import DlnirspL1QualityMetrics
16
14
  from dkist_processing_dlnirsp.tests.conftest import CalibratedHeaders
17
15
  from dkist_processing_dlnirsp.tests.conftest import DlnirspTestingConstants
18
16
  from dkist_processing_dlnirsp.tests.conftest import tag_on_modstate
19
- from dkist_processing_dlnirsp.tests.conftest import write_calibrated_frames_to_task
20
17
  from dkist_processing_dlnirsp.tests.conftest import write_lamp_gain_frames_to_task
21
18
  from dkist_processing_dlnirsp.tests.conftest import write_solar_gain_frames_to_task
22
19
 
@@ -56,31 +53,6 @@ def quality_l0_task(
56
53
  task._purge()
57
54
 
58
55
 
59
- @pytest.fixture
60
- def quality_l1_task(recipe_run_id, is_polarimetric, link_constants_db, tmp_path):
61
- num_mosaics = 2
62
- num_X_tiles = 2
63
- num_Y_tiles = 2
64
- constants = DlnirspTestingConstants(
65
- NUM_MODSTATES=8 if is_polarimetric else 1,
66
- POLARIMETER_MODE="Full Stokes" if is_polarimetric else "Stokes I",
67
- NUM_MOSAIC_REPEATS=num_mosaics,
68
- NUM_MOSAIC_TILES_X=num_X_tiles,
69
- NUM_MOSAIC_TILES_Y=num_Y_tiles,
70
- )
71
- link_constants_db(recipe_run_id, constants)
72
-
73
- with DlnirspL1QualityMetrics(
74
- recipe_run_id=recipe_run_id,
75
- workflow_name="workflow_name",
76
- workflow_version="workflow_version",
77
- ) as task:
78
- task.scratch = WorkflowFileSystem(scratch_base_path=tmp_path, recipe_run_id=recipe_run_id)
79
-
80
- yield task, num_mosaics, num_X_tiles, num_Y_tiles
81
- task._purge()
82
-
83
-
84
56
  @pytest.fixture
85
57
  def l0_task_types_and_writers() -> list[tuple[str, Callable]]:
86
58
  return [
@@ -161,62 +133,3 @@ def test_quality_l0_task(
161
133
  for facet in task_types:
162
134
  # make sure two facets of each type
163
135
  assert len([metric for metric in frame_metrics if metric.facet == facet]) == 2
164
-
165
-
166
- @pytest.mark.parametrize(
167
- "is_polarimetric",
168
- [pytest.param(True, id="polarimetric"), pytest.param(False, id="spectrographic")],
169
- )
170
- def test_quality_l1_task(
171
- quality_l1_task,
172
- is_polarimetric,
173
- ):
174
- """
175
- Given: A DlnirspL1QualityMetrics task with some OUTPUT frames
176
- When: Running the task
177
- Then: The correct files are produced and they have the expected amount of data
178
- """
179
- task, num_mosaics, num_X_tiles, num_Y_tiles = quality_l1_task
180
-
181
- num_l1_frames = write_calibrated_frames_to_task(
182
- task=task,
183
- num_mosaics=num_mosaics,
184
- num_X_tiles=num_X_tiles,
185
- num_Y_tiles=num_Y_tiles,
186
- is_polarimetric=is_polarimetric,
187
- array_shape=(200, 20, 20),
188
- data_func=make_infy_3D_data,
189
- )
190
- task()
191
-
192
- stokes_params = ["I"]
193
- if is_polarimetric:
194
- stokes_params += ["Q", "U", "V"]
195
-
196
- for stokes in stokes_params:
197
- sensitivity_data = list(
198
- task.read(
199
- tags=[DlnirspTag.quality("SENSITIVITY"), DlnirspTag.stokes(stokes)],
200
- decoder=json_decoder,
201
- )
202
- )
203
- assert len(sensitivity_data) == 0
204
- # Don't test sensitivity while calculation is incorrect
205
- # assert (
206
- # len(sensitivity_data[0]["x_values"])
207
- # == len(sensitivity_data[0]["y_values"])
208
- # == num_l1_frames / len(stokes_params)
209
- # )
210
-
211
- noise_data = list(
212
- task.read(
213
- tags=[DlnirspTag.quality("NOISE"), DlnirspTag.stokes(stokes)], decoder=json_decoder
214
- )
215
- )
216
- assert len(noise_data) == 0
217
- # Don't assert noise while calculation is incorrect
218
- # assert (
219
- # len(noise_data[0]["x_values"])
220
- # == len(noise_data[0]["y_values"])
221
- # == num_l1_frames / len(stokes_params)
222
- # )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 1.4.6
3
+ Version: 1.4.8rc2
4
4
  Summary: Science processing code for the DLNIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -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==13.0.4
16
+ Requires-Dist: dkist-processing-common==13.0.6rc2
17
17
  Requires-Dist: dkist-processing-math==2.2.2
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.3.1
@@ -107,14 +107,14 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
107
107
  Requires-Dist: asgiref==3.11.1; extra == "frozen"
108
108
  Requires-Dist: asteval==1.0.8; extra == "frozen"
109
109
  Requires-Dist: astropy==7.0.2; extra == "frozen"
110
- Requires-Dist: astropy-iers-data==0.2026.4.13.0.58.2; extra == "frozen"
110
+ Requires-Dist: astropy-iers-data==0.2026.4.20.0.58.15; extra == "frozen"
111
111
  Requires-Dist: astropy_healpix==1.1.3; extra == "frozen"
112
112
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
113
113
  Requires-Dist: attrs==26.1.0; extra == "frozen"
114
114
  Requires-Dist: babel==2.18.0; extra == "frozen"
115
115
  Requires-Dist: billiard==4.2.4; extra == "frozen"
116
- Requires-Dist: boto3==1.42.91; extra == "frozen"
117
- Requires-Dist: botocore==1.42.91; extra == "frozen"
116
+ Requires-Dist: boto3==1.42.92; extra == "frozen"
117
+ Requires-Dist: botocore==1.42.92; extra == "frozen"
118
118
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
119
119
  Requires-Dist: celery==5.6.3; extra == "frozen"
120
120
  Requires-Dist: certifi==2026.2.25; extra == "frozen"
@@ -131,15 +131,14 @@ Requires-Dist: cron_descriptor==2.0.8; extra == "frozen"
131
131
  Requires-Dist: croniter==6.2.2; extra == "frozen"
132
132
  Requires-Dist: cryptography==46.0.7; extra == "frozen"
133
133
  Requires-Dist: cycler==0.12.1; extra == "frozen"
134
- Requires-Dist: dacite==1.9.2; extra == "frozen"
135
134
  Requires-Dist: dask==2026.3.0; extra == "frozen"
136
135
  Requires-Dist: dask-image==2025.11.0; extra == "frozen"
137
136
  Requires-Dist: decorator==5.2.1; extra == "frozen"
138
137
  Requires-Dist: dill==0.4.1; extra == "frozen"
139
138
  Requires-Dist: dkist-header-validator==5.3.1; extra == "frozen"
140
- Requires-Dist: dkist-processing-common==13.0.4; extra == "frozen"
139
+ Requires-Dist: dkist-processing-common==13.0.6rc2; extra == "frozen"
141
140
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
142
- Requires-Dist: dkist-processing-dlnirsp==1.4.6; extra == "frozen"
141
+ Requires-Dist: dkist-processing-dlnirsp==1.4.8rc2; extra == "frozen"
143
142
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
144
143
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
145
144
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
@@ -158,7 +157,7 @@ Requires-Dist: fsspec==2026.3.0; extra == "frozen"
158
157
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
159
158
  Requires-Dist: google-crc32c==1.8.0; extra == "frozen"
160
159
  Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
161
- Requires-Dist: gqlclient==1.2.3; extra == "frozen"
160
+ Requires-Dist: gqlclient==2.0.0; extra == "frozen"
162
161
  Requires-Dist: greenback==1.3.0; extra == "frozen"
163
162
  Requires-Dist: greenlet==3.4.0; extra == "frozen"
164
163
  Requires-Dist: grpcio==1.80.0; extra == "frozen"
@@ -247,9 +246,9 @@ Requires-Dist: psutil==7.2.2; extra == "frozen"
247
246
  Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
248
247
  Requires-Dist: pyarrow==23.0.1; extra == "frozen"
249
248
  Requires-Dist: pycparser==3.0; extra == "frozen"
250
- Requires-Dist: pydantic==2.13.2; extra == "frozen"
251
- Requires-Dist: pydantic-settings==2.13.1; extra == "frozen"
252
- Requires-Dist: pydantic_core==2.46.2; extra == "frozen"
249
+ Requires-Dist: pydantic==2.13.3; extra == "frozen"
250
+ Requires-Dist: pydantic-settings==2.14.0; extra == "frozen"
251
+ Requires-Dist: pydantic_core==2.46.3; extra == "frozen"
253
252
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
254
253
  Requires-Dist: pygtrie==2.5.0; extra == "frozen"
255
254
  Requires-Dist: pyparsing==3.3.2; extra == "frozen"
@@ -10,6 +10,7 @@ pyproject.toml
10
10
  science_towncrier.sh
11
11
  towncrier_science.toml
12
12
  changelog/.gitempty
13
+ changelog/178.misc.rst
13
14
  dkist_processing_dlnirsp/__init__.py
14
15
  dkist_processing_dlnirsp/config.py
15
16
  dkist_processing_dlnirsp.egg-info/PKG-INFO
@@ -1,4 +1,4 @@
1
- dkist-processing-common==13.0.4
1
+ dkist-processing-common==13.0.6rc2
2
2
  dkist-processing-math==2.2.2
3
3
  dkist-processing-pac==3.1.1
4
4
  dkist-header-validator==5.3.1
@@ -73,14 +73,14 @@ asdf_transform_schemas==0.6.0
73
73
  asgiref==3.11.1
74
74
  asteval==1.0.8
75
75
  astropy==7.0.2
76
- astropy-iers-data==0.2026.4.13.0.58.2
76
+ astropy-iers-data==0.2026.4.20.0.58.15
77
77
  astropy_healpix==1.1.3
78
78
  asyncpg==0.31.0
79
79
  attrs==26.1.0
80
80
  babel==2.18.0
81
81
  billiard==4.2.4
82
- boto3==1.42.91
83
- botocore==1.42.91
82
+ boto3==1.42.92
83
+ botocore==1.42.92
84
84
  cadwyn==5.4.6
85
85
  celery==5.6.3
86
86
  certifi==2026.2.25
@@ -97,15 +97,14 @@ cron_descriptor==2.0.8
97
97
  croniter==6.2.2
98
98
  cryptography==46.0.7
99
99
  cycler==0.12.1
100
- dacite==1.9.2
101
100
  dask==2026.3.0
102
101
  dask-image==2025.11.0
103
102
  decorator==5.2.1
104
103
  dill==0.4.1
105
104
  dkist-header-validator==5.3.1
106
- dkist-processing-common==13.0.4
105
+ dkist-processing-common==13.0.6rc2
107
106
  dkist-processing-core==7.2.1
108
- dkist-processing-dlnirsp==1.4.6
107
+ dkist-processing-dlnirsp==1.4.8rc2
109
108
  dkist-processing-math==2.2.2
110
109
  dkist-processing-pac==3.1.1
111
110
  dkist-service-configuration==4.3.0
@@ -124,7 +123,7 @@ fsspec==2026.3.0
124
123
  globus-sdk==4.5.0
125
124
  google-crc32c==1.8.0
126
125
  googleapis-common-protos==1.74.0
127
- gqlclient==1.2.3
126
+ gqlclient==2.0.0
128
127
  greenback==1.3.0
129
128
  greenlet==3.4.0
130
129
  grpcio==1.80.0
@@ -213,9 +212,9 @@ psutil==7.2.2
213
212
  psycopg2-binary==2.9.11
214
213
  pyarrow==23.0.1
215
214
  pycparser==3.0
216
- pydantic==2.13.2
217
- pydantic-settings==2.13.1
218
- pydantic_core==2.46.2
215
+ pydantic==2.13.3
216
+ pydantic-settings==2.14.0
217
+ pydantic_core==2.46.3
219
218
  pyerfa==2.0.1.5
220
219
  pygtrie==2.5.0
221
220
  pyparsing==3.3.2
@@ -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 = "1.4.6"
13
- date = 2026-04-17T17:07:45.099814
12
+ version = "1.4.8rc2"
13
+ date = 2026-04-20T16:09:03.639894
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 == 13.0.4",
29
+ "dkist-processing-common == 13.0.6rc2",
30
30
  "dkist-processing-math == 2.2.2",
31
31
  "dkist-processing-pac == 3.1.1",
32
32
  "dkist-header-validator == 5.3.1",
@@ -135,14 +135,14 @@ frozen = [
135
135
  "asgiref == 3.11.1",
136
136
  "asteval == 1.0.8",
137
137
  "astropy == 7.0.2",
138
- "astropy-iers-data == 0.2026.4.13.0.58.2",
138
+ "astropy-iers-data == 0.2026.4.20.0.58.15",
139
139
  "astropy_healpix == 1.1.3",
140
140
  "asyncpg == 0.31.0",
141
141
  "attrs == 26.1.0",
142
142
  "babel == 2.18.0",
143
143
  "billiard == 4.2.4",
144
- "boto3 == 1.42.91",
145
- "botocore == 1.42.91",
144
+ "boto3 == 1.42.92",
145
+ "botocore == 1.42.92",
146
146
  "cadwyn == 5.4.6",
147
147
  "celery == 5.6.3",
148
148
  "certifi == 2026.2.25",
@@ -159,15 +159,14 @@ frozen = [
159
159
  "croniter == 6.2.2",
160
160
  "cryptography == 46.0.7",
161
161
  "cycler == 0.12.1",
162
- "dacite == 1.9.2",
163
162
  "dask == 2026.3.0",
164
163
  "dask-image == 2025.11.0",
165
164
  "decorator == 5.2.1",
166
165
  "dill == 0.4.1",
167
166
  "dkist-header-validator == 5.3.1",
168
- "dkist-processing-common == 13.0.4",
167
+ "dkist-processing-common == 13.0.6rc2",
169
168
  "dkist-processing-core == 7.2.1",
170
- "dkist-processing-dlnirsp == 1.4.6",
169
+ "dkist-processing-dlnirsp == 1.4.8rc2",
171
170
  "dkist-processing-math == 2.2.2",
172
171
  "dkist-processing-pac == 3.1.1",
173
172
  "dkist-service-configuration == 4.3.0",
@@ -186,7 +185,7 @@ frozen = [
186
185
  "globus-sdk == 4.5.0",
187
186
  "google-crc32c == 1.8.0",
188
187
  "googleapis-common-protos == 1.74.0",
189
- "gqlclient == 1.2.3",
188
+ "gqlclient == 2.0.0",
190
189
  "greenback == 1.3.0",
191
190
  "greenlet == 3.4.0",
192
191
  "grpcio == 1.80.0",
@@ -275,9 +274,9 @@ frozen = [
275
274
  "psycopg2-binary == 2.9.11",
276
275
  "pyarrow == 23.0.1",
277
276
  "pycparser == 3.0",
278
- "pydantic == 2.13.2",
279
- "pydantic-settings == 2.13.1",
280
- "pydantic_core == 2.46.2",
277
+ "pydantic == 2.13.3",
278
+ "pydantic-settings == 2.14.0",
279
+ "pydantic_core == 2.46.3",
281
280
  "pyerfa == 2.0.1.5",
282
281
  "pygtrie == 2.5.0",
283
282
  "pyparsing == 3.3.2",
@@ -1,173 +0,0 @@
1
- """Tasks for computing dataset-wide quality metrics."""
2
-
3
- from dataclasses import dataclass
4
- from dataclasses import field
5
- from typing import Iterable
6
- from typing import Literal
7
-
8
- import numpy as np
9
- from astropy.time import Time
10
- from dkist_processing_common.codecs.fits import fits_access_decoder
11
- from dkist_processing_common.codecs.fits import fits_array_decoder
12
- from dkist_processing_common.parsers.quality import L1QualityFitsAccess
13
- from dkist_processing_common.tasks import QualityL0Metrics
14
- from dkist_processing_common.tasks.mixin.quality import QualityMixin
15
- from dkist_service_configuration.logging import logger
16
-
17
- from dkist_processing_dlnirsp.models.constants import DlnirspConstants
18
- from dkist_processing_dlnirsp.models.tags import DlnirspTag
19
- from dkist_processing_dlnirsp.tasks.dlnirsp_base import DlnirspTaskBase
20
-
21
- __all__ = ["DlnirspL0QualityMetrics", "DlnirspL1QualityMetrics"]
22
-
23
-
24
- @dataclass
25
- class QualityDataPoint:
26
- """Class for storage of a single DLNIRSP quality data point in a time series."""
27
-
28
- datetime: str | int # AKA isot | mjd
29
- value: float
30
-
31
-
32
- @dataclass
33
- class QualityTimeSeries:
34
- """Class for storage of DLNIRSP time series quality data."""
35
-
36
- data_points: list[QualityDataPoint] = field(default_factory=list)
37
-
38
- @property
39
- def datetimes(self) -> list[str | int]:
40
- """Parse datetimes from list of data points."""
41
- return [dp.datetime for dp in self.data_points]
42
-
43
- @property
44
- def values(self) -> list[float]:
45
- """Parse values from list of data points."""
46
- return [dp.value for dp in self.data_points]
47
-
48
- def __len__(self):
49
- return len(self.data_points)
50
-
51
-
52
- class DlnirspL0QualityMetrics(QualityL0Metrics):
53
- """
54
- Task class for collection of DLNIRSP L0 specific quality metrics.
55
-
56
- Parameters
57
- ----------
58
- recipe_run_id : int
59
- id of the recipe run used to identify the workflow run this task is part of
60
- workflow_name : str
61
- name of the workflow to which this instance of the task belongs
62
- workflow_version : str
63
- version of the workflow to which this instance of the task belongs
64
-
65
- """
66
-
67
- @property
68
- def constants_model_class(self):
69
- """Class for DLNIRSP constants."""
70
- return DlnirspConstants
71
-
72
- @property
73
- def raw_frame_tag(self) -> str:
74
- """
75
- Define tag corresponding to L0 data.
76
-
77
- For DL it's LINEARIZED.
78
- """
79
- return DlnirspTag.linearized()
80
-
81
- @property
82
- def modstate_list(self) -> Iterable[int] | None:
83
- """
84
- Define the list of modstates over which to compute L0 quality metrics.
85
-
86
- If the dataset is non-polarimetric then we just compute all metrics over all modstates at once.
87
- """
88
- if self.constants.correct_for_polarization:
89
- return list(range(1, self.constants.num_modstates + 1))
90
-
91
- return None
92
-
93
-
94
- class DlnirspL1QualityMetrics(DlnirspTaskBase, QualityMixin):
95
- """Task class for computing of L1 specific dataset metrics."""
96
-
97
- def run(self):
98
- """
99
- Calculate L1 metrics for the whole dataset.
100
-
101
- The dataset metrics include polarimetric sensitivity and noise per frame.
102
-
103
- NOTE THAT THIS TASK HAS BEEN REMOVED FROM WORKFLOWS WHILE CALCULATIONS ARE WORKED ON
104
- """
105
- pass
106
-
107
- def _compile_sensitivity_and_noise_data(
108
- self, stokes: Literal["I", "Q", "U", "V"]
109
- ) -> tuple[QualityTimeSeries, QualityTimeSeries]:
110
- r"""
111
- Compute the sensitivity and noise for every OUTPUT frame in a dataset.
112
-
113
- We compute them both in one method so we don't have to read every file twice.
114
-
115
- Sensitivity, :math:`s`, is defined as:
116
-
117
- .. math::
118
-
119
- s = stddev(F_i)/\left<F_I\right>
120
-
121
- where :math:`F_i` is a full array of values for Stokes parameter :math:`i` (I, Q, U, V), and :math:`F_I` is the
122
- full frame of Stokes-I. The stddev is computed across the entire frame and :math:`\left< \right>` denote the
123
- frame average.
124
-
125
- The noise is defined as the average of the stddev of various sub-regions of the output array, taken around the
126
- edges of the frame.
127
- """
128
- sensitivity_data = QualityTimeSeries()
129
- noise_data = QualityTimeSeries()
130
- for mosaic in range(self.constants.num_mosaic_repeats):
131
- for X_tile in range(1, self.constants.num_mosaic_tiles_x + 1):
132
- for Y_tile in range(1, self.constants.num_mosaic_tiles_y + 1):
133
- # Sensitivity
134
- non_stokes_tags = [
135
- DlnirspTag.calibrated(),
136
- DlnirspTag.frame(),
137
- DlnirspTag.mosaic_num(mosaic),
138
- DlnirspTag.mosaic_tile_x(X_tile),
139
- DlnirspTag.mosaic_tile_y(Y_tile),
140
- ]
141
- stokes_I_data = next(
142
- self.read(
143
- tags=non_stokes_tags + [DlnirspTag.stokes("I")],
144
- decoder=fits_array_decoder,
145
- )
146
- )
147
- stokes_I_avg = np.nanmedian(stokes_I_data) or np.nanmean(stokes_I_data)
148
-
149
- stokes_frame = next(
150
- self.read(
151
- tags=non_stokes_tags + [DlnirspTag.stokes(stokes)],
152
- decoder=fits_access_decoder,
153
- fits_access_class=L1QualityFitsAccess,
154
- )
155
- )
156
-
157
- sensitivity = (
158
- np.nanstd(stokes_frame.data[np.isfinite(stokes_frame.data)]) / stokes_I_avg
159
- )
160
- time_str = Time(stokes_frame.time_obs).fits
161
- sensitivity_data_point = QualityDataPoint(value=sensitivity, datetime=time_str)
162
- sensitivity_data.data_points.append(sensitivity_data_point)
163
-
164
- # Noise
165
- non_inf_data = np.copy(stokes_frame.data)
166
- non_inf_data[~np.isfinite(non_inf_data)] = np.nan
167
- avg_noise = self.avg_noise(non_inf_data)
168
- noise_data_point = QualityDataPoint(value=avg_noise, datetime=time_str)
169
- noise_data.data_points.append(noise_data_point)
170
-
171
- logger.info(f"Calculated {len(sensitivity_data)} sensitivities and noise values")
172
-
173
- return sensitivity_data, noise_data