dkist-processing-cryonirsp 0.0.17rc1__tar.gz → 0.0.18__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 (114) hide show
  1. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/CHANGELOG.rst +20 -0
  2. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/PKG-INFO +1 -1
  3. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/models/optical_density_filter_names.py +3 -2
  4. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/models/parameters.py +8 -0
  5. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +1 -1
  6. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +1 -1
  7. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/science_base.py +5 -8
  8. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/sp_science.py +0 -16
  9. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +2 -3
  10. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/conftest.py +7 -6
  11. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/header_models.py +1 -1
  12. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +1 -1
  13. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_parameters.py +21 -0
  14. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_parse.py +20 -10
  15. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_sp_science.py +1 -1
  16. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp.egg-info/PKG-INFO +1 -1
  17. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +0 -1
  18. dkist_processing_cryonirsp-0.0.17rc1/changelog/70.feature.rst +0 -1
  19. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/.gitignore +0 -0
  20. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/.pre-commit-config.yaml +0 -0
  21. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/.readthedocs.yml +0 -0
  22. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/README.rst +0 -0
  23. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/SCIENCE_CHANGELOG.rst +0 -0
  24. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/bitbucket-pipelines.yml +0 -0
  25. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/changelog/.gitempty +0 -0
  26. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/check_changelog_updated.sh +0 -0
  27. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/__init__.py +0 -0
  28. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/models/__init__.py +0 -0
  29. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/models/constants.py +0 -0
  30. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/models/filter.py +0 -0
  31. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/models/tags.py +0 -0
  32. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/models/task_name.py +0 -0
  33. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
  34. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
  35. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
  36. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
  37. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
  38. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/polarimeter_mode.py +0 -0
  39. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/polcal_task.py +0 -0
  40. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
  41. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/task.py +0 -0
  42. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/time.py +0 -0
  43. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/parsers/wavelength.py +0 -0
  44. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/__init__.py +0 -0
  45. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/assemble_movie.py +0 -0
  46. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +0 -0
  47. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +0 -0
  48. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +0 -0
  49. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/ci_science.py +0 -0
  50. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
  51. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/dark.py +0 -0
  52. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
  53. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +0 -0
  54. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
  55. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/linearity_correction.py +0 -0
  56. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
  57. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
  58. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/mixin/beam_access.py +0 -0
  59. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +0 -0
  60. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +0 -0
  61. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +0 -0
  62. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/parse.py +0 -0
  63. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/quality_metrics.py +0 -0
  64. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +0 -0
  65. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/sp_geometric.py +0 -0
  66. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/trial_output_data.py +0 -0
  67. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tasks/write_l1.py +0 -0
  68. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
  69. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/ci_e2e_test.py +0 -0
  70. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/e2e_helpers.py +0 -0
  71. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/e2e_linearize.py +0 -0
  72. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/sp_e2e_test.py +0 -0
  73. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +0 -0
  74. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
  75. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_build_quality_report.py +0 -0
  76. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +0 -0
  77. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_ci_make_movie_frames.py +0 -0
  78. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_ci_science.py +0 -0
  79. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
  80. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
  81. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_dark.py +0 -0
  82. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
  83. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
  84. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
  85. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +0 -0
  86. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
  87. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
  88. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
  89. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_submit_qualilty.py +0 -0
  90. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
  91. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/tests/test_write_l1.py +0 -0
  92. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
  93. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +0 -0
  94. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +0 -0
  95. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp/workflows/trial_workflows.py +0 -0
  96. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
  97. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp.egg-info/requires.txt +0 -0
  98. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/dkist_processing_cryonirsp.egg-info/top_level.txt +0 -0
  99. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/Makefile +0 -0
  100. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/changelog.rst +0 -0
  101. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/conf.py +0 -0
  102. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/index.rst +0 -0
  103. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
  104. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
  105. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/make.bat +0 -0
  106. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/requirements.txt +0 -0
  107. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/requirements_table.rst +0 -0
  108. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/docs/scientific_changelog.rst +0 -0
  109. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/licenses/LICENSE.rst +0 -0
  110. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/pyproject.toml +0 -0
  111. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/science_towncrier.sh +0 -0
  112. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/setup.cfg +0 -0
  113. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/setup.py +0 -0
  114. {dkist_processing_cryonirsp-0.0.17rc1 → dkist_processing_cryonirsp-0.0.18}/towncrier_science.toml +0 -0
@@ -1,3 +1,23 @@
1
+ v0.0.18 (2023-11-08)
2
+ ====================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Removes cross-talk correction from SP science task. (`#72 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/72>`__)
8
+ - Turn on bad-pixel correction of science observe frames for science team evaluation. (`#73 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/73>`__)
9
+ - Fix computation of characteristic spectrum by removing incorrect median normalization. (`#74 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/74>`__)
10
+
11
+
12
+ v0.0.17 (2023-11-06)
13
+ ====================
14
+
15
+ Features
16
+ --------
17
+
18
+ - Implement relative photometric calibration. Linearized ramp sets are normalized to counts per second. Attenuation due to Optical Density filters is compensated. Solar gain image is no longer normalized to mean of 1. Observe images are now in units of flux relative to solar center. (`#70 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/70>`__)
19
+
20
+
1
21
  v0.0.16 (2023-11-02)
2
22
  ====================
3
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dkist_processing_cryonirsp
3
- Version: 0.0.17rc1
3
+ Version: 0.0.18
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
@@ -5,7 +5,8 @@ from enum import StrEnum
5
5
  class AllowableOpticalDensityFilterNames(StrEnum):
6
6
  """Enum to implement list of allowable Optical Density Filter names."""
7
7
 
8
+ G278 = "G278"
8
9
  G358 = "G358"
9
10
  G408 = "G408"
10
- OPEN = "Open"
11
- NONE = "none"
11
+ OPEN = "OPEN"
12
+ NONE = "NONE"
@@ -156,6 +156,7 @@ class CryonirspParameters(ParameterBase):
156
156
  def linearization_filter_attenuation_dict(self) -> dict:
157
157
  """Return a dict that maps the filter name to its attenuation parameter."""
158
158
  filter_attenuation_dict = {
159
+ AllowableOpticalDensityFilterNames.G278.value: self._linearization_optical_density_filter_attenuation_g278,
159
160
  AllowableOpticalDensityFilterNames.G358.value: self._linearization_optical_density_filter_attenuation_g358,
160
161
  AllowableOpticalDensityFilterNames.G408.value: self._linearization_optical_density_filter_attenuation_g408,
161
162
  AllowableOpticalDensityFilterNames.OPEN.value: self._linearization_optical_density_filter_attenuation_open,
@@ -163,6 +164,13 @@ class CryonirspParameters(ParameterBase):
163
164
  }
164
165
  return filter_attenuation_dict
165
166
 
167
+ @cached_property
168
+ def _linearization_optical_density_filter_attenuation_g278(self) -> float:
169
+ """Return the attenuation value for the G278 filter."""
170
+ return self._find_parameter_closest_wavelength(
171
+ "cryonirsp_linearization_optical_density_filter_attenuation_g278"
172
+ )
173
+
166
174
  @cached_property
167
175
  def _linearization_optical_density_filter_attenuation_g358(self) -> float:
168
176
  """Return the attenuation value for the G358 filter."""
@@ -32,7 +32,7 @@ class CryonirspRampFitsAccess(L0FitsAccess):
32
32
  self.camera_readout_mode = self.header["CNCAMMD"]
33
33
  self.curr_frame_in_ramp: int = self.header["CNCNDR"]
34
34
  self.arm_id: str = self.header["CNARMID"]
35
- self.filter_name = self.header["CNFILTNP"]
35
+ self.filter_name = self.header["CNFILTNP"].upper()
36
36
  self.roi_1_origin_x = self.header["HWROI1OX"]
37
37
  self.roi_1_origin_y = self.header["HWROI1OY"]
38
38
  self.roi_1_size_x = self.header["HWROI1SX"]
@@ -31,7 +31,7 @@ class OpticalDensityFiltersPickyBud(Stem):
31
31
  -------
32
32
  The optical density filter name associated with this fits object
33
33
  """
34
- return fits_obj.filter_name
34
+ return fits_obj.filter_name.upper()
35
35
 
36
36
  def getter(self, key: Hashable) -> Thorn:
37
37
  """Return a Thorn for valid names or raise an exception for bad names."""
@@ -168,17 +168,14 @@ class ScienceCalibrationBase(CryonirspTaskBase, ABC):
168
168
  # Dark correction
169
169
  dark_corrected_array = next(subtract_array_from_arrays(avg_observe_array, dark_array))
170
170
 
171
- # TODO: Unclear how much this helps, so leaving it out for now...
172
- # TODO: Do not remove this code until we have confirmed with the cryo team
173
171
  # Bad pixel correction
174
- # bad_pixel_map = self.intermediate_frame_load_bad_pixel_map(beam=beam)
175
- # bad_pixel_corrected_array = self.corrections_correct_bad_pixels(
176
- # dark_corrected_array, bad_pixel_map
177
- # )
172
+ bad_pixel_map = self.intermediate_frame_load_bad_pixel_map(beam=beam)
173
+ bad_pixel_corrected_array = self.corrections_correct_bad_pixels(
174
+ dark_corrected_array, bad_pixel_map
175
+ )
178
176
 
179
177
  # Gain correction
180
- # gain_corrected_array = next(divide_arrays_by_array(bad_pixel_corrected_array, gain_array))
181
- gain_corrected_array = next(divide_arrays_by_array(dark_corrected_array, gain_array))
178
+ gain_corrected_array = next(divide_arrays_by_array(bad_pixel_corrected_array, gain_array))
182
179
 
183
180
  return gain_corrected_array, observe_header
184
181
 
@@ -99,7 +99,6 @@ class SPScienceCalibration(ScienceCalibrationBase):
99
99
 
100
100
  logger.info(f"Correcting telescope polarization for {logging_str}")
101
101
  calibrated = self.telescope_polarization_correction(combined)
102
- calibrated = self.remove_crosstalk(calibrated)
103
102
 
104
103
  return calibrated
105
104
 
@@ -208,21 +207,6 @@ class SPScienceCalibration(ScienceCalibrationBase):
208
207
 
209
208
  return obj
210
209
 
211
- @staticmethod
212
- def remove_crosstalk(fits_obj: CryonirspL0FitsAccess) -> CryonirspL0FitsAccess:
213
- """Remove the continuum from QUV (remove cross-talk)."""
214
- array_stack = fits_obj.data
215
- array_header = fits_obj.header
216
- for i in range(1, 4):
217
- array_stack[:, :, i] = (
218
- array_stack[:, :, i]
219
- - np.nanmedian(array_stack[:, :, i] / array_stack[:, :, 0], axis=1)[:, None]
220
- * array_stack[:, :, 0]
221
- )
222
- hdu = fits.ImageHDU(data=array_stack, header=array_header)
223
- obj = CryonirspL0FitsAccess(hdu=hdu, auto_squeeze=False)
224
- return obj
225
-
226
210
  def collect_calibration_objects(self) -> CalibrationCollection:
227
211
  """
228
212
  Collect *all* calibration for all modstates, and exposure times.
@@ -154,15 +154,14 @@ class SPSolarGainCalibration(CryonirspTaskBase):
154
154
  return spectral_corrected_solar_array
155
155
 
156
156
  def _compute_char_spectrum(self, array: np.ndarray) -> np.ndarray:
157
- """Estimate the characteristic colar spectrum from the corrected solar gain data."""
157
+ """Estimate the characteristic solar spectrum from the corrected solar gain data."""
158
158
  # Normalize data row by row
159
159
  pct = self.parameters.solar_characteristic_spatial_normalization_percentile
160
160
  array_row_norm = array / np.nanpercentile(array, pct, axis=1)[:, None]
161
161
  # Compute characteristic spectrum
162
162
  char_spec_1d = np.nanmedian(array_row_norm, axis=0)
163
- median_char_spec_1d = char_spec_1d / np.nanmean(char_spec_1d)
164
163
  # Expand the 1D median along the columns (along the slit)
165
- median_char_spec_2d = np.tile(median_char_spec_1d, (array_row_norm.shape[0], 1))
164
+ median_char_spec_2d = np.tile(char_spec_1d, (array_row_norm.shape[0], 1))
166
165
  return median_char_spec_2d
167
166
 
168
167
  def _distort_char_spectrum(self, char_spec: np.ndarray) -> np.ndarray:
@@ -329,6 +329,9 @@ def cryonirsp_testing_parameters_factory(
329
329
  )
330
330
  )
331
331
  cryonirsp_linearization_max_memory_gb: float = 4.0
332
+ cryonirsp_linearization_optical_density_filter_attenuation_g278: WavelengthParameter = (
333
+ WavelengthParameter(values=(-1.64, -1.64, -1.64, -1.64))
334
+ )
332
335
  cryonirsp_linearization_optical_density_filter_attenuation_g358: WavelengthParameter = (
333
336
  WavelengthParameter(values=(-3.75, -3.75, -3.75, -3.75))
334
337
  )
@@ -387,7 +390,7 @@ def assign_input_dataset_doc_to_task(
387
390
  def _write_frames_to_task(
388
391
  task: Type[WorkflowTaskBase],
389
392
  frame_generator: Spec122Dataset,
390
- change_translated_headers: Callable[[fits.Header | None], fits.Header] = None,
393
+ change_translated_headers: Callable[[fits.Header], fits.Header] = lambda x: x,
391
394
  tag_ramp_frames: Callable[[fits.Header], list[str]] = lambda x: [],
392
395
  extra_tags: list[str] | None = None,
393
396
  tag_func: Callable[[CryonirspHeaders], list[str]] = lambda x: [],
@@ -404,11 +407,9 @@ def _write_frames_to_task(
404
407
  data = frame.data
405
408
  frame_tags = tags + tag_func(frame)
406
409
  translated_header = fits.Header(translate_spec122_to_spec214_l0(header))
407
- if change_translated_headers is not None:
408
- translated_header = change_translated_headers(translated_header)
409
- if tag_ramp_frames is not None:
410
- ramp_tags = tag_ramp_frames(translated_header)
411
- frame_tags = frame_tags + ramp_tags
410
+ translated_header = change_translated_headers(translated_header)
411
+ ramp_tags = tag_ramp_frames(translated_header)
412
+ frame_tags = frame_tags + ramp_tags
412
413
 
413
414
  task.write(data=data, header=translated_header, tags=frame_tags, encoder=fits_array_encoder)
414
415
  num_frames += 1
@@ -108,7 +108,7 @@ class CryonirspHeadersValidNonLinearizedFrames(CryonirspHeaders):
108
108
  @key_function("XPOSURE")
109
109
  # set the exposure time for each frame in the ramp
110
110
  def exposure_time(self, key: float):
111
- return 100 * self._index * 0.01
111
+ return 100 * self.index * 0.01
112
112
 
113
113
 
114
114
  class CryonirspHeadersValidLinearizedFrames(CryonirspHeaders):
@@ -117,7 +117,7 @@ def linearity_correction(
117
117
 
118
118
  @pytest.mark.parametrize(
119
119
  "filter_name",
120
- [pytest.param("G358", id="G358"), pytest.param("Open", id="Open")],
120
+ [pytest.param("G358", id="G358"), pytest.param("OPEN", id="OPEN")],
121
121
  )
122
122
  @pytest.mark.parametrize(
123
123
  "frames_in_ramp",
@@ -52,6 +52,27 @@ def _is_wavelength_param(param_value: Any) -> bool:
52
52
  return isinstance(param_value, dict) and "wavelength" in param_value
53
53
 
54
54
 
55
+ @given(wave=st.floats(min_value=800.0, max_value=2000.0))
56
+ @settings(suppress_health_check=[HealthCheck.function_scoped_fixture])
57
+ @example(wave=1082.7)
58
+ def test_filter_parameters(basic_science_task_with_parameter_mixin, wave):
59
+ """
60
+ Given: A Science task with the parameter mixin
61
+ When: Accessing properties for the optical density filters
62
+ Then: The correct value is returned
63
+ """
64
+ task, expected = basic_science_task_with_parameter_mixin
65
+ task_params = task.parameters
66
+ task_params._wavelength = wave
67
+ expected = {
68
+ "_linearization_optical_density_filter_attenuation_g278": -1.64,
69
+ "_linearization_optical_density_filter_attenuation_g358": -3.75,
70
+ "_linearization_optical_density_filter_attenuation_g408": -4.26,
71
+ }
72
+ for param in expected:
73
+ assert getattr(task_params, param) == expected[param]
74
+
75
+
55
76
  def _is_file_param(param_value: Any) -> bool:
56
77
  return isinstance(param_value, dict) and "is_file" in param_value and param_value["is_file"]
57
78
 
@@ -107,7 +107,7 @@ def write_observe_frames_to_task(
107
107
  num_map_scans: int,
108
108
  num_sub_repeats: int,
109
109
  arm_id: str,
110
- change_translated_headers: Callable[[fits.Header | None], fits.Header] = None,
110
+ change_translated_headers: Callable[[fits.Header | None], fits.Header] = lambda x: x,
111
111
  exp_time_ms: float = 6.0,
112
112
  array_shape=(2, 2, 1),
113
113
  tags: list[str] | None = None,
@@ -154,7 +154,7 @@ def write_non_linearized_frames(
154
154
  arm_id: str,
155
155
  start_time: str,
156
156
  camera_readout_mode: str,
157
- change_translated_headers: Callable[[fits.Header | None], fits.Header] = None,
157
+ change_translated_headers: Callable[[fits.Header | None], fits.Header] = lambda x: x,
158
158
  tags: list[str] | None = None,
159
159
  ):
160
160
  frame_generator = CryonirspHeadersValidNonLinearizedFrames(
@@ -194,7 +194,7 @@ def make_linearized_test_frames(
194
194
  dark_exp_times: list[float],
195
195
  num_modstates: int,
196
196
  num_steps: int,
197
- change_translated_headers: Callable[[fits.Header | None], fits.Header] = None,
197
+ change_translated_headers: Callable[[fits.Header | None], fits.Header] = lambda x: x,
198
198
  num_map_scans: int = 1,
199
199
  num_sub_repeats: int = 1,
200
200
  extra_headers: dict | None = None,
@@ -232,7 +232,7 @@ def make_linearized_test_frames(
232
232
 
233
233
  def make_non_linearized_test_frames(
234
234
  task,
235
- change_translated_headers: Callable[[fits.Header | None], fits.Header] = None,
235
+ change_translated_headers: Callable[[fits.Header | None], fits.Header] = lambda x: x,
236
236
  ):
237
237
  arm_id = "SP"
238
238
  camera_readout_mode = "FastUpTheRamp"
@@ -335,11 +335,13 @@ def test_parse_cryonirsp_non_linearized_data_bad_filter_name(parse_non_linearize
335
335
 
336
336
  task = parse_non_linearized_task
337
337
 
338
- def fix_ramp_frame_headers(translated_header: fits.Header):
338
+ def insert_bad_filter_name_into_header(translated_header: fits.Header):
339
339
  translated_header["CNFILTNP"] = "BAD_FILTER_NAME"
340
340
  return translated_header
341
341
 
342
- make_non_linearized_test_frames(task, change_translated_headers=fix_ramp_frame_headers)
342
+ make_non_linearized_test_frames(
343
+ task, change_translated_headers=insert_bad_filter_name_into_header
344
+ )
343
345
 
344
346
  with pytest.raises(
345
347
  ValueError,
@@ -560,7 +562,6 @@ def test_parse_cryonirsp_linearized_incomplete_final_map(parse_linearized_task,
560
562
  task=task,
561
563
  frame_generator=frame_generator,
562
564
  extra_tags=[CryonirspTag.linearized()],
563
- change_translated_headers=None,
564
565
  )
565
566
 
566
567
  task()
@@ -720,6 +721,15 @@ def test_parse_cryonirsp_linearized_data_constants(parse_linearized_task, arm_id
720
721
 
721
722
  def test_optical_density_filter_names(parse_non_linearized_task):
722
723
  task = parse_non_linearized_task
723
- filter_map = {k for k in task.parameters.linearization_filter_attenuation_dict.keys()}
724
- difference = filter_map.symmetric_difference(ALLOWABLE_OPTICAL_DENSITY_FILTERS)
725
- assert not difference
724
+ # List of filter attenuation parameters defined in CryonirspParameters:
725
+ defined_filter_params = {
726
+ item[-4:].upper()
727
+ for item in dir(task.parameters)
728
+ if item.startswith("_linearization_optical_density_filter_attenuation_")
729
+ }
730
+ # List of filters in the filter map:
731
+ filter_map_params = {k for k in task.parameters.linearization_filter_attenuation_dict.keys()}
732
+ # Make sure all filter parameters match the allowable list
733
+ assert not defined_filter_params.symmetric_difference(ALLOWABLE_OPTICAL_DENSITY_FILTERS)
734
+ # Make sure all filter map keys match the allowable list
735
+ assert not filter_map_params.symmetric_difference(ALLOWABLE_OPTICAL_DENSITY_FILTERS)
@@ -67,7 +67,7 @@ def sp_science_calibration_task(
67
67
  assign_input_dataset_doc_to_task(task, param_class())
68
68
  # Create fake bad pixel map
69
69
  task.intermediate_frame_write_arrays(
70
- arrays=np.zeros((1, 1)),
70
+ arrays=np.zeros((30, 60)),
71
71
  task_tag=CryonirspTag.task_bad_pixel_map(),
72
72
  )
73
73
  # Create fake demodulation matrices
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dkist-processing-cryonirsp
3
- Version: 0.0.17rc1
3
+ Version: 0.0.18
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
@@ -12,7 +12,6 @@ setup.cfg
12
12
  setup.py
13
13
  towncrier_science.toml
14
14
  changelog/.gitempty
15
- changelog/70.feature.rst
16
15
  dkist_processing_cryonirsp/__init__.py
17
16
  dkist_processing_cryonirsp.egg-info/PKG-INFO
18
17
  dkist_processing_cryonirsp.egg-info/SOURCES.txt
@@ -1 +0,0 @@
1
- Implement relative photometric calibration. Linearized ramp sets are normalized to counts per second. Attenuation due to Optical Density filters is compensated. Solar gain image is no longer normalized to mean of 1. Observe images are now in units of flux relative to solar center.