dkist-processing-visp 5.0.0__tar.gz → 5.0.0rc2__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.
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/CHANGELOG.rst +0 -33
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/PKG-INFO +38 -39
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/SCIENCE_CHANGELOG.rst +0 -19
- dkist_processing_visp-5.0.0rc2/changelog/246.doc.2.rst +2 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.doc.rst +2 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.feature.2.rst +1 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.feature.3.rst +1 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.feature.4.rst +1 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.feature.rst +4 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.misc.2.rst +1 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.misc.3.rst +1 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.misc.rst +2 -0
- dkist_processing_visp-5.0.0rc2/changelog/246.science.rst +11 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/models/parameters.py +1 -37
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/solar.py +12 -63
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/conftest.py +0 -3
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_parameters.py +1 -50
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_solar.py +7 -13
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp.egg-info/PKG-INFO +38 -39
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp.egg-info/SOURCES.txt +10 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp.egg-info/requires.txt +37 -38
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/pyproject.toml +39 -40
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/.gitignore +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/.pre-commit-config.yaml +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/.readthedocs.yml +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/.snyk +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/README.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/bitbucket-pipelines.yml +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/changelog/.gitempty +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/config.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/models/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/models/constants.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/models/fits_access.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/models/metric_code.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/models/tags.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/models/task_name.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/map_repeats.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/modulator_states.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/raster_step.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/spectrograph_configuration.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/time.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/background_light.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/dark.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/geometric.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/instrument_polarization.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/lamp.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/parse.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/science.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/visp_base.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/write_l1.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/README.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/header_models.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_background_light.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_dark.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_downsample.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_fits_access.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_geometric.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_lamp.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_parse.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_quality.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_science.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_workflows.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tests/test_write_l1.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/workflows/__init__.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/workflows/l0_processing.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp.egg-info/top_level.txt +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/Makefile +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/background_light.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/changelog.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/conf.py +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/gain_correction.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/geometric.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/index.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/l0_to_l1_visp.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/l0_to_l1_visp_full-trial.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/landing_page.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/make.bat +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/polarization_calibration.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/requirements.txt +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/requirements_table.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/science_calibration.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/docs/scientific_changelog.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/licenses/LICENSE.rst +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/science_towncrier.sh +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/setup.cfg +0 -0
- {dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/towncrier_science.toml +0 -0
|
@@ -1,36 +1,3 @@
|
|
|
1
|
-
v5.0.0 (2025-12-02)
|
|
2
|
-
===================
|
|
3
|
-
|
|
4
|
-
Features
|
|
5
|
-
--------
|
|
6
|
-
|
|
7
|
-
- Only compute a single lamp gain for each beam. In the past a single map gain was also computed for each modulation state. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
8
|
-
- Add quality report metrics that show the quality of the vignette estimation in the Solar Gain tasks. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
9
|
-
- Update the Solar Gain task to measure vignetting signal, compute a single gain for each beam (as opposed to for each beam and modulator state),
|
|
10
|
-
and stop applying residual spectral shifts to the characteristic spectra before removing from the input gain array.
|
|
11
|
-
See the `Science Changelog <https://docs.dkist.nso.edu/projects/visp/en/stable/scientific_changelog.html>`_ and
|
|
12
|
-
`gain algorithm docs <https://docs.dkist.nso.edu/projects/visp/en/stable/gain_correction.html>`_ for more information. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
13
|
-
- Add Buds to parse the spectrograph setup into pipeline constants to be used when fitting a solar atlas. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Misc
|
|
17
|
-
----
|
|
18
|
-
|
|
19
|
-
- Remove the `LineZonesMixin` and move its methods directly to the Geometric calibration task, which is now the only task that uses them. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
20
|
-
- Rename the ``solar_spectral_avg_window`` to ``solar_spatial_median_filter_width_px`` to more accurately capture what it does. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
21
|
-
- Rename all line-zone parameters to be "geo*" parameters instead of "solar*" parameters. These parameters are now only used in the
|
|
22
|
-
Geometric calibration task. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Documentation
|
|
26
|
-
-------------
|
|
27
|
-
|
|
28
|
-
- Update the online doc page for `gain calibration <https://docs.dkist.nso.edu/projects/visp/en/stable/gain_correction.html>`_
|
|
29
|
-
to reflect the updates to the Solar Gain task. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
30
|
-
- Add intersphinx mappings for `lmfit <https://lmfit.github.io/lmfit-py/>`_ and `scikit-learn <https://scikit-learn.org/stable/>`_
|
|
31
|
-
for linking bliss. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
32
|
-
|
|
33
|
-
|
|
34
1
|
v4.0.0 (2025-11-12)
|
|
35
2
|
===================
|
|
36
3
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dkist-processing-visp
|
|
3
|
-
Version: 5.0.
|
|
3
|
+
Version: 5.0.0rc2
|
|
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,14 +13,14 @@ Classifier: Programming Language :: Python :: 3
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
14
|
Requires-Python: >=3.12
|
|
15
15
|
Description-Content-Type: text/x-rst
|
|
16
|
-
Requires-Dist: dkist-processing-common==11.8.
|
|
16
|
+
Requires-Dist: dkist-processing-common==11.8.1rc2
|
|
17
17
|
Requires-Dist: dkist-processing-math==2.2.1
|
|
18
18
|
Requires-Dist: dkist-processing-pac==3.1.1
|
|
19
19
|
Requires-Dist: dkist-header-validator==5.2.1
|
|
20
20
|
Requires-Dist: dkist-fits-specifications==4.17.0
|
|
21
21
|
Requires-Dist: dkist-service-configuration==4.1.7
|
|
22
22
|
Requires-Dist: dkist-spectral-lines==3.0.0
|
|
23
|
-
Requires-Dist: solar-wavelength-calibration==2.0.
|
|
23
|
+
Requires-Dist: solar-wavelength-calibration==2.0.0rc3
|
|
24
24
|
Requires-Dist: astropy==7.0.2
|
|
25
25
|
Requires-Dist: numpy==2.2.5
|
|
26
26
|
Requires-Dist: sunpy==6.1.1
|
|
@@ -95,44 +95,44 @@ Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
|
|
|
95
95
|
Requires-Dist: aiohttp==3.13.2; extra == "frozen"
|
|
96
96
|
Requires-Dist: aiosignal==1.4.0; extra == "frozen"
|
|
97
97
|
Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
|
|
98
|
-
Requires-Dist: alembic==1.17.
|
|
98
|
+
Requires-Dist: alembic==1.17.1; extra == "frozen"
|
|
99
99
|
Requires-Dist: amqp==5.3.1; extra == "frozen"
|
|
100
100
|
Requires-Dist: annotated-types==0.7.0; extra == "frozen"
|
|
101
|
-
Requires-Dist: anyio==4.
|
|
101
|
+
Requires-Dist: anyio==4.11.0; extra == "frozen"
|
|
102
102
|
Requires-Dist: apache-airflow==2.11.0; extra == "frozen"
|
|
103
|
-
Requires-Dist: apache-airflow-providers-celery==3.
|
|
104
|
-
Requires-Dist: apache-airflow-providers-common-compat==1.
|
|
105
|
-
Requires-Dist: apache-airflow-providers-common-io==1.
|
|
106
|
-
Requires-Dist: apache-airflow-providers-common-sql==1.
|
|
103
|
+
Requires-Dist: apache-airflow-providers-celery==3.10.0; extra == "frozen"
|
|
104
|
+
Requires-Dist: apache-airflow-providers-common-compat==1.8.0; extra == "frozen"
|
|
105
|
+
Requires-Dist: apache-airflow-providers-common-io==1.6.4; extra == "frozen"
|
|
106
|
+
Requires-Dist: apache-airflow-providers-common-sql==1.28.2; extra == "frozen"
|
|
107
107
|
Requires-Dist: apache-airflow-providers-fab==1.5.3; extra == "frozen"
|
|
108
|
-
Requires-Dist: apache-airflow-providers-ftp==3.
|
|
109
|
-
Requires-Dist: apache-airflow-providers-http==5.
|
|
110
|
-
Requires-Dist: apache-airflow-providers-imap==3.
|
|
111
|
-
Requires-Dist: apache-airflow-providers-postgres==6.
|
|
112
|
-
Requires-Dist: apache-airflow-providers-smtp==2.
|
|
113
|
-
Requires-Dist: apache-airflow-providers-sqlite==4.2
|
|
114
|
-
Requires-Dist: apispec==6.
|
|
108
|
+
Requires-Dist: apache-airflow-providers-ftp==3.13.2; extra == "frozen"
|
|
109
|
+
Requires-Dist: apache-airflow-providers-http==5.4.0; extra == "frozen"
|
|
110
|
+
Requires-Dist: apache-airflow-providers-imap==3.9.3; extra == "frozen"
|
|
111
|
+
Requires-Dist: apache-airflow-providers-postgres==6.4.0; extra == "frozen"
|
|
112
|
+
Requires-Dist: apache-airflow-providers-smtp==2.3.1; extra == "frozen"
|
|
113
|
+
Requires-Dist: apache-airflow-providers-sqlite==4.1.2; extra == "frozen"
|
|
114
|
+
Requires-Dist: apispec==6.8.4; extra == "frozen"
|
|
115
115
|
Requires-Dist: argcomplete==3.6.3; extra == "frozen"
|
|
116
116
|
Requires-Dist: asdf==3.5.0; extra == "frozen"
|
|
117
117
|
Requires-Dist: asdf_standard==1.4.0; extra == "frozen"
|
|
118
118
|
Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
|
|
119
|
-
Requires-Dist: asgiref==3.
|
|
119
|
+
Requires-Dist: asgiref==3.10.0; extra == "frozen"
|
|
120
120
|
Requires-Dist: asteval==1.0.7; extra == "frozen"
|
|
121
121
|
Requires-Dist: astropy==7.0.2; extra == "frozen"
|
|
122
|
-
Requires-Dist: astropy-iers-data==0.2025.
|
|
123
|
-
Requires-Dist: asyncpg==0.
|
|
122
|
+
Requires-Dist: astropy-iers-data==0.2025.11.10.0.38.31; extra == "frozen"
|
|
123
|
+
Requires-Dist: asyncpg==0.30.0; extra == "frozen"
|
|
124
124
|
Requires-Dist: attrs==25.4.0; extra == "frozen"
|
|
125
125
|
Requires-Dist: babel==2.17.0; extra == "frozen"
|
|
126
|
-
Requires-Dist: billiard==4.2.
|
|
126
|
+
Requires-Dist: billiard==4.2.2; extra == "frozen"
|
|
127
127
|
Requires-Dist: blinker==1.9.0; extra == "frozen"
|
|
128
|
-
Requires-Dist: boto3==1.
|
|
129
|
-
Requires-Dist: botocore==1.
|
|
128
|
+
Requires-Dist: boto3==1.40.72; extra == "frozen"
|
|
129
|
+
Requires-Dist: botocore==1.40.72; extra == "frozen"
|
|
130
130
|
Requires-Dist: cachelib==0.13.0; extra == "frozen"
|
|
131
|
-
Requires-Dist: celery==5.
|
|
131
|
+
Requires-Dist: celery==5.3.1; extra == "frozen"
|
|
132
132
|
Requires-Dist: certifi==2025.11.12; extra == "frozen"
|
|
133
133
|
Requires-Dist: cffi==2.0.0; extra == "frozen"
|
|
134
134
|
Requires-Dist: charset-normalizer==3.4.4; extra == "frozen"
|
|
135
|
-
Requires-Dist: click==8.3.
|
|
135
|
+
Requires-Dist: click==8.3.0; extra == "frozen"
|
|
136
136
|
Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
|
|
137
137
|
Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
|
|
138
138
|
Requires-Dist: click-repl==0.3.0; extra == "frozen"
|
|
@@ -149,20 +149,19 @@ Requires-Dist: dacite==1.9.2; extra == "frozen"
|
|
|
149
149
|
Requires-Dist: decorator==5.2.1; extra == "frozen"
|
|
150
150
|
Requires-Dist: dill==0.4.0; extra == "frozen"
|
|
151
151
|
Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
|
|
152
|
-
Requires-Dist: dkist-processing-common==11.8.
|
|
152
|
+
Requires-Dist: dkist-processing-common==11.8.1rc2; extra == "frozen"
|
|
153
153
|
Requires-Dist: dkist-processing-core==6.0.0; extra == "frozen"
|
|
154
154
|
Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
|
|
155
155
|
Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
|
|
156
|
-
Requires-Dist: dkist-processing-visp==5.0.
|
|
156
|
+
Requires-Dist: dkist-processing-visp==5.0.0rc2; extra == "frozen"
|
|
157
157
|
Requires-Dist: dkist-service-configuration==4.1.7; extra == "frozen"
|
|
158
158
|
Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
|
|
159
159
|
Requires-Dist: dkist_fits_specifications==4.17.0; extra == "frozen"
|
|
160
160
|
Requires-Dist: dnspython==2.8.0; extra == "frozen"
|
|
161
161
|
Requires-Dist: email-validator==2.3.0; extra == "frozen"
|
|
162
|
-
Requires-Dist: exceptiongroup==1.3.1; extra == "frozen"
|
|
163
162
|
Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
|
|
164
163
|
Requires-Dist: flower==2.0.1; extra == "frozen"
|
|
165
|
-
Requires-Dist: fonttools==4.
|
|
164
|
+
Requires-Dist: fonttools==4.60.1; extra == "frozen"
|
|
166
165
|
Requires-Dist: frozenlist==1.8.0; extra == "frozen"
|
|
167
166
|
Requires-Dist: fsspec==2025.10.0; extra == "frozen"
|
|
168
167
|
Requires-Dist: globus-sdk==3.65.0; extra == "frozen"
|
|
@@ -187,7 +186,7 @@ Requires-Dist: jsonschema==4.25.1; extra == "frozen"
|
|
|
187
186
|
Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
|
|
188
187
|
Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
|
|
189
188
|
Requires-Dist: kiwisolver==1.4.9; extra == "frozen"
|
|
190
|
-
Requires-Dist: kombu==5.6.
|
|
189
|
+
Requires-Dist: kombu==5.6.0; extra == "frozen"
|
|
191
190
|
Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
|
|
192
191
|
Requires-Dist: lazy_loader==0.4; extra == "frozen"
|
|
193
192
|
Requires-Dist: limits==5.6.0; extra == "frozen"
|
|
@@ -207,7 +206,7 @@ Requires-Dist: more-itertools==10.8.0; extra == "frozen"
|
|
|
207
206
|
Requires-Dist: moviepy==2.1.2; extra == "frozen"
|
|
208
207
|
Requires-Dist: multidict==6.7.0; extra == "frozen"
|
|
209
208
|
Requires-Dist: nbformat==5.10.4; extra == "frozen"
|
|
210
|
-
Requires-Dist: networkx==3.
|
|
209
|
+
Requires-Dist: networkx==3.5; extra == "frozen"
|
|
211
210
|
Requires-Dist: numpy==2.2.5; extra == "frozen"
|
|
212
211
|
Requires-Dist: object-clerk==1.0.0; extra == "frozen"
|
|
213
212
|
Requires-Dist: opentelemetry-api==1.38.0; extra == "frozen"
|
|
@@ -252,11 +251,11 @@ Requires-Dist: proglog==0.1.12; extra == "frozen"
|
|
|
252
251
|
Requires-Dist: prometheus_client==0.23.1; extra == "frozen"
|
|
253
252
|
Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
|
|
254
253
|
Requires-Dist: propcache==0.4.1; extra == "frozen"
|
|
255
|
-
Requires-Dist: protobuf==6.33.
|
|
254
|
+
Requires-Dist: protobuf==6.33.0; extra == "frozen"
|
|
256
255
|
Requires-Dist: psutil==7.1.3; extra == "frozen"
|
|
257
256
|
Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
|
|
258
257
|
Requires-Dist: pycparser==2.23; extra == "frozen"
|
|
259
|
-
Requires-Dist: pydantic==2.12.
|
|
258
|
+
Requires-Dist: pydantic==2.12.4; extra == "frozen"
|
|
260
259
|
Requires-Dist: pydantic-settings==2.12.0; extra == "frozen"
|
|
261
260
|
Requires-Dist: pydantic_core==2.41.5; extra == "frozen"
|
|
262
261
|
Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
|
|
@@ -274,17 +273,18 @@ Requires-Dist: requests-toolbelt==1.0.0; extra == "frozen"
|
|
|
274
273
|
Requires-Dist: rfc3339-validator==0.1.4; extra == "frozen"
|
|
275
274
|
Requires-Dist: rich==13.9.4; extra == "frozen"
|
|
276
275
|
Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
|
|
277
|
-
Requires-Dist: rpds-py==0.
|
|
278
|
-
Requires-Dist: s3transfer==0.
|
|
276
|
+
Requires-Dist: rpds-py==0.28.0; extra == "frozen"
|
|
277
|
+
Requires-Dist: s3transfer==0.14.0; extra == "frozen"
|
|
279
278
|
Requires-Dist: scikit-image==0.25.2; extra == "frozen"
|
|
280
279
|
Requires-Dist: scikit-learn==1.6.1; extra == "frozen"
|
|
281
280
|
Requires-Dist: scipy==1.15.3; extra == "frozen"
|
|
282
281
|
Requires-Dist: semantic-version==2.10.0; extra == "frozen"
|
|
283
282
|
Requires-Dist: setproctitle==1.3.7; extra == "frozen"
|
|
284
283
|
Requires-Dist: six==1.17.0; extra == "frozen"
|
|
285
|
-
Requires-Dist:
|
|
284
|
+
Requires-Dist: sniffio==1.3.1; extra == "frozen"
|
|
285
|
+
Requires-Dist: solar-wavelength-calibration==2.0.0rc3; extra == "frozen"
|
|
286
286
|
Requires-Dist: sqids==0.5.1; extra == "frozen"
|
|
287
|
-
Requires-Dist: sqlparse==0.5.
|
|
287
|
+
Requires-Dist: sqlparse==0.5.3; extra == "frozen"
|
|
288
288
|
Requires-Dist: sunpy==6.1.1; extra == "frozen"
|
|
289
289
|
Requires-Dist: tabulate==0.9.0; extra == "frozen"
|
|
290
290
|
Requires-Dist: talus==1.3.4; extra == "frozen"
|
|
@@ -299,17 +299,16 @@ Requires-Dist: traitlets==5.14.3; extra == "frozen"
|
|
|
299
299
|
Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
|
|
300
300
|
Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
|
|
301
301
|
Requires-Dist: tzdata==2025.2; extra == "frozen"
|
|
302
|
-
Requires-Dist: tzlocal==5.3.1; extra == "frozen"
|
|
303
302
|
Requires-Dist: uc-micro-py==1.0.3; extra == "frozen"
|
|
304
303
|
Requires-Dist: uncertainties==3.2.3; extra == "frozen"
|
|
305
|
-
Requires-Dist: universal_pathlib==0.3.
|
|
304
|
+
Requires-Dist: universal_pathlib==0.3.5; extra == "frozen"
|
|
306
305
|
Requires-Dist: urllib3==2.5.0; extra == "frozen"
|
|
307
306
|
Requires-Dist: vine==5.1.0; extra == "frozen"
|
|
308
307
|
Requires-Dist: voluptuous==0.15.2; extra == "frozen"
|
|
309
308
|
Requires-Dist: wcwidth==0.2.14; extra == "frozen"
|
|
310
309
|
Requires-Dist: wirerope==1.0.0; extra == "frozen"
|
|
311
310
|
Requires-Dist: wrapt==1.17.3; extra == "frozen"
|
|
312
|
-
Requires-Dist: yamale==6.
|
|
311
|
+
Requires-Dist: yamale==6.0.0; extra == "frozen"
|
|
313
312
|
Requires-Dist: yarl==1.22.0; extra == "frozen"
|
|
314
313
|
Requires-Dist: zipp==3.23.0; extra == "frozen"
|
|
315
314
|
|
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
v5.0.0 (2025-12-02)
|
|
2
|
-
===================
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- Major update to the gain algorithm to mitigate polarization artifacts in L1 science frames. This change can be split into
|
|
8
|
-
three parts. See the `gain correction <https://docs.dkist.nso.edu/projects/visp/en/stable/gain_correction.html>`_ page for more information.
|
|
9
|
-
|
|
10
|
-
#. Compute a single gain correction image for each beam. In the past we had computed a separate gain image for each modstate as well, but this was found to couple residual polarization structure into the final science frames.
|
|
11
|
-
|
|
12
|
-
#. Stop "refining" (i.e., applying small spectral offsets to) the characteristic solar spectrum on a per-spatial-pixel basis. This was initially done to minimize line residuals in Telluric lines but was found to have a more-negative on polarimetric residuals.
|
|
13
|
-
|
|
14
|
-
#. Separate vignetting caused by aperture masks from the solar signal used to remove spectral lines in the final gain image. This is done by fitting a solar atlas and taking the deviation in continuum to be the vignetting signal.
|
|
15
|
-
|
|
16
|
-
Computing a single gain per beam will greatly reduce the polarization artifacts in L1 data. Measuring the vignette
|
|
17
|
-
signal directly will further reduce these artifacts and improve flatness across the array. (`#246 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/246>`__)
|
|
18
|
-
|
|
19
|
-
|
|
20
1
|
v4.0.0 (2025-11-12)
|
|
21
2
|
===================
|
|
22
3
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Only compute a single lamp gain for each beam. In the past a single map gain was also computed for each modulation state.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Add Buds to parse the spectrograph setup into pipeline constants to be used when fitting a solar atlas.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Add quality report metrics that show the quality of the vignette estimation in the Solar Gain tasks.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
Update the Solar Gain task to measure vignetting signal, compute a single gain for each beam (as opposed to for each beam and modulator state),
|
|
2
|
+
and stop applying residual spectral shifts to the characteristic spectra before removing from the input gain array.
|
|
3
|
+
See the `Science Changelog <https://docs.dkist.nso.edu/projects/visp/en/stable/scientific_changelog.html>`_ and
|
|
4
|
+
`gain algorithm docs <https://docs.dkist.nso.edu/projects/visp/en/stable/gain_correction.html>`_ for more information.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Remove the `LineZonesMixin` and move its methods directly to the Geometric calibration task, which is now the only task that uses them.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Rename the ``solar_spectral_avg_window`` to ``solar_spatial_median_filter_width_px`` to more accurately capture what it does.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Major update to the gain algorithm to mitigate polarization artifacts in L1 science frames. This change can be split into
|
|
2
|
+
three parts. See the `gain correction <https://docs.dkist.nso.edu/projects/visp/en/stable/gain_correction.html>`_ page for more information.
|
|
3
|
+
|
|
4
|
+
#. Compute a single gain correction image for each beam. In the past we had computed a separate gain image for each modstate as well, but this was found to couple residual polarization structure into the final science frames.
|
|
5
|
+
|
|
6
|
+
#. Stop "refining" (i.e., applying small spectral offsets to) the characteristic solar spectrum on a per-spatial-pixel basis. This was initially done to minimize line residuals in Telluric lines but was found to have a more-negative on polarimetric residuals.
|
|
7
|
+
|
|
8
|
+
#. Separate vignetting caused by aperture masks from the solar signal used to remove spectral lines in the final gain image. This is done by fitting a solar atlas and taking the deviation in continuum to be the vignetting signal.
|
|
9
|
+
|
|
10
|
+
Computing a single gain per beam will greatly reduce the polarization artifacts in L1 data. Measuring the vignette
|
|
11
|
+
signal directly will further reduce these artifacts and improve flatness across the array.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Visp calibration pipeline parameters."""
|
|
2
2
|
|
|
3
3
|
from datetime import datetime
|
|
4
|
-
from random import randint
|
|
5
4
|
from typing import Any
|
|
6
5
|
|
|
7
6
|
import astropy.units as u
|
|
@@ -187,38 +186,10 @@ class VispParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmIdMixi
|
|
|
187
186
|
"visp_solar_vignette_initial_continuum_poly_fit_order"
|
|
188
187
|
)
|
|
189
188
|
|
|
190
|
-
@property
|
|
191
|
-
def solar_vignette_crval_bounds_px(self) -> float:
|
|
192
|
-
"""
|
|
193
|
-
Define the bounds (in *pixels*) on crval when fitting the initial vignette signal.
|
|
194
|
-
|
|
195
|
-
The actual bounds on the value of crval are equal to ± the initial dispersion times this number. Note that the
|
|
196
|
-
total range searched by the fitting algorithm will be twice this number (in pixels).
|
|
197
|
-
"""
|
|
198
|
-
return self._find_most_recent_past_value("visp_solar_vignette_crval_bounds_px") * u.pix
|
|
199
|
-
|
|
200
|
-
@property
|
|
201
|
-
def solar_vignette_dispersion_bounds_fraction(self) -> float:
|
|
202
|
-
"""
|
|
203
|
-
Define the ± fraction away from the initial value for bounds on dispersion when fitting the initial vignette signal.
|
|
204
|
-
|
|
205
|
-
This value should be between 0 and 1. For example, the minimum bound is `init_value * (1 - solar_vignette_dispersion_bounds_fraction)`.
|
|
206
|
-
"""
|
|
207
|
-
return self._find_most_recent_past_value("visp_solar_vignette_dispersion_bounds_fraction")
|
|
208
|
-
|
|
209
189
|
@property
|
|
210
190
|
def solar_vignette_wavecal_fit_kwargs(self) -> dict[str, Any]:
|
|
211
191
|
"""Define extra keyword arguments to pass to the wavelength calibration fitter."""
|
|
212
|
-
|
|
213
|
-
rng_kwarg = dict()
|
|
214
|
-
fitting_method = doc_dict.get("method", False)
|
|
215
|
-
if fitting_method in ["basinhopping", "differential_evolution", "dual_annealing"]:
|
|
216
|
-
rng = randint(1, 1_000_000)
|
|
217
|
-
rng_kwarg["rng"] = rng
|
|
218
|
-
|
|
219
|
-
# The order here allows us to override `rng` in a parameter value
|
|
220
|
-
fit_kwargs = rng_kwarg | doc_dict
|
|
221
|
-
return fit_kwargs
|
|
192
|
+
return self._find_most_recent_past_value("visp_solar_vignette_wavecal_fit_kwargs")
|
|
222
193
|
|
|
223
194
|
@property
|
|
224
195
|
def solar_vignette_spectral_poly_fit_order(self) -> int:
|
|
@@ -257,13 +228,6 @@ class VispParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmIdMixi
|
|
|
257
228
|
config_dict = self._find_most_recent_past_value("visp_wavecal_atlas_download_config")
|
|
258
229
|
return DownloadConfig.model_validate(config_dict)
|
|
259
230
|
|
|
260
|
-
@property
|
|
261
|
-
def wavecal_init_crval_guess_normalization_percentile(self) -> float | None:
|
|
262
|
-
"""Define the CDF percentage used to normalize the Atlas to the input spectrum level when computing an initial CRVAL guess."""
|
|
263
|
-
return self._find_most_recent_past_value(
|
|
264
|
-
"visp_wavecal_init_crval_guess_normalization_percentile"
|
|
265
|
-
)
|
|
266
|
-
|
|
267
231
|
@property
|
|
268
232
|
def wavecal_init_resolving_power(self) -> int:
|
|
269
233
|
"""Define the initial guess for ViSP resolving power in wavecal fits."""
|
{dkist_processing_visp-5.0.0 → dkist_processing_visp-5.0.0rc2}/dkist_processing_visp/tasks/solar.py
RENAMED
|
@@ -70,7 +70,6 @@ class WavelengthCalibrationParametersWithContinuum(WavelengthCalibrationParamete
|
|
|
70
70
|
|
|
71
71
|
continuum_poly_fit_order: int
|
|
72
72
|
normalized_abscissa: np.ndarray
|
|
73
|
-
zeroth_order_continuum_coefficient: float
|
|
74
73
|
|
|
75
74
|
@property
|
|
76
75
|
def continuum_function(self) -> Callable[[np.ndarray, Parameters], np.ndarray]:
|
|
@@ -94,26 +93,16 @@ class WavelengthCalibrationParametersWithContinuum(WavelengthCalibrationParamete
|
|
|
94
93
|
# dynamically create the required number of "poly_coeff_{o:02n}" fields. Sorry if this bites you!
|
|
95
94
|
params = super().lmfit_parameters
|
|
96
95
|
for o in range(self.continuum_poly_fit_order + 1):
|
|
97
|
-
# `np.polyval` uses its input coefficient list "backwards", so `poly_coeff_{self.continuum_poly_fit_order}`
|
|
98
|
-
# is the 0th order polynomial term.
|
|
99
96
|
params.add(
|
|
100
97
|
f"poly_coeff_{o:02n}",
|
|
101
98
|
vary=True,
|
|
102
|
-
value=
|
|
103
|
-
self.zeroth_order_continuum_coefficient
|
|
104
|
-
if o == self.continuum_poly_fit_order
|
|
105
|
-
else 0
|
|
106
|
-
),
|
|
99
|
+
value=o // self.continuum_poly_fit_order,
|
|
107
100
|
min=-1,
|
|
108
101
|
max=1,
|
|
109
102
|
)
|
|
110
103
|
|
|
111
|
-
params[f"poly_coeff_{self.continuum_poly_fit_order:02n}"].min =
|
|
112
|
-
|
|
113
|
-
)
|
|
114
|
-
params[f"poly_coeff_{self.continuum_poly_fit_order:02n}"].max = (
|
|
115
|
-
self.zeroth_order_continuum_coefficient * 1.5
|
|
116
|
-
)
|
|
104
|
+
params[f"poly_coeff_{self.continuum_poly_fit_order:02n}"].min = 0.7
|
|
105
|
+
params[f"poly_coeff_{self.continuum_poly_fit_order:02n}"].max = 1.3
|
|
117
106
|
|
|
118
107
|
# Remove the default continuum parameterization
|
|
119
108
|
del params["continuum_level"]
|
|
@@ -562,11 +551,9 @@ class SolarCalibration(
|
|
|
562
551
|
|
|
563
552
|
fitter = WavelengthCalibrationFitter(input_parameters=init_parameters, atlas=atlas)
|
|
564
553
|
with self.telemetry_span("Fit atlas and continuum"):
|
|
565
|
-
extra_kwargs = self.parameters.solar_vignette_wavecal_fit_kwargs
|
|
566
|
-
logger.info(f"Calling fitter with extra kwargs: {extra_kwargs}")
|
|
567
554
|
fit_result = fitter(
|
|
568
555
|
input_spectrum=representative_spectrum,
|
|
569
|
-
**
|
|
556
|
+
**self.parameters.solar_vignette_wavecal_fit_kwargs,
|
|
570
557
|
)
|
|
571
558
|
|
|
572
559
|
return fit_result
|
|
@@ -623,7 +610,6 @@ class SolarCalibration(
|
|
|
623
610
|
negative_limit=-wavelength_range / 2,
|
|
624
611
|
positive_limit=wavelength_range / 2,
|
|
625
612
|
num_steps=500,
|
|
626
|
-
normalization_percentile=self.parameters.wavecal_init_crval_guess_normalization_percentile,
|
|
627
613
|
)
|
|
628
614
|
|
|
629
615
|
logger.info(f"{crval_init = !s}")
|
|
@@ -641,22 +627,18 @@ class SolarCalibration(
|
|
|
641
627
|
resolving_power = self.parameters.wavecal_init_resolving_power
|
|
642
628
|
opacity_factor = self.parameters.wavecal_init_opacity_factor
|
|
643
629
|
straylight_faction = self.parameters.wavecal_init_straylight_fraction
|
|
644
|
-
relative_atlas_scaling = self.estimate_relative_continuum_level(
|
|
645
|
-
crval_init=crval_init,
|
|
646
|
-
wavelength_range=wavelength_range,
|
|
647
|
-
atlas=atlas,
|
|
648
|
-
representative_spectrum=representative_spectrum,
|
|
649
|
-
)
|
|
650
|
-
logger.info(f"0th order coefficient initial guess: {relative_atlas_scaling}")
|
|
651
630
|
|
|
652
|
-
|
|
631
|
+
# The first time we have to change these ranges (which may never happen!) we should at least consider making
|
|
632
|
+
# them parameters.
|
|
633
|
+
wavelength_search_width = wavelength_range * 0.15
|
|
653
634
|
bounds = BoundsModel(
|
|
635
|
+
# An alternative for the crval bounds would be `[input_wavelength_vector.min(), input_wavelength_vector.max()]`
|
|
654
636
|
crval=LengthBoundRange(
|
|
655
637
|
min=crval_init - wavelength_search_width, max=crval_init + wavelength_search_width
|
|
656
638
|
),
|
|
657
639
|
dispersion=DispersionBoundRange(
|
|
658
|
-
min=dispersion *
|
|
659
|
-
max=dispersion *
|
|
640
|
+
min=dispersion * 0.96,
|
|
641
|
+
max=dispersion * 1.04,
|
|
660
642
|
),
|
|
661
643
|
incident_light_angle=AngleBoundRange(
|
|
662
644
|
min=incident_light_angle - 1 * u.deg, max=incident_light_angle + 1 * u.deg
|
|
@@ -664,6 +646,7 @@ class SolarCalibration(
|
|
|
664
646
|
resolving_power=UnitlessBoundRange(min=1e5, max=5e5),
|
|
665
647
|
opacity_factor=UnitlessBoundRange(min=1.0, max=10),
|
|
666
648
|
straylight_fraction=UnitlessBoundRange(min=0.0, max=0.8),
|
|
649
|
+
continuum_level=UnitlessBoundRange(min=0.99, max=1.1),
|
|
667
650
|
)
|
|
668
651
|
|
|
669
652
|
init_params = WavelengthCalibrationParametersWithContinuum(
|
|
@@ -673,7 +656,7 @@ class SolarCalibration(
|
|
|
673
656
|
grating_constant=grating_constant,
|
|
674
657
|
doppler_velocity=doppler_velocity,
|
|
675
658
|
order=spectral_order,
|
|
676
|
-
continuum_level=1,
|
|
659
|
+
continuum_level=1.0,
|
|
677
660
|
resolving_power=resolving_power,
|
|
678
661
|
opacity_factor=opacity_factor,
|
|
679
662
|
straylight_fraction=straylight_faction,
|
|
@@ -681,44 +664,10 @@ class SolarCalibration(
|
|
|
681
664
|
bounds=bounds,
|
|
682
665
|
continuum_poly_fit_order=self.parameters.solar_vignette_initial_continuum_poly_fit_order,
|
|
683
666
|
normalized_abscissa=normalized_abscissa,
|
|
684
|
-
zeroth_order_continuum_coefficient=relative_atlas_scaling,
|
|
685
667
|
)
|
|
686
668
|
|
|
687
669
|
return init_params
|
|
688
670
|
|
|
689
|
-
def estimate_relative_continuum_level(
|
|
690
|
-
self,
|
|
691
|
-
*,
|
|
692
|
-
crval_init: Quantity,
|
|
693
|
-
wavelength_range: Quantity,
|
|
694
|
-
atlas: Atlas,
|
|
695
|
-
representative_spectrum: np.ndarray,
|
|
696
|
-
) -> float:
|
|
697
|
-
"""
|
|
698
|
-
Estimate the multiplicative scaling between the representative spectrum and atlas solar transmission.
|
|
699
|
-
|
|
700
|
-
This scaling is used to set the initial guess of 0th-order polynomial fit coefficient. We estimate the scaling
|
|
701
|
-
factor by comparing the values of the two spectra at a given percent of the CDF. This percent is taken from
|
|
702
|
-
the `~dkist_processing_visp.models.parameters.VispParameters.wavecal_init_crval_guess_normalization_percentile`
|
|
703
|
-
pipeline parameter.
|
|
704
|
-
"""
|
|
705
|
-
wave_min = crval_init - wavelength_range / 2
|
|
706
|
-
wave_max = crval_init + wavelength_range / 2
|
|
707
|
-
|
|
708
|
-
atlas_idx = np.where(
|
|
709
|
-
(atlas.solar_atlas_wavelength >= wave_min) & (atlas.solar_atlas_wavelength <= wave_max)
|
|
710
|
-
)
|
|
711
|
-
atlas_norm = np.nanpercentile(
|
|
712
|
-
atlas.solar_atlas_transmission[atlas_idx],
|
|
713
|
-
self.parameters.wavecal_init_crval_guess_normalization_percentile,
|
|
714
|
-
)
|
|
715
|
-
spec_norm = np.nanpercentile(
|
|
716
|
-
representative_spectrum,
|
|
717
|
-
self.parameters.wavecal_init_crval_guess_normalization_percentile,
|
|
718
|
-
)
|
|
719
|
-
|
|
720
|
-
return spec_norm / atlas_norm
|
|
721
|
-
|
|
722
671
|
def compute_final_vignette_estimate(self, init_vignette_correction: np.ndarray) -> np.ndarray:
|
|
723
672
|
"""
|
|
724
673
|
Fit the spectral shape of continuum residuals for each spatial pixel.
|
|
@@ -149,8 +149,6 @@ class VispInputDatasetParameterValues:
|
|
|
149
149
|
)
|
|
150
150
|
visp_solar_characteristic_spatial_normalization_percentile: float = 90.0
|
|
151
151
|
visp_solar_vignette_initial_continuum_poly_fit_order: int = 6
|
|
152
|
-
visp_solar_vignette_crval_bounds_px: float = 7
|
|
153
|
-
visp_solar_vignette_dispersion_bounds_fraction: float = 0.02
|
|
154
152
|
visp_solar_vignette_wavecal_fit_kwargs: dict[str, Any] = field(
|
|
155
153
|
default_factory=lambda: {
|
|
156
154
|
"method": "differential_evolution",
|
|
@@ -186,7 +184,6 @@ class VispInputDatasetParameterValues:
|
|
|
186
184
|
"solar_reference_atlas_hash_id": "md5:84ab4c50689ef235fe5ed4f7ee905ca0",
|
|
187
185
|
}
|
|
188
186
|
)
|
|
189
|
-
visp_wavecal_init_crval_guess_normalization_percentile: float = 95
|
|
190
187
|
visp_wavecal_init_resolving_power: int = 150000
|
|
191
188
|
visp_wavecal_init_straylight_fraction: float = 0.2
|
|
192
189
|
visp_wavecal_init_opacity_factor: float = 5.0
|
|
@@ -34,7 +34,6 @@ def arm_parameter_names() -> list[str]:
|
|
|
34
34
|
@pytest.fixture(scope="session")
|
|
35
35
|
def unit_parameter_names_and_units() -> dict[str, u.Unit | list[u.Unit]]:
|
|
36
36
|
return {
|
|
37
|
-
"solar_vignette_crval_bounds_px": u.pix,
|
|
38
37
|
"wavecal_camera_lens_parameters": [u.m, u.m / u.nm, u.m / u.nm**2],
|
|
39
38
|
"wavecal_pixel_pitch_micron_per_pix": u.um / u.pix,
|
|
40
39
|
}
|
|
@@ -103,11 +102,7 @@ def test_non_wave_parameters(
|
|
|
103
102
|
pn = f"{pn}_{arm_id}"
|
|
104
103
|
pv = expected[pn]
|
|
105
104
|
is_wavelength_param = isinstance(pv, dict) and "wavelength" in pv
|
|
106
|
-
if
|
|
107
|
-
parameter_name not in parse_parameter_names
|
|
108
|
-
and not is_wavelength_param
|
|
109
|
-
and parameter_name != "solar_vignette_wavecal_fit_kwargs"
|
|
110
|
-
):
|
|
105
|
+
if parameter_name not in parse_parameter_names and not is_wavelength_param:
|
|
111
106
|
param_obj_value = getattr(task_param_attr, parameter_name)
|
|
112
107
|
if isinstance(pv, tuple):
|
|
113
108
|
pv = list(pv)
|
|
@@ -175,47 +170,3 @@ def test_wave_parameters(
|
|
|
175
170
|
is_wavelength_param = isinstance(pv, dict) and "wavelength" in pv
|
|
176
171
|
if is_wavelength_param and property_name not in parse_parameter_names + arm_parameter_names:
|
|
177
172
|
assert getattr(task_param_attr, property_name) == pv["values"][idx]
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
class AnyInt:
|
|
181
|
-
pass
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
@pytest.mark.parametrize("arm_id", [pytest.param("1")])
|
|
185
|
-
@pytest.mark.parametrize(
|
|
186
|
-
"db_value, expected",
|
|
187
|
-
[
|
|
188
|
-
pytest.param({"method": "nelder"}, {"method": "nelder"}, id="non_rng_method"),
|
|
189
|
-
pytest.param(
|
|
190
|
-
{"method": "basinhopping"}, {"method": "basinhopping", "rng": AnyInt}, id="random_rng"
|
|
191
|
-
),
|
|
192
|
-
pytest.param(
|
|
193
|
-
{"method": "differential_evolution", "rng": 6.28},
|
|
194
|
-
{"method": "differential_evolution", "rng": 6.28},
|
|
195
|
-
id="override_rng",
|
|
196
|
-
),
|
|
197
|
-
pytest.param(dict(), dict(), id="no_kwargs"),
|
|
198
|
-
],
|
|
199
|
-
)
|
|
200
|
-
def test_fit_kwarg_parameters(
|
|
201
|
-
basic_science_task_with_parameter_mixin,
|
|
202
|
-
db_value,
|
|
203
|
-
expected,
|
|
204
|
-
):
|
|
205
|
-
"""
|
|
206
|
-
Given: A Science task with the parameter mixin
|
|
207
|
-
When: Accessing properties for parameters that do not depend on wavelength
|
|
208
|
-
Then: The correct value is returned
|
|
209
|
-
"""
|
|
210
|
-
task, _ = next(
|
|
211
|
-
basic_science_task_with_parameter_mixin(
|
|
212
|
-
VispInputDatasetParameterValues(visp_solar_vignette_wavecal_fit_kwargs=db_value)
|
|
213
|
-
)
|
|
214
|
-
)
|
|
215
|
-
kwarg_dict = task.parameters.solar_vignette_wavecal_fit_kwargs
|
|
216
|
-
assert kwarg_dict.keys() == expected.keys()
|
|
217
|
-
for k in expected.keys():
|
|
218
|
-
if expected[k] is AnyInt:
|
|
219
|
-
assert type(kwarg_dict[k]) is int
|
|
220
|
-
else:
|
|
221
|
-
assert expected[k] == kwarg_dict[k]
|
|
@@ -311,10 +311,7 @@ def solar_gain_task(
|
|
|
311
311
|
|
|
312
312
|
@pytest.mark.parametrize(
|
|
313
313
|
"background_on",
|
|
314
|
-
[
|
|
315
|
-
pytest.param(True, id="background_on"),
|
|
316
|
-
pytest.param(False, id="background_off"),
|
|
317
|
-
],
|
|
314
|
+
[pytest.param(True, id="background_on"), pytest.param(False, id="background_off")],
|
|
318
315
|
)
|
|
319
316
|
def test_solar_gain_task(
|
|
320
317
|
solar_gain_task,
|
|
@@ -450,10 +447,8 @@ def test_continuum_wavecal_parameters():
|
|
|
450
447
|
Then: The polynomial coefficients are present
|
|
451
448
|
"""
|
|
452
449
|
order = 3
|
|
453
|
-
zeroth_order = 6.28
|
|
454
450
|
param_object = WavelengthCalibrationParametersWithContinuum(
|
|
455
451
|
continuum_poly_fit_order=order,
|
|
456
|
-
zeroth_order_continuum_coefficient=zeroth_order,
|
|
457
452
|
crval=400 * u.nm,
|
|
458
453
|
dispersion=3 * u.nm / u.pix,
|
|
459
454
|
incident_light_angle=4 * u.deg,
|
|
@@ -461,7 +456,6 @@ def test_continuum_wavecal_parameters():
|
|
|
461
456
|
doppler_velocity=0 * u.km / u.s,
|
|
462
457
|
order=1,
|
|
463
458
|
normalized_abscissa=np.arange(10),
|
|
464
|
-
continuum_level=99999.9,
|
|
465
459
|
)
|
|
466
460
|
lmfit_params = param_object.lmfit_parameters
|
|
467
461
|
|
|
@@ -470,13 +464,13 @@ def test_continuum_wavecal_parameters():
|
|
|
470
464
|
assert "poly_coeff_01" in lmfit_params
|
|
471
465
|
assert "poly_coeff_00" in lmfit_params
|
|
472
466
|
|
|
473
|
-
assert lmfit_params["poly_coeff_03"].
|
|
474
|
-
assert lmfit_params["poly_coeff_02"].
|
|
475
|
-
assert lmfit_params["poly_coeff_01"].
|
|
476
|
-
assert lmfit_params["poly_coeff_00"].
|
|
467
|
+
assert lmfit_params["poly_coeff_03"].value == 1
|
|
468
|
+
assert lmfit_params["poly_coeff_02"].value == 0
|
|
469
|
+
assert lmfit_params["poly_coeff_01"].value == 0
|
|
470
|
+
assert lmfit_params["poly_coeff_00"].value == 0
|
|
477
471
|
|
|
478
|
-
assert lmfit_params["poly_coeff_03"].min ==
|
|
479
|
-
assert lmfit_params["poly_coeff_03"].max ==
|
|
472
|
+
assert lmfit_params["poly_coeff_03"].min == 0.7
|
|
473
|
+
assert lmfit_params["poly_coeff_03"].max == 1.3
|
|
480
474
|
assert lmfit_params["poly_coeff_02"].min == -1
|
|
481
475
|
assert lmfit_params["poly_coeff_02"].max == 1
|
|
482
476
|
assert lmfit_params["poly_coeff_01"].min == -1
|