dkist-processing-common 14.6.0__tar.gz → 14.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/CHANGELOG.rst +9 -0
  2. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/PKG-INFO +1 -1
  3. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/quality_metrics.py +11 -6
  4. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_quality.py +53 -1
  5. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common.egg-info/PKG-INFO +1 -1
  6. dkist_processing_common-14.6.1/dkist_processing_common.egg-info/scm_version.json +8 -0
  7. dkist_processing_common-14.6.0/dkist_processing_common.egg-info/scm_version.json +0 -8
  8. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/.gitignore +0 -0
  9. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/.pre-commit-config.yaml +0 -0
  10. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/.readthedocs.yml +0 -0
  11. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/.rovodev/.review-agent.md +0 -0
  12. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/.snyk +0 -0
  13. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/README.rst +0 -0
  14. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/bitbucket-pipelines.yml +0 -0
  15. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/changelog/.gitempty +0 -0
  16. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/__init__.py +0 -0
  17. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/_util/__init__.py +0 -0
  18. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/_util/constants.py +0 -0
  19. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/_util/graphql.py +0 -0
  20. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/_util/scratch.py +0 -0
  21. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/_util/tags.py +0 -0
  22. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/__init__.py +0 -0
  23. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/array.py +0 -0
  24. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/asdf.py +0 -0
  25. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/basemodel.py +0 -0
  26. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/bytes.py +0 -0
  27. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/fits.py +0 -0
  28. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/iobase.py +0 -0
  29. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/json.py +0 -0
  30. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/path.py +0 -0
  31. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/quality.py +0 -0
  32. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/codecs/str.py +0 -0
  33. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/config.py +0 -0
  34. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/fonts/Lato-Regular.ttf +0 -0
  35. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/fonts/__init__.py +0 -0
  36. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/manual.py +0 -0
  37. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/__init__.py +0 -0
  38. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/constants.py +0 -0
  39. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/dkist_location.py +0 -0
  40. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/extras.py +0 -0
  41. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/fits_access.py +0 -0
  42. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/flower_pot.py +0 -0
  43. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/fried_parameter.py +0 -0
  44. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/graphql.py +0 -0
  45. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/input_dataset.py +0 -0
  46. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/message.py +0 -0
  47. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/message_queue_binding.py +0 -0
  48. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/metric_code.py +0 -0
  49. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/parameters.py +0 -0
  50. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/quality.py +0 -0
  51. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/tags.py +0 -0
  52. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/task_name.py +0 -0
  53. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/telemetry.py +0 -0
  54. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/models/wavelength.py +0 -0
  55. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/__init__.py +0 -0
  56. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/average_bud.py +0 -0
  57. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/cs_step.py +0 -0
  58. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/dsps_repeat.py +0 -0
  59. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/experiment_id_bud.py +0 -0
  60. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/id_bud.py +0 -0
  61. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/l0_fits_access.py +0 -0
  62. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/l1_fits_access.py +0 -0
  63. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/lookup_bud.py +0 -0
  64. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/near_bud.py +0 -0
  65. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/observing_program_id_bud.py +0 -0
  66. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/proposal_id_bud.py +0 -0
  67. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/quality.py +0 -0
  68. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/retarder.py +0 -0
  69. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/single_value_single_key_flower.py +0 -0
  70. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/task.py +0 -0
  71. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/time.py +0 -0
  72. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/unique_bud.py +0 -0
  73. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/parsers/wavelength.py +0 -0
  74. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/__init__.py +0 -0
  75. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/assemble_movie.py +0 -0
  76. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/base.py +0 -0
  77. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/l1_output_data.py +0 -0
  78. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/__init__.py +0 -0
  79. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/globus.py +0 -0
  80. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/interservice_bus.py +0 -0
  81. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/metadata_store.py +0 -0
  82. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/object_store.py +0 -0
  83. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/quality/__init__.py +0 -0
  84. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/quality/_base.py +0 -0
  85. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/mixin/quality/_metrics.py +0 -0
  86. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/output_data_base.py +0 -0
  87. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/parse_l0_input_data.py +0 -0
  88. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/teardown.py +0 -0
  89. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/transfer_input_data.py +0 -0
  90. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/trial_catalog.py +0 -0
  91. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/trial_output_data.py +0 -0
  92. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/write_extra.py +0 -0
  93. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/write_l1.py +0 -0
  94. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tasks/write_l1_base.py +0 -0
  95. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/__init__.py +0 -0
  96. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/conftest.py +0 -0
  97. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/mock_metadata_store.py +0 -0
  98. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_assemble_movie.py +0 -0
  99. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_assemble_quality.py +0 -0
  100. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_base.py +0 -0
  101. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_codecs.py +0 -0
  102. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_constants.py +0 -0
  103. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_construct_dataset_extras.py +0 -0
  104. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_cs_step.py +0 -0
  105. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_dkist_location.py +0 -0
  106. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_fits_access.py +0 -0
  107. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_flower_pot.py +0 -0
  108. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_fried_parameter.py +0 -0
  109. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_input_dataset.py +0 -0
  110. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_interservice_bus.py +0 -0
  111. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_interservice_bus_mixin.py +0 -0
  112. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_manual_processing.py +0 -0
  113. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_output_data_base.py +0 -0
  114. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_parameters.py +0 -0
  115. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_parse_l0_input_data.py +0 -0
  116. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_publish_catalog_messages.py +0 -0
  117. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_quality_mixin.py +0 -0
  118. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_scratch.py +0 -0
  119. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_stems.py +0 -0
  120. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_submit_dataset_metadata.py +0 -0
  121. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_tags.py +0 -0
  122. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_task_name.py +0 -0
  123. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_task_parsing.py +0 -0
  124. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_teardown.py +0 -0
  125. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_transfer_input_data.py +0 -0
  126. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_transfer_l1_output_data.py +0 -0
  127. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_trial_catalog.py +0 -0
  128. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_trial_output_data.py +0 -0
  129. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_workflow_task_base.py +0 -0
  130. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common/tests/test_write_l1.py +0 -0
  131. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common.egg-info/SOURCES.txt +0 -0
  132. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common.egg-info/dependency_links.txt +0 -0
  133. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common.egg-info/requires.txt +0 -0
  134. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common.egg-info/scm_file_list.json +0 -0
  135. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/dkist_processing_common.egg-info/top_level.txt +0 -0
  136. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/docs/Makefile +0 -0
  137. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/docs/changelog.rst +0 -0
  138. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/docs/conf.py +0 -0
  139. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/docs/index.rst +0 -0
  140. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/docs/landing_page.rst +0 -0
  141. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/docs/make.bat +0 -0
  142. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/docs/requirements.txt +0 -0
  143. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/licenses/LICENSE.rst +0 -0
  144. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/pyproject.toml +0 -0
  145. {dkist_processing_common-14.6.0 → dkist_processing_common-14.6.1}/setup.cfg +0 -0
@@ -1,3 +1,12 @@
1
+ v14.6.1 (2026-10-14)
2
+ ====================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Exclude negative light-level readings from the LIGHT_LEVEL quality plot and summary statistics. Omit the metric when only negative readings remain. (`#355 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/355>`__)
8
+
9
+
1
10
  v14.6.0 (2026-10-08)
2
11
  ====================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 14.6.0
3
+ Version: 14.6.1
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -620,10 +620,13 @@ class QualityL1Metrics(WorkflowTaskBase, QualityMixin):
620
620
  self.write(metric, tags=Tag.quality("GENERIC"), encoder=basemodel_encoder)
621
621
 
622
622
  def compute_and_write_light_level(self, l1_quality_data: L1QualityData) -> None:
623
- """Write LIGHT_LEVEL quality metric."""
624
- # don't need to check for None - l1_quality_data.light_level_values does not allow None
625
- datetimes = l1_quality_data.datetimes
626
- light_level_values = l1_quality_data.light_level_values
623
+ """Write LIGHT_LEVEL quality metric using only nonnegative measurements."""
624
+ datetimes: list[datetime] = []
625
+ light_level_values: list[float] = []
626
+ for date, light_level in zip(l1_quality_data.datetimes, l1_quality_data.light_level_values):
627
+ if light_level >= 0:
628
+ datetimes.append(date)
629
+ light_level_values.append(light_level)
627
630
 
628
631
  # don't write anything if there is no data
629
632
  if not light_level_values:
@@ -642,8 +645,10 @@ class QualityL1Metrics(WorkflowTaskBase, QualityMixin):
642
645
  series_data=series_data,
643
646
  )
644
647
 
645
- statement = f"Average Light Level for L1 dataset: "
646
- f"{round(np.mean(light_level_values), 2)} ± {round(np.std(light_level_values), 2)} adu"
648
+ statement = (
649
+ f"Average Light Level for L1 dataset: "
650
+ f"{round(np.mean(light_level_values), 2)} ± {round(np.std(light_level_values), 2)} adu"
651
+ )
647
652
 
648
653
  metric = QualityMetric(
649
654
  name="Light Level",
@@ -1084,7 +1084,7 @@ def test_compute_and_write_light_level(
1084
1084
  all_statements = metric.statement
1085
1085
  assert isinstance(all_statements, list)
1086
1086
  assert len(all_statements) == 1
1087
- assert all_statements[0].startswith("Average Light Level for L1 dataset")
1087
+ assert all_statements == ["Average Light Level for L1 dataset: 0.45 ± 0.2 adu"]
1088
1088
  assert metric.warnings is None
1089
1089
  # data
1090
1090
  all_plot_data = metric.plot_data
@@ -1112,6 +1112,58 @@ def test_compute_and_write_light_level(
1112
1112
  assert len(time_series.x_values) == 7
1113
1113
 
1114
1114
 
1115
+ def test_light_level_excludes_negative_values(
1116
+ quality_l1_task_no_scratch_data: QualityL1Metrics, l1_quality_data: L1QualityData
1117
+ ):
1118
+ """
1119
+ Given: negative, zero, and positive light levels with distinct timestamps
1120
+ When: the light level quality metric is written
1121
+ Then: only nonnegative readings and their timestamps contribute to the plot and statistics
1122
+ """
1123
+ task = quality_l1_task_no_scratch_data
1124
+ l1_quality_data.light_level_values = (-1.0, 0.0, 2.0, -0.01, 4.0, -2.0, 6.0)
1125
+ original_quality_data = l1_quality_data.model_dump()
1126
+
1127
+ task.compute_and_write_light_level(l1_quality_data)
1128
+
1129
+ metrics = list(
1130
+ task.read(tags=[Tag.quality("GENERIC")], decoder=basemodel_decoder, model=QualityMetric)
1131
+ )
1132
+ assert len(metrics) == 1
1133
+ metric = metrics[0]
1134
+ time_series = metric.plot_data[0].series_data[""]
1135
+ assert time_series.x_values == tuple(l1_quality_data.datetimes[i] for i in (1, 2, 4, 6))
1136
+ assert time_series.y_values == (0.0, 2.0, 4.0, 6.0)
1137
+ assert metric.statement == ["Average Light Level for L1 dataset: 3.0 ± 2.24 adu"]
1138
+ assert l1_quality_data.model_dump() == original_quality_data
1139
+
1140
+
1141
+ def test_light_level_all_negative_values(
1142
+ quality_l1_task_with_calibrated_frames: QualityL1Metrics,
1143
+ ):
1144
+ """
1145
+ Given: calibrated frames whose light levels are all negative
1146
+ When: the L1 quality workflow task runs
1147
+ Then: light level is omitted, other metrics are written, and FITS headers retain their readings
1148
+ """
1149
+ task = quality_l1_task_with_calibrated_frames
1150
+ frame_paths = list(task.read(tags=[Tag.calibrated(), Tag.frame()]))
1151
+ for frame_path in frame_paths:
1152
+ with fits.open(frame_path, mode="update") as hdul:
1153
+ hdul[0].header["LIGHTLVL"] = -1.0
1154
+
1155
+ task()
1156
+
1157
+ metrics = list(
1158
+ task.read(tags=[Tag.quality("GENERIC")], decoder=basemodel_decoder, model=QualityMetric)
1159
+ )
1160
+ assert "LIGHT_LEVEL" not in {metric.metric_code for metric in metrics}
1161
+ assert "HEALTH_STATUS" in {metric.metric_code for metric in metrics}
1162
+ for frame_path in frame_paths:
1163
+ with fits.open(frame_path) as hdul:
1164
+ assert hdul[0].header["LIGHTLVL"] == -1.0
1165
+
1166
+
1115
1167
  def test_no_calibration_frames_no_l1_metrics(quality_l1_task_no_scratch_data: QualityL1Metrics):
1116
1168
  """
1117
1169
  Given: No calibrated frames
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 14.6.0
3
+ Version: 14.6.1
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "14.6.1",
3
+ "distance": 0,
4
+ "node": "g973c26e0f5932cfa29522cda89e3be9cedc1b8d2",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-14"
8
+ }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "14.6.0",
3
- "distance": 0,
4
- "node": "gfdf3dc49b280fcf0e203ef318adda23c2f29fc85",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-08"
8
- }