dkist-processing-cryonirsp 1.1.0__tar.gz → 1.1.1__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-1.1.0 → dkist_processing_cryonirsp-1.1.1}/CHANGELOG.rst +11 -0
  2. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/PKG-INFO +1 -1
  3. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/linearity_correction.py +52 -34
  4. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +68 -1
  5. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp.egg-info/PKG-INFO +1 -1
  6. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/.gitignore +0 -0
  7. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/.pre-commit-config.yaml +0 -0
  8. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/.readthedocs.yml +0 -0
  9. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/README.rst +0 -0
  10. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/SCIENCE_CHANGELOG.rst +0 -0
  11. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/bitbucket-pipelines.yml +0 -0
  12. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/changelog/.gitempty +0 -0
  13. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/check_changelog_updated.sh +0 -0
  14. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/__init__.py +0 -0
  15. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/config.py +0 -0
  16. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/models/__init__.py +0 -0
  17. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/models/constants.py +0 -0
  18. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/models/exposure_conditions.py +0 -0
  19. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/models/parameters.py +0 -0
  20. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/models/tags.py +0 -0
  21. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/models/task_name.py +0 -0
  22. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
  23. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +0 -0
  24. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
  25. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/exposure_conditions.py +0 -0
  26. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
  27. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
  28. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
  29. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +0 -0
  30. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/polarimetric_check.py +0 -0
  31. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
  32. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/time.py +0 -0
  33. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/parsers/wavelength.py +0 -0
  34. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/__init__.py +0 -0
  35. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/assemble_movie.py +0 -0
  36. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +0 -0
  37. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +0 -0
  38. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +0 -0
  39. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/ci_science.py +0 -0
  40. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
  41. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/dark.py +0 -0
  42. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
  43. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +0 -0
  44. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
  45. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
  46. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
  47. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/mixin/beam_access.py +0 -0
  48. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +0 -0
  49. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +0 -0
  50. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +0 -0
  51. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +0 -0
  52. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/parse.py +0 -0
  53. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/quality_metrics.py +0 -0
  54. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/science_base.py +0 -0
  55. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +0 -0
  56. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +0 -0
  57. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/sp_geometric.py +0 -0
  58. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/sp_science.py +0 -0
  59. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +0 -0
  60. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/trial_output_data.py +0 -0
  61. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tasks/write_l1.py +0 -0
  62. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
  63. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/conftest.py +0 -0
  64. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/header_models.py +0 -0
  65. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
  66. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  67. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  68. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +0 -0
  69. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  70. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +0 -0
  71. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +0 -0
  72. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
  73. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +0 -0
  74. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_ci_science.py +0 -0
  75. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_corrections.py +0 -0
  76. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
  77. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
  78. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_dark.py +0 -0
  79. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
  80. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
  81. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_make_movie_frames.py +0 -0
  82. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_parameters.py +0 -0
  83. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_parse.py +0 -0
  84. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
  85. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +0 -0
  86. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +0 -0
  87. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
  88. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
  89. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_sp_science.py +0 -0
  90. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
  91. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +0 -0
  92. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_trial_output_data.py +0 -0
  93. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
  94. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/tests/test_write_l1.py +0 -0
  95. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
  96. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +0 -0
  97. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +0 -0
  98. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp/workflows/trial_workflows.py +0 -0
  99. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +0 -0
  100. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
  101. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp.egg-info/requires.txt +0 -0
  102. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/dkist_processing_cryonirsp.egg-info/top_level.txt +0 -0
  103. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/Makefile +0 -0
  104. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/bad_pixel_calibration.rst +0 -0
  105. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/beam_angle_calculation.rst +0 -0
  106. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/beam_boundary_computation.rst +0 -0
  107. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/changelog.rst +0 -0
  108. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/ci_science_calibration.rst +0 -0
  109. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/conf.py +0 -0
  110. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/index.rst +0 -0
  111. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/l0_to_l1_cryonirsp_ci-full-trial.rst +0 -0
  112. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
  113. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/l0_to_l1_cryonirsp_sp-full-trial.rst +0 -0
  114. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
  115. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/linearization.rst +0 -0
  116. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/make.bat +0 -0
  117. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/requirements.txt +0 -0
  118. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/requirements_table.rst +0 -0
  119. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/scientific_changelog.rst +0 -0
  120. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/docs/sp_science_calibration.rst +0 -0
  121. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/licenses/LICENSE.rst +0 -0
  122. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/pyproject.toml +0 -0
  123. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/science_towncrier.sh +0 -0
  124. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/setup.cfg +0 -0
  125. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/setup.py +0 -0
  126. {dkist_processing_cryonirsp-1.1.0 → dkist_processing_cryonirsp-1.1.1}/towncrier_science.toml +0 -0
@@ -1,3 +1,14 @@
1
+ v1.1.1 (2024-09-18)
2
+ ===================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Add validation in linearity_correction task to ensure that the value of NUM_FRAMES_IN_RAMP is the same
8
+ across all frames in a ramp, and that the value of NUM_FRAMES_IN_RAMP actually matches the number of frames found. (`#147 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/147>`__)
9
+ - When writing linearized frames, use a fixed tag list as opposed to one derived from L0 data to alleviate load on redis. (`#148 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/148>`__)
10
+
11
+
1
12
  v1.1.0 (2024-09-10)
2
13
  ===================
3
14
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dkist_processing_cryonirsp
3
- Version: 1.1.0
3
+ Version: 1.1.1
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
@@ -25,7 +25,6 @@ class _RampSet:
25
25
  current_ramp_set_num: int
26
26
  time_obs: str
27
27
  num_frames_in_ramp: int
28
- expected_num_frames_in_ramp: int
29
28
  exposure_times_ms: np.ndarray
30
29
  frame_shape: tuple[int]
31
30
  last_frame_name: str
@@ -33,10 +32,6 @@ class _RampSet:
33
32
  frames_to_process: np.ndarray
34
33
  index_offset_to_first_frame: int
35
34
 
36
- @property
37
- def is_valid(self):
38
- return self.num_frames_in_ramp == self.expected_num_frames_in_ramp
39
-
40
35
 
41
36
  class LinearityCorrection(CryonirspTaskBase):
42
37
  """Task class for performing linearity correction on all input frames, regardless of task type."""
@@ -76,10 +71,12 @@ class LinearityCorrection(CryonirspTaskBase):
76
71
  exposure_corrected_output_array = self.apply_exposure_corrections(
77
72
  output_array, ramp_set
78
73
  )
79
- # Get the tags for the linearized output frame
80
- tags = self.generate_output_tag_set(
81
- ramp_set.last_frame_name, ramp_set.frames_to_process[-1]
82
- )
74
+ # Set the tags for the linearized output frame
75
+ tags = [
76
+ CryonirspTag.linearized(),
77
+ CryonirspTag.frame(),
78
+ CryonirspTag.time_obs(time_obs),
79
+ ]
83
80
  # The last frame in the ramp is used for the header
84
81
  self.write(
85
82
  data=exposure_corrected_output_array,
@@ -109,11 +106,53 @@ class LinearityCorrection(CryonirspTaskBase):
109
106
  Generator which yields _RampSet instances
110
107
  """
111
108
  for ramp_set_num, time_obs in enumerate(self.constants.time_obs_list):
109
+ input_objects = list(
110
+ self.read(
111
+ tags=[
112
+ CryonirspTag.input(),
113
+ CryonirspTag.frame(),
114
+ CryonirspTag.time_obs(time_obs),
115
+ ],
116
+ decoder=fits_access_decoder,
117
+ fits_access_class=CryonirspRampFitsAccess,
118
+ )
119
+ )
120
+
121
+ if not self.is_ramp_valid(input_objects):
122
+ continue
123
+
112
124
  ramp_set = self.populate_ramp_set(time_obs, ramp_set_num)
113
- if ramp_set.is_valid:
114
- yield ramp_set
115
- else:
116
- logger.info(f"Ramp set for {time_obs=} skipped.")
125
+ yield ramp_set
126
+
127
+ def is_ramp_valid(self, ramp_object_list: list[CryonirspRampFitsAccess]) -> bool:
128
+ """
129
+ Check if a given ramp is valid.
130
+
131
+ Current validity checks are:
132
+
133
+ 1. All frames in the ramp have the same value for NUM_FRAMES_IN_RAMP
134
+ 2. The value of NUM_FRAMES_IN_RAMP equals the length of actual frames found
135
+
136
+ If a ramp is not valid then warnings are logged and `False` is returned.
137
+ """
138
+ frames_in_ramp_set = {o.num_frames_in_ramp for o in ramp_object_list}
139
+ task_type = ramp_object_list[0].ip_task_type
140
+
141
+ if len(frames_in_ramp_set) > 1:
142
+ logger.info(
143
+ f"Not all frames have the same FRAMES_IN_RAMP value. Set is {frames_in_ramp_set}. Ramp is task {task_type}. Skipping ramp."
144
+ )
145
+ return False
146
+
147
+ num_frames_in_ramp = frames_in_ramp_set.pop()
148
+ num_ramp_objects = len(ramp_object_list)
149
+ if num_ramp_objects != num_frames_in_ramp:
150
+ logger.info(
151
+ f"Missing some ramp frames. Expected {num_frames_in_ramp} from header value, but only have {num_ramp_objects}. Ramp is task {task_type}. Skipping ramp."
152
+ )
153
+ return False
154
+
155
+ return True
117
156
 
118
157
  @staticmethod
119
158
  def tag_list_for_single_ramp_frame(time_obs: str, frame_num: int) -> list[CryonirspTag]:
@@ -201,7 +240,6 @@ class LinearityCorrection(CryonirspTaskBase):
201
240
  actual_num_frames_in_ramp = self.count(CryonirspTag.time_obs(time_obs))
202
241
  exp_times = self.get_ordered_exposure_time_list(time_obs, actual_num_frames_in_ramp)
203
242
  last_frame = self.read_single_ramp_frame(time_obs, actual_num_frames_in_ramp)
204
- expected_num_frames_in_ramp = last_frame.num_frames_in_ramp
205
243
  ramp_set_num = idx + 1
206
244
  # The default list of curr_frame_in_ramp tag numbers to use, which may be altered later on
207
245
  frames_to_process = np.array(range(1, actual_num_frames_in_ramp + 1), dtype=int)
@@ -209,7 +247,6 @@ class LinearityCorrection(CryonirspTaskBase):
209
247
  current_ramp_set_num=ramp_set_num,
210
248
  time_obs=time_obs,
211
249
  num_frames_in_ramp=actual_num_frames_in_ramp,
212
- expected_num_frames_in_ramp=expected_num_frames_in_ramp,
213
250
  exposure_times_ms=exp_times,
214
251
  frame_shape=last_frame.data.shape,
215
252
  last_frame_name=last_frame.name,
@@ -220,25 +257,6 @@ class LinearityCorrection(CryonirspTaskBase):
220
257
  )
221
258
  return ramp_set
222
259
 
223
- def generate_output_tag_set(self, frame_name: str, curr_frame_in_ramp: int) -> list[str]:
224
- """
225
- Use one of the input frames to derive the proper list of output tags.
226
-
227
- Parameters
228
- ----------
229
- frame_name
230
- file path to use to get starting tag set
231
-
232
- Returns
233
- -------
234
- A list of tags to use for writing the output frame
235
- """
236
- result_tags = list(self.tags(frame_name))
237
- result_tags.remove(CryonirspTag.input())
238
- result_tags.remove(CryonirspTag.curr_frame_in_ramp(curr_frame_in_ramp))
239
- result_tags.append(CryonirspTag.linearized())
240
- return result_tags
241
-
242
260
  def apply_exposure_corrections(self, input_array: np.ndarray, ramp_set: _RampSet) -> np.ndarray:
243
261
  """
244
262
  Normalize the array by converting to counts per second and correcting for Optical Density filter attenuation.
@@ -1,4 +1,6 @@
1
1
  """Test the linearity correction task."""
2
+ import re
3
+ from dataclasses import dataclass
2
4
  from datetime import datetime
3
5
 
4
6
  import numpy as np
@@ -9,6 +11,7 @@ from dkist_processing_common._util.scratch import WorkflowFileSystem
9
11
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
10
12
  from dkist_processing_common.models.tags import Tag
11
13
  from dkist_processing_common.tests.conftest import FakeGQLClient
14
+ from dkist_service_configuration.logging import logger
12
15
 
13
16
  from dkist_processing_cryonirsp.models.constants import CryonirspBudName
14
17
  from dkist_processing_cryonirsp.models.exposure_conditions import AllowableOpticalDensityFilterNames
@@ -138,7 +141,12 @@ def linearity_correction(
138
141
  [pytest.param(1, id="1 chunk"), pytest.param(2, id="2 chunks")],
139
142
  )
140
143
  def test_linearity_correction(
141
- linearity_correction, mocker, arm_id, frames_in_ramp, num_chunks, filter_name
144
+ linearity_correction,
145
+ mocker,
146
+ arm_id,
147
+ frames_in_ramp,
148
+ num_chunks,
149
+ filter_name,
142
150
  ):
143
151
  """
144
152
  Given: A LinearityCorrection task
@@ -176,3 +184,62 @@ def test_linearity_correction(
176
184
  assert np.allclose(data, expected_data)
177
185
  else:
178
186
  assert len(files_found) == 0
187
+
188
+
189
+ @pytest.fixture
190
+ def simple_linearity_correction_task(recipe_run_id, arm_id, init_cryonirsp_constants_db, tmp_path):
191
+ constants_db = CryonirspConstantsDb(
192
+ ARM_ID=arm_id,
193
+ )
194
+ init_cryonirsp_constants_db(recipe_run_id, constants_db)
195
+ with LinearityCorrection(
196
+ recipe_run_id=recipe_run_id,
197
+ workflow_name="workflow_name",
198
+ workflow_version="workflow_version",
199
+ ) as task:
200
+ task.scratch = WorkflowFileSystem(recipe_run_id=recipe_run_id, scratch_base_path=tmp_path)
201
+
202
+ yield task
203
+
204
+ task._purge()
205
+
206
+
207
+ @dataclass
208
+ class DummyRampFitsAccess:
209
+ """Just a class that has the one property that is checked during ramp validation."""
210
+
211
+ num_frames_in_ramp: int
212
+ ip_task_type: str = "TASK"
213
+
214
+
215
+ @pytest.mark.parametrize(
216
+ "arm_id",
217
+ [pytest.param("CI", id="CI"), pytest.param("SP", id="SP")],
218
+ )
219
+ @pytest.mark.parametrize(
220
+ "ramp_list, valid, message",
221
+ [
222
+ pytest.param(
223
+ [
224
+ DummyRampFitsAccess(num_frames_in_ramp=2),
225
+ DummyRampFitsAccess(num_frames_in_ramp=3),
226
+ ],
227
+ False,
228
+ "Not all frames have the same FRAMES_IN_RAMP value. Set is {2, 3}. Ramp is task TASK. Skipping ramp.",
229
+ id="num_frames_mismatch_actual_frames",
230
+ ),
231
+ pytest.param(
232
+ [
233
+ DummyRampFitsAccess(num_frames_in_ramp=8),
234
+ ],
235
+ False,
236
+ "Missing some ramp frames. Expected 8 from header value, but only have 1. Ramp is task TASK. Skipping ramp.",
237
+ id="num_frames_in_set_mismatch",
238
+ ),
239
+ ],
240
+ )
241
+ def test_is_ramp_valid(simple_linearity_correction_task, ramp_list, valid, message, caplog):
242
+ logger.add(caplog.handler)
243
+ assert simple_linearity_correction_task.is_ramp_valid(ramp_list) is valid
244
+ if not valid:
245
+ assert re.search(message, caplog.text)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dkist-processing-cryonirsp
3
- Version: 1.1.0
3
+ Version: 1.1.1
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