dkist-processing-cryonirsp 0.0.79__tar.gz → 0.0.80__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.
Potentially problematic release.
This version of dkist-processing-cryonirsp might be problematic. Click here for more details.
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/CHANGELOG.rst +19 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/PKG-INFO +1 -1
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/assemble_movie.py +3 -3
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +2 -2
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +12 -12
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +2 -2
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/ci_science.py +4 -4
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +4 -4
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/linearity_correction.py +39 -42
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/beam_access.py +2 -2
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/science_base.py +14 -14
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +8 -8
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_geometric.py +4 -4
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_science.py +6 -6
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +25 -25
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/write_l1.py +58 -58
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +35 -44
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +12 -5
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +1 -1
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +2 -2
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_ci_science.py +4 -4
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +1 -1
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_science.py +4 -4
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/PKG-INFO +1 -1
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/requires.txt +1 -1
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/setup.cfg +1 -1
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/.gitignore +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/.pre-commit-config.yaml +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/.readthedocs.yml +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/README.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/SCIENCE_CHANGELOG.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/bitbucket-pipelines.yml +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/changelog/.gitempty +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/check_changelog_updated.sh +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/config.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/constants.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/exposure_conditions.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/parameters.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/tags.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/task_name.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/exposure_conditions.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/polarimetric_check.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/time.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/wavelength.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/dark.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/parse.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/quality_metrics.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/trial_output_data.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/conftest.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/header_models.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_corrections.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_dark.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_make_movie_frames.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_parameters.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_parse.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_trial_output_data.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_write_l1.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/trial_workflows.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/top_level.txt +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/Makefile +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/bad_pixel_calibration.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/beam_angle_calculation.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/beam_boundary_computation.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/changelog.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/ci_science_calibration.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/conf.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/index.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_ci-full-trial.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_sp-full-trial.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/linearization.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/make.bat +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/requirements.txt +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/requirements_table.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/scientific_changelog.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/docs/sp_science_calibration.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/licenses/LICENSE.rst +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/pyproject.toml +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/science_towncrier.sh +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/setup.py +0 -0
- {dkist_processing_cryonirsp-0.0.79 → dkist_processing_cryonirsp-0.0.80}/towncrier_science.toml +0 -0
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
v0.0.80 (2024-08-15)
|
|
2
|
+
====================
|
|
3
|
+
|
|
4
|
+
Bugfixes
|
|
5
|
+
--------
|
|
6
|
+
|
|
7
|
+
- Use arm-specific Parsing tasks from v0.0.78 in local trial (AKA GROGU) workflows as well. (`#143 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/143>`__)
|
|
8
|
+
- Re-activate `CryonirspL0QualityMetrics` task in "l0_to_l1" local trial workflow. (`#143 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/143>`__)
|
|
9
|
+
- Correctly load a saved SP Dispersion Axis calibration when running local trial workflows. (`#143 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/143>`__)
|
|
10
|
+
- Move to version 4.6.0 of `dkist-fits-specifications` to correct allowed values of the TTBLTRCK header keyword.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Misc
|
|
15
|
+
----
|
|
16
|
+
|
|
17
|
+
- Make private methods public where documentation needs to be generated. (`#144 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/144>`__)
|
|
18
|
+
|
|
19
|
+
|
|
1
20
|
v0.0.79 (2024-08-12)
|
|
2
21
|
====================
|
|
3
22
|
|
|
@@ -33,7 +33,7 @@ class AssembleCryonirspMovieBase(AssembleMovie):
|
|
|
33
33
|
|
|
34
34
|
MPL_COLOR_MAP = "gray"
|
|
35
35
|
|
|
36
|
-
def
|
|
36
|
+
def compute_frame_shape(self) -> tuple[int, int]:
|
|
37
37
|
"""Dynamically set the dimensions of the movie based on L1 file shape."""
|
|
38
38
|
movie_frame_arrays = self.read(
|
|
39
39
|
tags=[CryonirspTag.movie_frame()], decoder=fits_array_decoder
|
|
@@ -56,7 +56,7 @@ class AssembleCryonirspMovieBase(AssembleMovie):
|
|
|
56
56
|
def pre_run(self) -> None:
|
|
57
57
|
"""Set the movie frame shape prior to running."""
|
|
58
58
|
super().pre_run()
|
|
59
|
-
frame_shape = self.
|
|
59
|
+
frame_shape = self.compute_frame_shape()
|
|
60
60
|
logger.info(f"Setting movie shape to {frame_shape}")
|
|
61
61
|
self.MOVIE_FRAME_SHAPE = frame_shape
|
|
62
62
|
|
|
@@ -107,7 +107,7 @@ class AssembleCryonirspMovieBase(AssembleMovie):
|
|
|
107
107
|
if self.constants.correct_for_polarization:
|
|
108
108
|
self.write_line(draw=draw, text="Stokes-I", line=4, column="right", font=self.font_36)
|
|
109
109
|
|
|
110
|
-
def
|
|
110
|
+
def get_middle_line(self, draw: ImageDraw, text: str, font: FreeTypeFont) -> int:
|
|
111
111
|
"""
|
|
112
112
|
Get the line number for the middle of the frame.
|
|
113
113
|
|
|
@@ -45,7 +45,7 @@ class BadPixelMapCalibration(CryonirspTaskBase):
|
|
|
45
45
|
|
|
46
46
|
"""
|
|
47
47
|
with self.apm_task_step(f"Compute average uncorrected solar gain image"):
|
|
48
|
-
average_solar_gain_array = self.
|
|
48
|
+
average_solar_gain_array = self.compute_average_gain_array()
|
|
49
49
|
|
|
50
50
|
with self.apm_task_step(f"Compute the bad pixel map"):
|
|
51
51
|
with self.apm_processing_step("Smooth array with median filter"):
|
|
@@ -72,7 +72,7 @@ class BadPixelMapCalibration(CryonirspTaskBase):
|
|
|
72
72
|
bad_pixel_map, task=CryonirspTaskName.bad_pixel_map.value
|
|
73
73
|
)
|
|
74
74
|
|
|
75
|
-
def
|
|
75
|
+
def compute_average_gain_array(self) -> np.ndarray:
|
|
76
76
|
"""
|
|
77
77
|
Compute an average of uncorrected solar gain arrays.
|
|
78
78
|
|
|
@@ -87,7 +87,7 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
87
87
|
"""
|
|
88
88
|
# Step 1:
|
|
89
89
|
with self.apm_processing_step(f"Compute average solar gain image"):
|
|
90
|
-
average_solar_gain_array = self.
|
|
90
|
+
average_solar_gain_array = self.compute_average_gain_array()
|
|
91
91
|
|
|
92
92
|
# Step 2:
|
|
93
93
|
with self.apm_task_step(f"Retrieve bad pixel map"):
|
|
@@ -98,30 +98,30 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
98
98
|
|
|
99
99
|
# Step 3
|
|
100
100
|
with self.apm_processing_step(f"Smooth the array to get good segmentation"):
|
|
101
|
-
smoothed_solar_gain_array = self.
|
|
101
|
+
smoothed_solar_gain_array = self.smooth_gain_array(corrected_solar_gain_array)
|
|
102
102
|
|
|
103
103
|
# Step 4
|
|
104
104
|
with self.apm_processing_step(f"Split the beam horizontally"):
|
|
105
|
-
split_beams = self.
|
|
105
|
+
split_beams = self.split_beams(smoothed_solar_gain_array)
|
|
106
106
|
|
|
107
107
|
# Step 5
|
|
108
108
|
with self.apm_processing_step(
|
|
109
109
|
f"Segment the beams into illuminated and non-illuminated pixels"
|
|
110
110
|
):
|
|
111
|
-
segmented_beams = self.
|
|
111
|
+
segmented_beams = self.segment_arrays(split_beams)
|
|
112
112
|
|
|
113
113
|
# Step 6:
|
|
114
114
|
with self.apm_processing_step(
|
|
115
115
|
f"Compute the inscribed rectangular extents of the illuminated portions of the sensor"
|
|
116
116
|
):
|
|
117
|
-
illuminated_boundaries = self.
|
|
117
|
+
illuminated_boundaries = self.compute_boundaries_of_beam_illumination_regions(
|
|
118
118
|
segmented_beams
|
|
119
119
|
)
|
|
120
120
|
|
|
121
121
|
# Steps 7 - 9:
|
|
122
122
|
with self.apm_processing_step(f"Compute the boundaries of the illuminated beams"):
|
|
123
123
|
split_beams_float = [split_beam.astype(float) for split_beam in split_beams]
|
|
124
|
-
boundaries = self.
|
|
124
|
+
boundaries = self.compute_final_beam_boundaries(
|
|
125
125
|
split_beams_float, illuminated_boundaries
|
|
126
126
|
)
|
|
127
127
|
|
|
@@ -134,7 +134,7 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
134
134
|
beam=beam,
|
|
135
135
|
)
|
|
136
136
|
|
|
137
|
-
def
|
|
137
|
+
def compute_average_gain_array(self) -> np.ndarray:
|
|
138
138
|
"""
|
|
139
139
|
Compute an average of uncorrected solar gain arrays.
|
|
140
140
|
|
|
@@ -158,7 +158,7 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
158
158
|
averaged_gain_data = average_numpy_arrays(lin_corr_gain_arrays)
|
|
159
159
|
return averaged_gain_data
|
|
160
160
|
|
|
161
|
-
def
|
|
161
|
+
def smooth_gain_array(self, array: np.ndarray) -> np.ndarray:
|
|
162
162
|
"""
|
|
163
163
|
Smooth the input array with morphological filtering using a disk shape.
|
|
164
164
|
|
|
@@ -181,7 +181,7 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
181
181
|
return norm_gain
|
|
182
182
|
|
|
183
183
|
@abstractmethod
|
|
184
|
-
def
|
|
184
|
+
def split_beams(self, input_array: np.ndarray) -> list[np.ndarray]:
|
|
185
185
|
"""
|
|
186
186
|
Split the beams along the horizontal axis.
|
|
187
187
|
|
|
@@ -201,7 +201,7 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
201
201
|
pass
|
|
202
202
|
|
|
203
203
|
@staticmethod
|
|
204
|
-
def
|
|
204
|
+
def segment_arrays(arrays: list[np.ndarray]) -> list[np.ndarray]:
|
|
205
205
|
"""
|
|
206
206
|
Segment the arrays into illuminated (True) and non-illuminated (False) regions.
|
|
207
207
|
|
|
@@ -222,7 +222,7 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
222
222
|
segmented_arrays.append((beam_array > thresh).astype(bool))
|
|
223
223
|
return segmented_arrays
|
|
224
224
|
|
|
225
|
-
def
|
|
225
|
+
def compute_boundaries_of_beam_illumination_regions(
|
|
226
226
|
self, arrays: list[np.ndarray]
|
|
227
227
|
) -> list[BeamBoundary]:
|
|
228
228
|
"""
|
|
@@ -257,7 +257,7 @@ class BeamBoundariesCalibrationBase(CryonirspTaskBase):
|
|
|
257
257
|
return boundaries
|
|
258
258
|
|
|
259
259
|
@abstractmethod
|
|
260
|
-
def
|
|
260
|
+
def compute_final_beam_boundaries(
|
|
261
261
|
self,
|
|
262
262
|
smoothed_solar_gain_arrays: list[np.ndarray],
|
|
263
263
|
illuminated_boundaries: list[BeamBoundary],
|
|
@@ -12,7 +12,7 @@ __all__ = ["CIBeamBoundariesCalibration"]
|
|
|
12
12
|
class CIBeamBoundariesCalibration(BeamBoundariesCalibrationBase):
|
|
13
13
|
"""Task class for calculation of the CI beam boundaries for later use during calibration."""
|
|
14
14
|
|
|
15
|
-
def
|
|
15
|
+
def split_beams(self, array: np.ndarray) -> list[np.ndarray]:
|
|
16
16
|
"""
|
|
17
17
|
Return the input array, as there is no beam split for CI.
|
|
18
18
|
|
|
@@ -31,7 +31,7 @@ class CIBeamBoundariesCalibration(BeamBoundariesCalibrationBase):
|
|
|
31
31
|
"""
|
|
32
32
|
return [array]
|
|
33
33
|
|
|
34
|
-
def
|
|
34
|
+
def compute_final_beam_boundaries(
|
|
35
35
|
self, smoothed_solar_gain_array: np.ndarray, illuminated_boundaries: list[BeamBoundary]
|
|
36
36
|
):
|
|
37
37
|
"""
|
|
@@ -84,7 +84,7 @@ class CIScienceCalibration(ScienceCalibrationBase):
|
|
|
84
84
|
calibrations=calibrations,
|
|
85
85
|
)
|
|
86
86
|
|
|
87
|
-
intermediate_object = self.
|
|
87
|
+
intermediate_object = self.wrap_array_and_header_in_fits_access(
|
|
88
88
|
intermediate_array, intermediate_header
|
|
89
89
|
)
|
|
90
90
|
|
|
@@ -118,11 +118,11 @@ class CIScienceCalibration(ScienceCalibrationBase):
|
|
|
118
118
|
exposure_conditions=exposure_conditions,
|
|
119
119
|
calibrations=calibrations,
|
|
120
120
|
)
|
|
121
|
-
intermediate_header = self.
|
|
121
|
+
intermediate_header = self.compute_date_keys(intermediate_header)
|
|
122
122
|
|
|
123
|
-
intermediate_array = self.
|
|
123
|
+
intermediate_array = self.add_stokes_dimension_to_intensity_only_array(intermediate_array)
|
|
124
124
|
|
|
125
|
-
calibrated_object = self.
|
|
125
|
+
calibrated_object = self.wrap_array_and_header_in_fits_access(
|
|
126
126
|
intermediate_array, intermediate_header
|
|
127
127
|
)
|
|
128
128
|
|
|
@@ -245,7 +245,7 @@ class InstrumentPolarizationCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
245
245
|
gain_corrected_array = next(divide_arrays_by_array(dark_corrected_array, gain_array))
|
|
246
246
|
|
|
247
247
|
with self.apm_processing_step(f"Extract macro pixels from {apm_str}"):
|
|
248
|
-
self.
|
|
248
|
+
self.set_original_beam_size(gain_corrected_array)
|
|
249
249
|
output_shape = (
|
|
250
250
|
self.parameters.polcal_num_spatial_bins,
|
|
251
251
|
self.parameters.polcal_num_spectral_bins,
|
|
@@ -304,14 +304,14 @@ class InstrumentPolarizationCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
304
304
|
|
|
305
305
|
target_shape = self.single_beam_shape + demod_shape
|
|
306
306
|
logger.info(f"Target full-frame demodulation shape: {target_shape}")
|
|
307
|
-
return self.
|
|
307
|
+
return self.resize_polcal_array(demod_matrices, target_shape)
|
|
308
308
|
|
|
309
|
-
def
|
|
309
|
+
def set_original_beam_size(self, array: np.ndarray) -> None:
|
|
310
310
|
"""Record the shape of a single beam as a class property."""
|
|
311
311
|
self.single_beam_shape = array.shape
|
|
312
312
|
|
|
313
313
|
@staticmethod
|
|
314
|
-
def
|
|
314
|
+
def resize_polcal_array(array: np.ndarray, output_shape: tuple[int, ...]) -> np.ndarray:
|
|
315
315
|
return next(resize_arrays(array, output_shape))
|
|
316
316
|
|
|
317
317
|
def generate_polcal_dark_calibration(
|
|
@@ -44,28 +44,28 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
44
44
|
record_provenance = True
|
|
45
45
|
|
|
46
46
|
def run(self):
|
|
47
|
-
"""
|
|
47
|
+
"""
|
|
48
|
+
Run method for this task.
|
|
48
49
|
|
|
49
50
|
Steps to be performed:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- Write linearity corrected frame with updated tags
|
|
51
|
+
- Iterate through frames by ramp set (identified by date-obs)
|
|
52
|
+
- Identify the frames in the ramp set and populate the ramp set data structure
|
|
53
|
+
- Perform linearity correction on the ramp set, minimizing the memory footprint based on a maximum memory limit for the ramp set
|
|
54
|
+
- Collate tags for linearity corrected frame(s)
|
|
55
|
+
- Write linearity corrected frame with updated tags
|
|
56
56
|
|
|
57
57
|
Returns
|
|
58
58
|
-------
|
|
59
59
|
None
|
|
60
60
|
"""
|
|
61
61
|
num_ramp_sets = len(self.constants.time_obs_list)
|
|
62
|
-
for ramp_set in self.
|
|
62
|
+
for ramp_set in self.identify_ramp_sets():
|
|
63
63
|
time_obs = ramp_set.time_obs
|
|
64
64
|
ramp_set_num = ramp_set.current_ramp_set_num
|
|
65
65
|
logger.info(
|
|
66
66
|
f"Processing frames from {time_obs}: ramp set {ramp_set_num} of {num_ramp_sets}"
|
|
67
67
|
)
|
|
68
|
-
output_array = self.
|
|
68
|
+
output_array = self.reduce_ramp_set(
|
|
69
69
|
ramp_set=ramp_set,
|
|
70
70
|
mode="LookUpTable",
|
|
71
71
|
camera_readout_mode=self.constants.camera_readout_mode,
|
|
@@ -73,11 +73,11 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
73
73
|
thresholds=self.parameters.linearization_thresholds,
|
|
74
74
|
)
|
|
75
75
|
# Normalize by the exposure time and correct for the Optical Density filter
|
|
76
|
-
exposure_corrected_output_array = self.
|
|
76
|
+
exposure_corrected_output_array = self.apply_exposure_corrections(
|
|
77
77
|
output_array, ramp_set
|
|
78
78
|
)
|
|
79
79
|
# Get the tags for the linearized output frame
|
|
80
|
-
tags = self.
|
|
80
|
+
tags = self.generate_output_tag_set(
|
|
81
81
|
ramp_set.last_frame_name, ramp_set.frames_to_process[-1]
|
|
82
82
|
)
|
|
83
83
|
# The last frame in the ramp is used for the header
|
|
@@ -88,7 +88,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
88
88
|
encoder=fits_array_encoder,
|
|
89
89
|
)
|
|
90
90
|
|
|
91
|
-
def
|
|
91
|
+
def identify_ramp_sets(self) -> Generator[_RampSet, None, None]:
|
|
92
92
|
"""
|
|
93
93
|
Identify all the ramp sets present in the input data.
|
|
94
94
|
|
|
@@ -109,14 +109,14 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
109
109
|
Generator which yields _RampSet instances
|
|
110
110
|
"""
|
|
111
111
|
for ramp_set_num, time_obs in enumerate(self.constants.time_obs_list):
|
|
112
|
-
ramp_set = self.
|
|
112
|
+
ramp_set = self.populate_ramp_set(time_obs, ramp_set_num)
|
|
113
113
|
if ramp_set.is_valid:
|
|
114
114
|
yield ramp_set
|
|
115
115
|
else:
|
|
116
116
|
logger.info(f"Ramp set for {time_obs=} skipped.")
|
|
117
117
|
|
|
118
118
|
@staticmethod
|
|
119
|
-
def
|
|
119
|
+
def tag_list_for_single_ramp_frame(time_obs: str, frame_num: int) -> list[CryonirspTag]:
|
|
120
120
|
"""Return the tag list required to identify a single ramp frame."""
|
|
121
121
|
tags = [
|
|
122
122
|
CryonirspTag.input(),
|
|
@@ -126,7 +126,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
126
126
|
]
|
|
127
127
|
return tags
|
|
128
128
|
|
|
129
|
-
def
|
|
129
|
+
def read_single_ramp_frame(self, time_obs: str, frame_num: int) -> CryonirspRampFitsAccess:
|
|
130
130
|
"""
|
|
131
131
|
Read a single file from a single ramp set based on the observe time and frame number.
|
|
132
132
|
|
|
@@ -143,7 +143,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
143
143
|
A CryonirspRampFitsAccess object containing the desired frame
|
|
144
144
|
|
|
145
145
|
"""
|
|
146
|
-
tags = self.
|
|
146
|
+
tags = self.tag_list_for_single_ramp_frame(time_obs, frame_num)
|
|
147
147
|
fits_obj_list = list(
|
|
148
148
|
self.read(
|
|
149
149
|
tags=tags,
|
|
@@ -156,7 +156,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
156
156
|
fits_obj = fits_obj_list[0]
|
|
157
157
|
return fits_obj
|
|
158
158
|
|
|
159
|
-
def
|
|
159
|
+
def get_ordered_exposure_time_list(self, time_obs: str, num_frames_in_ramp: int) -> np.ndarray:
|
|
160
160
|
"""
|
|
161
161
|
Return a list of exposure times for this ramp, ordered by frame in ramp.
|
|
162
162
|
|
|
@@ -177,11 +177,11 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
177
177
|
"""
|
|
178
178
|
exp_time_list = []
|
|
179
179
|
for frame_num in range(1, num_frames_in_ramp + 1):
|
|
180
|
-
fits_obj = self.
|
|
180
|
+
fits_obj = self.read_single_ramp_frame(time_obs, frame_num)
|
|
181
181
|
exp_time_list.append(fits_obj.fpa_exposure_time_ms)
|
|
182
182
|
return np.array(exp_time_list, dtype=np.float32)
|
|
183
183
|
|
|
184
|
-
def
|
|
184
|
+
def populate_ramp_set(self, time_obs: str, idx: int) -> _RampSet | None:
|
|
185
185
|
"""
|
|
186
186
|
Populate a _RampSet dataclass for the ramp identified by time_obs.
|
|
187
187
|
|
|
@@ -199,8 +199,8 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
199
199
|
The last frame in the set is read to access the shape of the data frame.
|
|
200
200
|
"""
|
|
201
201
|
actual_num_frames_in_ramp = self.count(CryonirspTag.time_obs(time_obs))
|
|
202
|
-
exp_times = self.
|
|
203
|
-
last_frame = self.
|
|
202
|
+
exp_times = self.get_ordered_exposure_time_list(time_obs, actual_num_frames_in_ramp)
|
|
203
|
+
last_frame = self.read_single_ramp_frame(time_obs, actual_num_frames_in_ramp)
|
|
204
204
|
expected_num_frames_in_ramp = last_frame.num_frames_in_ramp
|
|
205
205
|
ramp_set_num = idx + 1
|
|
206
206
|
# The default list of curr_frame_in_ramp tag numbers to use, which may be altered later on
|
|
@@ -220,7 +220,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
220
220
|
)
|
|
221
221
|
return ramp_set
|
|
222
222
|
|
|
223
|
-
def
|
|
223
|
+
def generate_output_tag_set(self, frame_name: str, curr_frame_in_ramp: int) -> list[str]:
|
|
224
224
|
"""
|
|
225
225
|
Use one of the input frames to derive the proper list of output tags.
|
|
226
226
|
|
|
@@ -239,9 +239,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
239
239
|
result_tags.append(CryonirspTag.linearized())
|
|
240
240
|
return result_tags
|
|
241
241
|
|
|
242
|
-
def
|
|
243
|
-
self, input_array: np.ndarray, ramp_set: _RampSet
|
|
244
|
-
) -> np.ndarray:
|
|
242
|
+
def apply_exposure_corrections(self, input_array: np.ndarray, ramp_set: _RampSet) -> np.ndarray:
|
|
245
243
|
"""
|
|
246
244
|
Normalize the array by converting to counts per second and correcting for Optical Density filter attenuation.
|
|
247
245
|
|
|
@@ -267,7 +265,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
267
265
|
od_filter_attenuation = 10**log_od_filter_attenuation
|
|
268
266
|
return exposure_normalized_array / od_filter_attenuation
|
|
269
267
|
|
|
270
|
-
def
|
|
268
|
+
def reduce_ramp_set(
|
|
271
269
|
self,
|
|
272
270
|
ramp_set: _RampSet,
|
|
273
271
|
mode: str = None,
|
|
@@ -278,7 +276,6 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
278
276
|
"""
|
|
279
277
|
Process a single ramp from a set of input frames.
|
|
280
278
|
|
|
281
|
-
mode:
|
|
282
279
|
Parameters
|
|
283
280
|
----------
|
|
284
281
|
ramp_set
|
|
@@ -318,7 +315,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
318
315
|
]
|
|
319
316
|
|
|
320
317
|
if mode == "LookUpTable" and camera_readout_mode == "FastUpTheRamp":
|
|
321
|
-
return self.
|
|
318
|
+
return self.reduce_ramp_set_for_lookup_table_and_fast_up_the_ramp(
|
|
322
319
|
ramp_set=ramp_set,
|
|
323
320
|
lin_curve=lin_curve,
|
|
324
321
|
thresholds=thresh_roi,
|
|
@@ -327,7 +324,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
327
324
|
f"Linearization mode {mode} and camera readout mode {camera_readout_mode} is currently not supported."
|
|
328
325
|
)
|
|
329
326
|
|
|
330
|
-
def
|
|
327
|
+
def reduce_ramp_set_for_lookup_table_and_fast_up_the_ramp(
|
|
331
328
|
self,
|
|
332
329
|
ramp_set: _RampSet,
|
|
333
330
|
lin_curve: np.ndarray,
|
|
@@ -339,14 +336,14 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
339
336
|
ramp_set.frames_to_process = ramp_set.frames_to_process[1:]
|
|
340
337
|
ramp_set.exposure_times_ms = ramp_set.exposure_times_ms[1:]
|
|
341
338
|
ramp_set.index_offset_to_first_frame += 1
|
|
342
|
-
processed_frame = self.
|
|
339
|
+
processed_frame = self.linearize_fast_up_the_ramp_with_lookup_table(
|
|
343
340
|
ramp_set=ramp_set,
|
|
344
341
|
lin_curve=lin_curve,
|
|
345
342
|
thresholds=thresholds,
|
|
346
343
|
)
|
|
347
344
|
return processed_frame
|
|
348
345
|
|
|
349
|
-
def
|
|
346
|
+
def linearize_fast_up_the_ramp_with_lookup_table(
|
|
350
347
|
self,
|
|
351
348
|
ramp_set: _RampSet,
|
|
352
349
|
lin_curve: np.ndarray,
|
|
@@ -382,7 +379,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
382
379
|
frame_shape = ramp_set.frame_shape
|
|
383
380
|
linearized_frame = np.zeros(np.prod(frame_shape), dtype=np.float32)
|
|
384
381
|
num_frame_size_elements = int(np.prod(frame_shape))
|
|
385
|
-
chunk_size_nelem = self.
|
|
382
|
+
chunk_size_nelem = self.compute_linear_chunk_size(
|
|
386
383
|
num_frame_size_elements, ramp_set.num_frames_in_ramp
|
|
387
384
|
)
|
|
388
385
|
# num_chunks = num full chunks + a single partial chunk, if needed
|
|
@@ -400,10 +397,10 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
400
397
|
logger.info(f"Processing chunk {chunk} of {num_chunks}")
|
|
401
398
|
current_chunk_size_nelem = min(chunk_size_nelem, elements_remaining)
|
|
402
399
|
current_slice = slice(offset, offset + current_chunk_size_nelem)
|
|
403
|
-
chunk_stack = self.
|
|
400
|
+
chunk_stack = self.load_chunk_stack(
|
|
404
401
|
ramp_set, current_chunk_size_nelem, ramp_set.num_frames_in_ramp, current_slice
|
|
405
402
|
)
|
|
406
|
-
linearized_frame[current_slice] = self.
|
|
403
|
+
linearized_frame[current_slice] = self.linearize_chunk(
|
|
407
404
|
chunk_stack,
|
|
408
405
|
lin_curve,
|
|
409
406
|
thresholds_flattened[current_slice],
|
|
@@ -414,7 +411,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
414
411
|
|
|
415
412
|
return linearized_frame.reshape(frame_shape)
|
|
416
413
|
|
|
417
|
-
def
|
|
414
|
+
def load_chunk_stack(
|
|
418
415
|
self,
|
|
419
416
|
ramp_set: _RampSet,
|
|
420
417
|
current_chunk_size: int,
|
|
@@ -448,12 +445,12 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
448
445
|
"""
|
|
449
446
|
chunk_stack = np.zeros((current_chunk_size, trimmed_frames_in_ramp), np.float32)
|
|
450
447
|
for frame_num in ramp_set.frames_to_process:
|
|
451
|
-
frame = self.
|
|
448
|
+
frame = self.read_single_ramp_frame(ramp_set.time_obs, frame_num).data
|
|
452
449
|
frame_pos_in_stack = frame_num - ramp_set.index_offset_to_first_frame
|
|
453
450
|
chunk_stack[:current_chunk_size, frame_pos_in_stack] = frame.flatten()[current_slice]
|
|
454
451
|
return chunk_stack
|
|
455
452
|
|
|
456
|
-
def
|
|
453
|
+
def compute_linear_chunk_size(self, frame_size_nelem: int, num_frames_in_ramp: int) -> int:
|
|
457
454
|
"""
|
|
458
455
|
Compute the number of pixel stacks that constitute a 'chunk'.
|
|
459
456
|
|
|
@@ -487,7 +484,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
487
484
|
)
|
|
488
485
|
return chunk_size_nelem
|
|
489
486
|
|
|
490
|
-
def
|
|
487
|
+
def linearize_chunk(
|
|
491
488
|
self, chunk_stack: np.ndarray, linc: np.ndarray, thresh: np.ndarray, exptimes: np.ndarray
|
|
492
489
|
) -> np.ndarray:
|
|
493
490
|
"""
|
|
@@ -509,8 +506,8 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
509
506
|
An array containing a linearized slice of the full ramp stack
|
|
510
507
|
|
|
511
508
|
"""
|
|
512
|
-
raw_data = self.
|
|
513
|
-
slopes = self.
|
|
509
|
+
raw_data = self.lin_correct(chunk_stack, linc)
|
|
510
|
+
slopes = self.get_slopes(exptimes, raw_data, thresh)
|
|
514
511
|
# Scale the slopes by the exposure time to convert to counts
|
|
515
512
|
processed_frame = slopes * np.nanmax(exptimes)
|
|
516
513
|
return processed_frame
|
|
@@ -518,7 +515,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
518
515
|
# The methods below are derived versions of the same codes in Tom Schad's h2rg.py
|
|
519
516
|
@staticmethod
|
|
520
517
|
@njit(parallel=False)
|
|
521
|
-
def
|
|
518
|
+
def lin_correct(raw_data: np.ndarray, linc: np.ndarray) -> np.ndarray:
|
|
522
519
|
"""
|
|
523
520
|
Correct the measured raw fluence to normalized flux per non-destructive readout (NDR).
|
|
524
521
|
|
|
@@ -531,7 +528,7 @@ class LinearityCorrection(CryonirspTaskBase):
|
|
|
531
528
|
|
|
532
529
|
@staticmethod
|
|
533
530
|
@njit(parallel=False)
|
|
534
|
-
def
|
|
531
|
+
def get_slopes(exptimes: np.ndarray, data: np.ndarray, thresholds: np.ndarray):
|
|
535
532
|
"""
|
|
536
533
|
Compute the weighted least squares estimate of the normalized flux per exposure time increment for a single ramp.
|
|
537
534
|
|
|
@@ -22,7 +22,7 @@ class BeamAccessMixin:
|
|
|
22
22
|
-------
|
|
23
23
|
An ndarray containing the extracted beam
|
|
24
24
|
"""
|
|
25
|
-
boundaries = self.
|
|
25
|
+
boundaries = self.beam_boundaries[beam]
|
|
26
26
|
spatial_min, spatial_max, spectral_min, spectral_max = boundaries
|
|
27
27
|
|
|
28
28
|
if (
|
|
@@ -38,7 +38,7 @@ class BeamAccessMixin:
|
|
|
38
38
|
return np.copy(array[spatial_min:spatial_max, spectral_min:spectral_max])
|
|
39
39
|
|
|
40
40
|
@cached_property
|
|
41
|
-
def
|
|
41
|
+
def beam_boundaries(self) -> dict[int, np.ndarray]:
|
|
42
42
|
"""
|
|
43
43
|
Load the beam boundaries from their respective files and return as a boundary dict.
|
|
44
44
|
|
|
@@ -222,7 +222,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
222
222
|
intermediate_array = self.polarization_correction(
|
|
223
223
|
array_stack, calibrations.demod_matrices[CryonirspTag.beam(beam)]
|
|
224
224
|
)
|
|
225
|
-
intermediate_header = self.
|
|
225
|
+
intermediate_header = self.compute_date_keys(header_stack)
|
|
226
226
|
|
|
227
227
|
return intermediate_array, intermediate_header
|
|
228
228
|
|
|
@@ -298,14 +298,14 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
298
298
|
meas_num
|
|
299
299
|
The current measurement number
|
|
300
300
|
"""
|
|
301
|
-
final_header = self.
|
|
301
|
+
final_header = self.update_calibrated_header(calibrated_object.header, map_scan=map_scan)
|
|
302
302
|
if self.constants.correct_for_polarization:
|
|
303
303
|
stokes_I_data = calibrated_object.data[:, :, 0]
|
|
304
304
|
for s, stokes_param in enumerate(self.constants.stokes_params):
|
|
305
305
|
stokes_data = calibrated_object.data[:, :, s]
|
|
306
|
-
final_data = self.
|
|
307
|
-
pol_header = self.
|
|
308
|
-
self.
|
|
306
|
+
final_data = self.re_dummy_data(stokes_data)
|
|
307
|
+
pol_header = self.add_L1_pol_headers(final_header, stokes_data, stokes_I_data)
|
|
308
|
+
self.write_calibrated_array(
|
|
309
309
|
data=final_data,
|
|
310
310
|
header=pol_header,
|
|
311
311
|
stokes=stokes_param,
|
|
@@ -315,8 +315,8 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
315
315
|
)
|
|
316
316
|
|
|
317
317
|
else:
|
|
318
|
-
final_data = self.
|
|
319
|
-
self.
|
|
318
|
+
final_data = self.re_dummy_data(calibrated_object.data[:, :, 0])
|
|
319
|
+
self.write_calibrated_array(
|
|
320
320
|
data=final_data,
|
|
321
321
|
header=final_header,
|
|
322
322
|
stokes="I",
|
|
@@ -326,7 +326,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
326
326
|
)
|
|
327
327
|
|
|
328
328
|
@staticmethod
|
|
329
|
-
def
|
|
329
|
+
def wrap_array_and_header_in_fits_access(
|
|
330
330
|
array: np.ndarray, header: fits.Header
|
|
331
331
|
) -> CryonirspL0FitsAccess:
|
|
332
332
|
"""Wrap input array and header in a CryonirspL0FitsAccess object."""
|
|
@@ -336,7 +336,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
336
336
|
return obj
|
|
337
337
|
|
|
338
338
|
@staticmethod
|
|
339
|
-
def
|
|
339
|
+
def add_stokes_dimension_to_intensity_only_array(array: np.ndarray) -> np.ndarray:
|
|
340
340
|
"""
|
|
341
341
|
Add a length-1 dimension to the end of an array.
|
|
342
342
|
|
|
@@ -345,7 +345,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
345
345
|
return array[..., None]
|
|
346
346
|
|
|
347
347
|
@staticmethod
|
|
348
|
-
def
|
|
348
|
+
def compute_date_keys(headers: Iterable[fits.Header] | fits.Header) -> fits.Header:
|
|
349
349
|
"""
|
|
350
350
|
Generate correct DATE-??? header keys from a set of input headers.
|
|
351
351
|
|
|
@@ -376,7 +376,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
376
376
|
|
|
377
377
|
return header
|
|
378
378
|
|
|
379
|
-
def
|
|
379
|
+
def re_dummy_data(self, data: np.ndarray):
|
|
380
380
|
"""
|
|
381
381
|
Add the dummy dimension that we have been secretly squeezing out during processing.
|
|
382
382
|
|
|
@@ -390,7 +390,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
390
390
|
logger.info(f"Adding dummy WCS dimension to array with shape {data.shape}")
|
|
391
391
|
return data[None, :, :]
|
|
392
392
|
|
|
393
|
-
def
|
|
393
|
+
def update_calibrated_header(self, header: fits.Header, map_scan: int) -> fits.Header:
|
|
394
394
|
"""
|
|
395
395
|
Update calibrated headers with any information gleaned during science calibration.
|
|
396
396
|
|
|
@@ -414,7 +414,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
414
414
|
|
|
415
415
|
return header
|
|
416
416
|
|
|
417
|
-
def
|
|
417
|
+
def add_L1_pol_headers(
|
|
418
418
|
self, input_header: fits.Header, stokes_data: np.ndarray, stokes_I_data: np.ndarray
|
|
419
419
|
) -> fits.Header:
|
|
420
420
|
"""Compute and add 214 header values specific to polarimetric datasets."""
|
|
@@ -460,7 +460,7 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
|
|
|
460
460
|
"""
|
|
461
461
|
return float(1.0 / np.sqrt(np.nanmax(stokes_I_data)))
|
|
462
462
|
|
|
463
|
-
def
|
|
463
|
+
def write_calibrated_array(
|
|
464
464
|
self,
|
|
465
465
|
data: np.ndarray,
|
|
466
466
|
header: fits.Header,
|