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.
Files changed (145) hide show
  1. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/PKG-INFO +53 -53
  2. dkist_processing_cryonirsp-3.0.0rc1/changelog/306.doc.rst +1 -0
  3. dkist_processing_cryonirsp-3.0.0rc1/changelog/306.feature.2.rst +1 -0
  4. dkist_processing_cryonirsp-3.0.0rc1/changelog/306.feature.rst +2 -0
  5. dkist_processing_cryonirsp-3.0.0rc1/changelog/306.misc.rst +1 -0
  6. dkist_processing_cryonirsp-3.0.0rc1/changelog/306.science.rst +2 -0
  7. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/beam_boundaries.py +12 -12
  8. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/parameters.py +27 -15
  9. dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +249 -0
  10. dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +25 -0
  11. dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +52 -0
  12. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/write_dataset_extras.py +29 -0
  13. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/conftest.py +10 -3
  14. {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
  15. {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
  16. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +19 -15
  17. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_parameters.py +2 -0
  18. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +63 -17
  19. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_write_dataset_extras.py +6 -0
  20. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +3 -3
  21. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +3 -3
  22. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/trial_workflows.py +6 -6
  23. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/PKG-INFO +53 -53
  24. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +5 -0
  25. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/requires.txt +52 -52
  26. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/scm_file_list.json +5 -0
  27. dkist_processing_cryonirsp-3.0.0rc1/dkist_processing_cryonirsp.egg-info/scm_version.json +8 -0
  28. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/dataset_extras.rst +9 -0
  29. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/pyproject.toml +54 -54
  30. dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +0 -261
  31. dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +0 -56
  32. dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +0 -271
  33. dkist_processing_cryonirsp-2.1.2/dkist_processing_cryonirsp.egg-info/scm_version.json +0 -8
  34. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.gitignore +0 -0
  35. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.pre-commit-config.yaml +0 -0
  36. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.readthedocs.yml +0 -0
  37. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.rovodev/.review-agent.md +0 -0
  38. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/.snyk +0 -0
  39. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/CHANGELOG.rst +0 -0
  40. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/README.rst +0 -0
  41. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/SCIENCE_CHANGELOG.rst +0 -0
  42. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/bitbucket-pipelines.yml +0 -0
  43. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/changelog/.gitempty +0 -0
  44. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/__init__.py +0 -0
  45. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/codecs/__init__.py +0 -0
  46. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/codecs/fits.py +0 -0
  47. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/config.py +0 -0
  48. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/__init__.py +0 -0
  49. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/constants.py +0 -0
  50. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/dataset_extras.py +0 -0
  51. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/exposure_conditions.py +0 -0
  52. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/fits_access.py +0 -0
  53. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/tags.py +0 -0
  54. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/models/task_name.py +0 -0
  55. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
  56. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/check_for_gains.py +0 -0
  57. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +0 -0
  58. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
  59. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/exposure_conditions.py +0 -0
  60. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
  61. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
  62. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
  63. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +0 -0
  64. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/polarimetric_check.py +0 -0
  65. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
  66. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/parsers/time.py +0 -0
  67. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/__init__.py +0 -0
  68. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/assemble_movie.py +0 -0
  69. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +0 -0
  70. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/ci_science.py +0 -0
  71. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
  72. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/dark.py +0 -0
  73. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
  74. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +0 -0
  75. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
  76. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/linearity_correction.py +0 -0
  77. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
  78. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
  79. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +0 -0
  80. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +0 -0
  81. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/parse.py +0 -0
  82. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/polcal_as_science.py +0 -0
  83. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/quality_metrics.py +0 -0
  84. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/science_base.py +0 -0
  85. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_geometric.py +0 -0
  86. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_science.py +0 -0
  87. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +0 -0
  88. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/sp_wavelength_calibration.py +0 -0
  89. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tasks/write_l1.py +0 -0
  90. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
  91. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/header_models.py +0 -0
  92. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
  93. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +0 -0
  94. {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
  95. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +0 -0
  96. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +0 -0
  97. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
  98. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_ci_science.py +0 -0
  99. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_corrections.py +0 -0
  100. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
  101. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
  102. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_dark.py +0 -0
  103. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_fits_access.py +0 -0
  104. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
  105. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
  106. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +0 -0
  107. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_make_movie_frames.py +0 -0
  108. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_parse.py +0 -0
  109. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_polcal_as_science.py +0 -0
  110. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
  111. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
  112. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
  113. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_science.py +0 -0
  114. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
  115. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_sp_wavelength_calibration.py +0 -0
  116. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +0 -0
  117. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
  118. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/tests/test_write_l1.py +0 -0
  119. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
  120. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
  121. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/dkist_processing_cryonirsp.egg-info/top_level.txt +0 -0
  122. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/Makefile +0 -0
  123. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/bad_pixel_calibration.rst +0 -0
  124. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/beam_angle_calculation.rst +0 -0
  125. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/beam_boundary_computation.rst +0 -0
  126. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/changelog.rst +0 -0
  127. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/ci_science_calibration.rst +0 -0
  128. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/conf.py +0 -0
  129. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/index.rst +0 -0
  130. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_ci-full-trial.rst +0 -0
  131. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
  132. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_sp-full-trial.rst +0 -0
  133. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
  134. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/landing_page.rst +0 -0
  135. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/linearization.rst +0 -0
  136. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/make.bat +0 -0
  137. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/requirements.txt +0 -0
  138. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/requirements_table.rst +0 -0
  139. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/scientific_changelog.rst +0 -0
  140. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/sp_science_calibration.rst +0 -0
  141. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/docs/wavelength_calibration.rst +0 -0
  142. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/licenses/LICENSE.rst +0 -0
  143. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/science_towncrier.sh +0 -0
  144. {dkist_processing_cryonirsp-2.1.2 → dkist_processing_cryonirsp-3.0.0rc1}/setup.cfg +0 -0
  145. {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: 2.1.2
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.29.0
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.0
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==1.3.1; extra == "frozen"
66
- Requires-Dist: ImageIO==2.37.4; extra == "frozen"
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.0; extra == "frozen"
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.0.54; extra == "frozen"
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.0; extra == "frozen"
92
- Requires-Dist: apache-airflow-providers-common-compat==1.19.0; extra == "frozen"
93
- Requires-Dist: apache-airflow-providers-common-io==1.9.0; extra == "frozen"
94
- Requires-Dist: apache-airflow-providers-common-sql==2.1.1; extra == "frozen"
95
- Requires-Dist: apache-airflow-providers-postgres==7.0.2; extra == "frozen"
96
- Requires-Dist: apache-airflow-providers-smtp==3.0.4; extra == "frozen"
97
- Requires-Dist: apache-airflow-providers-standard==1.19.0; extra == "frozen"
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.21.0.56.25; extra == "frozen"
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.101; extra == "frozen"
118
- Requires-Dist: botocore==1.43.101; extra == "frozen"
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.0; extra == "frozen"
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==2.1.2; extra == "frozen"
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.29.0; extra == "frozen"
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.5.1; extra == "frozen"
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.0; extra == "frozen"
162
- Requires-Dist: googleapis-common-protos==1.75.3; extra == "frozen"
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.21.1; extra == "frozen"
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.44.0; extra == "frozen"
232
- Requires-Dist: opentelemetry-exporter-otlp==1.44.0; extra == "frozen"
233
- Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.44.0; extra == "frozen"
234
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.44.0; extra == "frozen"
235
- Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.44.0; extra == "frozen"
236
- Requires-Dist: opentelemetry-instrumentation==0.65b0; extra == "frozen"
237
- Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.65b0; extra == "frozen"
238
- Requires-Dist: opentelemetry-instrumentation-asgi==0.65b0; extra == "frozen"
239
- Requires-Dist: opentelemetry-instrumentation-botocore==0.65b0; extra == "frozen"
240
- Requires-Dist: opentelemetry-instrumentation-celery==0.65b0; extra == "frozen"
241
- Requires-Dist: opentelemetry-instrumentation-dbapi==0.65b0; extra == "frozen"
242
- Requires-Dist: opentelemetry-instrumentation-fastapi==0.65b0; extra == "frozen"
243
- Requires-Dist: opentelemetry-instrumentation-pika==0.65b0; extra == "frozen"
244
- Requires-Dist: opentelemetry-instrumentation-psycopg2==0.65b0; extra == "frozen"
245
- Requires-Dist: opentelemetry-instrumentation-pymongo==0.65b0; extra == "frozen"
246
- Requires-Dist: opentelemetry-instrumentation-redis==0.65b0; extra == "frozen"
247
- Requires-Dist: opentelemetry-instrumentation-requests==0.65b0; extra == "frozen"
248
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.65b0; extra == "frozen"
249
- Requires-Dist: opentelemetry-instrumentation-system-metrics==0.65b0; extra == "frozen"
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.44.0; extra == "frozen"
252
- Requires-Dist: opentelemetry-sdk==1.44.0; extra == "frozen"
253
- Requires-Dist: opentelemetry-semantic-conventions==0.65b0; extra == "frozen"
254
- Requires-Dist: opentelemetry-util-http==0.65b0; extra == "frozen"
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.11.12; extra == "frozen"
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.1; extra == "frozen"
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.53.0; extra == "frozen"
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.4.1; extra == "frozen"
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,2 @@
1
+ Replace `BeamBoundariesCalibration` task with `SpatialBeamBoundaries`, which only computes the boundaries of the illuminated region along the spatial axis.
2
+ The spectral axis (or second spatial axis, for CI) boundaries are hard-coded as a pipeline parameter.
@@ -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
- y_min: int
13
- y_max: int
14
- x_min: int
15
- x_max: int
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 y_slice(self):
19
- """Return a slice object representing the illumination along the y-axis (numpy 0 axis)."""
20
- return slice(self.y_min, self.y_max)
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 x_slice(self):
24
- """Return a slice object representing the illumination along the x-axis (numpy 1 axis)."""
25
- return slice(self.x_min, self.x_max)
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.y_slice, self.x_slice
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.y_min, self.y_max, self.x_min, self.x_max
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 beam_boundaries_smoothing_disk_size(self) -> int:
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
- Fraction of full spectral size to use as the size of the transition region between the two SP beams.
115
+ Return a list of `slice` objects that extract beams in the spectral dimension.
126
116
 
127
- A region with size = (this parameter * full spectral size) and centered at the center of the spectral dimension
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
- "cryonirsp_beam_boundaries_sp_beam_transition_region_size_fraction"
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