dkist-processing-cryonirsp 0.0.76rc1__tar.gz → 0.0.77rc1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/CHANGELOG.rst +9 -0
  2. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/PKG-INFO +1 -1
  3. dkist_processing_cryonirsp-0.0.77rc1/changelog/110.feature.rst +6 -0
  4. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/models/constants.py +36 -0
  5. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/models/parameters.py +36 -0
  6. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/models/tags.py +10 -0
  7. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/models/task_name.py +2 -0
  8. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +12 -0
  9. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/time.py +31 -0
  10. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/__init__.py +1 -0
  11. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/mixin/corrections.py +2 -2
  12. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/parse.py +34 -0
  13. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/quality_metrics.py +1 -1
  14. dkist_processing_cryonirsp-0.0.77rc1/dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +484 -0
  15. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/sp_solar_gain.py +5 -2
  16. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/write_l1.py +32 -0
  17. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/conftest.py +22 -0
  18. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/header_models.py +18 -1
  19. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +26 -1
  20. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +29 -0
  21. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_parameters.py +8 -5
  22. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_parse.py +1 -1
  23. dkist_processing_cryonirsp-0.0.77rc1/dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +155 -0
  24. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_write_l1.py +41 -0
  25. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/workflows/sp_l0_processing.py +6 -1
  26. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/workflows/trial_workflows.py +5 -1
  27. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp.egg-info/PKG-INFO +1 -1
  28. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp.egg-info/SOURCES.txt +3 -1
  29. dkist_processing_cryonirsp-0.0.76rc1/changelog/139.doc.rst +0 -1
  30. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/.gitignore +0 -0
  31. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/.pre-commit-config.yaml +0 -0
  32. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/.readthedocs.yml +0 -0
  33. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/README.rst +0 -0
  34. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/SCIENCE_CHANGELOG.rst +0 -0
  35. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/bitbucket-pipelines.yml +0 -0
  36. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/changelog/.gitempty +0 -0
  37. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/check_changelog_updated.sh +0 -0
  38. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/__init__.py +0 -0
  39. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/config.py +0 -0
  40. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/models/__init__.py +0 -0
  41. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/models/exposure_conditions.py +0 -0
  42. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/__init__.py +0 -0
  43. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +0 -0
  44. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/exposure_conditions.py +0 -0
  45. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/map_repeats.py +0 -0
  46. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/measurements.py +0 -0
  47. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/modstates.py +0 -0
  48. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/optical_density_filters.py +0 -0
  49. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/polarimetric_check.py +0 -0
  50. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/scan_step.py +0 -0
  51. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/parsers/wavelength.py +0 -0
  52. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/assemble_movie.py +0 -0
  53. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/bad_pixel_map.py +0 -0
  54. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +0 -0
  55. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +0 -0
  56. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/ci_science.py +0 -0
  57. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -0
  58. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/dark.py +0 -0
  59. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/gain.py +0 -0
  60. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/instrument_polarization.py +0 -0
  61. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -0
  62. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/linearity_correction.py +0 -0
  63. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/make_movie_frames.py +0 -0
  64. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/mixin/__init__.py +0 -0
  65. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/mixin/beam_access.py +0 -0
  66. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +0 -0
  67. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +0 -0
  68. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +0 -0
  69. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/science_base.py +0 -0
  70. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +0 -0
  71. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/sp_geometric.py +0 -0
  72. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/sp_science.py +0 -0
  73. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tasks/trial_output_data.py +0 -0
  74. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/__init__.py +0 -0
  75. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
  76. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  77. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +0 -0
  78. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_assemble_movie.py +0 -0
  79. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +0 -0
  80. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +0 -0
  81. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +0 -0
  82. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_ci_science.py +0 -0
  83. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_corrections.py +0 -0
  84. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_cryo_base.py +0 -0
  85. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_cryo_constants.py +0 -0
  86. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_dark.py +0 -0
  87. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_gain.py +0 -0
  88. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_instrument_polarization.py +0 -0
  89. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_linearity_correction.py +0 -0
  90. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_make_movie_frames.py +0 -0
  91. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_quality.py +0 -0
  92. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +0 -0
  93. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_sp_geometric.py +0 -0
  94. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +0 -0
  95. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_sp_science.py +0 -0
  96. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_sp_solar.py +0 -0
  97. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +0 -0
  98. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_trial_output_data.py +0 -0
  99. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/tests/test_workflows.py +0 -0
  100. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/workflows/__init__.py +0 -0
  101. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp/workflows/ci_l0_processing.py +0 -0
  102. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp.egg-info/dependency_links.txt +0 -0
  103. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp.egg-info/requires.txt +0 -0
  104. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/dkist_processing_cryonirsp.egg-info/top_level.txt +0 -0
  105. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/Makefile +0 -0
  106. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/bad_pixel_calibration.rst +0 -0
  107. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/beam_angle_calculation.rst +0 -0
  108. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/beam_boundary_computation.rst +0 -0
  109. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/changelog.rst +0 -0
  110. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/ci_science_calibration.rst +0 -0
  111. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/conf.py +0 -0
  112. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/index.rst +0 -0
  113. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/l0_to_l1_cryonirsp_ci-full-trial.rst +0 -0
  114. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/l0_to_l1_cryonirsp_ci.rst +0 -0
  115. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/l0_to_l1_cryonirsp_sp-full-trial.rst +0 -0
  116. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/l0_to_l1_cryonirsp_sp.rst +0 -0
  117. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/linearization.rst +0 -0
  118. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/make.bat +0 -0
  119. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/requirements.txt +0 -0
  120. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/requirements_table.rst +0 -0
  121. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/scientific_changelog.rst +0 -0
  122. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/docs/sp_science_calibration.rst +0 -0
  123. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/licenses/LICENSE.rst +0 -0
  124. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/pyproject.toml +0 -0
  125. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/science_towncrier.sh +0 -0
  126. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/setup.cfg +0 -0
  127. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/setup.py +0 -0
  128. {dkist_processing_cryonirsp-0.0.76rc1 → dkist_processing_cryonirsp-0.0.77rc1}/towncrier_science.toml +0 -0
@@ -1,3 +1,12 @@
1
+ v0.0.76 (2024-08-05)
2
+ ====================
3
+
4
+ Documentation
5
+ -------------
6
+
7
+ - Add pre-commit hook for documentation, add missing workflow documentation and update README.rst. (`#139 <https://bitbucket.org/dkistdc/dkist-processing-cryonirsp/pull-requests/139>`__)
8
+
9
+
1
10
  v0.0.75 (2024-07-31)
2
11
  ====================
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dkist_processing_cryonirsp
3
- Version: 0.0.76rc1
3
+ Version: 0.0.77rc1
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
@@ -0,0 +1,6 @@
1
+ Add calibration task to compute accurate header values for
2
+ CTYPE1, CUNIT1, CRPIX1, PV1_0, PV1_1, PV1_2, CRVAL1, CDELT1, PV1_2,
3
+ CTYPE1A, CUNIT1A, CRPIX1A, PV1_0A, PV1_1A, PV1_2A, CRVAL1A, CDELT1A, PV1_2A.
4
+
5
+ This is done by shifting the raw wavelength value (CRVAL1/A) to align with the FTS atlas, and
6
+ then fitting a model to infer and correct the values of the aforementioned headers.
@@ -18,6 +18,11 @@ class CryonirspBudName(Enum):
18
18
  num_map_scans = "NUM_MAP_SCANS"
19
19
  num_modstates = "NUM_MODSTATES"
20
20
  wavelength = "WAVELENGTH"
21
+ wave_min = "WAVE_MIN"
22
+ wave_max = "WAVE_MAX"
23
+ grating_position_deg = "GRATING_POSITION_DEG"
24
+ grating_littrow_angle_deg = "GRATING_LITTROW_ANGLE_DEG"
25
+ grating_constant = "GRATING_CONSTANT"
21
26
  camera_readout_mode = "CAM_READOUT_MODE"
22
27
  num_meas = "NUM_MEAS"
23
28
  time_obs_list = "TIME_OBS_LIST"
@@ -40,6 +45,7 @@ class CryonirspBudName(Enum):
40
45
  roi_1_size_x = "ROI_1_SIZE_X"
41
46
  roi_1_size_y = "ROI_1_SIZE_Y"
42
47
  optical_density_filter_picky_bud = "OPTICAL_DENSITY_FILTER_PICKY_BUD"
48
+ solar_gain_ip_start_time = "SOLAR_GAIN_IP_START_TIME"
43
49
 
44
50
 
45
51
  class CryonirspConstants(ConstantsBase):
@@ -73,6 +79,36 @@ class CryonirspConstants(ConstantsBase):
73
79
  """Wavelength."""
74
80
  return self._db_dict[CryonirspBudName.wavelength.value]
75
81
 
82
+ @property
83
+ def wave_min(self) -> float:
84
+ """Wavelength minimum."""
85
+ return self._db_dict[CryonirspBudName.wave_min.value]
86
+
87
+ @property
88
+ def wave_max(self) -> float:
89
+ """Wavelength maximum."""
90
+ return self._db_dict[CryonirspBudName.wave_max.value]
91
+
92
+ @property
93
+ def solar_gain_ip_start_time(self) -> str:
94
+ """Solar gain IP start time."""
95
+ return self._db_dict[CryonirspBudName.solar_gain_ip_start_time.value]
96
+
97
+ @property
98
+ def grating_position_deg(self) -> float:
99
+ """Grating position angle (deg)."""
100
+ return self._db_dict[CryonirspBudName.grating_position_deg.value]
101
+
102
+ @property
103
+ def grating_littrow_angle_deg(self) -> float:
104
+ """Grating littrow angle (deg)."""
105
+ return self._db_dict[CryonirspBudName.grating_littrow_angle_deg.value]
106
+
107
+ @property
108
+ def grating_constant(self) -> float:
109
+ """Grating constant."""
110
+ return self._db_dict[CryonirspBudName.grating_constant.value]
111
+
76
112
  @property
77
113
  def camera_readout_mode(self) -> str:
78
114
  """Determine the readout mode of the camera."""
@@ -7,6 +7,7 @@ import numpy as np
7
7
  from dkist_processing_common.models.parameters import ParameterArmIdMixin
8
8
  from dkist_processing_common.models.parameters import ParameterBase
9
9
  from dkist_processing_common.models.parameters import ParameterWavelengthMixin
10
+ from dkist_processing_common.tasks.mixin.input_dataset import InputDatasetMixin
10
11
 
11
12
  from dkist_processing_cryonirsp.models.exposure_conditions import AllowableOpticalDensityFilterNames
12
13
 
@@ -258,3 +259,38 @@ class CryonirspParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmI
258
259
  """Return the CryoNIRSP mirror scan recalibration constant."""
259
260
  mirror_scan_recalibration_constant = 0.466 / 0.5
260
261
  return mirror_scan_recalibration_constant
262
+
263
+ @property
264
+ def camera_mirror_focal_length_mm(self) -> u.Quantity:
265
+ """Return the CryoNIRSP camera mirror focal length."""
266
+ return (
267
+ self._find_most_recent_past_value("cryonirsp_camera_mirror_focal_length_mm")
268
+ * u.millimeter
269
+ )
270
+
271
+ @property
272
+ def pixel_pitch_micron(self) -> u.Quantity:
273
+ """Return the CryoNIRSP pixel pitch."""
274
+ return self._find_most_recent_past_value("cryonirsp_pixel_pitch_micron") * u.micron
275
+
276
+ @cached_property
277
+ def solar_atlas(self) -> np.ndarray:
278
+ """Solar reference atlas.
279
+
280
+ Contains two arrays:
281
+ - wavelength in nanometers
282
+ - transmission at given wavelength
283
+ """
284
+ param_dict = self._find_most_recent_past_value("cryonirsp_solar_atlas")
285
+ return self._load_param_value_from_numpy_save(param_dict)
286
+
287
+ @cached_property
288
+ def telluric_atlas(self) -> np.ndarray:
289
+ """Telluric reference atlas.
290
+
291
+ Contains two arrays:
292
+ - wavelength in nanometers
293
+ - transmission at given wavelength
294
+ """
295
+ param_dict = self._find_most_recent_past_value("cryonirsp_telluric_atlas")
296
+ return self._load_param_value_from_numpy_save(param_dict)
@@ -156,3 +156,13 @@ class CryonirspTag(Tag):
156
156
  def task_bad_pixel_map(cls) -> str:
157
157
  """Tags intermediate bad pixel map objects."""
158
158
  return cls.format_tag(StemName.task, CryonirspTaskName.bad_pixel_map.value)
159
+
160
+ @classmethod
161
+ def task_spectral_fit(cls) -> str:
162
+ """Tags spectral fit solution."""
163
+ return cls.format_tag(StemName.task, CryonirspTaskName.spectral_fit.value)
164
+
165
+ @classmethod
166
+ def task_characteristic_spectra(cls) -> str:
167
+ """Tags 1D intermediate characteristic spectra."""
168
+ return cls.format_tag(StemName.task, CryonirspTaskName.solar_char_spec.value)
@@ -10,3 +10,5 @@ class CryonirspTaskName(str, Enum):
10
10
  polcal_dark = "POLCAL_DARK"
11
11
  polcal_gain = "POLCAL_GAIN"
12
12
  spectral_corrected_solar_array = "SPECTRAL_CORRECTED_SOLAR_ARRAY"
13
+ spectral_fit = "SPECTRAL_FIT"
14
+ solar_char_spec = "SOLAR_CHAR_SPEC"
@@ -86,12 +86,24 @@ class CryonirspL0FitsAccess(L0FitsAccess):
86
86
  self.axis_1_type: str = self.header["CTYPE1"]
87
87
  self.axis_2_type: str = self.header["CTYPE2"]
88
88
  self.axis_3_type: str = self.header["CTYPE3"]
89
+ self.wave_min: float = round(
90
+ self.header["CRVAL1"] - (self.header["CRPIX1"] * self.header["CDELT1"]), 1
91
+ )
92
+ self.wave_max: float = round(
93
+ self.header["CRVAL1"]
94
+ + ((self.header["NAXIS1"] - self.header["CRPIX1"]) * self.header["CDELT1"]),
95
+ 1,
96
+ )
97
+ self.grating_position_deg: float = self.header["CNGRTPOS"]
98
+ self.grating_littrow_angle_deg: float = self.header["CNGRTLAT"]
99
+ self.grating_constant: float = self.header["CNGRTCON"]
89
100
  self.obs_ip_start_time = self.header["DKIST011"]
90
101
  # The ExposureConditions are a combination of the exposure time and the OD filter name:
91
102
  self.exposure_conditions = ExposureConditions(
92
103
  round(self.fpa_exposure_time_ms, CRYO_EXP_TIME_ROUND_DIGITS),
93
104
  self.header["CNFILTNP"].upper(),
94
105
  )
106
+ self.solar_gain_ip_start_time = self.header["DATE-OBS"]
95
107
 
96
108
  @property
97
109
  def cn1_scan_step(self):
@@ -1,12 +1,43 @@
1
1
  """Buds to parse exposure time."""
2
2
  from typing import Hashable
3
+ from typing import Type
3
4
 
5
+ from dkist_processing_common.models.flower_pot import SpilledDirt
4
6
  from dkist_processing_common.models.flower_pot import Stem
7
+ from dkist_processing_common.models.task_name import TaskName
8
+ from dkist_processing_common.parsers.task import parse_header_ip_task_with_gains
5
9
 
6
10
  from dkist_processing_cryonirsp.models.constants import CryonirspBudName
11
+ from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
7
12
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspRampFitsAccess
8
13
 
9
14
 
15
+ class CryonirspSolarGainStartTimeBud(Stem):
16
+ """Bud for finding the start time of the solar gain."""
17
+
18
+ def __init__(self):
19
+ self.metadata_key = "time_obs"
20
+ super().__init__(stem_name=CryonirspBudName.solar_gain_ip_start_time.value)
21
+
22
+ def setter(self, fits_obj: CryonirspL0FitsAccess) -> Type[SpilledDirt] | int:
23
+ """
24
+ Setter for the bud.
25
+
26
+ Parameters
27
+ ----------
28
+ fits_obj:
29
+ A single FitsAccess object
30
+ """
31
+ if parse_header_ip_task_with_gains(fits_obj) != TaskName.solar_gain.value:
32
+ return SpilledDirt
33
+ return getattr(fits_obj, self.metadata_key)
34
+
35
+ def getter(self, key: Hashable):
36
+ """Return the first date-obs value."""
37
+ first_date_obs = min(list(self.key_to_petal_dict.values()))
38
+ return first_date_obs
39
+
40
+
10
41
  class CryonirspTimeObsBud(Stem):
11
42
  """
12
43
  Produce a tuple of all time_obs values present in the dataset.
@@ -11,6 +11,7 @@ from dkist_processing_cryonirsp.tasks.make_movie_frames import *
11
11
  from dkist_processing_cryonirsp.tasks.parse import *
12
12
  from dkist_processing_cryonirsp.tasks.quality_metrics import *
13
13
  from dkist_processing_cryonirsp.tasks.sp_beam_boundaries import *
14
+ from dkist_processing_cryonirsp.tasks.sp_dispersion_axis_correction import *
14
15
  from dkist_processing_cryonirsp.tasks.sp_geometric import *
15
16
  from dkist_processing_cryonirsp.tasks.sp_science import *
16
17
  from dkist_processing_cryonirsp.tasks.sp_solar_gain import *
@@ -47,7 +47,7 @@ class CorrectionsMixin:
47
47
  array[np.where(array == -np.inf)] = np.min(array[np.isfinite(array)])
48
48
  array[np.isnan(array)] = np.nanmedian(array)
49
49
  translated = affine_transform_arrays(array, translation=-shift, mode="edge", order=1)
50
- # TODO: rotate_arrays_about_point rotates the wrong way, so no negative sign here
50
+ # rotate_arrays_about_point rotates the wrong way, so no negative sign here
51
51
  yield next(rotate_arrays_about_point(translated, angle=angle, mode="edge", order=1))
52
52
 
53
53
  @staticmethod
@@ -85,7 +85,7 @@ class CorrectionsMixin:
85
85
  array[np.where(array == np.inf)] = np.max(array[np.isfinite(array)])
86
86
  array[np.where(array == -np.inf)] = np.min(array[np.isfinite(array)])
87
87
  array[np.isnan(array)] = np.nanmedian(array)
88
- # TODO: rotate_arrays_about_point rotates the wrong way, so no negative sign here
88
+ # rotate_arrays_about_point rotates the wrong way, so no negative sign here
89
89
  rotated = rotate_arrays_about_point(array, angle=angle, mode="edge")
90
90
  yield next(affine_transform_arrays(rotated, translation=-shift, mode="edge"))
91
91
 
@@ -13,6 +13,7 @@ from dkist_processing_common.parsers.task import parse_header_ip_task_with_gains
13
13
  from dkist_processing_common.parsers.task import PolcalTaskFlower
14
14
  from dkist_processing_common.parsers.task import TaskTypeFlower
15
15
  from dkist_processing_common.parsers.time import ObsIpStartTimeBud
16
+ from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
16
17
  from dkist_processing_common.parsers.unique_bud import UniqueBud
17
18
  from dkist_processing_common.tasks import default_constant_bud_factory
18
19
  from dkist_processing_common.tasks import default_tag_flower_factory
@@ -43,9 +44,11 @@ from dkist_processing_cryonirsp.parsers.optical_density_filters import OpticalDe
43
44
  from dkist_processing_cryonirsp.parsers.polarimetric_check import PolarimetricCheckingUniqueBud
44
45
  from dkist_processing_cryonirsp.parsers.scan_step import NumberOfScanStepsBud
45
46
  from dkist_processing_cryonirsp.parsers.scan_step import ScanStepNumberFlower
47
+ from dkist_processing_cryonirsp.parsers.time import CryonirspSolarGainStartTimeBud
46
48
  from dkist_processing_cryonirsp.parsers.time import CryonirspTimeObsBud
47
49
  from dkist_processing_cryonirsp.parsers.wavelength import ObserveWavelengthBud
48
50
 
51
+
49
52
  __all__ = ["ParseL0CryonirspRampData", "ParseL0CryonirspLinearizedData"]
50
53
  S = TypeVar("S", bound=Stem)
51
54
 
@@ -169,7 +172,20 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
169
172
  NumMapScansBud(),
170
173
  NumberOfScanStepsBud(),
171
174
  NumberOfMeasurementsBud(),
175
+ CryonirspSolarGainStartTimeBud(),
172
176
  NumCSStepBud(self.parameters.max_cs_step_time_sec),
177
+ TaskUniqueBud(
178
+ constant_name=CryonirspBudName.wave_min.value,
179
+ metadata_key="wave_min",
180
+ ip_task_type=TaskName.solar_gain.value,
181
+ task_type_parsing_function=parse_header_ip_task_with_gains,
182
+ ),
183
+ TaskUniqueBud(
184
+ constant_name=CryonirspBudName.wave_max.value,
185
+ metadata_key="wave_max",
186
+ ip_task_type=TaskName.solar_gain.value,
187
+ task_type_parsing_function=parse_header_ip_task_with_gains,
188
+ ),
173
189
  CryonirspTaskExposureConditionsBud(
174
190
  stem_name=CryonirspBudName.dark_frame_exposure_conditions_list.value,
175
191
  ip_task_type=TaskName.dark.value,
@@ -203,6 +219,24 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
203
219
  constant_name=CryonirspBudName.modulator_spin_mode.value,
204
220
  metadata_key="modulator_spin_mode",
205
221
  ),
222
+ TaskUniqueBud(
223
+ constant_name=CryonirspBudName.grating_position_deg.value,
224
+ metadata_key="grating_position_deg",
225
+ ip_task_type=TaskName.solar_gain.value,
226
+ task_type_parsing_function=parse_header_ip_task_with_gains,
227
+ ),
228
+ TaskUniqueBud(
229
+ constant_name=CryonirspBudName.grating_littrow_angle_deg.value,
230
+ metadata_key="grating_littrow_angle_deg",
231
+ ip_task_type=TaskName.solar_gain.value,
232
+ task_type_parsing_function=parse_header_ip_task_with_gains,
233
+ ),
234
+ TaskUniqueBud(
235
+ constant_name=CryonirspBudName.grating_constant.value,
236
+ metadata_key="grating_constant",
237
+ ip_task_type=TaskName.solar_gain.value,
238
+ task_type_parsing_function=parse_header_ip_task_with_gains,
239
+ ),
206
240
  ]
207
241
 
208
242
  @property
@@ -237,7 +237,7 @@ class CryonirspL1QualityMetrics(CryonirspTaskBase, QualityMixin):
237
237
  median = np.nanmedian(frame.data)
238
238
  time_obs_mjd = Time(frame.time_obs).mjd
239
239
  mean = np.nanmean(frame.data)
240
- average = median or mean # TODO: Needs hardening for value of 0
240
+ average = median or mean
241
241
  result = _QualityDataPoint(value=average, datetime=time_obs_mjd)
242
242
  logger.info(f"Calculated intensity frame average as {result}")
243
243
  return result