dkist-processing-vbi 1.29.2__tar.gz → 1.30.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/CHANGELOG.rst +9 -0
  2. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/PKG-INFO +14 -14
  3. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/models/parameters.py +5 -0
  4. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/write_l1.py +41 -8
  5. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/conftest.py +1 -0
  6. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_write_l1.py +12 -1
  7. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi.egg-info/PKG-INFO +14 -14
  8. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi.egg-info/requires.txt +13 -13
  9. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/pyproject.toml +15 -15
  10. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/.gitignore +0 -0
  11. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/.pre-commit-config.yaml +0 -0
  12. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/.readthedocs.yml +0 -0
  13. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/.snyk +0 -0
  14. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/README.rst +0 -0
  15. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/SCIENCE_CHANGELOG.rst +0 -0
  16. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/bitbucket-pipelines.yml +0 -0
  17. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/changelog/.gitempty +0 -0
  18. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/__init__.py +0 -0
  19. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/config.py +0 -0
  20. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/models/__init__.py +0 -0
  21. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/models/constants.py +0 -0
  22. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/models/filter.py +0 -0
  23. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/models/fits_access.py +0 -0
  24. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/models/tags.py +0 -0
  25. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/parsers/__init__.py +0 -0
  26. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/parsers/mosaic_repeats.py +0 -0
  27. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/parsers/spatial_step_pattern.py +0 -0
  28. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/parsers/vbi_l0_fits_access.py +0 -0
  29. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/parsers/vbi_l1_fits_access.py +0 -0
  30. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/__init__.py +0 -0
  31. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/assemble_movie.py +0 -0
  32. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/dark.py +0 -0
  33. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/gain.py +0 -0
  34. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/make_movie_frames.py +0 -0
  35. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/parse.py +0 -0
  36. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/process_summit_processed.py +0 -0
  37. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/quality_metrics.py +0 -0
  38. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/science.py +0 -0
  39. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tasks/vbi_base.py +0 -0
  40. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/__init__.py +0 -0
  41. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/local_trial_workflows/__init__.py +0 -0
  42. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/local_trial_workflows/l0_to_l1.py +0 -0
  43. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_assemble_movie.py +0 -0
  44. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_dark.py +0 -0
  45. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_fits_access.py +0 -0
  46. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_gain.py +0 -0
  47. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_make_movie_frames.py +0 -0
  48. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_parse_l0.py +0 -0
  49. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_parse_summit.py +0 -0
  50. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_process_summit.py +0 -0
  51. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_quality_metrics.py +0 -0
  52. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_science.py +0 -0
  53. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_spatial_step_pattern.py +0 -0
  54. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_vbi_base.py +0 -0
  55. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_vbi_constants.py +0 -0
  56. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/tests/test_workflows.py +0 -0
  57. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/workflows/__init__.py +0 -0
  58. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/workflows/l0_processing.py +0 -0
  59. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/workflows/summit_data_processing.py +0 -0
  60. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi/workflows/trial_workflows.py +0 -0
  61. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi.egg-info/SOURCES.txt +0 -0
  62. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi.egg-info/dependency_links.txt +0 -0
  63. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/dkist_processing_vbi.egg-info/top_level.txt +0 -0
  64. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/Makefile +0 -0
  65. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/changelog.rst +0 -0
  66. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/conf.py +0 -0
  67. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/index.rst +0 -0
  68. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/l0_to_l1_vbi_no-speckle-full-trial.rst +0 -0
  69. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/l0_to_l1_vbi_no-speckle.rst +0 -0
  70. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/l0_to_l1_vbi_summit-calibrated-full-trial.rst +0 -0
  71. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/l0_to_l1_vbi_summit-calibrated.rst +0 -0
  72. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/landing_page.rst +0 -0
  73. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/make.bat +0 -0
  74. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/requirements.txt +0 -0
  75. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/requirements_table.rst +0 -0
  76. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/docs/scientific_changelog.rst +0 -0
  77. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/licenses/LICENSE.rst +0 -0
  78. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/science_towncrier.sh +0 -0
  79. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/setup.cfg +0 -0
  80. {dkist_processing_vbi-1.29.2 → dkist_processing_vbi-1.30.0}/towncrier_science.toml +0 -0
@@ -1,3 +1,12 @@
1
+ v1.30.0 (2026-05-04)
2
+ ====================
3
+
4
+ Features
5
+ --------
6
+
7
+ - Add new headers keys showing the average intensity (`VBICRI`) and root mean square contrast (`VBICRMSC`) of the central isoplanatic patch. Another header key (`VBICENSZ`) shows the length of the side of the square isoplanatic patch. (`#188 <https://bitbucket.org/dkistdc/dkist-processing-vbi/pull-requests/188>`__)
8
+
9
+
1
10
  v1.29.2 (2026-04-27)
2
11
  ====================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-vbi
3
- Version: 1.29.2
3
+ Version: 1.30.0
4
4
  Summary: Processing code for the VBI instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -57,7 +57,7 @@ Provides-Extra: frozen
57
57
  Requires-Dist: Deprecated==1.3.1; extra == "frozen"
58
58
  Requires-Dist: ImageIO==2.37.3; extra == "frozen"
59
59
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
60
- Requires-Dist: Mako==1.3.11; extra == "frozen"
60
+ Requires-Dist: Mako==1.3.12; extra == "frozen"
61
61
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
62
62
  Requires-Dist: PeakUtils==1.3.5; extra == "frozen"
63
63
  Requires-Dist: PyJWT==2.12.1; extra == "frozen"
@@ -81,7 +81,7 @@ Requires-Dist: annotated-types==0.7.0; extra == "frozen"
81
81
  Requires-Dist: anyio==4.13.0; extra == "frozen"
82
82
  Requires-Dist: apache-airflow==3.1.8; extra == "frozen"
83
83
  Requires-Dist: apache-airflow-core==3.1.8; extra == "frozen"
84
- Requires-Dist: apache-airflow-providers-celery==3.18.0; extra == "frozen"
84
+ Requires-Dist: apache-airflow-providers-celery==3.19.0; extra == "frozen"
85
85
  Requires-Dist: apache-airflow-providers-common-compat==1.14.3; extra == "frozen"
86
86
  Requires-Dist: apache-airflow-providers-common-io==1.7.2; extra == "frozen"
87
87
  Requires-Dist: apache-airflow-providers-common-sql==1.35.0; extra == "frozen"
@@ -96,13 +96,13 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
96
96
  Requires-Dist: asgiref==3.11.1; extra == "frozen"
97
97
  Requires-Dist: asteval==1.0.8; extra == "frozen"
98
98
  Requires-Dist: astropy==7.0.2; extra == "frozen"
99
- Requires-Dist: astropy-iers-data==0.2026.4.27.1.3.2; extra == "frozen"
99
+ Requires-Dist: astropy-iers-data==0.2026.5.4.1.4.54; extra == "frozen"
100
100
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
101
101
  Requires-Dist: attrs==26.1.0; extra == "frozen"
102
102
  Requires-Dist: babel==2.18.0; extra == "frozen"
103
103
  Requires-Dist: billiard==4.2.4; extra == "frozen"
104
- Requires-Dist: boto3==1.42.97; extra == "frozen"
105
- Requires-Dist: botocore==1.42.97; extra == "frozen"
104
+ Requires-Dist: boto3==1.43.2; extra == "frozen"
105
+ Requires-Dist: botocore==1.43.2; extra == "frozen"
106
106
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
107
107
  Requires-Dist: celery==5.6.3; extra == "frozen"
108
108
  Requires-Dist: certifi==2026.4.22; extra == "frozen"
@@ -125,7 +125,7 @@ Requires-Dist: dkist-processing-common==14.0.1; extra == "frozen"
125
125
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
126
126
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
127
127
  Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
128
- Requires-Dist: dkist-processing-vbi==1.29.2; extra == "frozen"
128
+ Requires-Dist: dkist-processing-vbi==1.30.0; extra == "frozen"
129
129
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
130
130
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
131
131
  Requires-Dist: dkist_fits_specifications==4.25.0; extra == "frozen"
@@ -137,7 +137,7 @@ Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
137
137
  Requires-Dist: flower==2.0.1; extra == "frozen"
138
138
  Requires-Dist: fonttools==4.62.1; extra == "frozen"
139
139
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
140
- Requires-Dist: fsspec==2026.3.0; extra == "frozen"
140
+ Requires-Dist: fsspec==2026.4.0; extra == "frozen"
141
141
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
142
142
  Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
143
143
  Requires-Dist: gqlclient==2.0.0; extra == "frozen"
@@ -234,15 +234,15 @@ Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
234
234
  Requires-Dist: python-dotenv==1.2.2; extra == "frozen"
235
235
  Requires-Dist: python-multipart==0.0.27; extra == "frozen"
236
236
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
237
- Requires-Dist: pytz==2026.1.post1; extra == "frozen"
237
+ Requires-Dist: pytz==2026.2; extra == "frozen"
238
238
  Requires-Dist: redis==6.4.0; extra == "frozen"
239
239
  Requires-Dist: referencing==0.37.0; extra == "frozen"
240
240
  Requires-Dist: requests==2.33.1; extra == "frozen"
241
241
  Requires-Dist: rich==15.0.0; extra == "frozen"
242
- Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
242
+ Requires-Dist: rich-argparse==1.8.0; extra == "frozen"
243
243
  Requires-Dist: rich-toolkit==0.19.7; extra == "frozen"
244
244
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
245
- Requires-Dist: s3transfer==0.16.1; extra == "frozen"
245
+ Requires-Dist: s3transfer==0.17.0; extra == "frozen"
246
246
  Requires-Dist: scikit-image==0.26.0; extra == "frozen"
247
247
  Requires-Dist: scipy==1.15.3; extra == "frozen"
248
248
  Requires-Dist: semantic-version==2.10.0; extra == "frozen"
@@ -262,11 +262,11 @@ Requires-Dist: talus==1.3.4; extra == "frozen"
262
262
  Requires-Dist: tenacity==8.5.0; extra == "frozen"
263
263
  Requires-Dist: termcolor==3.3.0; extra == "frozen"
264
264
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
265
- Requires-Dist: tifffile==2026.4.11; extra == "frozen"
265
+ Requires-Dist: tifffile==2026.5.2; extra == "frozen"
266
266
  Requires-Dist: tornado==6.5.5; extra == "frozen"
267
267
  Requires-Dist: tqdm==4.67.3; extra == "frozen"
268
268
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
269
- Requires-Dist: typer==0.25.0; extra == "frozen"
269
+ Requires-Dist: typer==0.25.1; extra == "frozen"
270
270
  Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
271
271
  Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
272
272
  Requires-Dist: tzdata==2026.2; extra == "frozen"
@@ -281,7 +281,7 @@ Requires-Dist: uvloop==0.22.1; extra == "frozen"
281
281
  Requires-Dist: vine==5.1.0; extra == "frozen"
282
282
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
283
283
  Requires-Dist: watchfiles==1.1.1; extra == "frozen"
284
- Requires-Dist: wcwidth==0.6.0; extra == "frozen"
284
+ Requires-Dist: wcwidth==0.7.0; extra == "frozen"
285
285
  Requires-Dist: websockets==16.0; extra == "frozen"
286
286
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
287
287
  Requires-Dist: wrapt==2.1.2; extra == "frozen"
@@ -10,3 +10,8 @@ class VbiParameters(ParameterBase):
10
10
  def movie_intensity_clipping_percentile(self) -> float:
11
11
  """Percentile to clip the movie intensity at."""
12
12
  return self._find_most_recent_past_value("vbi_movie_intensity_clipping_percentile")
13
+
14
+ @property
15
+ def central_region_side_length(self) -> int:
16
+ """Side length of the square-shaped central region."""
17
+ return self._find_most_recent_past_value("vbi_central_region_side_length")
@@ -12,11 +12,10 @@ from dkist_processing_common.models.constants import ConstantsBase
12
12
  from dkist_processing_common.models.fits_access import MetadataKey
13
13
  from dkist_processing_common.tasks.write_l1 import WavelengthRange
14
14
  from dkist_processing_common.tasks.write_l1 import WriteL1Frame
15
- from dkist_service_configuration.logging import logger
16
15
 
17
16
  from dkist_processing_vbi.models.constants import VbiConstants
18
- from dkist_processing_vbi.models.filter import VBI_FILTERS
19
17
  from dkist_processing_vbi.models.filter import find_associated_filter
18
+ from dkist_processing_vbi.models.parameters import VbiParameters
20
19
 
21
20
  __all__ = ["VbiWriteL1Frame"]
22
21
 
@@ -37,6 +36,22 @@ class VbiWriteL1Frame(WriteL1Frame):
37
36
  version of the workflow to which this instance of the task belongs
38
37
  """
39
38
 
39
+ def __init__(
40
+ self,
41
+ recipe_run_id: int,
42
+ workflow_name: str,
43
+ workflow_version: str,
44
+ ):
45
+ super().__init__(
46
+ recipe_run_id=recipe_run_id,
47
+ workflow_name=workflow_name,
48
+ workflow_version=workflow_version,
49
+ )
50
+ self.parameters = VbiParameters(
51
+ scratch=self.scratch,
52
+ obs_ip_start_time=self.constants.obs_ip_start_time,
53
+ )
54
+
40
55
  @property
41
56
  def constants_model_class(self) -> Type[ConstantsBase]:
42
57
  """Supply the correct class, so we can access VBI-specific constants."""
@@ -137,12 +152,6 @@ class VbiWriteL1Frame(WriteL1Frame):
137
152
  header["NBIN3"] = 1
138
153
  header["NBIN"] = header["NBIN1"] * header["NBIN2"] * header["NBIN3"]
139
154
 
140
- # VBI stats header
141
- # TODO overwrite these with correct values
142
- header["VBICRI"] = 0
143
- header["VBICRLEN"] = 0
144
- header["VBICRMSC"] = 0
145
-
146
155
  return header
147
156
 
148
157
  def calculate_date_end(self, header: fits.Header) -> str:
@@ -177,3 +186,27 @@ class VbiWriteL1Frame(WriteL1Frame):
177
186
  def get_waveband(self, wavelength: u.Quantity, wavelength_range: WavelengthRange) -> str:
178
187
  """Get the name of the filter that includes the given wavelength."""
179
188
  return find_associated_filter(wavelength=wavelength).name
189
+
190
+ def add_stats_headers(self, header: fits.Header, data: np.ndarray) -> fits.Header:
191
+ """Add some VBI specific statistics headers."""
192
+ header = super().add_stats_headers(header, data)
193
+
194
+ # These headers only refer to a central patch in the data array
195
+ central_patch_side_length = self.parameters.central_region_side_length
196
+ x_axis_length = header["NAXIS2"]
197
+ y_axis_length = header["NAXIS1"]
198
+ x_start = x_axis_length // 2 - central_patch_side_length // 2
199
+ y_start = y_axis_length // 2 - central_patch_side_length // 2
200
+ central_patch_data = data[
201
+ y_start : y_start + central_patch_side_length,
202
+ x_start : x_start + central_patch_side_length,
203
+ ]
204
+
205
+ finite_mask = np.isfinite(central_patch_data)
206
+ valid_data = central_patch_data[finite_mask]
207
+ valid_mean = valid_data.mean()
208
+ valid_std = valid_data.std()
209
+ header["VBICRI"] = valid_mean
210
+ header["VBICRMSC"] = valid_std / valid_mean
211
+ header["VBICRLEN"] = central_patch_side_length
212
+ return header
@@ -300,6 +300,7 @@ class VbiConstantsDb:
300
300
  @dataclass
301
301
  class VbiInputDatasetParameterValues:
302
302
  vbi_movie_intensity_clipping_percentile: float = 0.5
303
+ vbi_central_region_side_length: int = 300
303
304
 
304
305
 
305
306
  @pytest.fixture(scope="session")
@@ -18,6 +18,7 @@ from dkist_processing_vbi.models.fits_access import VbiMetadataKey
18
18
  from dkist_processing_vbi.tasks.write_l1 import VbiWriteL1Frame
19
19
  from dkist_processing_vbi.tests.conftest import Vbi122ObserveFrames
20
20
  from dkist_processing_vbi.tests.conftest import VbiConstantsDb
21
+ from dkist_processing_vbi.tests.conftest import VbiInputDatasetParameterValues
21
22
 
22
23
 
23
24
  @pytest.fixture(scope="function")
@@ -107,7 +108,13 @@ def write_l1_task(calibrated_header, num_mosaic_repeats, camera_str: Literal["re
107
108
  ],
108
109
  )
109
110
  def test_write_l1_frame(
110
- write_l1_task, num_mosaic_repeats, is_mosaic, camera_str, mocker, fake_gql_client
111
+ write_l1_task,
112
+ num_mosaic_repeats,
113
+ is_mosaic,
114
+ camera_str,
115
+ mocker,
116
+ fake_gql_client,
117
+ assign_input_dataset_doc_to_task,
111
118
  ):
112
119
  """
113
120
  :Given: a write L1 task
@@ -118,6 +125,7 @@ def test_write_l1_frame(
118
125
  "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
119
126
  )
120
127
  task = write_l1_task
128
+ assign_input_dataset_doc_to_task(task, VbiInputDatasetParameterValues())
121
129
  task()
122
130
  files = list(task.read(tags=[Tag.frame(), Tag.output(), Tag.stokes("I")]))
123
131
  assert len(files) == 1
@@ -207,5 +215,8 @@ def test_write_l1_frame(
207
215
  assert header["EXPRID03"] == "EXPERID3"
208
216
  assert header["WAVEBAND"] == "VBI-Red H-alpha"
209
217
  assert header["SPECLN01"] == "H alpha (656.28 nm)"
218
+ assert header["VBICRI"] # exists
219
+ assert header["VBICRMSC"] # exists
220
+ assert header["VBICRLEN"] == VbiInputDatasetParameterValues.vbi_central_region_side_length
210
221
  with pytest.raises(KeyError):
211
222
  header["SPECLN02"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-vbi
3
- Version: 1.29.2
3
+ Version: 1.30.0
4
4
  Summary: Processing code for the VBI instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -57,7 +57,7 @@ Provides-Extra: frozen
57
57
  Requires-Dist: Deprecated==1.3.1; extra == "frozen"
58
58
  Requires-Dist: ImageIO==2.37.3; extra == "frozen"
59
59
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
60
- Requires-Dist: Mako==1.3.11; extra == "frozen"
60
+ Requires-Dist: Mako==1.3.12; extra == "frozen"
61
61
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
62
62
  Requires-Dist: PeakUtils==1.3.5; extra == "frozen"
63
63
  Requires-Dist: PyJWT==2.12.1; extra == "frozen"
@@ -81,7 +81,7 @@ Requires-Dist: annotated-types==0.7.0; extra == "frozen"
81
81
  Requires-Dist: anyio==4.13.0; extra == "frozen"
82
82
  Requires-Dist: apache-airflow==3.1.8; extra == "frozen"
83
83
  Requires-Dist: apache-airflow-core==3.1.8; extra == "frozen"
84
- Requires-Dist: apache-airflow-providers-celery==3.18.0; extra == "frozen"
84
+ Requires-Dist: apache-airflow-providers-celery==3.19.0; extra == "frozen"
85
85
  Requires-Dist: apache-airflow-providers-common-compat==1.14.3; extra == "frozen"
86
86
  Requires-Dist: apache-airflow-providers-common-io==1.7.2; extra == "frozen"
87
87
  Requires-Dist: apache-airflow-providers-common-sql==1.35.0; extra == "frozen"
@@ -96,13 +96,13 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
96
96
  Requires-Dist: asgiref==3.11.1; extra == "frozen"
97
97
  Requires-Dist: asteval==1.0.8; extra == "frozen"
98
98
  Requires-Dist: astropy==7.0.2; extra == "frozen"
99
- Requires-Dist: astropy-iers-data==0.2026.4.27.1.3.2; extra == "frozen"
99
+ Requires-Dist: astropy-iers-data==0.2026.5.4.1.4.54; extra == "frozen"
100
100
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
101
101
  Requires-Dist: attrs==26.1.0; extra == "frozen"
102
102
  Requires-Dist: babel==2.18.0; extra == "frozen"
103
103
  Requires-Dist: billiard==4.2.4; extra == "frozen"
104
- Requires-Dist: boto3==1.42.97; extra == "frozen"
105
- Requires-Dist: botocore==1.42.97; extra == "frozen"
104
+ Requires-Dist: boto3==1.43.2; extra == "frozen"
105
+ Requires-Dist: botocore==1.43.2; extra == "frozen"
106
106
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
107
107
  Requires-Dist: celery==5.6.3; extra == "frozen"
108
108
  Requires-Dist: certifi==2026.4.22; extra == "frozen"
@@ -125,7 +125,7 @@ Requires-Dist: dkist-processing-common==14.0.1; extra == "frozen"
125
125
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
126
126
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
127
127
  Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
128
- Requires-Dist: dkist-processing-vbi==1.29.2; extra == "frozen"
128
+ Requires-Dist: dkist-processing-vbi==1.30.0; extra == "frozen"
129
129
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
130
130
  Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
131
131
  Requires-Dist: dkist_fits_specifications==4.25.0; extra == "frozen"
@@ -137,7 +137,7 @@ Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
137
137
  Requires-Dist: flower==2.0.1; extra == "frozen"
138
138
  Requires-Dist: fonttools==4.62.1; extra == "frozen"
139
139
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
140
- Requires-Dist: fsspec==2026.3.0; extra == "frozen"
140
+ Requires-Dist: fsspec==2026.4.0; extra == "frozen"
141
141
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
142
142
  Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
143
143
  Requires-Dist: gqlclient==2.0.0; extra == "frozen"
@@ -234,15 +234,15 @@ Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
234
234
  Requires-Dist: python-dotenv==1.2.2; extra == "frozen"
235
235
  Requires-Dist: python-multipart==0.0.27; extra == "frozen"
236
236
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
237
- Requires-Dist: pytz==2026.1.post1; extra == "frozen"
237
+ Requires-Dist: pytz==2026.2; extra == "frozen"
238
238
  Requires-Dist: redis==6.4.0; extra == "frozen"
239
239
  Requires-Dist: referencing==0.37.0; extra == "frozen"
240
240
  Requires-Dist: requests==2.33.1; extra == "frozen"
241
241
  Requires-Dist: rich==15.0.0; extra == "frozen"
242
- Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
242
+ Requires-Dist: rich-argparse==1.8.0; extra == "frozen"
243
243
  Requires-Dist: rich-toolkit==0.19.7; extra == "frozen"
244
244
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
245
- Requires-Dist: s3transfer==0.16.1; extra == "frozen"
245
+ Requires-Dist: s3transfer==0.17.0; extra == "frozen"
246
246
  Requires-Dist: scikit-image==0.26.0; extra == "frozen"
247
247
  Requires-Dist: scipy==1.15.3; extra == "frozen"
248
248
  Requires-Dist: semantic-version==2.10.0; extra == "frozen"
@@ -262,11 +262,11 @@ Requires-Dist: talus==1.3.4; extra == "frozen"
262
262
  Requires-Dist: tenacity==8.5.0; extra == "frozen"
263
263
  Requires-Dist: termcolor==3.3.0; extra == "frozen"
264
264
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
265
- Requires-Dist: tifffile==2026.4.11; extra == "frozen"
265
+ Requires-Dist: tifffile==2026.5.2; extra == "frozen"
266
266
  Requires-Dist: tornado==6.5.5; extra == "frozen"
267
267
  Requires-Dist: tqdm==4.67.3; extra == "frozen"
268
268
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
269
- Requires-Dist: typer==0.25.0; extra == "frozen"
269
+ Requires-Dist: typer==0.25.1; extra == "frozen"
270
270
  Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
271
271
  Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
272
272
  Requires-Dist: tzdata==2026.2; extra == "frozen"
@@ -281,7 +281,7 @@ Requires-Dist: uvloop==0.22.1; extra == "frozen"
281
281
  Requires-Dist: vine==5.1.0; extra == "frozen"
282
282
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
283
283
  Requires-Dist: watchfiles==1.1.1; extra == "frozen"
284
- Requires-Dist: wcwidth==0.6.0; extra == "frozen"
284
+ Requires-Dist: wcwidth==0.7.0; extra == "frozen"
285
285
  Requires-Dist: websockets==16.0; extra == "frozen"
286
286
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
287
287
  Requires-Dist: wrapt==2.1.2; extra == "frozen"
@@ -27,7 +27,7 @@ dkist-sphinx-theme
27
27
  Deprecated==1.3.1
28
28
  ImageIO==2.37.3
29
29
  Jinja2==3.1.6
30
- Mako==1.3.11
30
+ Mako==1.3.12
31
31
  MarkupSafe==3.0.3
32
32
  PeakUtils==1.3.5
33
33
  PyJWT==2.12.1
@@ -51,7 +51,7 @@ annotated-types==0.7.0
51
51
  anyio==4.13.0
52
52
  apache-airflow==3.1.8
53
53
  apache-airflow-core==3.1.8
54
- apache-airflow-providers-celery==3.18.0
54
+ apache-airflow-providers-celery==3.19.0
55
55
  apache-airflow-providers-common-compat==1.14.3
56
56
  apache-airflow-providers-common-io==1.7.2
57
57
  apache-airflow-providers-common-sql==1.35.0
@@ -66,13 +66,13 @@ asdf_transform_schemas==0.6.0
66
66
  asgiref==3.11.1
67
67
  asteval==1.0.8
68
68
  astropy==7.0.2
69
- astropy-iers-data==0.2026.4.27.1.3.2
69
+ astropy-iers-data==0.2026.5.4.1.4.54
70
70
  asyncpg==0.31.0
71
71
  attrs==26.1.0
72
72
  babel==2.18.0
73
73
  billiard==4.2.4
74
- boto3==1.42.97
75
- botocore==1.42.97
74
+ boto3==1.43.2
75
+ botocore==1.43.2
76
76
  cadwyn==5.4.6
77
77
  celery==5.6.3
78
78
  certifi==2026.4.22
@@ -95,7 +95,7 @@ dkist-processing-common==14.0.1
95
95
  dkist-processing-core==7.2.1
96
96
  dkist-processing-math==2.2.2
97
97
  dkist-processing-pac==3.1.2
98
- dkist-processing-vbi==1.29.2
98
+ dkist-processing-vbi==1.30.0
99
99
  dkist-service-configuration==4.3.0
100
100
  dkist-spectral-lines==3.0.1
101
101
  dkist_fits_specifications==4.25.0
@@ -107,7 +107,7 @@ fastjsonschema==2.21.2
107
107
  flower==2.0.1
108
108
  fonttools==4.62.1
109
109
  frozenlist==1.8.0
110
- fsspec==2026.3.0
110
+ fsspec==2026.4.0
111
111
  globus-sdk==4.5.0
112
112
  googleapis-common-protos==1.74.0
113
113
  gqlclient==2.0.0
@@ -204,15 +204,15 @@ python-dateutil==2.9.0.post0
204
204
  python-dotenv==1.2.2
205
205
  python-multipart==0.0.27
206
206
  python-slugify==8.0.4
207
- pytz==2026.1.post1
207
+ pytz==2026.2
208
208
  redis==6.4.0
209
209
  referencing==0.37.0
210
210
  requests==2.33.1
211
211
  rich==15.0.0
212
- rich-argparse==1.7.2
212
+ rich-argparse==1.8.0
213
213
  rich-toolkit==0.19.7
214
214
  rpds-py==0.30.0
215
- s3transfer==0.16.1
215
+ s3transfer==0.17.0
216
216
  scikit-image==0.26.0
217
217
  scipy==1.15.3
218
218
  semantic-version==2.10.0
@@ -232,11 +232,11 @@ talus==1.3.4
232
232
  tenacity==8.5.0
233
233
  termcolor==3.3.0
234
234
  text-unidecode==1.3
235
- tifffile==2026.4.11
235
+ tifffile==2026.5.2
236
236
  tornado==6.5.5
237
237
  tqdm==4.67.3
238
238
  traitlets==5.14.3
239
- typer==0.25.0
239
+ typer==0.25.1
240
240
  typing-inspection==0.4.2
241
241
  typing_extensions==4.15.0
242
242
  tzdata==2026.2
@@ -251,7 +251,7 @@ uvloop==0.22.1
251
251
  vine==5.1.0
252
252
  voluptuous==0.16.0
253
253
  watchfiles==1.1.1
254
- wcwidth==0.6.0
254
+ wcwidth==0.7.0
255
255
  websockets==16.0
256
256
  wirerope==1.0.0
257
257
  wrapt==2.1.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.29.2"
13
- date = 2026-04-27T14:52:22.671749
12
+ version = "1.30.0"
13
+ date = 2026-05-04T09:29:02.126389
14
14
 
15
15
  [project]
16
16
  dynamic = ["version"]
@@ -85,7 +85,7 @@ frozen = [
85
85
  "Deprecated == 1.3.1",
86
86
  "ImageIO == 2.37.3",
87
87
  "Jinja2 == 3.1.6",
88
- "Mako == 1.3.11",
88
+ "Mako == 1.3.12",
89
89
  "MarkupSafe == 3.0.3",
90
90
  "PeakUtils == 1.3.5",
91
91
  "PyJWT == 2.12.1",
@@ -109,7 +109,7 @@ frozen = [
109
109
  "anyio == 4.13.0",
110
110
  "apache-airflow == 3.1.8",
111
111
  "apache-airflow-core == 3.1.8",
112
- "apache-airflow-providers-celery == 3.18.0",
112
+ "apache-airflow-providers-celery == 3.19.0",
113
113
  "apache-airflow-providers-common-compat == 1.14.3",
114
114
  "apache-airflow-providers-common-io == 1.7.2",
115
115
  "apache-airflow-providers-common-sql == 1.35.0",
@@ -124,13 +124,13 @@ frozen = [
124
124
  "asgiref == 3.11.1",
125
125
  "asteval == 1.0.8",
126
126
  "astropy == 7.0.2",
127
- "astropy-iers-data == 0.2026.4.27.1.3.2",
127
+ "astropy-iers-data == 0.2026.5.4.1.4.54",
128
128
  "asyncpg == 0.31.0",
129
129
  "attrs == 26.1.0",
130
130
  "babel == 2.18.0",
131
131
  "billiard == 4.2.4",
132
- "boto3 == 1.42.97",
133
- "botocore == 1.42.97",
132
+ "boto3 == 1.43.2",
133
+ "botocore == 1.43.2",
134
134
  "cadwyn == 5.4.6",
135
135
  "celery == 5.6.3",
136
136
  "certifi == 2026.4.22",
@@ -153,7 +153,7 @@ frozen = [
153
153
  "dkist-processing-core == 7.2.1",
154
154
  "dkist-processing-math == 2.2.2",
155
155
  "dkist-processing-pac == 3.1.2",
156
- "dkist-processing-vbi == 1.29.2",
156
+ "dkist-processing-vbi == 1.30.0",
157
157
  "dkist-service-configuration == 4.3.0",
158
158
  "dkist-spectral-lines == 3.0.1",
159
159
  "dkist_fits_specifications == 4.25.0",
@@ -165,7 +165,7 @@ frozen = [
165
165
  "flower == 2.0.1",
166
166
  "fonttools == 4.62.1",
167
167
  "frozenlist == 1.8.0",
168
- "fsspec == 2026.3.0",
168
+ "fsspec == 2026.4.0",
169
169
  "globus-sdk == 4.5.0",
170
170
  "googleapis-common-protos == 1.74.0",
171
171
  "gqlclient == 2.0.0",
@@ -262,15 +262,15 @@ frozen = [
262
262
  "python-dotenv == 1.2.2",
263
263
  "python-multipart == 0.0.27",
264
264
  "python-slugify == 8.0.4",
265
- "pytz == 2026.1.post1",
265
+ "pytz == 2026.2",
266
266
  "redis == 6.4.0",
267
267
  "referencing == 0.37.0",
268
268
  "requests == 2.33.1",
269
269
  "rich == 15.0.0",
270
- "rich-argparse == 1.7.2",
270
+ "rich-argparse == 1.8.0",
271
271
  "rich-toolkit == 0.19.7",
272
272
  "rpds-py == 0.30.0",
273
- "s3transfer == 0.16.1",
273
+ "s3transfer == 0.17.0",
274
274
  "scikit-image == 0.26.0",
275
275
  "scipy == 1.15.3",
276
276
  "semantic-version == 2.10.0",
@@ -290,11 +290,11 @@ frozen = [
290
290
  "tenacity == 8.5.0",
291
291
  "termcolor == 3.3.0",
292
292
  "text-unidecode == 1.3",
293
- "tifffile == 2026.4.11",
293
+ "tifffile == 2026.5.2",
294
294
  "tornado == 6.5.5",
295
295
  "tqdm == 4.67.3",
296
296
  "traitlets == 5.14.3",
297
- "typer == 0.25.0",
297
+ "typer == 0.25.1",
298
298
  "typing-inspection == 0.4.2",
299
299
  "typing_extensions == 4.15.0",
300
300
  "tzdata == 2026.2",
@@ -309,7 +309,7 @@ frozen = [
309
309
  "vine == 5.1.0",
310
310
  "voluptuous == 0.16.0",
311
311
  "watchfiles == 1.1.1",
312
- "wcwidth == 0.6.0",
312
+ "wcwidth == 0.7.0",
313
313
  "websockets == 16.0",
314
314
  "wirerope == 1.0.0",
315
315
  "wrapt == 2.1.2",