dkist-processing-dlnirsp 0.32.2__tar.gz → 0.32.4__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 (117) hide show
  1. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/CHANGELOG.rst +18 -0
  2. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/PKG-INFO +42 -41
  3. dkist_processing_dlnirsp-0.32.4/dkist_processing_dlnirsp/models/fits_access.py +32 -0
  4. dkist_processing_dlnirsp-0.32.4/dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py +99 -0
  5. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/parsers/task.py +2 -6
  6. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/parsers/time.py +2 -1
  7. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/parsers/wavelength.py +5 -1
  8. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/linearity_correction.py +55 -24
  9. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/parse.py +21 -12
  10. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/science.py +7 -5
  11. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/write_l1.py +5 -4
  12. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/conftest.py +13 -5
  13. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py +18 -16
  14. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_helpers.py +2 -1
  15. dkist_processing_dlnirsp-0.32.4/dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py +129 -0
  16. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_linearity_correction.py +120 -21
  17. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_parse.py +3 -2
  18. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_science.py +7 -6
  19. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp.egg-info/PKG-INFO +42 -41
  20. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp.egg-info/SOURCES.txt +1 -0
  21. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp.egg-info/requires.txt +41 -40
  22. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/pyproject.toml +43 -42
  23. dkist_processing_dlnirsp-0.32.2/dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py +0 -87
  24. dkist_processing_dlnirsp-0.32.2/dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py +0 -76
  25. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/.gitignore +0 -0
  26. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/.pre-commit-config.yaml +0 -0
  27. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/.readthedocs.yml +0 -0
  28. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/.snyk +0 -0
  29. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/README.rst +0 -0
  30. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/SCIENCE_CHANGELOG.rst +0 -0
  31. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/bitbucket-pipelines.yml +0 -0
  32. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/changelog/.gitempty +0 -0
  33. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/__init__.py +0 -0
  34. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/config.py +0 -0
  35. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/dev_scripts/__init__.py +0 -0
  36. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/dev_scripts/test_slitbeam_group_assignment.py +0 -0
  37. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/models/__init__.py +0 -0
  38. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/models/constants.py +0 -0
  39. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/models/parameters.py +0 -0
  40. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/models/tags.py +0 -0
  41. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/models/task_name.py +0 -0
  42. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/parsers/__init__.py +0 -0
  43. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/parsers/dlnirsp_l1_fits_acess.py +0 -0
  44. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/parsers/mosaic.py +0 -0
  45. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/parsers/wcs_corrections.py +0 -0
  46. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/__init__.py +0 -0
  47. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/assemble_movie.py +0 -0
  48. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/bad_pixel_map.py +0 -0
  49. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/dark.py +0 -0
  50. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/dlnirsp_base.py +0 -0
  51. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/geometric.py +0 -0
  52. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/ifu_drift.py +0 -0
  53. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/instrument_polarization.py +0 -0
  54. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/l1_output_data.py +0 -0
  55. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/lamp.py +0 -0
  56. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/make_movie_frames.py +0 -0
  57. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/mixin/__init__.py +0 -0
  58. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/mixin/corrections.py +0 -0
  59. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/mixin/group_id.py +0 -0
  60. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/quality_metrics.py +0 -0
  61. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/solar.py +0 -0
  62. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tasks/wavelength_calibration.py +0 -0
  63. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/__init__.py +0 -0
  64. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/__init__.py +0 -0
  65. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_linearize_only.py +0 -0
  66. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  67. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  68. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  69. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/local_trial_workflows/translate_files.py +0 -0
  70. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_assemble_movie.py +0 -0
  71. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_assemble_quality.py +0 -0
  72. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_bad_pixel_map.py +0 -0
  73. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_corrections.py +0 -0
  74. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_dark.py +0 -0
  75. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_dlnirsp_base.py +0 -0
  76. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py +0 -0
  77. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_geometric.py +0 -0
  78. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_group_id.py +0 -0
  79. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_ifu_drift.py +0 -0
  80. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_instrument_polarization_calibration.py +0 -0
  81. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_lamp.py +0 -0
  82. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_make_movie_frames.py +0 -0
  83. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_parameters.py +0 -0
  84. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_quality.py +0 -0
  85. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_solar.py +0 -0
  86. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_trial_create_quality_report.py +0 -0
  87. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_wavelength_calibration.py +0 -0
  88. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_workflows.py +0 -0
  89. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/tests/test_write_l1.py +0 -0
  90. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/workflows/__init__.py +0 -0
  91. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/workflows/l0_processing.py +0 -0
  92. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp/workflows/trial_workflow.py +0 -0
  93. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp.egg-info/dependency_links.txt +0 -0
  94. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp.egg-info/entry_points.txt +0 -0
  95. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/dkist_processing_dlnirsp.egg-info/top_level.txt +0 -0
  96. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/Makefile +0 -0
  97. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/bad_pixel_calibration.rst +0 -0
  98. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/changelog.rst +0 -0
  99. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/conf.py +0 -0
  100. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/gain.rst +0 -0
  101. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/geometric.rst +0 -0
  102. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/ifu_drift.rst +0 -0
  103. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/index.rst +0 -0
  104. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/l0_to_l1_dlnirsp.rst +0 -0
  105. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/l0_to_l1_dlnirsp_full-trial.rst +0 -0
  106. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/landing_page.rst +0 -0
  107. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/linearization.rst +0 -0
  108. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/make.bat +0 -0
  109. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/polarization_calibration.rst +0 -0
  110. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/requirements_table.rst +0 -0
  111. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/science_calibration.rst +0 -0
  112. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/scientific_changelog.rst +0 -0
  113. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/docs/wavelength_calibration.rst +0 -0
  114. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/licenses/LICENSE.rst +0 -0
  115. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/science_towncrier.sh +0 -0
  116. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/setup.cfg +0 -0
  117. {dkist_processing_dlnirsp-0.32.2 → dkist_processing_dlnirsp-0.32.4}/towncrier_science.toml +0 -0
@@ -1,3 +1,21 @@
1
+ v0.32.4 (2025-12-01)
2
+ ====================
3
+
4
+ Bugfixes
5
+ --------
6
+
7
+ - Fix bug in how the "SubFrame" camera readout mode has its ramps parsed and linearized. (`#115 <https://bitbucket.org/dkistdc/dkist-processing-dlnirsp/pull-requests/115>`__)
8
+
9
+
10
+ v0.32.3 (2025-11-04)
11
+ ====================
12
+
13
+ Misc
14
+ ----
15
+
16
+ - Replace metadata key strings with members of the string enum DlnirspMetadataKey. (`#111 <https://bitbucket.org/dkistdc/dkist-processing-dlnirsp/pull-requests/111>`__)
17
+
18
+
1
19
  v0.32.2 (2025-11-03)
2
20
  ====================
3
21
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 0.32.2
3
+ Version: 0.32.4
4
4
  Summary: Science processing code for the DLNIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -76,6 +76,7 @@ Requires-Dist: Flask-Login==0.6.3; extra == "frozen"
76
76
  Requires-Dist: Flask-SQLAlchemy==2.5.1; extra == "frozen"
77
77
  Requires-Dist: Flask-Session==0.5.0; extra == "frozen"
78
78
  Requires-Dist: Flask-WTF==1.2.2; extra == "frozen"
79
+ Requires-Dist: ImageIO==2.37.2; extra == "frozen"
79
80
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
80
81
  Requires-Dist: Mako==1.3.10; extra == "frozen"
81
82
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
@@ -93,44 +94,44 @@ Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
93
94
  Requires-Dist: aiohttp==3.13.2; extra == "frozen"
94
95
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
95
96
  Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
96
- Requires-Dist: alembic==1.17.1; extra == "frozen"
97
+ Requires-Dist: alembic==1.17.2; extra == "frozen"
97
98
  Requires-Dist: amqp==5.3.1; extra == "frozen"
98
99
  Requires-Dist: annotated-types==0.7.0; extra == "frozen"
99
- Requires-Dist: anyio==4.11.0; extra == "frozen"
100
+ Requires-Dist: anyio==4.12.0; extra == "frozen"
100
101
  Requires-Dist: apache-airflow==2.11.0; extra == "frozen"
101
- Requires-Dist: apache-airflow-providers-celery==3.10.0; extra == "frozen"
102
- Requires-Dist: apache-airflow-providers-common-compat==1.8.0; extra == "frozen"
103
- Requires-Dist: apache-airflow-providers-common-io==1.6.4; extra == "frozen"
104
- Requires-Dist: apache-airflow-providers-common-sql==1.28.2; extra == "frozen"
102
+ Requires-Dist: apache-airflow-providers-celery==3.13.1; extra == "frozen"
103
+ Requires-Dist: apache-airflow-providers-common-compat==1.10.0; extra == "frozen"
104
+ Requires-Dist: apache-airflow-providers-common-io==1.7.0; extra == "frozen"
105
+ Requires-Dist: apache-airflow-providers-common-sql==1.29.0; extra == "frozen"
105
106
  Requires-Dist: apache-airflow-providers-fab==1.5.3; extra == "frozen"
106
- Requires-Dist: apache-airflow-providers-ftp==3.13.2; extra == "frozen"
107
- Requires-Dist: apache-airflow-providers-http==5.4.0; extra == "frozen"
108
- Requires-Dist: apache-airflow-providers-imap==3.9.3; extra == "frozen"
109
- Requires-Dist: apache-airflow-providers-postgres==6.4.0; extra == "frozen"
110
- Requires-Dist: apache-airflow-providers-smtp==2.3.1; extra == "frozen"
111
- Requires-Dist: apache-airflow-providers-sqlite==4.1.2; extra == "frozen"
112
- Requires-Dist: apispec==6.8.4; extra == "frozen"
107
+ Requires-Dist: apache-airflow-providers-ftp==3.14.0; extra == "frozen"
108
+ Requires-Dist: apache-airflow-providers-http==5.6.0; extra == "frozen"
109
+ Requires-Dist: apache-airflow-providers-imap==3.10.0; extra == "frozen"
110
+ Requires-Dist: apache-airflow-providers-postgres==6.5.0; extra == "frozen"
111
+ Requires-Dist: apache-airflow-providers-smtp==2.4.0; extra == "frozen"
112
+ Requires-Dist: apache-airflow-providers-sqlite==4.2.0; extra == "frozen"
113
+ Requires-Dist: apispec==6.9.0; extra == "frozen"
113
114
  Requires-Dist: argcomplete==3.6.3; extra == "frozen"
114
115
  Requires-Dist: asdf==3.5.0; extra == "frozen"
115
116
  Requires-Dist: asdf_standard==1.4.0; extra == "frozen"
116
117
  Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
117
- Requires-Dist: asgiref==3.10.0; extra == "frozen"
118
- Requires-Dist: asteval==1.0.6; extra == "frozen"
118
+ Requires-Dist: asgiref==3.11.0; extra == "frozen"
119
+ Requires-Dist: asteval==1.0.7; extra == "frozen"
119
120
  Requires-Dist: astropy==7.0.2; extra == "frozen"
120
- Requires-Dist: astropy-iers-data==0.2025.11.3.0.38.37; extra == "frozen"
121
- Requires-Dist: asyncpg==0.30.0; extra == "frozen"
121
+ Requires-Dist: astropy-iers-data==0.2025.12.1.0.45.12; extra == "frozen"
122
+ Requires-Dist: asyncpg==0.31.0; extra == "frozen"
122
123
  Requires-Dist: attrs==25.4.0; extra == "frozen"
123
124
  Requires-Dist: babel==2.17.0; extra == "frozen"
124
- Requires-Dist: billiard==4.2.2; extra == "frozen"
125
+ Requires-Dist: billiard==4.2.4; extra == "frozen"
125
126
  Requires-Dist: blinker==1.9.0; extra == "frozen"
126
- Requires-Dist: boto3==1.40.64; extra == "frozen"
127
- Requires-Dist: botocore==1.40.64; extra == "frozen"
127
+ Requires-Dist: boto3==1.42.0; extra == "frozen"
128
+ Requires-Dist: botocore==1.41.6; extra == "frozen"
128
129
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
129
- Requires-Dist: celery==5.3.1; extra == "frozen"
130
- Requires-Dist: certifi==2025.10.5; extra == "frozen"
130
+ Requires-Dist: celery==5.6.0; extra == "frozen"
131
+ Requires-Dist: certifi==2025.11.12; extra == "frozen"
131
132
  Requires-Dist: cffi==2.0.0; extra == "frozen"
132
133
  Requires-Dist: charset-normalizer==3.4.4; extra == "frozen"
133
- Requires-Dist: click==8.3.0; extra == "frozen"
134
+ Requires-Dist: click==8.3.1; extra == "frozen"
134
135
  Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
135
136
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
136
137
  Requires-Dist: click-repl==0.3.0; extra == "frozen"
@@ -149,7 +150,7 @@ Requires-Dist: dill==0.4.0; extra == "frozen"
149
150
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
150
151
  Requires-Dist: dkist-processing-common==11.8.0; extra == "frozen"
151
152
  Requires-Dist: dkist-processing-core==6.0.0; extra == "frozen"
152
- Requires-Dist: dkist-processing-dlnirsp==0.32.2; extra == "frozen"
153
+ Requires-Dist: dkist-processing-dlnirsp==0.32.4; extra == "frozen"
153
154
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
154
155
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
155
156
  Requires-Dist: dkist-service-configuration==4.1.7; extra == "frozen"
@@ -157,14 +158,15 @@ Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
157
158
  Requires-Dist: dkist_fits_specifications==4.17.0; extra == "frozen"
158
159
  Requires-Dist: dnspython==2.8.0; extra == "frozen"
159
160
  Requires-Dist: email-validator==2.3.0; extra == "frozen"
161
+ Requires-Dist: exceptiongroup==1.3.1; extra == "frozen"
160
162
  Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
161
163
  Requires-Dist: flower==2.0.1; extra == "frozen"
162
- Requires-Dist: fonttools==4.60.1; extra == "frozen"
164
+ Requires-Dist: fonttools==4.61.0; extra == "frozen"
163
165
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
164
166
  Requires-Dist: fsspec==2025.10.0; extra == "frozen"
165
167
  Requires-Dist: globus-sdk==3.65.0; extra == "frozen"
166
- Requires-Dist: google-re2==1.1.20250805; extra == "frozen"
167
- Requires-Dist: googleapis-common-protos==1.71.0; extra == "frozen"
168
+ Requires-Dist: google-re2==1.1.20251105; extra == "frozen"
169
+ Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
168
170
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
169
171
  Requires-Dist: greenlet==3.2.4; extra == "frozen"
170
172
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
@@ -174,7 +176,6 @@ Requires-Dist: httpcore==1.0.9; extra == "frozen"
174
176
  Requires-Dist: httpx==0.28.1; extra == "frozen"
175
177
  Requires-Dist: humanize==4.14.0; extra == "frozen"
176
178
  Requires-Dist: idna==3.11; extra == "frozen"
177
- Requires-Dist: imageio==2.37.0; extra == "frozen"
178
179
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
179
180
  Requires-Dist: importlib_metadata==8.7.0; extra == "frozen"
180
181
  Requires-Dist: inflection==0.5.1; extra == "frozen"
@@ -184,7 +185,7 @@ Requires-Dist: jsonschema==4.25.1; extra == "frozen"
184
185
  Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
185
186
  Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
186
187
  Requires-Dist: kiwisolver==1.4.9; extra == "frozen"
187
- Requires-Dist: kombu==5.6.0; extra == "frozen"
188
+ Requires-Dist: kombu==5.6.1; extra == "frozen"
188
189
  Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
189
190
  Requires-Dist: lazy_loader==0.4; extra == "frozen"
190
191
  Requires-Dist: limits==5.6.0; extra == "frozen"
@@ -205,7 +206,7 @@ Requires-Dist: more-itertools==10.8.0; extra == "frozen"
205
206
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
206
207
  Requires-Dist: multidict==6.7.0; extra == "frozen"
207
208
  Requires-Dist: nbformat==5.10.4; extra == "frozen"
208
- Requires-Dist: networkx==3.5; extra == "frozen"
209
+ Requires-Dist: networkx==3.6; extra == "frozen"
209
210
  Requires-Dist: numba==0.61.2; extra == "frozen"
210
211
  Requires-Dist: numpy==2.2.5; extra == "frozen"
211
212
  Requires-Dist: object-clerk==1.0.0; extra == "frozen"
@@ -251,13 +252,13 @@ Requires-Dist: proglog==0.1.12; extra == "frozen"
251
252
  Requires-Dist: prometheus_client==0.23.1; extra == "frozen"
252
253
  Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
253
254
  Requires-Dist: propcache==0.4.1; extra == "frozen"
254
- Requires-Dist: protobuf==6.33.0; extra == "frozen"
255
+ Requires-Dist: protobuf==6.33.1; extra == "frozen"
255
256
  Requires-Dist: psutil==7.1.3; extra == "frozen"
256
257
  Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
257
258
  Requires-Dist: pycparser==2.23; extra == "frozen"
258
- Requires-Dist: pydantic==2.12.3; extra == "frozen"
259
- Requires-Dist: pydantic-settings==2.11.0; extra == "frozen"
260
- Requires-Dist: pydantic_core==2.41.4; extra == "frozen"
259
+ Requires-Dist: pydantic==2.12.5; extra == "frozen"
260
+ Requires-Dist: pydantic-settings==2.12.0; extra == "frozen"
261
+ Requires-Dist: pydantic_core==2.41.5; extra == "frozen"
261
262
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
262
263
  Requires-Dist: pyparsing==3.2.5; extra == "frozen"
263
264
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
@@ -273,17 +274,16 @@ Requires-Dist: requests-toolbelt==1.0.0; extra == "frozen"
273
274
  Requires-Dist: rfc3339-validator==0.1.4; extra == "frozen"
274
275
  Requires-Dist: rich==13.9.4; extra == "frozen"
275
276
  Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
276
- Requires-Dist: rpds-py==0.28.0; extra == "frozen"
277
- Requires-Dist: s3transfer==0.14.0; extra == "frozen"
277
+ Requires-Dist: rpds-py==0.30.0; extra == "frozen"
278
+ Requires-Dist: s3transfer==0.16.0; extra == "frozen"
278
279
  Requires-Dist: scikit-image==0.25.2; extra == "frozen"
279
280
  Requires-Dist: scipy==1.15.3; extra == "frozen"
280
281
  Requires-Dist: semantic-version==2.10.0; extra == "frozen"
281
282
  Requires-Dist: setproctitle==1.3.7; extra == "frozen"
282
283
  Requires-Dist: six==1.17.0; extra == "frozen"
283
- Requires-Dist: sniffio==1.3.1; extra == "frozen"
284
284
  Requires-Dist: solar-wavelength-calibration==1.0.1; extra == "frozen"
285
285
  Requires-Dist: sqids==0.5.1; extra == "frozen"
286
- Requires-Dist: sqlparse==0.5.3; extra == "frozen"
286
+ Requires-Dist: sqlparse==0.5.4; extra == "frozen"
287
287
  Requires-Dist: sunpy==6.1.1; extra == "frozen"
288
288
  Requires-Dist: tabulate==0.9.0; extra == "frozen"
289
289
  Requires-Dist: talus==1.3.4; extra == "frozen"
@@ -297,16 +297,17 @@ Requires-Dist: traitlets==5.14.3; extra == "frozen"
297
297
  Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
298
298
  Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
299
299
  Requires-Dist: tzdata==2025.2; extra == "frozen"
300
+ Requires-Dist: tzlocal==5.3.1; extra == "frozen"
300
301
  Requires-Dist: uc-micro-py==1.0.3; extra == "frozen"
301
302
  Requires-Dist: uncertainties==3.2.3; extra == "frozen"
302
- Requires-Dist: universal_pathlib==0.3.4; extra == "frozen"
303
+ Requires-Dist: universal_pathlib==0.3.6; extra == "frozen"
303
304
  Requires-Dist: urllib3==2.5.0; extra == "frozen"
304
305
  Requires-Dist: vine==5.1.0; extra == "frozen"
305
306
  Requires-Dist: voluptuous==0.15.2; extra == "frozen"
306
307
  Requires-Dist: wcwidth==0.2.14; extra == "frozen"
307
308
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
308
309
  Requires-Dist: wrapt==1.17.3; extra == "frozen"
309
- Requires-Dist: yamale==6.0.0; extra == "frozen"
310
+ Requires-Dist: yamale==6.1.0; extra == "frozen"
310
311
  Requires-Dist: yarl==1.22.0; extra == "frozen"
311
312
  Requires-Dist: zipp==3.23.0; extra == "frozen"
312
313
 
@@ -0,0 +1,32 @@
1
+ """DLNIRSP control of FITS key names and values."""
2
+
3
+ from enum import StrEnum
4
+
5
+ from dkist_processing_common.models.fits_access import MetadataKey
6
+
7
+
8
+ class DlnirspMetadataKey(StrEnum):
9
+ """Controlled list of names for FITS metadata header keys."""
10
+
11
+ crpix_1 = "CRPIX1"
12
+ crpix_2 = "CRPIX2"
13
+ modulator_spin_mode = "DLMOD"
14
+ camera_readout_mode = "DLCAMSMD"
15
+ num_frames_in_ramp = "DLCAMNS"
16
+ current_frame_in_ramp = "DLCAMCUR"
17
+ arm_id = "DLARMID"
18
+ camera_sample_sequence = "DLCAMSSQ"
19
+ polarimeter_mode = "DLPOLMD"
20
+ number_of_modulator_states = "DLNUMST"
21
+ modulator_state = "DLSTNUM"
22
+ num_mosaic_repeats = "DLMOSNRP"
23
+ mosaic_num = "DLCURMOS"
24
+ num_X_tiles = "DLNSSTPX"
25
+ X_tile_num = "DLCSTPX"
26
+ num_Y_tiles = "DLNSSTPY"
27
+ Y_tile_num = "DLCSTPY"
28
+ num_dither_steps = "DLDMODE"
29
+ dither_step = "DLCURSTP"
30
+ arm_position_mm = "DLARMPS"
31
+ grating_position_deg = "DLGRTAN"
32
+ grating_constant_inverse_mm = "DLGRTCN"
@@ -0,0 +1,99 @@
1
+ """DLNIRSP FitsAccess classes for raw and linearized data."""
2
+
3
+ from astropy.io import fits
4
+ from dkist_processing_common.parsers.l0_fits_access import L0FitsAccess
5
+
6
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
7
+
8
+
9
+ class DlnirspRampFitsAccess(L0FitsAccess):
10
+ """
11
+ Class to provide easy access to L0 headers for non-linearized (raw) DLNIRSP data.
12
+
13
+ i.e. instead of <DlnirspL0FitsAccess>.header['weird_key'] this class lets us use <DlnirspL0FitsAccess>.nice_key instead
14
+
15
+ Parameters
16
+ ----------
17
+ hdu :
18
+ Fits L0 header object
19
+
20
+ name : str
21
+ The name of the file that was loaded into this FitsAccess object
22
+
23
+ auto_squeeze : bool
24
+ When set to True, dimensions of length 1 will be removed from the array
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ hdu: fits.ImageHDU | fits.PrimaryHDU | fits.CompImageHDU,
30
+ name: str | None = None,
31
+ auto_squeeze: bool = True,
32
+ ):
33
+ super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
34
+
35
+ self.modulator_spin_mode: str = self.header[DlnirspMetadataKey.modulator_spin_mode]
36
+ self.camera_readout_mode: str = self.header.get(
37
+ DlnirspMetadataKey.camera_readout_mode, "DEFAULT_VISIBLE_CAMERA"
38
+ )
39
+ self.num_frames_in_ramp: int = self.header.get(DlnirspMetadataKey.num_frames_in_ramp, -99)
40
+ self.current_frame_in_ramp: int = self.header.get(
41
+ DlnirspMetadataKey.current_frame_in_ramp, -88
42
+ )
43
+ self.arm_id: str = self.header[DlnirspMetadataKey.arm_id]
44
+ self.camera_sample_sequence: str = self.header.get(
45
+ DlnirspMetadataKey.camera_sample_sequence, "VISIBLE_CAMERA_SEQUENCE"
46
+ )
47
+
48
+
49
+ class DlnirspL0FitsAccess(L0FitsAccess):
50
+ """
51
+ Class to provide easy access to L0 headers for linearized (ready for processing) DLNIRSP data.
52
+
53
+ i.e. instead of <DlnirspL0FitsAccess>.header['weird_key'] this class lets us use <DlnirspL0FitsAccess>.nice_key instead
54
+
55
+ Parameters
56
+ ----------
57
+ hdu :
58
+ Fits L0 header object
59
+
60
+ name : str
61
+ The name of the file that was loaded into this FitsAccess object
62
+
63
+ auto_squeeze : bool
64
+ When set to True, dimensions of length 1 will be removed from the array
65
+ """
66
+
67
+ def __init__(
68
+ self,
69
+ hdu: fits.ImageHDU | fits.PrimaryHDU | fits.CompImageHDU,
70
+ name: str | None = None,
71
+ auto_squeeze: bool = True,
72
+ ):
73
+ super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
74
+
75
+ self.crpix_1: float = self.header[DlnirspMetadataKey.crpix_1]
76
+ self.crpix_2: float = self.header[DlnirspMetadataKey.crpix_2]
77
+ self.arm_id: str = self.header[DlnirspMetadataKey.arm_id]
78
+ self.polarimeter_mode: str = self.header[DlnirspMetadataKey.polarimeter_mode]
79
+ self.number_of_modulator_states: int = self.header[
80
+ DlnirspMetadataKey.number_of_modulator_states
81
+ ]
82
+ self.modulator_state: int = self.header[DlnirspMetadataKey.modulator_state]
83
+ self.num_mosaic_repeats: int = self.header[DlnirspMetadataKey.num_mosaic_repeats]
84
+ self.mosaic_num: int = self.header[DlnirspMetadataKey.mosaic_num]
85
+ self.num_X_tiles: int = self.header[DlnirspMetadataKey.num_X_tiles]
86
+ self.X_tile_num: int = self.header[DlnirspMetadataKey.X_tile_num]
87
+ self.num_Y_tiles: int = self.header[DlnirspMetadataKey.num_Y_tiles]
88
+ self.Y_tile_num: int = self.header[DlnirspMetadataKey.Y_tile_num]
89
+ # DLDMODE is a bool in the header; the number of dither steps is either 1 or 2, corresponding to dither
90
+ # mode being True or False, respectively
91
+ self.num_dither_steps: int = int(self.header[DlnirspMetadataKey.num_dither_steps]) + 1
92
+ # Same with DLCURSTP. We'll index the dither loop at 0 so `False` is the first step and `True` is the second
93
+ # Use `get` because this key only exists if DLDMODE is `True`
94
+ self.dither_step: int = int(self.header.get(DlnirspMetadataKey.dither_step, False))
95
+ self.arm_position_mm: float = self.header[DlnirspMetadataKey.arm_position_mm]
96
+ self.grating_position_deg: float = self.header[DlnirspMetadataKey.grating_position_deg]
97
+ self.grating_constant_inverse_mm: float = self.header[
98
+ DlnirspMetadataKey.grating_constant_inverse_mm
99
+ ]
@@ -1,15 +1,11 @@
1
1
  """Custom parsers to identify task sub-groupings not captured by a single header key."""
2
2
 
3
- from typing import Callable
4
-
5
- from dkist_processing_common.models.flower_pot import SpilledDirt
3
+ from dkist_processing_common.models.fits_access import MetadataKey
6
4
  from dkist_processing_common.models.tags import StemName
7
5
  from dkist_processing_common.models.task_name import TaskName
8
- from dkist_processing_common.parsers.near_bud import NearFloatBud
9
6
  from dkist_processing_common.parsers.single_value_single_key_flower import (
10
7
  SingleValueSingleKeyFlower,
11
8
  )
12
- from dkist_processing_common.parsers.unique_bud import UniqueBud
13
9
 
14
10
  from dkist_processing_dlnirsp.parsers.dlnirsp_l0_fits_access import DlnirspL0FitsAccess
15
11
 
@@ -41,7 +37,7 @@ class DlnirspTaskTypeFlower(SingleValueSingleKeyFlower):
41
37
  """Flower to find the DLNIRSP task type."""
42
38
 
43
39
  def __init__(self):
44
- super().__init__(tag_stem_name=StemName.task.value, metadata_key="ip_task_type")
40
+ super().__init__(tag_stem_name=StemName.task.value, metadata_key=MetadataKey.ip_task_type)
45
41
 
46
42
  def setter(self, fits_obj: DlnirspL0FitsAccess):
47
43
  """
@@ -2,6 +2,7 @@
2
2
 
3
3
  from typing import Hashable
4
4
 
5
+ from dkist_processing_common.models.fits_access import MetadataKey
5
6
  from dkist_processing_common.models.flower_pot import Stem
6
7
  from dkist_processing_common.models.task_name import TaskName
7
8
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
@@ -17,7 +18,7 @@ class DLnirspSolarGainIpStartTimeBud(TaskUniqueBud):
17
18
  def __init__(self):
18
19
  super().__init__(
19
20
  constant_name=DlnirspBudName.solar_gain_ip_start_time.value,
20
- metadata_key="ip_start_time",
21
+ metadata_key=MetadataKey.ip_start_time,
21
22
  ip_task_types=TaskName.solar_gain.value,
22
23
  task_type_parsing_function=parse_header_ip_task,
23
24
  )
@@ -1,5 +1,6 @@
1
1
  """Bud to get the wavelength."""
2
2
 
3
+ from dkist_processing_common.models.fits_access import MetadataKey
3
4
  from dkist_processing_common.models.flower_pot import SpilledDirt
4
5
  from dkist_processing_common.parsers.unique_bud import UniqueBud
5
6
 
@@ -11,7 +12,10 @@ class ObserveWavelengthBud(UniqueBud):
11
12
  """Bud to find the wavelength."""
12
13
 
13
14
  def __init__(self):
14
- super().__init__(constant_name=DlnirspBudName.wavelength.value, metadata_key="wavelength")
15
+ super().__init__(
16
+ constant_name=DlnirspBudName.wavelength.value,
17
+ metadata_key=MetadataKey.wavelength,
18
+ )
15
19
 
16
20
  def setter(self, fits_obj: DlnirspL0FitsAccess):
17
21
  """
@@ -28,14 +28,32 @@ class LinearityCorrection(DlnirspTaskBase):
28
28
 
29
29
  record_provenance = True
30
30
 
31
- camera_sequence_regex: re.Pattern = re.compile(r"(\d*)line,(\d*)read")
31
+ valid_camera_sequence_regex: re.Pattern = re.compile(
32
+ r"^(\d*subframe)?(?(1)|(?:\d*line,\d*read,?)+)(?:,\d*line)?$"
33
+ )
32
34
  """
33
- regex pattern used to parse line-read-line values for a single coadd.
35
+ regex pattern that defines all valid camera-sample sequences.
36
+
37
+ It must start with either "Xline,Yread", which can repeat any number of times, or "Xsubframe" which must be by itself.
38
+ Either of these sequences may be padded with ",Zline" reset frames.
39
+ """
40
+
41
+ uptheramp_coadd_regex: re.Pattern = re.compile(r"(\d*)line,(\d*)read")
42
+ """
43
+ regex pattern used to parse line-read-line values for a single UpTheRamp coadd.
34
44
 
35
45
  This is where we decide that camera sequences are one or more coadd sequences, where each coadd sequence is
36
46
  "Xline,Yread". The total sequence may be padded with ",Zline" reset frames, which are not captured by this regex.
37
47
  """
38
48
 
49
+ subframe_sequence_regex: re.Pattern = re.compile(r"(\d*)subframe")
50
+ """
51
+ regex pattern used to parse coadds in SubFrame mode
52
+
53
+ Simply looks for "Xsubframe" and captures the "X". The sequence may be padded with ",Zline" reset frames, which are
54
+ not captured by this regex.
55
+ """
56
+
39
57
  def run(self):
40
58
  """
41
59
  Linearize IR camera frames or tag VIS camera frames as LINEARIZED.
@@ -110,17 +128,16 @@ class LinearityCorrection(DlnirspTaskBase):
110
128
  )
111
129
  num_coadds = len(coadd_sequence_nums_list)
112
130
 
113
- line_read_line_indices = coadd_sequence_nums_list[0]
114
- num_bias, num_read = line_read_line_indices[:2]
115
-
116
- ndr_per_coadd = num_bias + num_read
117
-
118
131
  # In `is_ramp_valid` we already confirmed that all NDRs have the same values and that they are one of the
119
132
  # expected values
120
133
  camera_readout_mode = ramp_obj_list[0].camera_readout_mode
121
134
  modulator_spin_mode = ramp_obj_list[0].modulator_spin_mode
122
135
  match camera_readout_mode:
123
136
  case "UpTheRamp":
137
+ line_read_line_indices = coadd_sequence_nums_list[0]
138
+ num_bias, num_read = line_read_line_indices[:2]
139
+ ndr_per_coadd = num_bias + num_read
140
+
124
141
  match modulator_spin_mode:
125
142
  case "Continuous":
126
143
  linearization_func = partial(
@@ -136,6 +153,11 @@ class LinearityCorrection(DlnirspTaskBase):
136
153
  )
137
154
 
138
155
  case "SubFrame":
156
+ # `self.valid_camera_sequence_regex`, along with `parse_camera_sample_sequence`, provides assurance that
157
+ # by the time we get here these assumptions are valid
158
+ num_bias = 0
159
+ num_read = 1
160
+ ndr_per_coadd = 1
139
161
  linearization_func = self.linearize_subframe_coadd
140
162
 
141
163
  coadd_stack = np.zeros((num_coadds, *ramp_obj_list[0].data.shape))
@@ -291,16 +313,25 @@ class LinearityCorrection(DlnirspTaskBase):
291
313
  "3line,45read,3line,45read,2line"
292
314
  `[[3, 45], [3, 45]]`
293
315
 
316
+ "4subframe,89line"
317
+ `[[1], [1], [1], [1]]`
318
+
294
319
  Returns
295
320
  -------
296
- A list of lists. Top-level list contains an item for each coadd. These items are themselves lists of
297
- length 2. The numbers in these inner lists correspond to the number of bias and read frames in that coadd,
298
- respectively.
321
+ A list of lists. Top-level list contains an item for each coadd. In UpTheRamp mode these items are themselves
322
+ lists of length 2. The numbers in these inner lists correspond to the number of bias and read frames in that coadd,
323
+ respectively. In SubFrame mode the inner lists will always be length 1 and should be equal to `[1]`.
299
324
  """
300
- coadd_matches = self.camera_sequence_regex.findall(camera_sample_sequence)
301
- coadd_sequence_numbers = [
302
- [int(num) for num in coadd_match] for coadd_match in coadd_matches
303
- ]
325
+ if "subframe" in camera_sample_sequence:
326
+ coadd_matches = self.subframe_sequence_regex.findall(camera_sample_sequence)
327
+ # `is_ramp_valid` ensures we only have a single match here
328
+ num_coadd = int(coadd_matches[0])
329
+ coadd_sequence_numbers = [[1]] * num_coadd
330
+ else:
331
+ coadd_matches = self.uptheramp_coadd_regex.findall(camera_sample_sequence)
332
+ coadd_sequence_numbers = [
333
+ [int(num) for num in coadd_match] for coadd_match in coadd_matches
334
+ ]
304
335
 
305
336
  return coadd_sequence_numbers
306
337
 
@@ -310,15 +341,15 @@ class LinearityCorrection(DlnirspTaskBase):
310
341
 
311
342
  Current validity checks are:
312
343
 
313
- 1. All frames in the ramp have the same value for NUM_FRAMES_IN_RAMP
314
- 2. All frames in the ramp have the same value for CAMERA_READOUT_MODE
315
- 3. All frames in the ramp have the same value for MODULATOR_SPIN_MODE
316
- 4. The CAMERA_READOUT and MODULATOR_SPIN modes have expected values
317
- 5. The value of NUM_FRAMES_IN_RAMP equals the length of actual frames found
318
- 6. All frames in the ramp have the same value for CAMERA_SAMPLE_SEQUENCE
319
- 7. The camera sample sequence has the expected form ('(,?\d*line,\d*read)*(,\d*line)?')
320
- 8. All coadds in the ramp have the same camera sample sequence
321
- 9. The ramp length is equal to the expected length from the camera sample sequence
344
+ #. All frames in the ramp have the same value for NUM_FRAMES_IN_RAMP
345
+ #. All frames in the ramp have the same value for CAMERA_READOUT_MODE
346
+ #. All frames in the ramp have the same value for MODULATOR_SPIN_MODE
347
+ #. The CAMERA_READOUT and MODULATOR_SPIN modes have expected values
348
+ #. The value of NUM_FRAMES_IN_RAMP equals the length of actual frames found
349
+ #. All frames in the ramp have the same value for CAMERA_SAMPLE_SEQUENCE
350
+ #. The camera sample sequence has the expected form (`valid_camera_sequence_regex`)
351
+ #. All coadds in the ramp have the same camera sample sequence
352
+ #. The ramp length is equal to the expected length from the camera sample sequence
322
353
 
323
354
  If a ramp is not valid then the reason is logged and `False` is returned.
324
355
  """
@@ -382,7 +413,7 @@ class LinearityCorrection(DlnirspTaskBase):
382
413
  return False
383
414
 
384
415
  camera_sample_sequence = camera_sample_sequence_set.pop()
385
- if re.search(r"\d*line,\d*line", camera_sample_sequence):
416
+ if not self.valid_camera_sequence_regex.search(camera_sample_sequence):
386
417
  logger.info(
387
418
  f"Malformed camera sample sequence: '{camera_sample_sequence}'. "
388
419
  f"{common_status_str}"