dkist-processing-visp 5.2.1__tar.gz → 5.2.2__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 (111) hide show
  1. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/CHANGELOG.rst +24 -0
  2. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/PKG-INFO +5 -4
  3. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/__init__.py +1 -0
  4. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/solar.py +3 -34
  5. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/wavelength_calibration.py +44 -3
  6. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/workflows/l0_processing.py +1 -1
  7. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/workflows/trial_workflows.py +1 -1
  8. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp.egg-info/PKG-INFO +5 -4
  9. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp.egg-info/requires.txt +4 -3
  10. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/pyproject.toml +6 -5
  11. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/.gitignore +0 -0
  12. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/.pre-commit-config.yaml +0 -0
  13. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/.readthedocs.yml +0 -0
  14. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/.snyk +0 -0
  15. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/README.rst +0 -0
  16. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/SCIENCE_CHANGELOG.rst +0 -0
  17. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/bitbucket-pipelines.yml +0 -0
  18. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/changelog/.gitempty +0 -0
  19. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/__init__.py +0 -0
  20. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/config.py +0 -0
  21. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  22. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/models/__init__.py +0 -0
  23. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/models/constants.py +0 -0
  24. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/models/fits_access.py +0 -0
  25. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/models/metric_code.py +0 -0
  26. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/models/parameters.py +0 -0
  27. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/models/tags.py +0 -0
  28. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/models/task_name.py +0 -0
  29. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/__init__.py +0 -0
  30. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  31. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/modulator_states.py +0 -0
  32. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  33. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/raster_step.py +0 -0
  34. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/spectrograph_configuration.py +0 -0
  35. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/time.py +0 -0
  36. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
  37. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
  38. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  39. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/background_light.py +0 -0
  40. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/dark.py +0 -0
  41. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/geometric.py +0 -0
  42. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/instrument_polarization.py +0 -0
  43. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  44. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/lamp.py +0 -0
  45. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  46. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  47. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  48. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
  49. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  50. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/parse.py +0 -0
  51. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  52. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/science.py +0 -0
  53. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/visp_base.py +0 -0
  54. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tasks/write_l1.py +0 -0
  55. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/README.rst +0 -0
  56. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/__init__.py +0 -0
  57. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/conftest.py +0 -0
  58. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/header_models.py +0 -0
  59. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  60. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  61. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  62. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  63. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  64. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  65. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  66. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  67. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_background_light.py +0 -0
  68. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_dark.py +0 -0
  69. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_downsample.py +0 -0
  70. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_fits_access.py +0 -0
  71. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_geometric.py +0 -0
  72. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  73. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_lamp.py +0 -0
  74. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  75. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
  76. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_parameters.py +0 -0
  77. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_parse.py +0 -0
  78. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_quality.py +0 -0
  79. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_science.py +0 -0
  80. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_solar.py +0 -0
  81. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  82. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
  83. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_wavelength_calibration.py +0 -0
  84. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_workflows.py +0 -0
  85. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  86. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/workflows/__init__.py +0 -0
  87. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  88. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp.egg-info/SOURCES.txt +0 -0
  89. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  90. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  91. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/Makefile +0 -0
  92. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/background_light.rst +0 -0
  93. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/changelog.rst +0 -0
  94. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/conf.py +0 -0
  95. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/gain_correction.rst +0 -0
  96. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/geometric.rst +0 -0
  97. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/index.rst +0 -0
  98. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/l0_to_l1_visp.rst +0 -0
  99. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  100. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/landing_page.rst +0 -0
  101. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/make.bat +0 -0
  102. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/polarization_calibration.rst +0 -0
  103. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/requirements.txt +0 -0
  104. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/requirements_table.rst +0 -0
  105. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/science_calibration.rst +0 -0
  106. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/scientific_changelog.rst +0 -0
  107. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/docs/wavelength_calibration.rst +0 -0
  108. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/licenses/LICENSE.rst +0 -0
  109. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/science_towncrier.sh +0 -0
  110. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/setup.cfg +0 -0
  111. {dkist_processing_visp-5.2.1 → dkist_processing_visp-5.2.2}/towncrier_science.toml +0 -0
@@ -1,3 +1,27 @@
1
+ v5.2.2 (2025-12-17)
2
+ ===================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Normalize atlas and input spectrum when computing an initial CRVAL guess in the `WavelengthCalibration` task. This fixes
8
+ failing fits caused by very poor initial guesses caused by large continuum offsets. (`#255 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/255>`__)
9
+
10
+
11
+ Misc
12
+ ----
13
+
14
+ - Move the `estimate_relative_continuum_level` method from `SolarCalibration` class to be a module-level function in
15
+ "wavelength_calibration.py" so it can be used by both the `SolarCalibration` and `WavelengthCalibration` tasks. (`#255 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/255>`__)
16
+ - Import the `WavelengthCalibration` task into the top-level `tasks` package and use that import path in workflow definitions. (`#255 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/255>`__)
17
+
18
+
19
+ Documentation
20
+ -------------
21
+
22
+ - Fix issue that prevented module-level functions in the wavelength calibration module from rendering in API docs. (`#255 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/255>`__)
23
+
24
+
1
25
  v5.2.1 (2025-12-16)
2
26
  ===================
3
27
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.2.1
3
+ Version: 5.2.2
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
@@ -126,8 +126,8 @@ Requires-Dist: attrs==25.4.0; extra == "frozen"
126
126
  Requires-Dist: babel==2.17.0; extra == "frozen"
127
127
  Requires-Dist: billiard==4.2.4; extra == "frozen"
128
128
  Requires-Dist: blinker==1.9.0; extra == "frozen"
129
- Requires-Dist: boto3==1.42.10; extra == "frozen"
130
- Requires-Dist: botocore==1.42.10; extra == "frozen"
129
+ Requires-Dist: boto3==1.42.11; extra == "frozen"
130
+ Requires-Dist: botocore==1.42.11; extra == "frozen"
131
131
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
132
132
  Requires-Dist: celery==5.6.0; extra == "frozen"
133
133
  Requires-Dist: certifi==2025.11.12; extra == "frozen"
@@ -154,7 +154,7 @@ Requires-Dist: dkist-processing-common==11.9.1; extra == "frozen"
154
154
  Requires-Dist: dkist-processing-core==6.0.1; extra == "frozen"
155
155
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
156
156
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
157
- Requires-Dist: dkist-processing-visp==5.2.1; extra == "frozen"
157
+ Requires-Dist: dkist-processing-visp==5.2.2; extra == "frozen"
158
158
  Requires-Dist: dkist-service-configuration==4.1.13; extra == "frozen"
159
159
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
160
160
  Requires-Dist: dkist_fits_specifications==4.19.0; extra == "frozen"
@@ -170,6 +170,7 @@ Requires-Dist: globus-sdk==4.2.0; extra == "frozen"
170
170
  Requires-Dist: google-re2==1.1.20251105; extra == "frozen"
171
171
  Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
172
172
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
173
+ Requires-Dist: greenlet==3.3.0; extra == "frozen"
173
174
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
174
175
  Requires-Dist: gunicorn==23.0.0; extra == "frozen"
175
176
  Requires-Dist: h11==0.16.0; extra == "frozen"
@@ -12,4 +12,5 @@ from dkist_processing_visp.tasks.parse import *
12
12
  from dkist_processing_visp.tasks.quality_metrics import *
13
13
  from dkist_processing_visp.tasks.science import *
14
14
  from dkist_processing_visp.tasks.solar import *
15
+ from dkist_processing_visp.tasks.wavelength_calibration import WavelengthCalibration
15
16
  from dkist_processing_visp.tasks.write_l1 import *
@@ -46,6 +46,7 @@ from dkist_processing_visp.tasks.visp_base import VispTaskBase
46
46
  from dkist_processing_visp.tasks.wavelength_calibration import compute_initial_dispersion
47
47
  from dkist_processing_visp.tasks.wavelength_calibration import compute_input_wavelength_vector
48
48
  from dkist_processing_visp.tasks.wavelength_calibration import compute_order
49
+ from dkist_processing_visp.tasks.wavelength_calibration import estimate_relative_continuum_level
49
50
  from dkist_processing_visp.tasks.wavelength_calibration import get_doppler_velocity
50
51
 
51
52
  __all__ = [
@@ -638,11 +639,12 @@ class SolarCalibration(
638
639
  resolving_power = self.parameters.wavecal_init_resolving_power
639
640
  opacity_factor = self.parameters.wavecal_init_opacity_factor
640
641
  straylight_faction = self.parameters.wavecal_init_straylight_fraction
641
- relative_atlas_scaling = self.estimate_relative_continuum_level(
642
+ relative_atlas_scaling = estimate_relative_continuum_level(
642
643
  crval_init=crval_init,
643
644
  wavelength_range=wavelength_range,
644
645
  atlas=atlas,
645
646
  representative_spectrum=representative_spectrum,
647
+ normalization_percentile=self.parameters.wavecal_init_crval_guess_normalization_percentile,
646
648
  )
647
649
  logger.info(f"0th order coefficient initial guess: {relative_atlas_scaling}")
648
650
 
@@ -683,39 +685,6 @@ class SolarCalibration(
683
685
 
684
686
  return init_params
685
687
 
686
- def estimate_relative_continuum_level(
687
- self,
688
- *,
689
- crval_init: Quantity,
690
- wavelength_range: Quantity,
691
- atlas: Atlas,
692
- representative_spectrum: np.ndarray,
693
- ) -> float:
694
- """
695
- Estimate the multiplicative scaling between the representative spectrum and atlas solar transmission.
696
-
697
- This scaling is used to set the initial guess of 0th-order polynomial fit coefficient. We estimate the scaling
698
- factor by comparing the values of the two spectra at a given percent of the CDF. This percent is taken from
699
- the `~dkist_processing_visp.models.parameters.VispParameters.wavecal_init_crval_guess_normalization_percentile`
700
- pipeline parameter.
701
- """
702
- wave_min = crval_init - wavelength_range / 2
703
- wave_max = crval_init + wavelength_range / 2
704
-
705
- atlas_idx = np.where(
706
- (atlas.solar_atlas_wavelength >= wave_min) & (atlas.solar_atlas_wavelength <= wave_max)
707
- )
708
- atlas_norm = np.nanpercentile(
709
- atlas.solar_atlas_transmission[atlas_idx],
710
- self.parameters.wavecal_init_crval_guess_normalization_percentile,
711
- )
712
- spec_norm = np.nanpercentile(
713
- representative_spectrum,
714
- self.parameters.wavecal_init_crval_guess_normalization_percentile,
715
- )
716
-
717
- return spec_norm / atlas_norm
718
-
719
688
  def compute_final_vignette_estimate(self, init_vignette_correction: np.ndarray) -> np.ndarray:
720
689
  """
721
690
  Fit the spectral shape of continuum residuals for each spatial pixel.
@@ -26,8 +26,6 @@ from sunpy.coordinates import HeliocentricInertial
26
26
  from dkist_processing_visp.models.tags import VispTag
27
27
  from dkist_processing_visp.tasks.visp_base import VispTaskBase
28
28
 
29
- __all__ = ["WavelengthCalibration"]
30
-
31
29
 
32
30
  class WavelengthCalibration(VispTaskBase, QualityMixin):
33
31
  """Task class for correcting the dispersion axis wavelength values.
@@ -125,6 +123,7 @@ class WavelengthCalibration(VispTaskBase, QualityMixin):
125
123
  negative_limit=-wavelength_range / 2,
126
124
  positive_limit=wavelength_range / 2,
127
125
  num_steps=550,
126
+ normalization_percentile=self.parameters.wavecal_init_crval_guess_normalization_percentile,
128
127
  )
129
128
  logger.info(f"{crval_initial_guess = !s}")
130
129
 
@@ -135,6 +134,15 @@ class WavelengthCalibration(VispTaskBase, QualityMixin):
135
134
  resolving_power = self.parameters.wavecal_init_resolving_power
136
135
  logger.info(f"{resolving_power = }")
137
136
 
137
+ init_continuum_level = estimate_relative_continuum_level(
138
+ crval_init=crval_initial_guess,
139
+ wavelength_range=wavelength_range,
140
+ atlas=atlas,
141
+ representative_spectrum=input_spectrum,
142
+ normalization_percentile=self.parameters.wavecal_init_crval_guess_normalization_percentile,
143
+ )
144
+ logger.info(f"{init_continuum_level = !s}")
145
+
138
146
  logger.info("Setting bounds")
139
147
  wavelength_search_width = dispersion * self.parameters.wavecal_crval_bounds_px
140
148
  bounds = BoundsModel(
@@ -158,7 +166,9 @@ class WavelengthCalibration(VispTaskBase, QualityMixin):
158
166
  ),
159
167
  opacity_factor=UnitlessBoundRange(min=0.0, max=10.0),
160
168
  straylight_fraction=UnitlessBoundRange(min=0.0, max=0.4),
161
- continuum_level=UnitlessBoundRange(min=0.5, max=2.0),
169
+ continuum_level=UnitlessBoundRange(
170
+ min=init_continuum_level * 0.7, max=init_continuum_level * 1.3
171
+ ),
162
172
  )
163
173
 
164
174
  fit_flags = FitFlagsModel(
@@ -180,6 +190,7 @@ class WavelengthCalibration(VispTaskBase, QualityMixin):
180
190
  opacity_factor=self.parameters.wavecal_init_opacity_factor,
181
191
  straylight_fraction=self.parameters.wavecal_init_straylight_fraction,
182
192
  grating_constant=self.constants.grating_constant_inverse_mm,
193
+ continuum_level=init_continuum_level,
183
194
  doppler_velocity=doppler_velocity,
184
195
  order=order,
185
196
  bounds=bounds,
@@ -428,3 +439,33 @@ def compute_initial_dispersion(
428
439
  dispersion = pixel_pitch / linear_dispersion
429
440
 
430
441
  return dispersion.to(u.nm / u.pix)
442
+
443
+
444
+ def estimate_relative_continuum_level(
445
+ *,
446
+ crval_init: Quantity,
447
+ wavelength_range: Quantity,
448
+ atlas: Atlas,
449
+ representative_spectrum: np.ndarray,
450
+ normalization_percentile: float,
451
+ ) -> float:
452
+ """
453
+ Estimate the multiplicative scaling between the representative spectrum and atlas solar transmission.
454
+
455
+ This scaling is used to set the initial guess of 0th-order continuum scaling. We estimate the scaling factor by
456
+ comparing the values of the two spectra at a given percent of the CDF. This percent is taken from the
457
+ `~dkist_processing_visp.models.parameters.VispParameters.wavecal_init_crval_guess_normalization_percentile`
458
+ pipeline parameter.
459
+ """
460
+ wave_min = crval_init - wavelength_range / 2
461
+ wave_max = crval_init + wavelength_range / 2
462
+
463
+ atlas_idx = np.where(
464
+ (atlas.solar_atlas_wavelength >= wave_min) & (atlas.solar_atlas_wavelength <= wave_max)
465
+ )
466
+ atlas_norm = np.nanpercentile(
467
+ atlas.solar_atlas_transmission[atlas_idx], normalization_percentile
468
+ )
469
+ spec_norm = np.nanpercentile(representative_spectrum, normalization_percentile)
470
+
471
+ return spec_norm / atlas_norm
@@ -22,7 +22,7 @@ from dkist_processing_visp.tasks import VispAssembleQualityData
22
22
  from dkist_processing_visp.tasks import VispL0QualityMetrics
23
23
  from dkist_processing_visp.tasks import VispL1QualityMetrics
24
24
  from dkist_processing_visp.tasks import VispWriteL1Frame
25
- from dkist_processing_visp.tasks.wavelength_calibration import WavelengthCalibration
25
+ from dkist_processing_visp.tasks import WavelengthCalibration
26
26
 
27
27
  l0_pipeline = Workflow(
28
28
  category="visp",
@@ -23,7 +23,7 @@ from dkist_processing_visp.tasks import VispAssembleQualityData
23
23
  from dkist_processing_visp.tasks import VispL0QualityMetrics
24
24
  from dkist_processing_visp.tasks import VispL1QualityMetrics
25
25
  from dkist_processing_visp.tasks import VispWriteL1Frame
26
- from dkist_processing_visp.tasks.wavelength_calibration import WavelengthCalibration
26
+ from dkist_processing_visp.tasks import WavelengthCalibration
27
27
 
28
28
  full_trial_pipeline = Workflow(
29
29
  category="visp",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.2.1
3
+ Version: 5.2.2
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
@@ -126,8 +126,8 @@ Requires-Dist: attrs==25.4.0; extra == "frozen"
126
126
  Requires-Dist: babel==2.17.0; extra == "frozen"
127
127
  Requires-Dist: billiard==4.2.4; extra == "frozen"
128
128
  Requires-Dist: blinker==1.9.0; extra == "frozen"
129
- Requires-Dist: boto3==1.42.10; extra == "frozen"
130
- Requires-Dist: botocore==1.42.10; extra == "frozen"
129
+ Requires-Dist: boto3==1.42.11; extra == "frozen"
130
+ Requires-Dist: botocore==1.42.11; extra == "frozen"
131
131
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
132
132
  Requires-Dist: celery==5.6.0; extra == "frozen"
133
133
  Requires-Dist: certifi==2025.11.12; extra == "frozen"
@@ -154,7 +154,7 @@ Requires-Dist: dkist-processing-common==11.9.1; extra == "frozen"
154
154
  Requires-Dist: dkist-processing-core==6.0.1; extra == "frozen"
155
155
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
156
156
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
157
- Requires-Dist: dkist-processing-visp==5.2.1; extra == "frozen"
157
+ Requires-Dist: dkist-processing-visp==5.2.2; extra == "frozen"
158
158
  Requires-Dist: dkist-service-configuration==4.1.13; extra == "frozen"
159
159
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
160
160
  Requires-Dist: dkist_fits_specifications==4.19.0; extra == "frozen"
@@ -170,6 +170,7 @@ Requires-Dist: globus-sdk==4.2.0; extra == "frozen"
170
170
  Requires-Dist: google-re2==1.1.20251105; extra == "frozen"
171
171
  Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
172
172
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
173
+ Requires-Dist: greenlet==3.3.0; extra == "frozen"
173
174
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
174
175
  Requires-Dist: gunicorn==23.0.0; extra == "frozen"
175
176
  Requires-Dist: h11==0.16.0; extra == "frozen"
@@ -92,8 +92,8 @@ attrs==25.4.0
92
92
  babel==2.17.0
93
93
  billiard==4.2.4
94
94
  blinker==1.9.0
95
- boto3==1.42.10
96
- botocore==1.42.10
95
+ boto3==1.42.11
96
+ botocore==1.42.11
97
97
  cachelib==0.13.0
98
98
  celery==5.6.0
99
99
  certifi==2025.11.12
@@ -120,7 +120,7 @@ dkist-processing-common==11.9.1
120
120
  dkist-processing-core==6.0.1
121
121
  dkist-processing-math==2.2.1
122
122
  dkist-processing-pac==3.1.1
123
- dkist-processing-visp==5.2.1
123
+ dkist-processing-visp==5.2.2
124
124
  dkist-service-configuration==4.1.13
125
125
  dkist-spectral-lines==3.0.0
126
126
  dkist_fits_specifications==4.19.0
@@ -136,6 +136,7 @@ globus-sdk==4.2.0
136
136
  google-re2==1.1.20251105
137
137
  googleapis-common-protos==1.72.0
138
138
  gqlclient==1.2.3
139
+ greenlet==3.3.0
139
140
  grpcio==1.76.0
140
141
  gunicorn==23.0.0
141
142
  h11==0.16.0
@@ -9,8 +9,8 @@ find = {}
9
9
 
10
10
  [tool.dkist-dev-tools]
11
11
  # Most recently frozen version by dkist-dev-tools
12
- version = "5.2.1"
13
- date = 2025-12-16T13:02:14.592784
12
+ version = "5.2.2"
13
+ date = 2025-12-17T09:12:25.459200
14
14
 
15
15
  [project]
16
16
  dynamic = ["version"]
@@ -154,8 +154,8 @@ frozen = [
154
154
  "babel == 2.17.0",
155
155
  "billiard == 4.2.4",
156
156
  "blinker == 1.9.0",
157
- "boto3 == 1.42.10",
158
- "botocore == 1.42.10",
157
+ "boto3 == 1.42.11",
158
+ "botocore == 1.42.11",
159
159
  "cachelib == 0.13.0",
160
160
  "celery == 5.6.0",
161
161
  "certifi == 2025.11.12",
@@ -182,7 +182,7 @@ frozen = [
182
182
  "dkist-processing-core == 6.0.1",
183
183
  "dkist-processing-math == 2.2.1",
184
184
  "dkist-processing-pac == 3.1.1",
185
- "dkist-processing-visp == 5.2.1",
185
+ "dkist-processing-visp == 5.2.2",
186
186
  "dkist-service-configuration == 4.1.13",
187
187
  "dkist-spectral-lines == 3.0.0",
188
188
  "dkist_fits_specifications == 4.19.0",
@@ -198,6 +198,7 @@ frozen = [
198
198
  "google-re2 == 1.1.20251105",
199
199
  "googleapis-common-protos == 1.72.0",
200
200
  "gqlclient == 1.2.3",
201
+ "greenlet == 3.3.0",
201
202
  "grpcio == 1.76.0",
202
203
  "gunicorn == 23.0.0",
203
204
  "h11 == 0.16.0",