dkist-processing-cryonirsp 1.4.12__tar.gz → 1.4.15__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 (125) hide show
  1. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/CHANGELOG.rst +33 -0
  2. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/PKG-INFO +3 -3
  3. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/bitbucket-pipelines.yml +17 -28
  4. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/models/constants.py +22 -4
  5. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/check_for_gains.py +31 -16
  6. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/exposure_conditions.py +72 -15
  7. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/dark.py +10 -3
  8. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/parse.py +25 -11
  9. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/conftest.py +8 -1
  10. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_dark.py +2 -2
  11. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_parse.py +59 -9
  12. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +1 -2
  13. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/workflows/trial_workflows.py +1 -2
  14. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp.egg-info/PKG-INFO +3 -3
  15. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp.egg-info/requires.txt +2 -2
  16. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp.egg-info/top_level.txt +1 -0
  17. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/pyproject.toml +2 -2
  18. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/.gitignore +0 -0
  19. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/.pre-commit-config.yaml +0 -0
  20. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/.readthedocs.yml +0 -0
  21. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/.snyk +0 -0
  22. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/README.rst +0 -0
  23. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/SCIENCE_CHANGELOG.rst +0 -0
  24. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/changelog/.gitempty +0 -0
  25. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/__init__.py +0 -0
  26. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/config.py +0 -0
  27. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/models/__init__.py +0 -0
  28. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/models/exposure_conditions.py +0 -0
  29. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/models/parameters.py +0 -0
  30. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/models/tags.py +0 -0
  31. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/models/task_name.py +0 -0
  32. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
  33. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +0 -0
  34. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
  35. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
  36. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
  37. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
  38. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +0 -0
  39. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/polarimetric_check.py +0 -0
  40. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
  41. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/time.py +0 -0
  42. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/parsers/wavelength.py +0 -0
  43. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/__init__.py +0 -0
  44. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/assemble_movie.py +0 -0
  45. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +0 -0
  46. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +0 -0
  47. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +0 -0
  48. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/ci_science.py +0 -0
  49. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
  50. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
  51. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +0 -0
  52. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
  53. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/linearity_correction.py +0 -0
  54. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
  55. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
  56. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/mixin/beam_access.py +0 -0
  57. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +0 -0
  58. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +0 -0
  59. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +0 -0
  60. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +0 -0
  61. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/quality_metrics.py +0 -0
  62. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/science_base.py +0 -0
  63. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +0 -0
  64. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +0 -0
  65. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/sp_geometric.py +0 -0
  66. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/sp_science.py +0 -0
  67. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +0 -0
  68. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tasks/write_l1.py +0 -0
  69. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
  70. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/header_models.py +0 -0
  71. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
  72. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  73. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  74. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +0 -0
  75. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  76. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +0 -0
  77. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +0 -0
  78. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
  79. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +0 -0
  80. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_ci_science.py +0 -0
  81. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_corrections.py +0 -0
  82. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
  83. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
  84. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
  85. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
  86. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +0 -0
  87. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_make_movie_frames.py +0 -0
  88. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_parameters.py +0 -0
  89. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
  90. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +0 -0
  91. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +0 -0
  92. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
  93. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
  94. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_sp_science.py +0 -0
  95. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
  96. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +0 -0
  97. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
  98. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/tests/test_write_l1.py +0 -0
  99. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
  100. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +0 -0
  101. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +0 -0
  102. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
  103. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/Makefile +0 -0
  104. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/bad_pixel_calibration.rst +0 -0
  105. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/beam_angle_calculation.rst +0 -0
  106. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/beam_boundary_computation.rst +0 -0
  107. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/changelog.rst +0 -0
  108. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/ci_science_calibration.rst +0 -0
  109. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/conf.py +0 -0
  110. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/index.rst +0 -0
  111. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/l0_to_l1_cryonirsp_ci-full-trial.rst +0 -0
  112. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
  113. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/l0_to_l1_cryonirsp_sp-full-trial.rst +0 -0
  114. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
  115. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/landing_page.rst +0 -0
  116. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/linearization.rst +0 -0
  117. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/make.bat +0 -0
  118. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/requirements.txt +0 -0
  119. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/requirements_table.rst +0 -0
  120. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/scientific_changelog.rst +0 -0
  121. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/docs/sp_science_calibration.rst +0 -0
  122. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/licenses/LICENSE.rst +0 -0
  123. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/science_towncrier.sh +0 -0
  124. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/setup.cfg +0 -0
  125. {dkist_processing_cryonirsp-1.4.12 → dkist_processing_cryonirsp-1.4.15}/towncrier_science.toml +0 -0
@@ -1,3 +1,36 @@
1
+ v1.4.15 (2025-01-30)
2
+ ====================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Correct how gain files are read in the PickyBuds during parsing of CRYO-NIRSP CI linearized data. (`#172 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/172>`__)
8
+
9
+
10
+ v1.4.14 (2025-01-29)
11
+ ====================
12
+
13
+ Misc
14
+ ----
15
+
16
+ - Update dkist-processing-common and dkist-quality to manage a bug present in dacite 1.9.0.
17
+
18
+
19
+ v1.4.13 (2025-01-29)
20
+ ====================
21
+
22
+ Features
23
+ --------
24
+
25
+ - Remove lamp gain calibration from the CRYO-NIRSP CI pipeline. (`#168 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/168>`__)
26
+
27
+
28
+ Misc
29
+ ----
30
+
31
+ - Update Bitbucket pipelines to use execute script for standard steps. (`#170 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/170>`__)
32
+
33
+
1
34
  v1.4.12 (2025-01-27)
2
35
  ====================
3
36
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dkist-processing-cryonirsp
3
- Version: 1.4.12
3
+ Version: 1.4.15
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
@@ -17,7 +17,7 @@ Requires-Dist: Pillow==10.3.0
17
17
  Requires-Dist: astropy==6.1.0
18
18
  Requires-Dist: dkist-fits-specifications==4.10.0
19
19
  Requires-Dist: dkist-header-validator==5.1.1
20
- Requires-Dist: dkist-processing-common==10.5.8
20
+ Requires-Dist: dkist-processing-common==10.5.9
21
21
  Requires-Dist: dkist-processing-math==2.1.2
22
22
  Requires-Dist: dkist-processing-pac==3.1.1
23
23
  Requires-Dist: dkist-spectral-lines==3.0.0
@@ -48,7 +48,7 @@ Provides-Extra: asdf
48
48
  Requires-Dist: dkist-processing-common[asdf]; extra == "asdf"
49
49
  Requires-Dist: dkist-inventory[asdf]==1.5.0; extra == "asdf"
50
50
  Provides-Extra: quality
51
- Requires-Dist: dkist-quality==1.2.0; extra == "quality"
51
+ Requires-Dist: dkist-quality==1.2.1; extra == "quality"
52
52
  Provides-Extra: grogu
53
53
  Requires-Dist: dkist; extra == "grogu"
54
54
  Requires-Dist: pyparsing; extra == "grogu"
@@ -6,39 +6,34 @@ definitions:
6
6
  redis:
7
7
  image: redis
8
8
  steps:
9
+ - step: &download_execute_script
10
+ name: Download Script Execute Script
11
+ script:
12
+ - echo "Retrieving Script Execution Script"
13
+ - curl -fL https://getcli.jfrog.io | sh
14
+ - ./jfrog rt dl --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --password $ARTIFACTORY_PASSWORD generic-packages/ci_scripts/latest/execute_script.sh
15
+ - cat ci_scripts/latest/execute_script.sh
16
+ - chmod 755 ci_scripts/latest/execute_script.sh
17
+ artifacts:
18
+ - ci_scripts/latest/execute_script.sh
9
19
  - step: &lint
10
20
  caches:
11
21
  - pip
12
22
  name: Lint
13
23
  script:
14
- - echo "Retrieving and Executing Lint Script"
15
- - curl -fL https://getcli.jfrog.io | sh
16
- - ./jfrog rt dl --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --password $ARTIFACTORY_PASSWORD generic-packages/ci_scripts/latest/lint_python.sh
17
- - cat ci_scripts/latest/lint_python.sh
18
- - chmod 755 ci_scripts/latest/lint_python.sh
19
- - ./ci_scripts/latest/lint_python.sh
24
+ - ./ci_scripts/latest/execute_script.sh lint_python.sh
20
25
  - step: &changelog
21
26
  caches:
22
27
  - pip
23
28
  name: Changelog
24
29
  script:
25
- - echo "Retrieving and Executing Changelog Script"
26
- - curl -fL https://getcli.jfrog.io | sh
27
- - ./jfrog rt dl --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --password $ARTIFACTORY_PASSWORD generic-packages/ci_scripts/latest/check_changelog.sh
28
- - cat ci_scripts/latest/check_changelog.sh
29
- - chmod 755 ci_scripts/latest/check_changelog.sh
30
- - ./ci_scripts/latest/check_changelog.sh
30
+ - ./ci_scripts/latest/execute_script.sh check_changelog.sh
31
31
  - step: &scan
32
32
  caches:
33
33
  - pip
34
34
  name: Scan
35
35
  script:
36
- - echo "Retrieving and Executing Scan Script"
37
- - curl -fL https://getcli.jfrog.io | sh
38
- - ./jfrog rt dl --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --password $ARTIFACTORY_PASSWORD generic-packages/ci_scripts/latest/scan_python.sh
39
- - cat ci_scripts/latest/scan_python.sh
40
- - chmod 755 ci_scripts/latest/scan_python.sh
41
- - ./ci_scripts/latest/scan_python.sh
36
+ - ./ci_scripts/latest/execute_script.sh scan_python.sh
42
37
  - step: &test
43
38
  caches:
44
39
  - pip
@@ -70,10 +65,7 @@ definitions:
70
65
  - pip
71
66
  name: Push Code
72
67
  script:
73
- - pip install -U pip
74
- - pip install build twine
75
- - python -m build --outdir wheelhouse .
76
- - python -m twine upload --skip-existing wheelhouse/*
68
+ - ./ci_scripts/latest/execute_script.sh push_python.sh
77
69
  - step: &push_mpw
78
70
  caches:
79
71
  - pip
@@ -100,17 +92,13 @@ definitions:
100
92
  caches:
101
93
  - pip
102
94
  script:
103
- - echo "Retrieving and Executing Sphinx Test Script"
104
- - curl -fL https://getcli.jfrog.io | sh
105
- - ./jfrog rt dl --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --password $ARTIFACTORY_PASSWORD generic-packages/ci_scripts/latest/test_sphinx.sh
106
- - cat ci_scripts/latest/test_sphinx.sh
107
- - chmod 755 ci_scripts/latest/test_sphinx.sh
108
- - ./ci_scripts/latest/test_sphinx.sh
95
+ - ./ci_scripts/latest/execute_script.sh test_sphinx.sh
109
96
 
110
97
  options:
111
98
  max-time: 25
112
99
  pipelines:
113
100
  default:
101
+ - step: *download_execute_script
114
102
  - parallel:
115
103
  - step: *lint
116
104
  - step: *changelog
@@ -120,6 +108,7 @@ pipelines:
120
108
  - step: *docs
121
109
  tags:
122
110
  'v*':
111
+ - step: *download_execute_script
123
112
  - parallel:
124
113
  - step: *lint
125
114
  - step: *changelog
@@ -32,10 +32,15 @@ class CryonirspBudName(Enum):
32
32
  solar_gain_exposure_conditions_list = "SOLAR_GAIN_EXPOSURE_CONDITIONS_LIST"
33
33
  polcal_exposure_conditions_list = "POLCAL_EXPOSURE_CONDITIONS_LIST"
34
34
  observe_exposure_conditions_list = "OBSERVE_EXPOSURE_CONDITIONS_LIST"
35
- non_dark_and_non_polcal_task_exposure_conditions_list = (
36
- "NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST"
35
+ sp_non_dark_and_non_polcal_task_exposure_conditions_list = (
36
+ "SP_NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST"
37
+ )
38
+ ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list = (
39
+ "CI_NON_DARK_AND_NON_POLCAL_AND_NON_LAMP_GAIN_TASK_EXPOSURE_CONDITIONS_LIST"
37
40
  )
38
41
  picky_dark_exposure_conditions_list = "PICKY_DARK_EXPOSURE_CONDITIONS_LIST"
42
+ ci_picky_dark_exposure_conditions_list = "CI_PICKY_DARK_EXPOSURE_CONDITIONS_LIST"
43
+ sp_picky_dark_exposure_conditions_list = "SP_PICKY_DARK_EXPOSURE_CONDITIONS_LIST"
39
44
  modulator_spin_mode = "MODULATOR_SPIN_MODE"
40
45
  axis_1_type = "AXIS_1_TYPE"
41
46
  axis_2_type = "AXIS_2_TYPE"
@@ -47,6 +52,8 @@ class CryonirspBudName(Enum):
47
52
  optical_density_filter_picky_bud = "OPTICAL_DENSITY_FILTER_PICKY_BUD"
48
53
  solar_gain_ip_start_time = "SOLAR_GAIN_IP_START_TIME"
49
54
  gain_frame_type_list = "GAIN_FRAME_TYPE_LIST"
55
+ lamp_gain_frame_type_list = "LAMP_GAIN_FRAME_TYPE_LIST"
56
+ solar_gain_frame_type_list = "SOLAR_GAIN_FRAME_TYPE_LIST"
50
57
 
51
58
 
52
59
  class CryonirspConstants(ConstantsBase):
@@ -188,10 +195,21 @@ class CryonirspConstants(ConstantsBase):
188
195
  return []
189
196
 
190
197
  @property
191
- def non_dark_and_non_polcal_task_exposure_conditions_list(self) -> [ExposureConditions]:
198
+ def ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list(
199
+ self,
200
+ ) -> [ExposureConditions]:
201
+ """Return a list of all exposure times required for all tasks other than dark, polcal, and lamp gain."""
202
+ raw_conditions: list[list[int, str]] = self._db_dict[
203
+ CryonirspBudName.ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list.value
204
+ ]
205
+ conditions = [ExposureConditions(*item) for item in raw_conditions]
206
+ return conditions
207
+
208
+ @property
209
+ def sp_non_dark_and_non_polcal_task_exposure_conditions_list(self) -> [ExposureConditions]:
192
210
  """Return a list of all exposure times required for all tasks other than dark and polcal."""
193
211
  raw_conditions: list[list[int, str]] = self._db_dict[
194
- CryonirspBudName.non_dark_and_non_polcal_task_exposure_conditions_list.value
212
+ CryonirspBudName.sp_non_dark_and_non_polcal_task_exposure_conditions_list.value
195
213
  ]
196
214
  conditions = [ExposureConditions(*item) for item in raw_conditions]
197
215
  return conditions
@@ -12,11 +12,12 @@ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
12
12
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
13
13
 
14
14
 
15
- class CheckGainFramesPickyBud(Stem):
16
- """Pickybud to check for lamp gain and solar gain frames."""
15
+ class CheckGainFramesPickyBudBase(Stem):
16
+ """Pickybud to check for gain frames."""
17
17
 
18
- def __init__(self):
19
- super().__init__(stem_name=CryonirspBudName.gain_frame_type_list.value)
18
+ def __init__(self, stem_name: str, task_name: str):
19
+ super().__init__(stem_name=stem_name)
20
+ self.task_name = task_name.casefold()
20
21
 
21
22
  def setter(self, fits_obj: CryonirspL0FitsAccess) -> Type[SpilledDirt] | str:
22
23
  """
@@ -30,15 +31,11 @@ class CheckGainFramesPickyBud(Stem):
30
31
  -------
31
32
  The calibration frame object associated with this fits object
32
33
  """
33
- task = parse_header_ip_task_with_gains(fits_obj).casefold()
34
-
35
- if task in [TaskName.lamp_gain.value.casefold(), TaskName.solar_gain.value.casefold()]:
36
- return task
37
- return SpilledDirt
34
+ return parse_header_ip_task_with_gains(fits_obj).casefold()
38
35
 
39
- def getter(self, key: Hashable) -> Thorn:
36
+ def getter(self, key: Hashable) -> Type[Thorn]:
40
37
  """
41
- Check that lamp and solar gain frames exist. If they do, return a Thorn.
38
+ Check that the specific gain exists. If it does, return a Thorn.
42
39
 
43
40
  Parameters
44
41
  ----------
@@ -49,10 +46,28 @@ class CheckGainFramesPickyBud(Stem):
49
46
  -------
50
47
  Thorn
51
48
  """
52
- gain_task_types = list(self.key_to_petal_dict.values())
49
+ task_types = list(self.key_to_petal_dict.values())
53
50
 
54
- if TaskName.lamp_gain.value.casefold() not in gain_task_types:
55
- raise ValueError("Lamp gain frames not found.")
56
- if TaskName.solar_gain.value.casefold() not in gain_task_types:
57
- raise ValueError("Solar gain frames not found.")
51
+ if self.task_name not in task_types:
52
+ raise ValueError(f"{self.task_name} frames not found.")
58
53
  return Thorn
54
+
55
+
56
+ class CheckSolarGainFramesPickyBud(CheckGainFramesPickyBudBase):
57
+ """Pickybud to check for solar gain frames."""
58
+
59
+ def __init__(self):
60
+ super().__init__(
61
+ stem_name=CryonirspBudName.solar_gain_frame_type_list.value,
62
+ task_name=TaskName.solar_gain.value,
63
+ )
64
+
65
+
66
+ class CheckLampGainFramesPickyBud(CheckGainFramesPickyBudBase):
67
+ """Pickybud to check for lamp gain frames."""
68
+
69
+ def __init__(self):
70
+ super().__init__(
71
+ stem_name=CryonirspBudName.lamp_gain_frame_type_list.value,
72
+ task_name=TaskName.lamp_gain.value,
73
+ )
@@ -13,8 +13,6 @@ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
13
13
  from dkist_processing_cryonirsp.models.exposure_conditions import ExposureConditions
14
14
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
15
15
 
16
- _DARK_AND_POLCAL_TASK_TYPES = (TaskName.dark.value, TaskName.polcal.value)
17
-
18
16
 
19
17
  class CryonirspTaskExposureConditionsBud(Stem):
20
18
  """
@@ -53,14 +51,13 @@ class CryonirspTaskExposureConditionsBud(Stem):
53
51
  return exposure_conditions_tuple
54
52
 
55
53
 
56
- class CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(Stem):
57
- """For ip task types that are neither DARK nor POLCAL, produce a list of exposure conditions tuples."""
54
+ class CryonirspConditionalTaskExposureConditionsBudBase(Stem):
55
+ """For ip task types that are not in task_types_to_ignore, produce a list of exposure conditions tuples."""
58
56
 
59
- def __init__(self):
60
- super().__init__(
61
- stem_name=CryonirspBudName.non_dark_and_non_polcal_task_exposure_conditions_list.value
62
- )
57
+ def __init__(self, stem_name: str, task_types_to_ignore: list[str]):
58
+ super().__init__(stem_name=stem_name)
63
59
  self.metadata_key = "exposure_conditions"
60
+ self.task_types_to_ignore = task_types_to_ignore
64
61
 
65
62
  def setter(self, fits_obj: CryonirspL0FitsAccess) -> ExposureConditions | Type[SpilledDirt]:
66
63
  """
@@ -74,7 +71,8 @@ class CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(Stem):
74
71
  -------
75
72
  The exposure time associated with this fits object
76
73
  """
77
- if fits_obj.ip_task_type.upper() not in _DARK_AND_POLCAL_TASK_TYPES:
74
+ task_type = parse_header_ip_task_with_gains(fits_obj=fits_obj)
75
+ if task_type.upper() not in self.task_types_to_ignore:
78
76
  return getattr(fits_obj, self.metadata_key)
79
77
  return SpilledDirt
80
78
 
@@ -95,16 +93,47 @@ class CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(Stem):
95
93
  return exposure_conditions_tuple
96
94
 
97
95
 
98
- class CryonirspPickyDarkExposureConditionsBud(Stem):
96
+ class CryonirspSPConditionalTaskExposureConditionsBud(
97
+ CryonirspConditionalTaskExposureConditionsBudBase
98
+ ):
99
+ """For ip task types that are neither DARK nor POLCAL, produce a list of exposure conditions tuples."""
100
+
101
+ def __init__(self):
102
+ super().__init__(
103
+ stem_name=CryonirspBudName.sp_non_dark_and_non_polcal_task_exposure_conditions_list.value,
104
+ task_types_to_ignore=[TaskName.dark.value, TaskName.polcal.value],
105
+ )
106
+ self.metadata_key = "exposure_conditions"
107
+
108
+
109
+ class CryonirspCIConditionalTaskExposureConditionsBud(
110
+ CryonirspConditionalTaskExposureConditionsBudBase
111
+ ):
112
+ """For ip task types that are neither DARK nor POLCAL nor LAMP GAIN, produce a list of exposure conditions tuples."""
113
+
114
+ def __init__(self):
115
+ super().__init__(
116
+ stem_name=CryonirspBudName.ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list.value,
117
+ task_types_to_ignore=[
118
+ TaskName.dark.value,
119
+ TaskName.polcal.value,
120
+ TaskName.lamp_gain.value,
121
+ ],
122
+ )
123
+ self.metadata_key = "exposure_conditions"
124
+
125
+
126
+ class CryonirspPickyDarkExposureConditionsBudBase(Stem):
99
127
  """Parse exposure conditions tuples to ensure existence of dark frames with the required exposure conditions."""
100
128
 
101
129
  DarkTaskTestAndExposureConditions = namedtuple(
102
130
  "DarkTaskTestAndExposureConditions", ["is_dark", "exposure_conditions"]
103
131
  )
104
132
 
105
- def __init__(self):
106
- super().__init__(stem_name=CryonirspBudName.picky_dark_exposure_conditions_list.value)
133
+ def __init__(self, stem_name: str, task_types_to_ignore: list[str]):
134
+ super().__init__(stem_name=stem_name)
107
135
  self.metadata_key = "exposure_conditions"
136
+ self.task_types_to_ignore = task_types_to_ignore
108
137
 
109
138
  def setter(self, fits_obj: CryonirspL0FitsAccess) -> tuple | Type[SpilledDirt]:
110
139
  """
@@ -118,15 +147,16 @@ class CryonirspPickyDarkExposureConditionsBud(Stem):
118
147
  -------
119
148
  A tuple of a boolean indicating if the task is a dark task, and the exposure conditions for this fits object
120
149
  """
121
- if fits_obj.ip_task_type.upper() == TaskName.dark.value:
150
+ task_type = parse_header_ip_task_with_gains(fits_obj=fits_obj)
151
+ if task_type.upper() == TaskName.dark.value:
122
152
  return self.DarkTaskTestAndExposureConditions(
123
153
  is_dark=True, exposure_conditions=getattr(fits_obj, self.metadata_key)
124
154
  )
125
- if fits_obj.ip_task_type.upper() not in _DARK_AND_POLCAL_TASK_TYPES:
155
+ if task_type.upper() not in self.task_types_to_ignore:
126
156
  return self.DarkTaskTestAndExposureConditions(
127
157
  is_dark=False, exposure_conditions=getattr(fits_obj, self.metadata_key)
128
158
  )
129
- # Polcal falls through
159
+ # Ignored task types fall through
130
160
  return SpilledDirt
131
161
 
132
162
  def getter(self, key: Hashable) -> Type[Thorn]:
@@ -161,3 +191,30 @@ class CryonirspPickyDarkExposureConditionsBud(Stem):
161
191
  f"Exposure conditions required in the set of dark frames not found. Missing conditions = {other_exposure_conditions_missing_from_dark_exposure_conditions}"
162
192
  )
163
193
  return Thorn
194
+
195
+
196
+ class CryonirspCIPickyDarkExposureConditionsBud(CryonirspPickyDarkExposureConditionsBudBase):
197
+ """Parse exposure conditions tuples to ensure existence of dark frames with the required exposure conditions, ignoring polcal frames and lamp gain frames."""
198
+
199
+ def __init__(self):
200
+ super().__init__(
201
+ stem_name=CryonirspBudName.ci_picky_dark_exposure_conditions_list.value,
202
+ task_types_to_ignore=[
203
+ TaskName.dark.value,
204
+ TaskName.polcal.value,
205
+ TaskName.lamp_gain.value,
206
+ ],
207
+ )
208
+
209
+
210
+ class CryonirspSPPickyDarkExposureConditionsBud(CryonirspPickyDarkExposureConditionsBudBase):
211
+ """Parse exposure conditions tuples to ensure existence of dark frames with the required exposure conditions, ignoring polcal frames."""
212
+
213
+ def __init__(self):
214
+ super().__init__(
215
+ stem_name=CryonirspBudName.sp_picky_dark_exposure_conditions_list.value,
216
+ task_types_to_ignore=[
217
+ TaskName.dark.value,
218
+ TaskName.polcal.value,
219
+ ],
220
+ )
@@ -39,9 +39,16 @@ class DarkCalibration(CryonirspTaskBase):
39
39
  None
40
40
 
41
41
  """
42
- target_exposure_conditions = (
43
- self.constants.non_dark_and_non_polcal_task_exposure_conditions_list
44
- )
42
+ arm = self.constants.arm_id
43
+
44
+ if arm == "CI":
45
+ target_exposure_conditions = (
46
+ self.constants.ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list
47
+ )
48
+ if arm == "SP":
49
+ target_exposure_conditions = (
50
+ self.constants.sp_non_dark_and_non_polcal_task_exposure_conditions_list
51
+ )
45
52
 
46
53
  logger.info(f"{target_exposure_conditions = }")
47
54
  with self.apm_task_step(
@@ -25,14 +25,21 @@ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
25
25
  from dkist_processing_cryonirsp.models.parameters import CryonirspParsingParameters
26
26
  from dkist_processing_cryonirsp.models.tags import CryonirspStemName
27
27
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
28
- from dkist_processing_cryonirsp.parsers.check_for_gains import CheckGainFramesPickyBud
28
+ from dkist_processing_cryonirsp.parsers.check_for_gains import CheckLampGainFramesPickyBud
29
+ from dkist_processing_cryonirsp.parsers.check_for_gains import CheckSolarGainFramesPickyBud
29
30
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
30
31
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspRampFitsAccess
31
32
  from dkist_processing_cryonirsp.parsers.exposure_conditions import (
32
- CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud,
33
+ CryonirspCIConditionalTaskExposureConditionsBud,
33
34
  )
34
35
  from dkist_processing_cryonirsp.parsers.exposure_conditions import (
35
- CryonirspPickyDarkExposureConditionsBud,
36
+ CryonirspCIPickyDarkExposureConditionsBud,
37
+ )
38
+ from dkist_processing_cryonirsp.parsers.exposure_conditions import (
39
+ CryonirspSPConditionalTaskExposureConditionsBud,
40
+ )
41
+ from dkist_processing_cryonirsp.parsers.exposure_conditions import (
42
+ CryonirspSPPickyDarkExposureConditionsBud,
36
43
  )
37
44
  from dkist_processing_cryonirsp.parsers.exposure_conditions import (
38
45
  CryonirspTaskExposureConditionsBud,
@@ -180,16 +187,12 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
180
187
  NumberOfScanStepsBud(),
181
188
  NumberOfMeasurementsBud(),
182
189
  CryonirspSolarGainStartTimeBud(),
183
- CheckGainFramesPickyBud(),
190
+ CheckSolarGainFramesPickyBud(),
184
191
  NumCSStepBud(self.parameters.max_cs_step_time_sec),
185
192
  CryonirspTaskExposureConditionsBud(
186
193
  stem_name=CryonirspBudName.dark_frame_exposure_conditions_list.value,
187
194
  ip_task_type=TaskName.dark.value,
188
195
  ),
189
- CryonirspTaskExposureConditionsBud(
190
- stem_name=CryonirspBudName.lamp_gain_exposure_conditions_list.value,
191
- ip_task_type=TaskName.lamp_gain.value,
192
- ),
193
196
  CryonirspTaskExposureConditionsBud(
194
197
  stem_name=CryonirspBudName.solar_gain_exposure_conditions_list.value,
195
198
  ip_task_type=TaskName.solar_gain.value,
@@ -202,8 +205,6 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
202
205
  stem_name=CryonirspBudName.polcal_exposure_conditions_list.value,
203
206
  ip_task_type=TaskName.polcal.value,
204
207
  ),
205
- CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(),
206
- CryonirspPickyDarkExposureConditionsBud(),
207
208
  UniqueBud(constant_name=CryonirspBudName.axis_1_type.value, metadata_key="axis_1_type"),
208
209
  UniqueBud(constant_name=CryonirspBudName.axis_2_type.value, metadata_key="axis_2_type"),
209
210
  UniqueBud(constant_name=CryonirspBudName.axis_3_type.value, metadata_key="axis_3_type"),
@@ -274,10 +275,23 @@ class ParseL0CryonirspSPLinearizedData(ParseL0CryonirspLinearizedData):
274
275
  ip_task_type=TaskName.solar_gain.value,
275
276
  task_type_parsing_function=parse_header_ip_task_with_gains,
276
277
  ),
278
+ CheckLampGainFramesPickyBud(),
279
+ CryonirspTaskExposureConditionsBud(
280
+ stem_name=CryonirspBudName.lamp_gain_exposure_conditions_list.value,
281
+ ip_task_type=TaskName.lamp_gain.value,
282
+ ),
283
+ CryonirspSPConditionalTaskExposureConditionsBud(),
284
+ CryonirspSPPickyDarkExposureConditionsBud(),
277
285
  ]
278
286
 
279
287
 
280
288
  class ParseL0CryonirspCILinearizedData(ParseL0CryonirspLinearizedData):
281
289
  """Parse linearity corrected CryoNIRSP-CI input data with CI arm specific constants."""
282
290
 
283
- pass
291
+ @property
292
+ def constant_buds(self) -> list[S]:
293
+ """Add CryoNIRSP-CI specific constants to common constants."""
294
+ return super().constant_buds + [
295
+ CryonirspCIConditionalTaskExposureConditionsBud(),
296
+ CryonirspCIPickyDarkExposureConditionsBud(),
297
+ ]
@@ -129,7 +129,14 @@ class CryonirspConstantsDb:
129
129
  ExposureConditions(0.01, AllowableOpticalDensityFilterNames.OPEN.value),
130
130
  )
131
131
  POLCAL_EXPOSURE_CONDITIONS_LIST: tuple[ExposureConditions] | tuple = ()
132
- NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST: tuple[ExposureConditions, ...] = (
132
+ SP_NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST: tuple[ExposureConditions, ...] = (
133
+ ExposureConditions(100.0, AllowableOpticalDensityFilterNames.OPEN.value),
134
+ ExposureConditions(1.0, AllowableOpticalDensityFilterNames.OPEN.value),
135
+ ExposureConditions(0.01, AllowableOpticalDensityFilterNames.OPEN.value),
136
+ )
137
+ CI_NON_DARK_AND_NON_POLCAL_AND_NON_LAMP_GAIN_TASK_EXPOSURE_CONDITIONS_LIST: tuple[
138
+ ExposureConditions, ...
139
+ ] = (
133
140
  ExposureConditions(100.0, AllowableOpticalDensityFilterNames.OPEN.value),
134
141
  ExposureConditions(1.0, AllowableOpticalDensityFilterNames.OPEN.value),
135
142
  ExposureConditions(0.01, AllowableOpticalDensityFilterNames.OPEN.value),
@@ -34,7 +34,7 @@ def sp_dark_calibration_task(
34
34
  200.0, AllowableOpticalDensityFilterNames.NONE.value
35
35
  )
36
36
  constants_db = CryonirspConstantsDb(
37
- NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
37
+ SP_NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
38
38
  ARM_ID="SP",
39
39
  )
40
40
  init_cryonirsp_constants_db(recipe_run_id, constants_db)
@@ -120,7 +120,7 @@ def ci_dark_calibration_task(
120
120
  )
121
121
 
122
122
  constants_db = CryonirspConstantsDb(
123
- NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
123
+ CI_NON_DARK_AND_NON_POLCAL_AND_NON_LAMP_GAIN_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
124
124
  ARM_ID="CI",
125
125
  )
126
126
  init_cryonirsp_constants_db(recipe_run_id, constants_db)
@@ -664,8 +664,11 @@ def test_parse_cryonirsp_linearized_incomplete_final_map(
664
664
  num_modstates = 2
665
665
  num_sub_repeats = 2
666
666
 
667
- # Needed so the dark picky bud is happy
667
+ # Needed so the picky buds are happy
668
668
  write_dark_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
669
+ write_solar_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
670
+ if arm_id == "SP":
671
+ write_lamp_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
669
672
 
670
673
  # Needed so the pol checking buds are happy
671
674
  write_polcal_frames_to_task(
@@ -884,8 +887,11 @@ def test_parse_cryonirsp_linearized_incomplete_raster_scan(
884
887
  translated_header["CNNUMSCN"] = num_scan_steps
885
888
  return translated_header
886
889
 
887
- # Needed so the dark picky bud is happy
890
+ # Needed so the picky buds are happy
888
891
  write_dark_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
892
+ write_solar_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
893
+ if arm_id == "SP":
894
+ write_lamp_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
889
895
 
890
896
  # Needed so the pol checking buds are happy
891
897
  write_polcal_frames_to_task(
@@ -1219,10 +1225,10 @@ def test_parse_cryonirsp_linearized_data_constants(
1219
1225
  assert sorted(task.constants._db_dict["DARK_FRAME_EXPOSURE_CONDITIONS_LIST"]) == sorted(
1220
1226
  [json.loads(json.dumps(condition)) for condition in dark_exp_conditions]
1221
1227
  )
1222
-
1223
- assert task.constants._db_dict["LAMP_GAIN_EXPOSURE_CONDITIONS_LIST"] == [
1224
- json.loads(json.dumps(lamp_exp_cond))
1225
- ]
1228
+ if arm_id == "SP":
1229
+ assert task.constants._db_dict["LAMP_GAIN_EXPOSURE_CONDITIONS_LIST"] == [
1230
+ json.loads(json.dumps(lamp_exp_cond))
1231
+ ]
1226
1232
  assert task.constants._db_dict["SOLAR_GAIN_EXPOSURE_CONDITIONS_LIST"] == [
1227
1233
  json.loads(json.dumps(solar_exp_cond))
1228
1234
  ]
@@ -1326,6 +1332,9 @@ def test_parse_cryonirsp_not_polarimetric_obs(parse_linearized_task, arm_id):
1326
1332
 
1327
1333
  for condition in dark_exp_conditions:
1328
1334
  write_dark_frames_to_task(task, exposure_condition=condition, tags=lin_tag)
1335
+ write_solar_gain_frames_to_task(task, exposure_condition=condition, tags=lin_tag)
1336
+ if arm_id == "SP":
1337
+ write_lamp_gain_frames_to_task(task, exposure_condition=condition, tags=lin_tag)
1329
1338
 
1330
1339
  write_polcal_frames_to_task(
1331
1340
  task,
@@ -1464,11 +1473,11 @@ def test_missing_solar_gain_frames(parse_linearized_task, arm_id):
1464
1473
  num_modstates=1,
1465
1474
  )
1466
1475
 
1467
- with pytest.raises(ValueError, match="Solar gain frames not found."):
1476
+ with pytest.raises(ValueError, match="solar_gain frames not found."):
1468
1477
  task()
1469
1478
 
1470
1479
 
1471
- @pytest.mark.parametrize("arm_id", ["CI", "SP"])
1480
+ @pytest.mark.parametrize("arm_id", ["SP"])
1472
1481
  def test_missing_lamp_gain_frames(parse_linearized_task, arm_id):
1473
1482
  """
1474
1483
  Given: A dataset missing lamp gain frames
@@ -1493,5 +1502,46 @@ def test_missing_lamp_gain_frames(parse_linearized_task, arm_id):
1493
1502
  num_modstates=1,
1494
1503
  )
1495
1504
 
1496
- with pytest.raises(ValueError, match="Lamp gain frames not found."):
1505
+ with pytest.raises(ValueError, match="lamp_gain frames not found."):
1497
1506
  task()
1507
+
1508
+
1509
+ @pytest.mark.parametrize("arm_id", ["CI"])
1510
+ def test_wrong_exposure_time_lamp_gain_dark(parse_linearized_task, arm_id):
1511
+ """
1512
+ Given: lamp gain frames with a different exposure time than the dark frames
1513
+ When: parsing data where the lamp gain has no matching exposure time
1514
+ Then: everything is fine because CRYO-CI ignores lamp gains
1515
+ """
1516
+ task = parse_linearized_task
1517
+ lin_tag = [CryonirspTag.linearized()]
1518
+ solar_gain_exposure_condition = ExposureConditions(
1519
+ 10.0, AllowableOpticalDensityFilterNames.OPEN.value
1520
+ )
1521
+ write_solar_gain_frames_to_task(
1522
+ task,
1523
+ tags=lin_tag,
1524
+ exposure_condition=solar_gain_exposure_condition,
1525
+ num_modstates=1,
1526
+ )
1527
+ lamp_gain_exposure_condition = ExposureConditions(
1528
+ 1000.0, AllowableOpticalDensityFilterNames.OPEN.value
1529
+ )
1530
+ write_lamp_gain_frames_to_task(
1531
+ task,
1532
+ tags=lin_tag,
1533
+ exposure_condition=lamp_gain_exposure_condition,
1534
+ num_modstates=1,
1535
+ )
1536
+ dark_exp_condition = ExposureConditions(10.0, AllowableOpticalDensityFilterNames.OPEN.value)
1537
+ write_dark_frames_to_task(task, exposure_condition=dark_exp_condition, tags=lin_tag)
1538
+
1539
+ task()
1540
+
1541
+ assert task.constants._db_dict["DARK_FRAME_EXPOSURE_CONDITIONS_LIST"] == [[10.0, "OPEN"]]
1542
+ assert task.constants._db_dict["SOLAR_GAIN_EXPOSURE_CONDITIONS_LIST"] == [[10.0, "OPEN"]]
1543
+ assert task.constants._db_dict[
1544
+ "CI_NON_DARK_AND_NON_POLCAL_AND_NON_LAMP_GAIN_TASK_EXPOSURE_CONDITIONS_LIST"
1545
+ ] == [[10.0, "OPEN"]]
1546
+ with pytest.raises(KeyError):
1547
+ assert task.constants._db_dict["LAMP_GAIN_EXPOSURE_CONDITIONS_LIST"]
@@ -47,8 +47,7 @@ l0_pipeline.add_node(task=ParseL0CryonirspCILinearizedData, upstreams=LinearityC
47
47
  l0_pipeline.add_node(task=BadPixelMapCalibration, upstreams=ParseL0CryonirspCILinearizedData)
48
48
  l0_pipeline.add_node(task=CIBeamBoundariesCalibration, upstreams=BadPixelMapCalibration)
49
49
  l0_pipeline.add_node(task=DarkCalibration, upstreams=CIBeamBoundariesCalibration)
50
- l0_pipeline.add_node(task=LampGainCalibration, upstreams=DarkCalibration)
51
- l0_pipeline.add_node(task=CISolarGainCalibration, upstreams=LampGainCalibration)
50
+ l0_pipeline.add_node(task=CISolarGainCalibration, upstreams=DarkCalibration)
52
51
  l0_pipeline.add_node(task=CIInstrumentPolarizationCalibration, upstreams=CISolarGainCalibration)
53
52
  l0_pipeline.add_node(task=CIScienceCalibration, upstreams=CIInstrumentPolarizationCalibration)
54
53
  l0_pipeline.add_node(task=CIWriteL1Frame, upstreams=CIScienceCalibration)
@@ -63,8 +63,7 @@ full_trial_ci_pipeline.add_node(
63
63
  )
64
64
  full_trial_ci_pipeline.add_node(task=CIBeamBoundariesCalibration, upstreams=BadPixelMapCalibration)
65
65
  full_trial_ci_pipeline.add_node(task=DarkCalibration, upstreams=CIBeamBoundariesCalibration)
66
- full_trial_ci_pipeline.add_node(task=LampGainCalibration, upstreams=DarkCalibration)
67
- full_trial_ci_pipeline.add_node(task=CISolarGainCalibration, upstreams=LampGainCalibration)
66
+ full_trial_ci_pipeline.add_node(task=CISolarGainCalibration, upstreams=DarkCalibration)
68
67
  full_trial_ci_pipeline.add_node(
69
68
  task=CIInstrumentPolarizationCalibration, upstreams=CISolarGainCalibration
70
69
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dkist-processing-cryonirsp
3
- Version: 1.4.12
3
+ Version: 1.4.15
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
@@ -17,7 +17,7 @@ Requires-Dist: Pillow==10.3.0
17
17
  Requires-Dist: astropy==6.1.0
18
18
  Requires-Dist: dkist-fits-specifications==4.10.0
19
19
  Requires-Dist: dkist-header-validator==5.1.1
20
- Requires-Dist: dkist-processing-common==10.5.8
20
+ Requires-Dist: dkist-processing-common==10.5.9
21
21
  Requires-Dist: dkist-processing-math==2.1.2
22
22
  Requires-Dist: dkist-processing-pac==3.1.1
23
23
  Requires-Dist: dkist-spectral-lines==3.0.0
@@ -48,7 +48,7 @@ Provides-Extra: asdf
48
48
  Requires-Dist: dkist-processing-common[asdf]; extra == "asdf"
49
49
  Requires-Dist: dkist-inventory[asdf]==1.5.0; extra == "asdf"
50
50
  Provides-Extra: quality
51
- Requires-Dist: dkist-quality==1.2.0; extra == "quality"
51
+ Requires-Dist: dkist-quality==1.2.1; extra == "quality"
52
52
  Provides-Extra: grogu
53
53
  Requires-Dist: dkist; extra == "grogu"
54
54
  Requires-Dist: pyparsing; extra == "grogu"
@@ -2,7 +2,7 @@ Pillow==10.3.0
2
2
  astropy==6.1.0
3
3
  dkist-fits-specifications==4.10.0
4
4
  dkist-header-validator==5.1.1
5
- dkist-processing-common==10.5.8
5
+ dkist-processing-common==10.5.9
6
6
  dkist-processing-math==2.1.2
7
7
  dkist-processing-pac==3.1.1
8
8
  dkist-spectral-lines==3.0.0
@@ -39,7 +39,7 @@ dkist-processing-common[inventory]
39
39
  dkist-inventory==1.5.0
40
40
 
41
41
  [quality]
42
- dkist-quality==1.2.0
42
+ dkist-quality==1.2.1
43
43
 
44
44
  [test]
45
45
  pytest
@@ -1,4 +1,5 @@
1
1
  changelog
2
+ ci_scripts
2
3
  dkist_processing_cryonirsp
3
4
  docs
4
5
  licenses
@@ -25,7 +25,7 @@ dependencies = [
25
25
  "astropy == 6.1.0",
26
26
  "dkist-fits-specifications == 4.10.0",
27
27
  "dkist-header-validator == 5.1.1",
28
- "dkist-processing-common == 10.5.8",
28
+ "dkist-processing-common == 10.5.9",
29
29
  "dkist-processing-math == 2.1.2",
30
30
  "dkist-processing-pac == 3.1.1",
31
31
  "dkist-spectral-lines == 3.0.0",
@@ -68,7 +68,7 @@ asdf = [
68
68
  "dkist-inventory[asdf]==1.5.0",
69
69
  ]
70
70
  quality = [
71
- "dkist-quality==1.2.0",
71
+ "dkist-quality==1.2.1",
72
72
  ]
73
73
  grogu = [
74
74
  "dkist",