dkist-processing-cryonirsp 0.0.78__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.

Files changed (126) hide show
  1. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/CHANGELOG.rst +28 -0
  2. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/PKG-INFO +1 -1
  3. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/assemble_movie.py +3 -3
  4. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +2 -2
  5. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +12 -12
  6. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +2 -2
  7. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/ci_science.py +4 -4
  8. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +4 -4
  9. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/linearity_correction.py +39 -42
  10. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/beam_access.py +2 -2
  11. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/science_base.py +14 -14
  12. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +8 -8
  13. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_geometric.py +4 -4
  14. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_science.py +6 -6
  15. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +25 -25
  16. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/write_l1.py +58 -58
  17. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +35 -44
  18. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +12 -5
  19. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +1 -1
  20. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +2 -2
  21. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_ci_science.py +4 -4
  22. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +1 -1
  23. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_science.py +4 -4
  24. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/PKG-INFO +1 -1
  25. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/requires.txt +1 -1
  26. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/setup.cfg +1 -1
  27. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/.gitignore +0 -0
  28. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/.pre-commit-config.yaml +0 -0
  29. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/.readthedocs.yml +0 -0
  30. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/README.rst +0 -0
  31. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/SCIENCE_CHANGELOG.rst +0 -0
  32. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/bitbucket-pipelines.yml +0 -0
  33. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/changelog/.gitempty +0 -0
  34. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/check_changelog_updated.sh +0 -0
  35. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/__init__.py +0 -0
  36. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/config.py +0 -0
  37. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/__init__.py +0 -0
  38. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/constants.py +0 -0
  39. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/exposure_conditions.py +0 -0
  40. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/parameters.py +0 -0
  41. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/tags.py +0 -0
  42. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/models/task_name.py +0 -0
  43. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
  44. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +0 -0
  45. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
  46. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/exposure_conditions.py +0 -0
  47. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
  48. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
  49. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
  50. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +0 -0
  51. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/polarimetric_check.py +0 -0
  52. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
  53. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/time.py +0 -0
  54. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/parsers/wavelength.py +0 -0
  55. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/__init__.py +0 -0
  56. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
  57. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/dark.py +0 -0
  58. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
  59. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
  60. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
  61. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
  62. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +0 -0
  63. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +0 -0
  64. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +0 -0
  65. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +0 -0
  66. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/parse.py +0 -0
  67. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/quality_metrics.py +0 -0
  68. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +0 -0
  69. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tasks/trial_output_data.py +0 -0
  70. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
  71. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/conftest.py +0 -0
  72. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/header_models.py +0 -0
  73. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
  74. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +0 -0
  75. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +0 -0
  76. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
  77. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +0 -0
  78. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_corrections.py +0 -0
  79. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
  80. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
  81. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_dark.py +0 -0
  82. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
  83. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
  84. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_make_movie_frames.py +0 -0
  85. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_parameters.py +0 -0
  86. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_parse.py +0 -0
  87. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
  88. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +0 -0
  89. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +0 -0
  90. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
  91. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
  92. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
  93. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +0 -0
  94. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_trial_output_data.py +0 -0
  95. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
  96. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/tests/test_write_l1.py +0 -0
  97. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
  98. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +0 -0
  99. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +0 -0
  100. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp/workflows/trial_workflows.py +0 -0
  101. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +0 -0
  102. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
  103. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/dkist_processing_cryonirsp.egg-info/top_level.txt +0 -0
  104. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/Makefile +0 -0
  105. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/bad_pixel_calibration.rst +0 -0
  106. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/beam_angle_calculation.rst +0 -0
  107. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/beam_boundary_computation.rst +0 -0
  108. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/changelog.rst +0 -0
  109. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/ci_science_calibration.rst +0 -0
  110. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/conf.py +0 -0
  111. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/index.rst +0 -0
  112. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_ci-full-trial.rst +0 -0
  113. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
  114. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_sp-full-trial.rst +0 -0
  115. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
  116. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/linearization.rst +0 -0
  117. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/make.bat +0 -0
  118. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/requirements.txt +0 -0
  119. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/requirements_table.rst +0 -0
  120. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/scientific_changelog.rst +0 -0
  121. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/docs/sp_science_calibration.rst +0 -0
  122. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/licenses/LICENSE.rst +0 -0
  123. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/pyproject.toml +0 -0
  124. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/science_towncrier.sh +0 -0
  125. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/setup.py +0 -0
  126. {dkist_processing_cryonirsp-0.0.78 → dkist_processing_cryonirsp-0.0.80}/towncrier_science.toml +0 -0
@@ -1,3 +1,31 @@
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
+
20
+ v0.0.79 (2024-08-12)
21
+ ====================
22
+
23
+ Misc
24
+ ----
25
+
26
+ - Move to version 4.5.0 of `dkist-fits-specifications` which includes `PV1_nA` keys for non linear dispersion.
27
+
28
+
1
29
  v0.0.78 (2024-08-09)
2
30
  ====================
3
31
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dkist_processing_cryonirsp
3
- Version: 0.0.78
3
+ Version: 0.0.80
4
4
  Summary: Science processing code for the Cryo-NIRSP instrument on DKIST
5
5
  Home-page: https://bitbucket.org/dkistdc/dkist_processing_cryonirsp/src/main/
6
6
  Author: NSO / AURA
@@ -33,7 +33,7 @@ class AssembleCryonirspMovieBase(AssembleMovie):
33
33
 
34
34
  MPL_COLOR_MAP = "gray"
35
35
 
36
- def _compute_frame_shape(self) -> tuple[int, int]:
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._compute_frame_shape()
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 _get_middle_line(self, draw: ImageDraw, text: str, font: FreeTypeFont) -> int:
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._compute_average_gain_array()
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 _compute_average_gain_array(self) -> np.ndarray:
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._compute_average_gain_array()
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._smooth_gain_array(corrected_solar_gain_array)
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._split_beams(smoothed_solar_gain_array)
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._segment_arrays(split_beams)
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._compute_boundaries_of_beam_illumination_regions(
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._compute_final_beam_boundaries(
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 _compute_average_gain_array(self) -> np.ndarray:
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 _smooth_gain_array(self, array: np.ndarray) -> np.ndarray:
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 _split_beams(self, input_array: np.ndarray) -> list[np.ndarray]:
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 _segment_arrays(arrays: list[np.ndarray]) -> list[np.ndarray]:
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 _compute_boundaries_of_beam_illumination_regions(
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 _compute_final_beam_boundaries(
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 _split_beams(self, array: np.ndarray) -> list[np.ndarray]:
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 _compute_final_beam_boundaries(
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._wrap_array_and_header_in_fits_access(
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._compute_date_keys(intermediate_header)
121
+ intermediate_header = self.compute_date_keys(intermediate_header)
122
122
 
123
- intermediate_array = self._add_stokes_dimension_to_intensity_only_array(intermediate_array)
123
+ intermediate_array = self.add_stokes_dimension_to_intensity_only_array(intermediate_array)
124
124
 
125
- calibrated_object = self._wrap_array_and_header_in_fits_access(
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._set_original_beam_size(gain_corrected_array)
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._resize_polcal_array(demod_matrices, target_shape)
307
+ return self.resize_polcal_array(demod_matrices, target_shape)
308
308
 
309
- def _set_original_beam_size(self, array: np.ndarray) -> None:
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 _resize_polcal_array(array: np.ndarray, output_shape: tuple[int, ...]) -> np.ndarray:
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
- """Run method for this task.
47
+ """
48
+ Run method for this task.
48
49
 
49
50
  Steps to be performed:
50
- - Iterate through frames by ramp set (identified by date-obs)
51
- - Identify the frames in the ramp set and populate the ramp set data structure
52
- - Perform linearity correction on the ramp set, minimizing the memory footprint
53
- 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
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._identify_ramp_sets():
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._reduce_ramp_set(
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._apply_exposure_corrections(
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._generate_output_tag_set(
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 _identify_ramp_sets(self) -> Generator[_RampSet, None, None]:
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._populate_ramp_set(time_obs, ramp_set_num)
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 _tag_list_for_single_ramp_frame(time_obs: str, frame_num: int) -> list[CryonirspTag]:
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 _read_single_ramp_frame(self, time_obs: str, frame_num: int) -> CryonirspRampFitsAccess:
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._tag_list_for_single_ramp_frame(time_obs, frame_num)
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 _get_ordered_exposure_time_list(self, time_obs: str, num_frames_in_ramp: int) -> np.ndarray:
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._read_single_ramp_frame(time_obs, frame_num)
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 _populate_ramp_set(self, time_obs: str, idx: int) -> _RampSet | None:
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._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)
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 _generate_output_tag_set(self, frame_name: str, curr_frame_in_ramp: int) -> list[str]:
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 _apply_exposure_corrections(
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 _reduce_ramp_set(
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._reduce_ramp_set_for_lookup_table_and_fast_up_the_ramp(
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 _reduce_ramp_set_for_lookup_table_and_fast_up_the_ramp(
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._linearize_fast_up_the_ramp_with_lookup_table(
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 _linearize_fast_up_the_ramp_with_lookup_table(
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._compute_linear_chunk_size(
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._load_chunk_stack(
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._linearize_chunk(
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 _load_chunk_stack(
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._read_single_ramp_frame(ramp_set.time_obs, frame_num).data
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 _compute_linear_chunk_size(self, frame_size_nelem: int, num_frames_in_ramp: int) -> int:
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 _linearize_chunk(
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._lin_correct(chunk_stack, linc)
513
- slopes = self._get_slopes(exptimes, raw_data, thresh)
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 _lin_correct(raw_data: np.ndarray, linc: np.ndarray) -> np.ndarray:
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 _get_slopes(exptimes: np.ndarray, data: np.ndarray, thresholds: np.ndarray):
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._beam_boundaries[beam]
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 _beam_boundaries(self) -> dict[int, np.ndarray]:
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._compute_date_keys(header_stack)
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._update_calibrated_header(calibrated_object.header, map_scan=map_scan)
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._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(
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._re_dummy_data(calibrated_object.data[:, :, 0])
319
- self._write_calibrated_array(
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 _wrap_array_and_header_in_fits_access(
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 _add_stokes_dimension_to_intensity_only_array(array: np.ndarray) -> np.ndarray:
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 _compute_date_keys(headers: Iterable[fits.Header] | fits.Header) -> fits.Header:
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 _re_dummy_data(self, data: np.ndarray):
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 _update_calibrated_header(self, header: fits.Header, map_scan: int) -> fits.Header:
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 _add_L1_pol_headers(
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 _write_calibrated_array(
463
+ def write_calibrated_array(
464
464
  self,
465
465
  data: np.ndarray,
466
466
  header: fits.Header,