dkist-processing-cryonirsp 2.1.2__tar.gz → 3.0.0rc1__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_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/PKG-INFO +53 -53
- dkist_processing_cryonirsp-3.0.0rc1/changelog/306.doc.rst +1 -0
- dkist_processing_cryonirsp-3.0.0rc1/changelog/306.feature.2.rst +1 -0
- dkist_processing_cryonirsp-3.0.0rc1/changelog/306.feature.rst +2 -0
- dkist_processing_cryonirsp-3.0.0rc1/changelog/306.misc.rst +1 -0
- dkist_processing_cryonirsp-3.0.0rc1/changelog/306.science.rst +2 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/beam_boundaries.py +12 -12
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/parameters.py +27 -15
- dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +249 -0
- dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +25 -0
- dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +52 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/write_dataset_extras.py +29 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/conftest.py +10 -3
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +4 -4
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +4 -4
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +19 -15
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_parameters.py +2 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +63 -17
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_write_dataset_extras.py +6 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +3 -3
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +3 -3
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/trial_workflows.py +6 -6
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/PKG-INFO +53 -53
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +5 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/requires.txt +52 -52
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/scm_file_list.json +5 -0
- dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp.egg-info/scm_version.json +8 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/dataset_extras.rst +9 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/pyproject.toml +54 -54
- dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +0 -261
- dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +0 -56
- dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +0 -271
- dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp.egg-info/scm_version.json +0 -8
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.gitignore +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.pre-commit-config.yaml +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.readthedocs.yml +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.rovodev/.review-agent.md +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.snyk +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/CHANGELOG.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/README.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/SCIENCE_CHANGELOG.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/bitbucket-pipelines.yml +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/changelog/.gitempty +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/codecs/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/codecs/fits.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/config.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/constants.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/dataset_extras.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/exposure_conditions.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/fits_access.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/tags.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/task_name.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/check_for_gains.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/exposure_conditions.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/polarimetric_check.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/time.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/assemble_movie.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/ci_science.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/dark.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/linearity_correction.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/parse.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/polcal_as_science.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/quality_metrics.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/science_base.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_geometric.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_science.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_wavelength_calibration.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/write_l1.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/header_models.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_ci_science.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_corrections.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_dark.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_fits_access.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_make_movie_frames.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_parse.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_polcal_as_science.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_science.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_wavelength_calibration.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_write_l1.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/top_level.txt +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/Makefile +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/bad_pixel_calibration.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/beam_angle_calculation.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/beam_boundary_computation.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/changelog.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/ci_science_calibration.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/conf.py +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/index.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_ci-full-trial.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_sp-full-trial.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/landing_page.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/linearization.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/make.bat +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/requirements.txt +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/requirements_table.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/scientific_changelog.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/sp_science_calibration.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/wavelength_calibration.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/licenses/LICENSE.rst +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/science_towncrier.sh +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/setup.cfg +0 -0
- {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/towncrier_science.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dkist-processing-cryonirsp
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0rc1
|
|
4
4
|
Summary: Science processing code for the Cryo-NIRSP instrument on DKIST
|
|
5
5
|
Author-email: NSO / AURA <dkistdc@nso.edu>
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -15,14 +15,13 @@ Requires-Python: >=3.13
|
|
|
15
15
|
Description-Content-Type: text/x-rst
|
|
16
16
|
Requires-Dist: Pillow==10.4.0
|
|
17
17
|
Requires-Dist: astropy==7.0.2
|
|
18
|
-
Requires-Dist: dkist-fits-specifications==4.
|
|
18
|
+
Requires-Dist: dkist-fits-specifications==4.30.0rc1
|
|
19
19
|
Requires-Dist: dkist-header-validator==6.0.0
|
|
20
|
-
Requires-Dist: dkist-processing-common==14.5.
|
|
20
|
+
Requires-Dist: dkist-processing-common==14.5.1rc1
|
|
21
21
|
Requires-Dist: dkist-processing-math==2.2.3
|
|
22
22
|
Requires-Dist: dkist-processing-pac==3.1.2
|
|
23
23
|
Requires-Dist: dkist-spectral-lines==3.0.1
|
|
24
24
|
Requires-Dist: solar-wavelength-calibration==2.0.3
|
|
25
|
-
Requires-Dist: largestinteriorrectangle==0.2.1
|
|
26
25
|
Requires-Dist: dkist-service-configuration==4.3.0
|
|
27
26
|
Requires-Dist: moviepy==2.1.2
|
|
28
27
|
Requires-Dist: numba==0.61.2
|
|
@@ -62,17 +61,17 @@ Requires-Dist: sphinx-autoapi; extra == "docs"
|
|
|
62
61
|
Requires-Dist: pytest; extra == "docs"
|
|
63
62
|
Requires-Dist: dkist-sphinx-theme; extra == "docs"
|
|
64
63
|
Provides-Extra: frozen
|
|
65
|
-
Requires-Dist: Deprecated==
|
|
66
|
-
Requires-Dist: ImageIO==2.
|
|
64
|
+
Requires-Dist: Deprecated==3.0.0; extra == "frozen"
|
|
65
|
+
Requires-Dist: ImageIO==2.38.0; extra == "frozen"
|
|
67
66
|
Requires-Dist: Jinja2==3.1.6; extra == "frozen"
|
|
68
67
|
Requires-Dist: Mako==1.4.3; extra == "frozen"
|
|
69
68
|
Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
|
|
70
69
|
Requires-Dist: PeakUtils==1.3.5; extra == "frozen"
|
|
71
|
-
Requires-Dist: PyJWT==2.15.
|
|
70
|
+
Requires-Dist: PyJWT==2.15.1; extra == "frozen"
|
|
72
71
|
Requires-Dist: PyYAML==6.0.3; extra == "frozen"
|
|
73
72
|
Requires-Dist: PyYAML-ft==8.0.0; extra == "frozen"
|
|
74
73
|
Requires-Dist: Pygments==2.21.0; extra == "frozen"
|
|
75
|
-
Requires-Dist: SQLAlchemy==2.
|
|
74
|
+
Requires-Dist: SQLAlchemy==2.1.1; extra == "frozen"
|
|
76
75
|
Requires-Dist: Send2Trash==2.1.0; extra == "frozen"
|
|
77
76
|
Requires-Dist: a2wsgi==1.10.10; extra == "frozen"
|
|
78
77
|
Requires-Dist: aioftp==0.28.3; extra == "frozen"
|
|
@@ -88,13 +87,13 @@ Requires-Dist: annotated-types==0.8.0; extra == "frozen"
|
|
|
88
87
|
Requires-Dist: anyio==4.15.1; extra == "frozen"
|
|
89
88
|
Requires-Dist: apache-airflow==3.3.1; extra == "frozen"
|
|
90
89
|
Requires-Dist: apache-airflow-core==3.3.1; extra == "frozen"
|
|
91
|
-
Requires-Dist: apache-airflow-providers-celery==3.24.
|
|
92
|
-
Requires-Dist: apache-airflow-providers-common-compat==1.
|
|
93
|
-
Requires-Dist: apache-airflow-providers-common-io==1.
|
|
94
|
-
Requires-Dist: apache-airflow-providers-common-sql==2.
|
|
95
|
-
Requires-Dist: apache-airflow-providers-postgres==7.0
|
|
96
|
-
Requires-Dist: apache-airflow-providers-smtp==3.0
|
|
97
|
-
Requires-Dist: apache-airflow-providers-standard==1.
|
|
90
|
+
Requires-Dist: apache-airflow-providers-celery==3.24.1; extra == "frozen"
|
|
91
|
+
Requires-Dist: apache-airflow-providers-common-compat==1.20.0; extra == "frozen"
|
|
92
|
+
Requires-Dist: apache-airflow-providers-common-io==1.10.0; extra == "frozen"
|
|
93
|
+
Requires-Dist: apache-airflow-providers-common-sql==2.2.0; extra == "frozen"
|
|
94
|
+
Requires-Dist: apache-airflow-providers-postgres==7.1.0; extra == "frozen"
|
|
95
|
+
Requires-Dist: apache-airflow-providers-smtp==3.1.0; extra == "frozen"
|
|
96
|
+
Requires-Dist: apache-airflow-providers-standard==1.20.0; extra == "frozen"
|
|
98
97
|
Requires-Dist: apache-airflow-task-sdk==1.3.1; extra == "frozen"
|
|
99
98
|
Requires-Dist: argcomplete==3.7.2; extra == "frozen"
|
|
100
99
|
Requires-Dist: argon2-cffi==25.1.0; extra == "frozen"
|
|
@@ -105,7 +104,7 @@ Requires-Dist: asdf_standard==1.5.0; extra == "frozen"
|
|
|
105
104
|
Requires-Dist: asgiref==3.12.1; extra == "frozen"
|
|
106
105
|
Requires-Dist: asteval==1.0.10; extra == "frozen"
|
|
107
106
|
Requires-Dist: astropy==7.0.2; extra == "frozen"
|
|
108
|
-
Requires-Dist: astropy-iers-data==0.2026.9.
|
|
107
|
+
Requires-Dist: astropy-iers-data==0.2026.9.28.0.59.37; extra == "frozen"
|
|
109
108
|
Requires-Dist: asttokens==3.0.2; extra == "frozen"
|
|
110
109
|
Requires-Dist: async-lru==2.3.0; extra == "frozen"
|
|
111
110
|
Requires-Dist: asyncpg==0.31.0; extra == "frozen"
|
|
@@ -114,8 +113,8 @@ Requires-Dist: babel==2.18.0; extra == "frozen"
|
|
|
114
113
|
Requires-Dist: beautifulsoup4==4.15.0; extra == "frozen"
|
|
115
114
|
Requires-Dist: billiard==4.3.0; extra == "frozen"
|
|
116
115
|
Requires-Dist: bleach==6.4.0; extra == "frozen"
|
|
117
|
-
Requires-Dist: boto3==1.43.
|
|
118
|
-
Requires-Dist: botocore==1.43.
|
|
116
|
+
Requires-Dist: boto3==1.43.104; extra == "frozen"
|
|
117
|
+
Requires-Dist: botocore==1.43.104; extra == "frozen"
|
|
119
118
|
Requires-Dist: cachetools==7.2.0; extra == "frozen"
|
|
120
119
|
Requires-Dist: cadwyn==7.0.0; extra == "frozen"
|
|
121
120
|
Requires-Dist: celery==5.6.3; extra == "frozen"
|
|
@@ -139,14 +138,14 @@ Requires-Dist: decorator==5.3.1; extra == "frozen"
|
|
|
139
138
|
Requires-Dist: defusedxml==0.7.1; extra == "frozen"
|
|
140
139
|
Requires-Dist: dill==0.4.1; extra == "frozen"
|
|
141
140
|
Requires-Dist: dkist-header-validator==6.0.0; extra == "frozen"
|
|
142
|
-
Requires-Dist: dkist-processing-common==14.5.
|
|
141
|
+
Requires-Dist: dkist-processing-common==14.5.1rc1; extra == "frozen"
|
|
143
142
|
Requires-Dist: dkist-processing-core==7.5.0; extra == "frozen"
|
|
144
|
-
Requires-Dist: dkist-processing-cryonirsp==
|
|
143
|
+
Requires-Dist: dkist-processing-cryonirsp==3.0.0rc1; extra == "frozen"
|
|
145
144
|
Requires-Dist: dkist-processing-math==2.2.3; extra == "frozen"
|
|
146
145
|
Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
|
|
147
146
|
Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
|
|
148
147
|
Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
|
|
149
|
-
Requires-Dist: dkist_fits_specifications==4.
|
|
148
|
+
Requires-Dist: dkist_fits_specifications==4.30.0rc1; extra == "frozen"
|
|
150
149
|
Requires-Dist: dnspython==2.8.0; extra == "frozen"
|
|
151
150
|
Requires-Dist: email-validator==2.3.0; extra == "frozen"
|
|
152
151
|
Requires-Dist: executing==2.2.1; extra == "frozen"
|
|
@@ -155,11 +154,11 @@ Requires-Dist: fastapi-cli==0.0.32; extra == "frozen"
|
|
|
155
154
|
Requires-Dist: fastjsonschema==2.22.2; extra == "frozen"
|
|
156
155
|
Requires-Dist: flower==2.2.0; extra == "frozen"
|
|
157
156
|
Requires-Dist: fonttools==4.66.0; extra == "frozen"
|
|
158
|
-
Requires-Dist: fqdn==1.
|
|
157
|
+
Requires-Dist: fqdn==1.6.0; extra == "frozen"
|
|
159
158
|
Requires-Dist: frozenlist==1.8.0; extra == "frozen"
|
|
160
159
|
Requires-Dist: fsspec==2026.9.0; extra == "frozen"
|
|
161
|
-
Requires-Dist: globus-sdk==4.9.
|
|
162
|
-
Requires-Dist: googleapis-common-protos==1.75.
|
|
160
|
+
Requires-Dist: globus-sdk==4.9.1; extra == "frozen"
|
|
161
|
+
Requires-Dist: googleapis-common-protos==1.75.4; extra == "frozen"
|
|
163
162
|
Requires-Dist: gqlclient==2.0.0; extra == "frozen"
|
|
164
163
|
Requires-Dist: greenback==1.3.0; extra == "frozen"
|
|
165
164
|
Requires-Dist: greenlet==3.5.6; extra == "frozen"
|
|
@@ -196,7 +195,6 @@ Requires-Dist: jupyterlab_pygments==0.3.0; extra == "frozen"
|
|
|
196
195
|
Requires-Dist: jupyterlab_server==2.28.1; extra == "frozen"
|
|
197
196
|
Requires-Dist: kiwisolver==1.5.1; extra == "frozen"
|
|
198
197
|
Requires-Dist: kombu==5.6.2; extra == "frozen"
|
|
199
|
-
Requires-Dist: largestinteriorrectangle==0.2.1; extra == "frozen"
|
|
200
198
|
Requires-Dist: lark==1.3.1; extra == "frozen"
|
|
201
199
|
Requires-Dist: lazy-loader==0.6; extra == "frozen"
|
|
202
200
|
Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
|
|
@@ -214,7 +212,7 @@ Requires-Dist: methodtools==0.4.7; extra == "frozen"
|
|
|
214
212
|
Requires-Dist: mistune==3.3.4; extra == "frozen"
|
|
215
213
|
Requires-Dist: more-itertools==11.1.0; extra == "frozen"
|
|
216
214
|
Requires-Dist: moviepy==2.1.2; extra == "frozen"
|
|
217
|
-
Requires-Dist: msgspec==0.
|
|
215
|
+
Requires-Dist: msgspec==0.22.0; extra == "frozen"
|
|
218
216
|
Requires-Dist: multidict==6.9.1; extra == "frozen"
|
|
219
217
|
Requires-Dist: narwhals==2.26.0; extra == "frozen"
|
|
220
218
|
Requires-Dist: natsort==8.4.0; extra == "frozen"
|
|
@@ -228,30 +226,32 @@ Requires-Dist: notebook_shim==0.2.4; extra == "frozen"
|
|
|
228
226
|
Requires-Dist: numba==0.61.2; extra == "frozen"
|
|
229
227
|
Requires-Dist: numpy==2.2.5; extra == "frozen"
|
|
230
228
|
Requires-Dist: object-clerk==1.0.0; extra == "frozen"
|
|
231
|
-
Requires-Dist: opentelemetry-api==1.
|
|
232
|
-
Requires-Dist: opentelemetry-exporter-
|
|
233
|
-
Requires-Dist: opentelemetry-exporter-otlp
|
|
234
|
-
Requires-Dist: opentelemetry-exporter-otlp-
|
|
235
|
-
Requires-Dist: opentelemetry-exporter-otlp-proto-
|
|
236
|
-
Requires-Dist: opentelemetry-
|
|
237
|
-
Requires-Dist: opentelemetry-
|
|
238
|
-
Requires-Dist: opentelemetry-instrumentation
|
|
239
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
240
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
241
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
242
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
243
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
244
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
245
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
246
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
247
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
248
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
249
|
-
Requires-Dist: opentelemetry-instrumentation-
|
|
229
|
+
Requires-Dist: opentelemetry-api==1.45.0; extra == "frozen"
|
|
230
|
+
Requires-Dist: opentelemetry-exporter-http-transport==0.66b0; extra == "frozen"
|
|
231
|
+
Requires-Dist: opentelemetry-exporter-otlp==1.45.0; extra == "frozen"
|
|
232
|
+
Requires-Dist: opentelemetry-exporter-otlp-common==0.66b0; extra == "frozen"
|
|
233
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.45.0; extra == "frozen"
|
|
234
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.45.0; extra == "frozen"
|
|
235
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.45.0; extra == "frozen"
|
|
236
|
+
Requires-Dist: opentelemetry-instrumentation==0.66b0; extra == "frozen"
|
|
237
|
+
Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.66b0; extra == "frozen"
|
|
238
|
+
Requires-Dist: opentelemetry-instrumentation-asgi==0.66b0; extra == "frozen"
|
|
239
|
+
Requires-Dist: opentelemetry-instrumentation-botocore==0.66b0; extra == "frozen"
|
|
240
|
+
Requires-Dist: opentelemetry-instrumentation-celery==0.66b0; extra == "frozen"
|
|
241
|
+
Requires-Dist: opentelemetry-instrumentation-dbapi==0.66b0; extra == "frozen"
|
|
242
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi==0.66b0; extra == "frozen"
|
|
243
|
+
Requires-Dist: opentelemetry-instrumentation-pika==0.66b0; extra == "frozen"
|
|
244
|
+
Requires-Dist: opentelemetry-instrumentation-psycopg2==0.66b0; extra == "frozen"
|
|
245
|
+
Requires-Dist: opentelemetry-instrumentation-pymongo==0.66b0; extra == "frozen"
|
|
246
|
+
Requires-Dist: opentelemetry-instrumentation-redis==0.66b0; extra == "frozen"
|
|
247
|
+
Requires-Dist: opentelemetry-instrumentation-requests==0.66b0; extra == "frozen"
|
|
248
|
+
Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.66b0; extra == "frozen"
|
|
249
|
+
Requires-Dist: opentelemetry-instrumentation-system-metrics==0.66b0; extra == "frozen"
|
|
250
250
|
Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
|
|
251
|
-
Requires-Dist: opentelemetry-proto==1.
|
|
252
|
-
Requires-Dist: opentelemetry-sdk==1.
|
|
253
|
-
Requires-Dist: opentelemetry-semantic-conventions==0.
|
|
254
|
-
Requires-Dist: opentelemetry-util-http==0.
|
|
251
|
+
Requires-Dist: opentelemetry-proto==1.45.0; extra == "frozen"
|
|
252
|
+
Requires-Dist: opentelemetry-sdk==1.45.0; extra == "frozen"
|
|
253
|
+
Requires-Dist: opentelemetry-semantic-conventions==0.66b0; extra == "frozen"
|
|
254
|
+
Requires-Dist: opentelemetry-util-http==0.66b0; extra == "frozen"
|
|
255
255
|
Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
|
|
256
256
|
Requires-Dist: packaging==26.3; extra == "frozen"
|
|
257
257
|
Requires-Dist: pandas==3.0.6; extra == "frozen"
|
|
@@ -265,7 +265,7 @@ Requires-Dist: pexpect==4.9.0; extra == "frozen"
|
|
|
265
265
|
Requires-Dist: pika==1.4.4; extra == "frozen"
|
|
266
266
|
Requires-Dist: pillow==10.4.0; extra == "frozen"
|
|
267
267
|
Requires-Dist: pip==26.2.1; extra == "frozen"
|
|
268
|
-
Requires-Dist: platformdirs==4.
|
|
268
|
+
Requires-Dist: platformdirs==4.12.1; extra == "frozen"
|
|
269
269
|
Requires-Dist: pluggy==1.6.0; extra == "frozen"
|
|
270
270
|
Requires-Dist: pooch==1.9.0; extra == "frozen"
|
|
271
271
|
Requires-Dist: proglog==0.1.12; extra == "frozen"
|
|
@@ -292,7 +292,7 @@ Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
|
|
|
292
292
|
Requires-Dist: python-dotenv==1.2.3; extra == "frozen"
|
|
293
293
|
Requires-Dist: python-json-logger==4.2.0; extra == "frozen"
|
|
294
294
|
Requires-Dist: python-multipart==0.0.32; extra == "frozen"
|
|
295
|
-
Requires-Dist: python-slugify==9.1.
|
|
295
|
+
Requires-Dist: python-slugify==9.1.2; extra == "frozen"
|
|
296
296
|
Requires-Dist: pytz==2026.4; extra == "frozen"
|
|
297
297
|
Requires-Dist: pyzmq==27.2.0; extra == "frozen"
|
|
298
298
|
Requires-Dist: redis==6.4.0; extra == "frozen"
|
|
@@ -345,7 +345,7 @@ Requires-Dist: universal_pathlib==0.3.10; extra == "frozen"
|
|
|
345
345
|
Requires-Dist: uri-template==1.3.0; extra == "frozen"
|
|
346
346
|
Requires-Dist: urllib3==2.8.0; extra == "frozen"
|
|
347
347
|
Requires-Dist: uuid6==2025.0.1; extra == "frozen"
|
|
348
|
-
Requires-Dist: uvicorn==0.
|
|
348
|
+
Requires-Dist: uvicorn==0.54.0; extra == "frozen"
|
|
349
349
|
Requires-Dist: uvloop==0.22.1; extra == "frozen"
|
|
350
350
|
Requires-Dist: vine==5.1.0; extra == "frozen"
|
|
351
351
|
Requires-Dist: voluptuous==0.16.0; extra == "frozen"
|
|
@@ -356,7 +356,7 @@ Requires-Dist: webencodings==0.6.1; extra == "frozen"
|
|
|
356
356
|
Requires-Dist: websocket-client==1.9.2; extra == "frozen"
|
|
357
357
|
Requires-Dist: websockets==17.1; extra == "frozen"
|
|
358
358
|
Requires-Dist: wirerope==1.0.0; extra == "frozen"
|
|
359
|
-
Requires-Dist: wrapt==2.
|
|
359
|
+
Requires-Dist: wrapt==2.5.0; extra == "frozen"
|
|
360
360
|
Requires-Dist: yamale==6.1.0; extra == "frozen"
|
|
361
361
|
Requires-Dist: yarl==1.25.1; extra == "frozen"
|
|
362
362
|
Requires-Dist: zipp==4.1.0; extra == "frozen"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Update online documentation "Dataset Extras" page to include information about the beam boundaries extra.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Save the full set of beam boundaries used to extract illuminated regions from the raw data as a dataset extra (called "BEAM_BOUNDARIES").
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Replace "x" and "y" language with "axis_0" and "axis_1", respectively, in the `BeamBoundary` model.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
The task that computes the boundaries of the useful, illuminated regions of the INPUT data has been simplified and made more robust to data with very high
|
|
2
|
+
dynamic range. This improvement will most affect data taken at 1430nm, but will slightly change the final array shape for all data.
|
|
@@ -9,30 +9,30 @@ import numpy as np
|
|
|
9
9
|
class BeamBoundary:
|
|
10
10
|
"""Simple dataclass to hold boundary information for the illuminated portion of the beam array."""
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
axis_0_min: int
|
|
13
|
+
axis_0_max: int
|
|
14
|
+
axis_1_min: int
|
|
15
|
+
axis_1_max: int
|
|
16
16
|
|
|
17
17
|
@property
|
|
18
|
-
def
|
|
19
|
-
"""Return a slice object representing the illumination along the
|
|
20
|
-
return slice(self.
|
|
18
|
+
def axis_0_slice(self):
|
|
19
|
+
"""Return a slice object representing the illumination along the 0th axis."""
|
|
20
|
+
return slice(self.axis_0_min, self.axis_0_max)
|
|
21
21
|
|
|
22
22
|
@property
|
|
23
|
-
def
|
|
24
|
-
"""Return a slice object representing the illumination along the
|
|
25
|
-
return slice(self.
|
|
23
|
+
def axis_1_slice(self):
|
|
24
|
+
"""Return a slice object representing the illumination along the 1st axis."""
|
|
25
|
+
return slice(self.axis_1_min, self.axis_1_max)
|
|
26
26
|
|
|
27
27
|
@property
|
|
28
28
|
def slices(self):
|
|
29
29
|
"""Return a tuple of slices in numpy order representing the illuminated portion of the beam array."""
|
|
30
|
-
return self.
|
|
30
|
+
return self.axis_0_slice, self.axis_1_slice
|
|
31
31
|
|
|
32
32
|
@property
|
|
33
33
|
def beam_boundaries(self):
|
|
34
34
|
"""Return a tuple containing the beam boundaries."""
|
|
35
|
-
return self.
|
|
35
|
+
return self.axis_0_min, self.axis_0_max, self.axis_1_min, self.axis_1_max
|
|
36
36
|
|
|
37
37
|
@property
|
|
38
38
|
def beam_boundaries_array(self):
|
|
@@ -110,27 +110,39 @@ class CryonirspParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmI
|
|
|
110
110
|
return self._find_most_recent_past_value("cryonirsp_polcal_pac_fit_mode")
|
|
111
111
|
|
|
112
112
|
@property
|
|
113
|
-
def
|
|
114
|
-
"""Return the size of the smoothing disk (in pixels) to be used in the beam boundaries computation."""
|
|
115
|
-
return self._find_most_recent_past_value("cryonirsp_beam_boundaries_smoothing_disk_size")
|
|
116
|
-
|
|
117
|
-
@property
|
|
118
|
-
def beam_boundaries_upsample_factor(self) -> int:
|
|
119
|
-
"""Return the upsample factor to be used in the beam boundaries cross correlation computation."""
|
|
120
|
-
return self._find_most_recent_past_value("cryonirsp_beam_boundaries_upsample_factor")
|
|
121
|
-
|
|
122
|
-
@property
|
|
123
|
-
def beam_boundaries_sp_beam_transition_region_size_fraction(self) -> float:
|
|
113
|
+
def beam_boundaries_spectral_beam_slices(self) -> list[slice]:
|
|
124
114
|
"""
|
|
125
|
-
|
|
115
|
+
Return a list of `slice` objects that extract beams in the spectral dimension.
|
|
126
116
|
|
|
127
|
-
|
|
128
|
-
will be ignored when extracting the beams.
|
|
117
|
+
For CI the "spectral" dimension is just the same axis of the chip that is spectral in SP data.
|
|
129
118
|
"""
|
|
119
|
+
raw_boundaries = self._find_parameter_for_arm(
|
|
120
|
+
"cryonirsp_beam_boundaries_spectral_beam_slices"
|
|
121
|
+
)
|
|
122
|
+
return [slice(b[0], b[1]) for b in raw_boundaries]
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def beam_boundaries_normalization_percentile(self) -> float:
|
|
126
|
+
"""Return the percentile (0, 100) used when collapsing the wavelength dimension into a single spatial profile."""
|
|
130
127
|
return self._find_most_recent_past_value(
|
|
131
|
-
"
|
|
128
|
+
"cryonirsp_beam_boundaries_normalization_percentile"
|
|
132
129
|
)
|
|
133
130
|
|
|
131
|
+
@property
|
|
132
|
+
def beam_boundaries_edge_profile_window_px(self) -> int:
|
|
133
|
+
"""Return the size of the moving window used to compute an edge profile."""
|
|
134
|
+
return self._find_most_recent_past_value("cryonirsp_beam_boundaries_edge_profile_window_px")
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def beam_boundaries_edge_threshold_sigma(self) -> float:
|
|
138
|
+
"""Return the threshold for determining if an illumination edge is strong enough to consider, in units of edge profile sigma."""
|
|
139
|
+
return self._find_most_recent_past_value("cryonirsp_beam_boundaries_edge_threshold_sigma")
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def beam_boundaries_detector_margin_px(self) -> int:
|
|
143
|
+
"""Return the distance away from a detector edge to hard-code boundaries that otherwise would run up to the edge."""
|
|
144
|
+
return self._find_most_recent_past_value("cryonirsp_beam_boundaries_detector_margin_px")
|
|
145
|
+
|
|
134
146
|
@property
|
|
135
147
|
def bad_pixel_map_median_filter_size(self) -> list[int, int]:
|
|
136
148
|
"""Return the smoothing disk size to be used in the bad pixel map computation."""
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"""Task for computing the spatial boundaries of CryoNIRSP data."""
|
|
2
|
+
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
from dkist_processing_common.codecs.fits import fits_array_encoder
|
|
7
|
+
from dkist_processing_math.statistics import average_numpy_arrays
|
|
8
|
+
from dkist_service_configuration.logging import logger
|
|
9
|
+
|
|
10
|
+
from dkist_processing_cryonirsp.codecs.fits import cryo_fits_array_decoder
|
|
11
|
+
from dkist_processing_cryonirsp.models.beam_boundaries import BeamBoundary
|
|
12
|
+
from dkist_processing_cryonirsp.models.tags import CryonirspTag
|
|
13
|
+
from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import (
|
|
14
|
+
CryonirspLinearizedFitsAccess,
|
|
15
|
+
)
|
|
16
|
+
from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
|
|
17
|
+
|
|
18
|
+
__all__ = ["SpatialBeamBoundariesBase"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SpatialBeamBoundariesBase(CryonirspTaskBase):
|
|
22
|
+
"""
|
|
23
|
+
Task class for calculating the beam boundaries for later use during calibration.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
recipe_run_id : int
|
|
28
|
+
id of the recipe run used to identify the workflow run this task is part of
|
|
29
|
+
|
|
30
|
+
workflow_name : str
|
|
31
|
+
name of the workflow to which this instance of the task belongs
|
|
32
|
+
|
|
33
|
+
workflow_version : str
|
|
34
|
+
version of the workflow to which this instance of the task belongs
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
record_provenance = True
|
|
38
|
+
num_beams: int = -1
|
|
39
|
+
|
|
40
|
+
def run(self):
|
|
41
|
+
"""
|
|
42
|
+
Compute the beam boundaries by analyzing a set of solar gain images.
|
|
43
|
+
|
|
44
|
+
Steps:
|
|
45
|
+
|
|
46
|
+
#. Compute the average gain image
|
|
47
|
+
|
|
48
|
+
#. For each beam
|
|
49
|
+
|
|
50
|
+
i. Extract the beam's spectral extent
|
|
51
|
+
|
|
52
|
+
#. Collapse along the spectal dimension to form a 1D spatial signal
|
|
53
|
+
|
|
54
|
+
#. Use a moving window comparison to construct a profile showing sharp changes in intensity
|
|
55
|
+
|
|
56
|
+
#. Take the maximum and minimum peaks of this profile to be the edges of the illuminated region
|
|
57
|
+
|
|
58
|
+
#. Adjust the regions so all beams have the same shape
|
|
59
|
+
|
|
60
|
+
#. Write the computed spatial bounds, and the spectral bounds from `parameters`, to scratch
|
|
61
|
+
|
|
62
|
+
NOTE: When this method referrs to the "spectral" dimension for CI data we really mean the spatial dimension that
|
|
63
|
+
corresponds to the chip axis that is the spectral dimensino in SP data.
|
|
64
|
+
|
|
65
|
+
Returns
|
|
66
|
+
-------
|
|
67
|
+
None
|
|
68
|
+
"""
|
|
69
|
+
with self.telemetry_span(f"Compute average solar gain image"):
|
|
70
|
+
average_solar_gain_array = self.compute_average_gain_array()
|
|
71
|
+
|
|
72
|
+
beam_boundaries = []
|
|
73
|
+
for beam in range(1, self.num_beams + 1):
|
|
74
|
+
with self.telemetry_span(f"Calculating spatial boundaries for beam {beam}"):
|
|
75
|
+
beam_array = self.extract_beam(average_solar_gain_array, beam)
|
|
76
|
+
|
|
77
|
+
spatial_signal = np.nanpercentile(
|
|
78
|
+
beam_array, self.parameters.beam_boundaries_normalization_percentile, axis=1
|
|
79
|
+
)
|
|
80
|
+
# Not really necessary, but helps us compare some debug numbers across datasets
|
|
81
|
+
spatial_signal /= np.nanmax(spatial_signal)
|
|
82
|
+
|
|
83
|
+
edge_profile = self.compute_edge_profile(
|
|
84
|
+
spatial_signal, window=self.parameters.beam_boundaries_edge_profile_window_px
|
|
85
|
+
)
|
|
86
|
+
min_edge, max_edge = self.find_edges(
|
|
87
|
+
edge_profile,
|
|
88
|
+
threshold_sigma=self.parameters.beam_boundaries_edge_threshold_sigma,
|
|
89
|
+
detector_margin=self.parameters.beam_boundaries_detector_margin_px,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
beam_boundaries.append((min_edge, max_edge))
|
|
93
|
+
|
|
94
|
+
with self.telemetry_span("Matching beam sizes"):
|
|
95
|
+
matched_spatial_boundaries = self.match_beam_sizes(
|
|
96
|
+
beam_boundaries, full_spatial_size=beam_array.shape[1]
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
with self.telemetry_span("Writing beam boundaries"):
|
|
100
|
+
final_beam_boundaries = self.construct_final_boundaries_objects(
|
|
101
|
+
matched_spatial_boundaries
|
|
102
|
+
)
|
|
103
|
+
for beam, bounds in enumerate(final_beam_boundaries, start=1):
|
|
104
|
+
self.write(
|
|
105
|
+
data=bounds.beam_boundaries_array,
|
|
106
|
+
tags=[
|
|
107
|
+
CryonirspTag.intermediate_frame(beam=beam),
|
|
108
|
+
CryonirspTag.task_beam_boundaries(),
|
|
109
|
+
],
|
|
110
|
+
encoder=fits_array_encoder,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def compute_average_gain_array(self) -> np.ndarray:
|
|
114
|
+
"""
|
|
115
|
+
Compute an average of uncorrected solar gain arrays.
|
|
116
|
+
|
|
117
|
+
We are computing the overall illumination pattern for both beams simultaneously,
|
|
118
|
+
so no dark correction is required and no beam splitting is used at this point.
|
|
119
|
+
Solar gain images are used because they have larger flux than the lamp gain images
|
|
120
|
+
and the lamp gain images do not have the same illumination pattern as the solar
|
|
121
|
+
gain images.
|
|
122
|
+
|
|
123
|
+
Returns
|
|
124
|
+
-------
|
|
125
|
+
The average gain array
|
|
126
|
+
"""
|
|
127
|
+
lin_corr_gain_arrays = self.read(
|
|
128
|
+
tags=[CryonirspTag.linearized_frame(), CryonirspTag.task_solar_gain()],
|
|
129
|
+
decoder=cryo_fits_array_decoder,
|
|
130
|
+
fits_access_class=CryonirspLinearizedFitsAccess,
|
|
131
|
+
)
|
|
132
|
+
averaged_gain_data = average_numpy_arrays(lin_corr_gain_arrays)
|
|
133
|
+
return averaged_gain_data
|
|
134
|
+
|
|
135
|
+
@staticmethod
|
|
136
|
+
def compute_edge_profile(spatial_signal: np.ndarray, window: int) -> np.ndarray:
|
|
137
|
+
"""
|
|
138
|
+
Compute a profile showing sharp changes in intensity.
|
|
139
|
+
|
|
140
|
+
Each point in the profile is calculated as the mean intensity ``window`` pixels beyond that point minus the mean
|
|
141
|
+
intensity ``window`` pixels before that point.
|
|
142
|
+
|
|
143
|
+
Values within ``window`` pixels of the start/end of the array are set to NaN.
|
|
144
|
+
"""
|
|
145
|
+
moving_mean = np.convolve(spatial_signal, np.ones(window), "valid") / window
|
|
146
|
+
|
|
147
|
+
profile = np.full_like(spatial_signal, np.nan)
|
|
148
|
+
profile[window : -window + 1] = moving_mean[window:] - moving_mean[:-window]
|
|
149
|
+
return profile
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def robust_sigma(array: np.ndarray) -> float:
|
|
153
|
+
"""
|
|
154
|
+
Robust estimation of the standard deviation based on the median absolute difference.
|
|
155
|
+
|
|
156
|
+
Assuming the values in array are roughly normally distributed.
|
|
157
|
+
"""
|
|
158
|
+
median = np.nanmedian(array)
|
|
159
|
+
return 1.4826 * np.nanmedian(np.abs(array - median))
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def find_edges(
|
|
163
|
+
edge_profile: np.ndarray, threshold_sigma: float, detector_margin: int
|
|
164
|
+
) -> tuple[int, int]:
|
|
165
|
+
"""
|
|
166
|
+
Identify peaks in an edge profile.
|
|
167
|
+
|
|
168
|
+
The location of the maximum change in the profile is taken to be the minimum edge of the illuminated beam while
|
|
169
|
+
the location of the most negative change in the profile is taken to be the maximum edge illumintated beam.
|
|
170
|
+
|
|
171
|
+
Both edges are checked to ensure they are significant enough by comparing their value to a threshold controlled
|
|
172
|
+
by ``threshold_sigma``. Edges that are below the threshold are interpreted as being essentially at the edge of
|
|
173
|
+
the array and set to simply be ``detector_margin`` pixels away from the edge.
|
|
174
|
+
|
|
175
|
+
Returns
|
|
176
|
+
-------
|
|
177
|
+
`[min_edge_idx, max_edge_idx]`
|
|
178
|
+
"""
|
|
179
|
+
threshold = threshold_sigma * SpatialBeamBoundariesBase.robust_sigma(edge_profile)
|
|
180
|
+
num_pix = len(edge_profile)
|
|
181
|
+
|
|
182
|
+
bottom_candidate = np.nanargmax(edge_profile)
|
|
183
|
+
top_candidate = np.nanargmin(edge_profile)
|
|
184
|
+
|
|
185
|
+
if bottom_candidate > top_candidate:
|
|
186
|
+
# If the edges appear flipped around
|
|
187
|
+
# This could potentially happen if there is some sharp signal right at the edge of the otherwise-unillumintaed
|
|
188
|
+
# detector that gets interpreted as a spurious edge. In this case we make the assumption that the true begining
|
|
189
|
+
# of illumination is in the first half of the detector and the true end of illumination is in the second half.
|
|
190
|
+
logger.info(
|
|
191
|
+
"Edge profile increasing/decreasing peaks appear to be swapped. This is likely due to spurious edges. Restricting seach to half the chip for each."
|
|
192
|
+
)
|
|
193
|
+
half_idx = edge_profile.size // 2
|
|
194
|
+
bottom_candidate = np.nanargmax(edge_profile[:half_idx])
|
|
195
|
+
top_candidate = np.nanargmin(edge_profile[half_idx:]) + half_idx
|
|
196
|
+
|
|
197
|
+
min_edge = (
|
|
198
|
+
bottom_candidate if edge_profile[bottom_candidate] > threshold else detector_margin
|
|
199
|
+
)
|
|
200
|
+
max_edge = (
|
|
201
|
+
top_candidate if edge_profile[top_candidate] < -threshold else num_pix - detector_margin
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
return min_edge, max_edge
|
|
205
|
+
|
|
206
|
+
def construct_final_boundaries_objects(
|
|
207
|
+
self, spatial_boundary_list: list[tuple[int, int]]
|
|
208
|
+
) -> list[BeamBoundary]:
|
|
209
|
+
"""Package the computed spatial boundaries with the spectral boundaries from parameters into `~dkist_processing_cryonirsp.models.beam_boundaries.BeamBoundary` objects."""
|
|
210
|
+
spectral_slices = self.parameters.beam_boundaries_spectral_beam_slices
|
|
211
|
+
|
|
212
|
+
output_list = []
|
|
213
|
+
for spatial_boundaries, spectral_slice in zip(spatial_boundary_list, spectral_slices):
|
|
214
|
+
boundary_obj = BeamBoundary(
|
|
215
|
+
axis_0_min=spatial_boundaries[0],
|
|
216
|
+
axis_0_max=spatial_boundaries[1],
|
|
217
|
+
axis_1_min=spectral_slice.start,
|
|
218
|
+
axis_1_max=spectral_slice.stop,
|
|
219
|
+
)
|
|
220
|
+
output_list.append(boundary_obj)
|
|
221
|
+
|
|
222
|
+
return output_list
|
|
223
|
+
|
|
224
|
+
def extract_beam(self, array: np.ndarray, beam: int) -> np.ndarray:
|
|
225
|
+
"""
|
|
226
|
+
Split the beams along the horizontal axis.
|
|
227
|
+
|
|
228
|
+
We use an abstract method so that the processing sequence is the same for both SP and CI
|
|
229
|
+
although the processing steps may be different.
|
|
230
|
+
|
|
231
|
+
Parameters
|
|
232
|
+
----------
|
|
233
|
+
array
|
|
234
|
+
The array to be split
|
|
235
|
+
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
[array, ...]
|
|
239
|
+
A list of arrays after the split
|
|
240
|
+
"""
|
|
241
|
+
slices = self.parameters.beam_boundaries_spectral_beam_slices
|
|
242
|
+
return array[:, slices[beam - 1]]
|
|
243
|
+
|
|
244
|
+
@abstractmethod
|
|
245
|
+
def match_beam_sizes(
|
|
246
|
+
self, beam_boundary_list: list[tuple[int, int]], full_spatial_size: int
|
|
247
|
+
) -> list[tuple[int, int]]:
|
|
248
|
+
"""Ensure that all spatial beam boundaries produce arrays of the same shape."""
|
|
249
|
+
pass
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Cryonirsp CI beam boundaries task."""
|
|
2
|
+
|
|
3
|
+
from dkist_service_configuration.logging import logger
|
|
4
|
+
|
|
5
|
+
from dkist_processing_cryonirsp.tasks.beam_boundaries_base import SpatialBeamBoundariesBase
|
|
6
|
+
|
|
7
|
+
__all__ = ["CISpatialBeamBoundaries"]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CISpatialBeamBoundaries(SpatialBeamBoundariesBase):
|
|
11
|
+
"""Task class for calculation of the CI beam boundaries for later use during calibration."""
|
|
12
|
+
|
|
13
|
+
num_beams = 1
|
|
14
|
+
|
|
15
|
+
def match_beam_sizes(
|
|
16
|
+
self, beam_boundary_list: list[tuple[int, int]], full_spatial_size: int
|
|
17
|
+
) -> list[tuple[int, int]]:
|
|
18
|
+
"""
|
|
19
|
+
Ensure that all spatial beam boundaries produce arrays of the same shape.
|
|
20
|
+
|
|
21
|
+
For CI there is only one beam so we just return the input boundaries.
|
|
22
|
+
"""
|
|
23
|
+
logger.info(f"Full array spatial boundaries = {beam_boundary_list[0]}")
|
|
24
|
+
|
|
25
|
+
return beam_boundary_list
|