dkist-processing-visp 5.7.21__tar.gz → 5.7.23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. dkist_processing_visp-5.7.23/.snyk +7 -0
  2. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/CHANGELOG.rst +22 -0
  3. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/PKG-INFO +62 -62
  4. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/parameters.py +7 -0
  5. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/spectrograph_configuration.py +17 -23
  6. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/parse.py +3 -1
  7. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/conftest.py +1 -0
  8. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_parse.py +123 -31
  9. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp.egg-info/PKG-INFO +62 -62
  10. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp.egg-info/SOURCES.txt +2 -0
  11. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp.egg-info/requires.txt +61 -61
  12. dkist_processing_visp-5.7.23/dkist_processing_visp.egg-info/scm_file_list.json +116 -0
  13. dkist_processing_visp-5.7.23/dkist_processing_visp.egg-info/scm_version.json +8 -0
  14. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/pyproject.toml +63 -63
  15. dkist_processing_visp-5.7.21/.snyk +0 -2
  16. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/.gitignore +0 -0
  17. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/.pre-commit-config.yaml +0 -0
  18. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/.readthedocs.yml +0 -0
  19. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/.rovodev/.review-agent.md +0 -0
  20. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/README.rst +0 -0
  21. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/SCIENCE_CHANGELOG.rst +0 -0
  22. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/bitbucket-pipelines.yml +0 -0
  23. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/changelog/.gitempty +0 -0
  24. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/__init__.py +0 -0
  25. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/config.py +0 -0
  26. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  27. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/__init__.py +0 -0
  28. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/constants.py +0 -0
  29. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/dataset_extras.py +0 -0
  30. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/fits_access.py +0 -0
  31. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/metric_code.py +0 -0
  32. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/tags.py +0 -0
  33. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/models/task_name.py +0 -0
  34. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/__init__.py +0 -0
  35. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  36. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/modulator_states.py +0 -0
  37. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  38. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/raster_step.py +0 -0
  39. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/time.py +0 -0
  40. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
  41. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
  42. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/__init__.py +0 -0
  43. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  44. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/background_light.py +0 -0
  45. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/dark.py +0 -0
  46. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/geometric.py +0 -0
  47. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/instrument_polarization.py +0 -0
  48. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  49. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/lamp.py +0 -0
  50. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  51. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  52. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  53. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
  54. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  55. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/polcal_as_science.py +0 -0
  56. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  57. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/science.py +0 -0
  58. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/solar.py +0 -0
  59. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/visp_base.py +0 -0
  60. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/wavelength_calibration.py +0 -0
  61. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/write_dataset_extras.py +0 -0
  62. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tasks/write_l1.py +0 -0
  63. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/README.rst +0 -0
  64. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/__init__.py +0 -0
  65. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/header_models.py +0 -0
  66. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  67. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  68. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  69. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  70. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  71. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  72. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  73. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  74. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_background_light.py +0 -0
  75. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_dark.py +0 -0
  76. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_downsample.py +0 -0
  77. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_fits_access.py +0 -0
  78. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_geometric.py +0 -0
  79. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  80. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_lamp.py +0 -0
  81. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  82. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
  83. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_parameters.py +0 -0
  84. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_polcal_as_science.py +0 -0
  85. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_quality.py +0 -0
  86. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_science.py +0 -0
  87. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_solar.py +0 -0
  88. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  89. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_visp_base.py +0 -0
  90. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
  91. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_wavelength_calibration.py +0 -0
  92. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_workflows.py +0 -0
  93. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_write_dataset_extras.py +0 -0
  94. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  95. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/workflows/__init__.py +0 -0
  96. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/workflows/l0_processing.py +0 -0
  97. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  98. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
  99. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  100. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  101. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/Makefile +0 -0
  102. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/background_light.rst +0 -0
  103. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/changelog.rst +0 -0
  104. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/conf.py +0 -0
  105. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/dataset_extras.rst +0 -0
  106. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/gain_correction.rst +0 -0
  107. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/geometric.rst +0 -0
  108. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/index.rst +0 -0
  109. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/l0_to_l1_visp.rst +0 -0
  110. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  111. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/landing_page.rst +0 -0
  112. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/make.bat +0 -0
  113. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/polarization_calibration.rst +0 -0
  114. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/requirements.txt +0 -0
  115. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/requirements_table.rst +0 -0
  116. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/science_calibration.rst +0 -0
  117. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/scientific_changelog.rst +0 -0
  118. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/docs/wavelength_calibration.rst +0 -0
  119. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/licenses/LICENSE.rst +0 -0
  120. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/science_towncrier.sh +0 -0
  121. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/setup.cfg +0 -0
  122. {dkist_processing_visp-5.7.21 → dkist_processing_visp-5.7.23}/towncrier_science.toml +0 -0
@@ -0,0 +1,7 @@
1
+ # Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities
2
+ # https://docs.snyk.io/manage-risk/policies/the-.snyk-file#syntax-of-the-.snyk-file
3
+ ignore:
4
+ SNYK-PYTHON-APACHEAIRFLOWCORE-17879182:
5
+ - "*" :
6
+ reason: 'Patched in Airflow 3.3.0, but we are not ready to upgrade till 3.3.1 or later'
7
+ expires: '2027-07-07T00:00:00.000Z'
@@ -1,3 +1,25 @@
1
+ v5.7.23 (2026-07-07)
2
+ ====================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Added tolerance to ``ReflectedLightAngleBud`` to handle small arm position differences between frames.
8
+ Previously, any variation in ``VSPARMPS`` across frames would cause pipeline parsing to fail with a ``ValueError``.
9
+ Now, ``ReflectedLightAngleBud`` subclasses ``TaskNearFloatBud`` and accepts a configurable tolerance via ``visp_reflected_light_angle_tolerance_deg``.
10
+ If the spread between the minimum and maximum ``REFLECTED_LIGHT_ANGLE_DEG`` values is within tolerance, the mean value is used.
11
+ If the spread exceeds the tolerance, a ``ValueError`` is still raised to flag genuine hardware problems. (`#327 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/327>`__)
12
+
13
+
14
+ v5.7.22 (2026-06-22)
15
+ ====================
16
+
17
+ Bugfixes
18
+ --------
19
+
20
+ - Harden writing statistics headers in the case where the data is very similar causing the kurtosis or skew calculations to return NaN. (`#326 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/326>`__)
21
+
22
+
1
23
  v5.7.21 (2026-06-18)
2
24
  ====================
3
25
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.7.21
3
+ Version: 5.7.23
4
4
  Summary: Science processing code for the ViSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==14.3.3
16
+ Requires-Dist: dkist-processing-common==14.3.4
17
17
  Requires-Dist: dkist-processing-math==2.2.3
18
18
  Requires-Dist: dkist-processing-pac==3.1.2
19
19
  Requires-Dist: dkist-header-validator==5.4.0
@@ -79,28 +79,28 @@ Requires-Dist: SQLAlchemy==2.0.51; extra == "frozen"
79
79
  Requires-Dist: Send2Trash==2.1.0; extra == "frozen"
80
80
  Requires-Dist: a2wsgi==1.10.10; extra == "frozen"
81
81
  Requires-Dist: aioftp==0.27.2; extra == "frozen"
82
- Requires-Dist: aiohappyeyeballs==2.6.2; extra == "frozen"
82
+ Requires-Dist: aiohappyeyeballs==2.7.1; extra == "frozen"
83
83
  Requires-Dist: aiohttp==3.14.1; extra == "frozen"
84
84
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
85
- Requires-Dist: aiosmtplib==5.1.1; extra == "frozen"
85
+ Requires-Dist: aiosmtplib==5.1.2; extra == "frozen"
86
86
  Requires-Dist: aiosqlite==0.21.0; extra == "frozen"
87
- Requires-Dist: alembic==1.18.4; extra == "frozen"
87
+ Requires-Dist: alembic==1.18.5; extra == "frozen"
88
88
  Requires-Dist: amqp==5.3.1; extra == "frozen"
89
89
  Requires-Dist: annotated-doc==0.0.4; extra == "frozen"
90
90
  Requires-Dist: annotated-types==0.7.0; extra == "frozen"
91
- Requires-Dist: anyio==4.14.0; extra == "frozen"
91
+ Requires-Dist: anyio==4.14.1; extra == "frozen"
92
92
  Requires-Dist: apache-airflow==3.2.1; extra == "frozen"
93
93
  Requires-Dist: apache-airflow-core==3.2.1; extra == "frozen"
94
- Requires-Dist: apache-airflow-providers-celery==3.20.0; extra == "frozen"
94
+ Requires-Dist: apache-airflow-providers-celery==3.21.0; extra == "frozen"
95
95
  Requires-Dist: apache-airflow-providers-common-compat==1.15.0; extra == "frozen"
96
- Requires-Dist: apache-airflow-providers-common-io==1.7.3; extra == "frozen"
96
+ Requires-Dist: apache-airflow-providers-common-io==1.8.0; extra == "frozen"
97
97
  Requires-Dist: apache-airflow-providers-common-sql==2.0.1; extra == "frozen"
98
- Requires-Dist: apache-airflow-providers-postgres==6.7.1; extra == "frozen"
98
+ Requires-Dist: apache-airflow-providers-postgres==6.8.0; extra == "frozen"
99
99
  Requires-Dist: apache-airflow-providers-smtp==3.0.1; extra == "frozen"
100
- Requires-Dist: apache-airflow-providers-standard==1.14.0; extra == "frozen"
100
+ Requires-Dist: apache-airflow-providers-standard==1.15.0; extra == "frozen"
101
101
  Requires-Dist: apache-airflow-task-sdk==1.2.1; extra == "frozen"
102
102
  Requires-Dist: appnope==0.1.4; extra == "frozen"
103
- Requires-Dist: argcomplete==3.6.3; extra == "frozen"
103
+ Requires-Dist: argcomplete==3.7.0; extra == "frozen"
104
104
  Requires-Dist: argon2-cffi==25.1.0; extra == "frozen"
105
105
  Requires-Dist: argon2-cffi-bindings==25.1.0; extra == "frozen"
106
106
  Requires-Dist: arrow==1.4.0; extra == "frozen"
@@ -109,7 +109,7 @@ Requires-Dist: asdf_standard==1.5.0; extra == "frozen"
109
109
  Requires-Dist: asgiref==3.11.1; extra == "frozen"
110
110
  Requires-Dist: asteval==1.0.9; extra == "frozen"
111
111
  Requires-Dist: astropy==7.0.2; extra == "frozen"
112
- Requires-Dist: astropy-iers-data==0.2026.6.15.15.33.16; extra == "frozen"
112
+ Requires-Dist: astropy-iers-data==0.2026.7.6.1.1.20; extra == "frozen"
113
113
  Requires-Dist: asttokens==3.0.1; extra == "frozen"
114
114
  Requires-Dist: async-lru==2.3.0; extra == "frozen"
115
115
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
@@ -118,14 +118,14 @@ Requires-Dist: babel==2.18.0; extra == "frozen"
118
118
  Requires-Dist: beautifulsoup4==4.15.0; extra == "frozen"
119
119
  Requires-Dist: billiard==4.2.4; extra == "frozen"
120
120
  Requires-Dist: bleach==6.4.0; extra == "frozen"
121
- Requires-Dist: boto3==1.43.33; extra == "frozen"
122
- Requires-Dist: botocore==1.43.33; extra == "frozen"
121
+ Requires-Dist: boto3==1.43.41; extra == "frozen"
122
+ Requires-Dist: botocore==1.43.41; extra == "frozen"
123
123
  Requires-Dist: cadwyn==7.1.0; extra == "frozen"
124
124
  Requires-Dist: celery==5.6.3; extra == "frozen"
125
125
  Requires-Dist: certifi==2026.6.17; extra == "frozen"
126
- Requires-Dist: cffi==2.0.0; extra == "frozen"
127
- Requires-Dist: charset-normalizer==3.4.7; extra == "frozen"
128
- Requires-Dist: click==8.4.1; extra == "frozen"
126
+ Requires-Dist: cffi==2.1.0; extra == "frozen"
127
+ Requires-Dist: charset-normalizer==3.4.9; extra == "frozen"
128
+ Requires-Dist: click==8.4.2; extra == "frozen"
129
129
  Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
130
130
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
131
131
  Requires-Dist: click-repl==0.3.0; extra == "frozen"
@@ -133,7 +133,7 @@ Requires-Dist: colorlog==6.10.1; extra == "frozen"
133
133
  Requires-Dist: comm==0.2.3; extra == "frozen"
134
134
  Requires-Dist: contourpy==1.3.3; extra == "frozen"
135
135
  Requires-Dist: cron_descriptor==2.1.0; extra == "frozen"
136
- Requires-Dist: croniter==6.2.2; extra == "frozen"
136
+ Requires-Dist: croniter==6.2.3; extra == "frozen"
137
137
  Requires-Dist: cryptography==49.0.0; extra == "frozen"
138
138
  Requires-Dist: cycler==0.12.1; extra == "frozen"
139
139
  Requires-Dist: debugpy==1.8.21; extra == "frozen"
@@ -141,19 +141,19 @@ Requires-Dist: decorator==5.3.1; extra == "frozen"
141
141
  Requires-Dist: defusedxml==0.7.1; extra == "frozen"
142
142
  Requires-Dist: dill==0.4.1; extra == "frozen"
143
143
  Requires-Dist: dkist-header-validator==5.4.0; extra == "frozen"
144
- Requires-Dist: dkist-processing-common==14.3.3; extra == "frozen"
144
+ Requires-Dist: dkist-processing-common==14.3.4; extra == "frozen"
145
145
  Requires-Dist: dkist-processing-core==7.3.0; extra == "frozen"
146
146
  Requires-Dist: dkist-processing-math==2.2.3; extra == "frozen"
147
147
  Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
148
- Requires-Dist: dkist-processing-visp==5.7.21; extra == "frozen"
148
+ Requires-Dist: dkist-processing-visp==5.7.23; extra == "frozen"
149
149
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
150
150
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
151
151
  Requires-Dist: dkist_fits_specifications==4.28.0; extra == "frozen"
152
152
  Requires-Dist: dnspython==2.8.0; extra == "frozen"
153
153
  Requires-Dist: email-validator==2.3.0; extra == "frozen"
154
154
  Requires-Dist: executing==2.2.1; extra == "frozen"
155
- Requires-Dist: fastapi==0.137.2; extra == "frozen"
156
- Requires-Dist: fastapi-cli==0.0.27; extra == "frozen"
155
+ Requires-Dist: fastapi==0.139.0; extra == "frozen"
156
+ Requires-Dist: fastapi-cli==0.0.28; extra == "frozen"
157
157
  Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
158
158
  Requires-Dist: flower==2.0.1; extra == "frozen"
159
159
  Requires-Dist: fonttools==4.63.0; extra == "frozen"
@@ -164,25 +164,25 @@ Requires-Dist: globus-sdk==4.8.1; extra == "frozen"
164
164
  Requires-Dist: googleapis-common-protos==1.75.0; extra == "frozen"
165
165
  Requires-Dist: gqlclient==2.0.0; extra == "frozen"
166
166
  Requires-Dist: greenback==1.3.0; extra == "frozen"
167
- Requires-Dist: greenlet==3.5.2; extra == "frozen"
168
- Requires-Dist: grpcio==1.81.1; extra == "frozen"
167
+ Requires-Dist: greenlet==3.5.3; extra == "frozen"
168
+ Requires-Dist: grpcio==1.82.0; extra == "frozen"
169
169
  Requires-Dist: h11==0.16.0; extra == "frozen"
170
170
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
171
171
  Requires-Dist: httptools==0.8.0; extra == "frozen"
172
172
  Requires-Dist: httpx==0.28.1; extra == "frozen"
173
- Requires-Dist: humanize==4.15.0; extra == "frozen"
173
+ Requires-Dist: humanize==4.16.0; extra == "frozen"
174
174
  Requires-Dist: idna==3.18; extra == "frozen"
175
175
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
176
176
  Requires-Dist: importlib_metadata==9.0.0; extra == "frozen"
177
177
  Requires-Dist: ipykernel==7.3.0; extra == "frozen"
178
- Requires-Dist: ipython==9.14.1; extra == "frozen"
178
+ Requires-Dist: ipython==9.15.0; extra == "frozen"
179
179
  Requires-Dist: ipython_pygments_lexers==1.1.1; extra == "frozen"
180
180
  Requires-Dist: isoduration==20.11.0; extra == "frozen"
181
181
  Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
182
182
  Requires-Dist: jedi==0.20.0; extra == "frozen"
183
183
  Requires-Dist: jmespath==1.1.0; extra == "frozen"
184
184
  Requires-Dist: joblib==1.5.3; extra == "frozen"
185
- Requires-Dist: json5==0.14.0; extra == "frozen"
185
+ Requires-Dist: json5==0.15.0; extra == "frozen"
186
186
  Requires-Dist: jsonpointer==3.1.1; extra == "frozen"
187
187
  Requires-Dist: jsonschema==4.26.0; extra == "frozen"
188
188
  Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
@@ -193,7 +193,7 @@ Requires-Dist: jupyter_client==8.9.1; extra == "frozen"
193
193
  Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
194
194
  Requires-Dist: jupyter_server==2.20.0; extra == "frozen"
195
195
  Requires-Dist: jupyter_server_terminals==0.5.4; extra == "frozen"
196
- Requires-Dist: jupyterlab==4.6.0; extra == "frozen"
196
+ Requires-Dist: jupyterlab==4.6.1; extra == "frozen"
197
197
  Requires-Dist: jupyterlab_pygments==0.3.0; extra == "frozen"
198
198
  Requires-Dist: jupyterlab_server==2.28.0; extra == "frozen"
199
199
  Requires-Dist: kiwisolver==1.5.0; extra == "frozen"
@@ -211,7 +211,7 @@ Requires-Dist: matplotlib==3.11.0; extra == "frozen"
211
211
  Requires-Dist: matplotlib-inline==0.2.2; extra == "frozen"
212
212
  Requires-Dist: mdurl==0.1.2; extra == "frozen"
213
213
  Requires-Dist: methodtools==0.4.7; extra == "frozen"
214
- Requires-Dist: mistune==3.2.1; extra == "frozen"
214
+ Requires-Dist: mistune==3.3.2; extra == "frozen"
215
215
  Requires-Dist: more-itertools==11.1.0; extra == "frozen"
216
216
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
217
217
  Requires-Dist: msgspec==0.21.1; extra == "frozen"
@@ -226,30 +226,30 @@ Requires-Dist: notebook==7.6.0; extra == "frozen"
226
226
  Requires-Dist: notebook_shim==0.2.4; extra == "frozen"
227
227
  Requires-Dist: numpy==2.2.5; extra == "frozen"
228
228
  Requires-Dist: object-clerk==1.0.0; extra == "frozen"
229
- Requires-Dist: opentelemetry-api==1.42.1; extra == "frozen"
230
- Requires-Dist: opentelemetry-exporter-otlp==1.42.1; extra == "frozen"
231
- Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.42.1; extra == "frozen"
232
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.42.1; extra == "frozen"
233
- Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.42.1; extra == "frozen"
234
- Requires-Dist: opentelemetry-instrumentation==0.63b1; extra == "frozen"
235
- Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.63b1; extra == "frozen"
236
- Requires-Dist: opentelemetry-instrumentation-asgi==0.63b1; extra == "frozen"
237
- Requires-Dist: opentelemetry-instrumentation-botocore==0.63b1; extra == "frozen"
238
- Requires-Dist: opentelemetry-instrumentation-celery==0.63b1; extra == "frozen"
239
- Requires-Dist: opentelemetry-instrumentation-dbapi==0.63b1; extra == "frozen"
240
- Requires-Dist: opentelemetry-instrumentation-fastapi==0.63b1; extra == "frozen"
241
- Requires-Dist: opentelemetry-instrumentation-pika==0.63b1; extra == "frozen"
242
- Requires-Dist: opentelemetry-instrumentation-psycopg2==0.63b1; extra == "frozen"
243
- Requires-Dist: opentelemetry-instrumentation-pymongo==0.63b1; extra == "frozen"
244
- Requires-Dist: opentelemetry-instrumentation-redis==0.63b1; extra == "frozen"
245
- Requires-Dist: opentelemetry-instrumentation-requests==0.63b1; extra == "frozen"
246
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.63b1; extra == "frozen"
247
- Requires-Dist: opentelemetry-instrumentation-system-metrics==0.63b1; extra == "frozen"
229
+ Requires-Dist: opentelemetry-api==1.43.0; extra == "frozen"
230
+ Requires-Dist: opentelemetry-exporter-otlp==1.43.0; extra == "frozen"
231
+ Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.43.0; extra == "frozen"
232
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.43.0; extra == "frozen"
233
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.43.0; extra == "frozen"
234
+ Requires-Dist: opentelemetry-instrumentation==0.64b0; extra == "frozen"
235
+ Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.64b0; extra == "frozen"
236
+ Requires-Dist: opentelemetry-instrumentation-asgi==0.64b0; extra == "frozen"
237
+ Requires-Dist: opentelemetry-instrumentation-botocore==0.64b0; extra == "frozen"
238
+ Requires-Dist: opentelemetry-instrumentation-celery==0.64b0; extra == "frozen"
239
+ Requires-Dist: opentelemetry-instrumentation-dbapi==0.64b0; extra == "frozen"
240
+ Requires-Dist: opentelemetry-instrumentation-fastapi==0.64b0; extra == "frozen"
241
+ Requires-Dist: opentelemetry-instrumentation-pika==0.64b0; extra == "frozen"
242
+ Requires-Dist: opentelemetry-instrumentation-psycopg2==0.64b0; extra == "frozen"
243
+ Requires-Dist: opentelemetry-instrumentation-pymongo==0.64b0; extra == "frozen"
244
+ Requires-Dist: opentelemetry-instrumentation-redis==0.64b0; extra == "frozen"
245
+ Requires-Dist: opentelemetry-instrumentation-requests==0.64b0; extra == "frozen"
246
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.64b0; extra == "frozen"
247
+ Requires-Dist: opentelemetry-instrumentation-system-metrics==0.64b0; extra == "frozen"
248
248
  Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
249
- Requires-Dist: opentelemetry-proto==1.42.1; extra == "frozen"
250
- Requires-Dist: opentelemetry-sdk==1.42.1; extra == "frozen"
251
- Requires-Dist: opentelemetry-semantic-conventions==0.63b1; extra == "frozen"
252
- Requires-Dist: opentelemetry-util-http==0.63b1; extra == "frozen"
249
+ Requires-Dist: opentelemetry-proto==1.43.0; extra == "frozen"
250
+ Requires-Dist: opentelemetry-sdk==1.43.0; extra == "frozen"
251
+ Requires-Dist: opentelemetry-semantic-conventions==0.64b0; extra == "frozen"
252
+ Requires-Dist: opentelemetry-util-http==0.64b0; extra == "frozen"
253
253
  Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
254
254
  Requires-Dist: packaging==26.2; extra == "frozen"
255
255
  Requires-Dist: pandas==3.0.3; extra == "frozen"
@@ -270,7 +270,7 @@ Requires-Dist: proglog==0.1.12; extra == "frozen"
270
270
  Requires-Dist: prometheus_client==0.25.0; extra == "frozen"
271
271
  Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
272
272
  Requires-Dist: propcache==0.5.2; extra == "frozen"
273
- Requires-Dist: protobuf==6.33.6; extra == "frozen"
273
+ Requires-Dist: protobuf==7.35.1; extra == "frozen"
274
274
  Requires-Dist: psutil==7.2.2; extra == "frozen"
275
275
  Requires-Dist: psycopg2-binary==2.9.12; extra == "frozen"
276
276
  Requires-Dist: ptyprocess==0.7.0; extra == "frozen"
@@ -278,7 +278,7 @@ Requires-Dist: pure_eval==0.2.3; extra == "frozen"
278
278
  Requires-Dist: pycparser==3.0; extra == "frozen"
279
279
  Requires-Dist: pydantic==2.13.4; extra == "frozen"
280
280
  Requires-Dist: pydantic-extra-types==2.11.1; extra == "frozen"
281
- Requires-Dist: pydantic-settings==2.14.1; extra == "frozen"
281
+ Requires-Dist: pydantic-settings==2.14.2; extra == "frozen"
282
282
  Requires-Dist: pydantic_core==2.46.4; extra == "frozen"
283
283
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
284
284
  Requires-Dist: pygtrie==2.5.0; extra == "frozen"
@@ -300,7 +300,7 @@ Requires-Dist: rfc3987-syntax==1.1.0; extra == "frozen"
300
300
  Requires-Dist: rich==15.0.0; extra == "frozen"
301
301
  Requires-Dist: rich-argparse==1.8.0; extra == "frozen"
302
302
  Requires-Dist: rich-toolkit==0.20.1; extra == "frozen"
303
- Requires-Dist: rpds-py==2026.5.1; extra == "frozen"
303
+ Requires-Dist: rpds-py==2026.6.3; extra == "frozen"
304
304
  Requires-Dist: s3transfer==0.19.0; extra == "frozen"
305
305
  Requires-Dist: scikit-image==0.25.2; extra == "frozen"
306
306
  Requires-Dist: scikit-learn==1.6.1; extra == "frozen"
@@ -329,31 +329,31 @@ Requires-Dist: threadpoolctl==3.6.0; extra == "frozen"
329
329
  Requires-Dist: tifffile==2026.6.1; extra == "frozen"
330
330
  Requires-Dist: tinycss2==1.5.1; extra == "frozen"
331
331
  Requires-Dist: tornado==6.5.7; extra == "frozen"
332
- Requires-Dist: tqdm==4.68.3; extra == "frozen"
332
+ Requires-Dist: tqdm==4.68.4; extra == "frozen"
333
333
  Requires-Dist: traitlets==5.15.1; extra == "frozen"
334
- Requires-Dist: typer==0.26.7; extra == "frozen"
334
+ Requires-Dist: typer==0.26.8; extra == "frozen"
335
335
  Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
336
- Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
336
+ Requires-Dist: typing_extensions==4.16.0; extra == "frozen"
337
337
  Requires-Dist: tzdata==2026.2; extra == "frozen"
338
- Requires-Dist: tzlocal==5.4.3; extra == "frozen"
338
+ Requires-Dist: tzlocal==5.4.4; extra == "frozen"
339
339
  Requires-Dist: uc-micro-py==2.0.0; extra == "frozen"
340
340
  Requires-Dist: uncertainties==3.2.3; extra == "frozen"
341
341
  Requires-Dist: universal_pathlib==0.3.10; extra == "frozen"
342
342
  Requires-Dist: uri-template==1.3.0; extra == "frozen"
343
343
  Requires-Dist: urllib3==2.7.0; extra == "frozen"
344
344
  Requires-Dist: uuid6==2025.0.1; extra == "frozen"
345
- Requires-Dist: uvicorn==0.49.0; extra == "frozen"
345
+ Requires-Dist: uvicorn==0.50.2; extra == "frozen"
346
346
  Requires-Dist: uvloop==0.22.1; extra == "frozen"
347
347
  Requires-Dist: vine==5.1.0; extra == "frozen"
348
348
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
349
349
  Requires-Dist: watchfiles==1.2.0; extra == "frozen"
350
- Requires-Dist: wcwidth==0.8.1; extra == "frozen"
350
+ Requires-Dist: wcwidth==0.8.2; extra == "frozen"
351
351
  Requires-Dist: webcolors==25.10.0; extra == "frozen"
352
352
  Requires-Dist: webencodings==0.5.1; extra == "frozen"
353
353
  Requires-Dist: websocket-client==1.9.0; extra == "frozen"
354
354
  Requires-Dist: websockets==16.0; extra == "frozen"
355
355
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
356
- Requires-Dist: wrapt==2.2.1; extra == "frozen"
356
+ Requires-Dist: wrapt==2.2.2; extra == "frozen"
357
357
  Requires-Dist: yamale==6.1.0; extra == "frozen"
358
358
  Requires-Dist: yarl==1.24.2; extra == "frozen"
359
359
  Requires-Dist: zipp==4.1.0; extra == "frozen"
@@ -27,6 +27,13 @@ class VispParsingParameters(ParameterBase):
27
27
  "visp_max_cs_step_time_sec", start_date=datetime.now()
28
28
  )
29
29
 
30
+ @property
31
+ def reflected_light_angle_tolerance_deg(self) -> float:
32
+ """Max allowed variation in REFLECTED_LIGHT_ANGLE_DEG across frames before raising an error."""
33
+ return self._find_most_recent_past_value(
34
+ "visp_reflected_light_angle_tolerance_deg", start_date=datetime.now()
35
+ )
36
+
30
37
 
31
38
  class VispParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmIdMixin):
32
39
  """Put all Visp parameters parsed from the input dataset document in a single property."""
@@ -1,8 +1,10 @@
1
1
  """Buds for parsing the incident and reflected light angles of the ViSP spectrograph."""
2
2
 
3
- from dkist_processing_common.models.flower_pot import SetStem
3
+ from statistics import mean
4
+
4
5
  from dkist_processing_common.models.flower_pot import SpilledDirt
5
6
  from dkist_processing_common.models.task_name import TaskName
7
+ from dkist_processing_common.parsers.near_bud import TaskNearFloatBud
6
8
  from dkist_processing_common.parsers.task import parse_header_ip_task_with_gains
7
9
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
8
10
 
@@ -56,42 +58,34 @@ class IncidentLightAngleBud(TaskUniqueBud):
56
58
  return convert_grating_angle_to_incident_light_angle(grating_angle)
57
59
 
58
60
 
59
- class ReflectedLightAngleBud(SetStem):
61
+ class ReflectedLightAngleBud(TaskNearFloatBud):
60
62
  """Bud that combines the incident light angle and arm position header values to compute the reflected light angle."""
61
63
 
62
- def __init__(self):
63
- super().__init__(stem_name=VispBudName.reflected_light_angle_deg.value)
64
- self.ip_task_types = [
65
- task.casefold() for task in [TaskName.observe.value, TaskName.solar_gain.value]
66
- ]
64
+ def __init__(self, tolerance_deg: float):
65
+ super().__init__(
66
+ constant_name=VispBudName.reflected_light_angle_deg.value,
67
+ metadata_key=VispMetadataKey.arm_position_deg,
68
+ ip_task_types=[TaskName.observe.value, TaskName.solar_gain.value],
69
+ tolerance=tolerance_deg,
70
+ task_type_parsing_function=parse_header_ip_task_with_gains,
71
+ )
67
72
 
68
73
  def setter(self, fits_obj: VispL0FitsAccess) -> float | type[SpilledDirt]:
69
74
  """
70
75
  Compute the reflected light angle.
71
76
 
72
- The reflected light angle is `-1 * fits_objs.grating_angle_deg + fits_obj.arm_position_deg`.
77
+ The reflected light angle is `-1 * fits_obj.grating_angle_deg + fits_obj.arm_position_deg`.
73
78
  """
74
- task = parse_header_ip_task_with_gains(fits_obj)
79
+ task = self.parsing_function(fits_obj)
75
80
 
76
81
  if task.casefold() in self.ip_task_types:
77
82
  incident_light_angle = convert_grating_angle_to_incident_light_angle(
78
83
  fits_obj.grating_angle_deg
79
84
  )
80
85
  arm_position = fits_obj.arm_position_deg
81
- reflected_angle = (
82
- convert_incident_light_angle_and_arm_position_to_reflected_light_angle(
83
- incident_light_angle=incident_light_angle,
84
- arm_position=arm_position,
85
- )
86
+ return convert_incident_light_angle_and_arm_position_to_reflected_light_angle(
87
+ incident_light_angle=incident_light_angle,
88
+ arm_position=arm_position,
86
89
  )
87
- return reflected_angle
88
90
 
89
91
  return SpilledDirt
90
-
91
- def getter(self) -> float:
92
- """Get the value for the reflected light angle and raise an error if it is not unique."""
93
- if len(self.value_set) > 1:
94
- raise ValueError(
95
- f"Multiple {self.stem_name} values found for key. Values: {self.value_set}"
96
- )
97
- return self.value_set.pop()
@@ -96,7 +96,9 @@ class ParseL0VispInputData(ParseL0InputDataBase):
96
96
  NonDarkNonPolcalTaskReadoutExpTimesBud(),
97
97
  DarkReadoutExpTimePickyBud(),
98
98
  IncidentLightAngleBud(),
99
- ReflectedLightAngleBud(),
99
+ ReflectedLightAngleBud(
100
+ tolerance_deg=self.parameters.reflected_light_angle_tolerance_deg
101
+ ),
100
102
  TaskUniqueBud(
101
103
  constant_name=VispBudName.grating_constant_inverse_mm.value,
102
104
  metadata_key=VispMetadataKey.grating_constant_inverse_mm,
@@ -184,6 +184,7 @@ class WavelengthParameter:
184
184
 
185
185
  @dataclass
186
186
  class VispInputDatasetParameterValues:
187
+ visp_reflected_light_angle_tolerance_deg: float = 0.03
187
188
  visp_max_cs_step_time_sec: float = 180.0
188
189
  visp_beam_border: int = 1000
189
190
  visp_background_on: bool = True