dkist-processing-cryonirsp 1.4.14__py3-none-any.whl → 1.4.16rc1__py3-none-any.whl

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 (55) hide show
  1. changelog/170.feature.rst +11 -0
  2. changelog/170.misc.1.rst +2 -0
  3. changelog/170.misc.rst +3 -0
  4. changelog/174.bugfix.rst +1 -0
  5. dkist_processing_cryonirsp/codecs/__init__.py +5 -0
  6. dkist_processing_cryonirsp/codecs/fits.py +52 -0
  7. dkist_processing_cryonirsp/models/beam_boundaries.py +39 -0
  8. dkist_processing_cryonirsp/models/parameters.py +0 -1
  9. dkist_processing_cryonirsp/models/tags.py +34 -0
  10. dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +38 -2
  11. dkist_processing_cryonirsp/parsers/exposure_conditions.py +5 -3
  12. dkist_processing_cryonirsp/tasks/assemble_movie.py +2 -2
  13. dkist_processing_cryonirsp/tasks/bad_pixel_map.py +14 -9
  14. dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +24 -43
  15. dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +1 -1
  16. dkist_processing_cryonirsp/tasks/ci_science.py +24 -6
  17. dkist_processing_cryonirsp/tasks/cryonirsp_base.py +0 -10
  18. dkist_processing_cryonirsp/tasks/dark.py +34 -14
  19. dkist_processing_cryonirsp/tasks/gain.py +69 -22
  20. dkist_processing_cryonirsp/tasks/instrument_polarization.py +131 -49
  21. dkist_processing_cryonirsp/tasks/l1_output_data.py +0 -1
  22. dkist_processing_cryonirsp/tasks/linearity_correction.py +4 -7
  23. dkist_processing_cryonirsp/tasks/make_movie_frames.py +5 -5
  24. dkist_processing_cryonirsp/tasks/quality_metrics.py +4 -4
  25. dkist_processing_cryonirsp/tasks/science_base.py +34 -10
  26. dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +1 -1
  27. dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +14 -6
  28. dkist_processing_cryonirsp/tasks/sp_geometric.py +112 -39
  29. dkist_processing_cryonirsp/tasks/sp_science.py +53 -11
  30. dkist_processing_cryonirsp/tasks/sp_solar_gain.py +108 -29
  31. dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +2 -10
  32. dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +8 -11
  33. dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +1 -1
  34. dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +1 -2
  35. dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +6 -5
  36. dkist_processing_cryonirsp/tests/test_ci_science.py +25 -24
  37. dkist_processing_cryonirsp/tests/test_cryo_base.py +41 -43
  38. dkist_processing_cryonirsp/tests/test_dark.py +20 -28
  39. dkist_processing_cryonirsp/tests/test_gain.py +46 -35
  40. dkist_processing_cryonirsp/tests/test_instrument_polarization.py +22 -16
  41. dkist_processing_cryonirsp/tests/test_linearity_correction.py +1 -4
  42. dkist_processing_cryonirsp/tests/test_parse.py +41 -0
  43. dkist_processing_cryonirsp/tests/test_quality.py +1 -2
  44. dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +6 -5
  45. dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +10 -9
  46. dkist_processing_cryonirsp/tests/test_sp_geometric.py +108 -53
  47. dkist_processing_cryonirsp/tests/test_sp_science.py +49 -35
  48. dkist_processing_cryonirsp/tests/test_sp_solar.py +70 -38
  49. {dkist_processing_cryonirsp-1.4.14.dist-info → dkist_processing_cryonirsp-1.4.16rc1.dist-info}/METADATA +2 -2
  50. {dkist_processing_cryonirsp-1.4.14.dist-info → dkist_processing_cryonirsp-1.4.16rc1.dist-info}/RECORD +52 -48
  51. dkist_processing_cryonirsp/tasks/mixin/beam_access.py +0 -52
  52. dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +0 -193
  53. dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +0 -309
  54. {dkist_processing_cryonirsp-1.4.14.dist-info → dkist_processing_cryonirsp-1.4.16rc1.dist-info}/WHEEL +0 -0
  55. {dkist_processing_cryonirsp-1.4.14.dist-info → dkist_processing_cryonirsp-1.4.16rc1.dist-info}/top_level.txt +0 -0
@@ -127,7 +127,7 @@ def tag_linearized_inputs_task(suffix: str):
127
127
  )
128
128
  for file in input_file_list:
129
129
  logger.info(f"Found {file}")
130
- self.tag(path=file, tags=[CryonirspTag.linearized(), CryonirspTag.frame()])
130
+ self.tag(path=file, tags=CryonirspTag.linearized_frame())
131
131
  # Update the arm_id constant, as it is derived in linearity processing
132
132
  with fits.open(file) as hdul:
133
133
  if len(hdul) == 1:
@@ -189,7 +189,6 @@ def CI_workflow(
189
189
  manual_processing_run: ManualProcessing,
190
190
  load_beam_boundaries: bool = False,
191
191
  load_dark: bool = False,
192
- load_lamp: bool = False,
193
192
  load_solar: bool = False,
194
193
  load_inst_pol: bool = False,
195
194
  ) -> None:
@@ -205,12 +204,6 @@ def CI_workflow(
205
204
  manual_processing_run.run_task(task=DarkCalibration)
206
205
  manual_processing_run.run_task(task=SaveDarkCal)
207
206
 
208
- if load_lamp:
209
- manual_processing_run.run_task(task=LoadLampCal)
210
- else:
211
- manual_processing_run.run_task(task=LampGainCalibration)
212
- manual_processing_run.run_task(task=SaveLampCal)
213
-
214
207
  if load_solar:
215
208
  manual_processing_run.run_task(task=LoadSolarCal)
216
209
  else:
@@ -365,7 +358,7 @@ def main(
365
358
  if not skip_saving_parse:
366
359
  manual_processing_run.run_task(
367
360
  task=save_parsing_task(
368
- tag_list=[CryonirspTag.linearized(), CryonirspTag.frame()],
361
+ tag_list=CryonirspTag.linearized_frame(),
369
362
  save_file="linearized_parsing.asdf",
370
363
  )
371
364
  )
@@ -394,7 +387,6 @@ def main(
394
387
  manual_processing_run,
395
388
  load_beam_boundaries=load_beam_boundaries,
396
389
  load_dark=load_dark,
397
- load_lamp=load_lamp,
398
390
  load_solar=load_solar,
399
391
  load_inst_pol=load_inst_pol,
400
392
  )
@@ -144,7 +144,7 @@ def tag_linearized_inputs_task(suffix: str):
144
144
  )
145
145
  for file in input_file_list:
146
146
  logger.info(f"Found {file}")
147
- self.tag(path=file, tags=[CryonirspTag.linearized(), CryonirspTag.frame()])
147
+ self.tag(path=file, tags=CryonirspTag.linearized_frame())
148
148
  # Update the arm_id constant, as it is derived in linearity processing
149
149
  with fits.open(file) as hdul:
150
150
  if len(hdul) == 1:
@@ -165,7 +165,12 @@ class ShowPolMode(CryonirspTaskBase):
165
165
  class ShowExposureConditions(CryonirspTaskBase):
166
166
  def run(self) -> None:
167
167
  logger.info(f"{self.constants.dark_exposure_conditions_list = }")
168
- logger.info(f"{self.constants.lamp_gain_exposure_conditions_list = }")
168
+ try:
169
+ logger.info(f"{self.constants.lamp_gain_exposure_conditions_list = }")
170
+ except KeyError:
171
+ logger.info(
172
+ f"Lamp gain exposure conditions list does not exist. This is expected for CRYO-NIRSP CI."
173
+ )
169
174
  logger.info(f"{self.constants.solar_gain_exposure_conditions_list = }")
170
175
  if self.constants.correct_for_polarization:
171
176
  try:
@@ -207,7 +212,6 @@ def CI_workflow(
207
212
  manual_processing_run: ManualProcessing,
208
213
  load_beam_boundaries: bool = False,
209
214
  load_dark: bool = False,
210
- load_lamp: bool = False,
211
215
  load_solar: bool = False,
212
216
  load_inst_pol: bool = False,
213
217
  ) -> None:
@@ -223,12 +227,6 @@ def CI_workflow(
223
227
  manual_processing_run.run_task(task=DarkCalibration)
224
228
  manual_processing_run.run_task(task=SaveDarkCal)
225
229
 
226
- if load_lamp:
227
- manual_processing_run.run_task(task=LoadLampCal)
228
- else:
229
- manual_processing_run.run_task(task=LampGainCalibration)
230
- manual_processing_run.run_task(task=SaveLampCal)
231
-
232
230
  if load_solar:
233
231
  manual_processing_run.run_task(task=LoadSolarCal)
234
232
  else:
@@ -390,7 +388,7 @@ def main(
390
388
  if not skip_saving_parse:
391
389
  manual_processing_run.run_task(
392
390
  task=save_parsing_task(
393
- tag_list=[CryonirspTag.linearized(), CryonirspTag.frame()],
391
+ tag_list=CryonirspTag.linearized_frame(),
394
392
  save_file="linearized_parsing.asdf",
395
393
  )
396
394
  )
@@ -425,7 +423,6 @@ def main(
425
423
  manual_processing_run,
426
424
  load_beam_boundaries=load_beam_boundaries,
427
425
  load_dark=load_dark,
428
- load_lamp=load_lamp,
429
426
  load_solar=load_solar,
430
427
  load_inst_pol=load_inst_pol,
431
428
  )
@@ -222,7 +222,7 @@ class SaveGeometricCal(WorkflowTaskBase):
222
222
  )
223
223
  path_list += list(
224
224
  self.read(
225
- tags=[CryonirspTag.task_geometric_sepectral_shifts(), CryonirspTag.intermediate()]
225
+ tags=[CryonirspTag.task_geometric_spectral_shifts(), CryonirspTag.intermediate()]
226
226
  )
227
227
  )
228
228
  path_list += list(
@@ -81,9 +81,8 @@ def compute_bad_pixel_map_task(
81
81
  task.write(
82
82
  data=hdul,
83
83
  tags=[
84
- CryonirspTag.linearized(),
84
+ CryonirspTag.linearized_frame(),
85
85
  CryonirspTag.task_solar_gain(),
86
- CryonirspTag.frame(),
87
86
  ],
88
87
  encoder=fits_hdulist_encoder,
89
88
  )
@@ -5,6 +5,7 @@ import pytest
5
5
  from astropy.io import fits
6
6
  from dkist_header_validator import spec122_validator
7
7
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
+ from dkist_processing_common.codecs.fits import fits_array_encoder
8
9
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
9
10
  from dkist_processing_common.tests.conftest import FakeGQLClient
10
11
 
@@ -40,9 +41,10 @@ def compute_beam_boundaries_task(
40
41
  param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
41
42
  assign_input_dataset_doc_to_task(task, param_class())
42
43
  # Create fake bad pixel map
43
- task.intermediate_frame_write_arrays(
44
- arrays=np.zeros(array_shape[1:]),
45
- task_tag=CryonirspTag.task_bad_pixel_map(),
44
+ task.write(
45
+ data=np.zeros(array_shape[1:]),
46
+ tags=[CryonirspTag.intermediate_frame(), CryonirspTag.task_bad_pixel_map()],
47
+ encoder=fits_array_encoder,
46
48
  )
47
49
  start_time = datetime.now()
48
50
  ds = CryonirspHeadersValidCISolarGainFrames(
@@ -73,9 +75,8 @@ def compute_beam_boundaries_task(
73
75
  task.write(
74
76
  data=hdul,
75
77
  tags=[
76
- CryonirspTag.linearized(),
78
+ CryonirspTag.linearized_frame(),
77
79
  CryonirspTag.task_solar_gain(),
78
- CryonirspTag.frame(),
79
80
  ],
80
81
  encoder=fits_hdulist_encoder,
81
82
  )
@@ -9,6 +9,7 @@ from astropy.time import Time
9
9
  from astropy.time import TimeDelta
10
10
  from dkist_header_validator import spec122_validator
11
11
  from dkist_processing_common._util.scratch import WorkflowFileSystem
12
+ from dkist_processing_common.codecs.fits import fits_array_encoder
12
13
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
13
14
  from dkist_processing_common.tests.conftest import FakeGQLClient
14
15
 
@@ -73,14 +74,16 @@ def ci_science_calibration_task(
73
74
  assign_input_dataset_doc_to_task(task, param_class())
74
75
 
75
76
  # Need a beam boundary file
76
- task.intermediate_frame_write_arrays(
77
- arrays=np.array([0, intermediate_shape[0], 0, intermediate_shape[1]]),
78
- task_tag=CryonirspTag.task_beam_boundaries(),
79
- beam=1,
77
+ task.write(
78
+ data=np.array([0, intermediate_shape[0], 0, intermediate_shape[1]]),
79
+ tags=[CryonirspTag.intermediate_frame(beam=1), CryonirspTag.task_beam_boundaries()],
80
+ encoder=fits_array_encoder,
80
81
  )
81
82
  # Create fake bad pixel map
82
- task.intermediate_frame_write_arrays(
83
- arrays=np.zeros(array_shape[1:]), task_tag=CryonirspTag.task_bad_pixel_map()
83
+ task.write(
84
+ data=np.zeros(array_shape[1:]),
85
+ tags=[CryonirspTag.intermediate_frame(), CryonirspTag.task_bad_pixel_map()],
86
+ encoder=fits_array_encoder,
84
87
  )
85
88
 
86
89
  # Create fake demodulation matrices
@@ -91,20 +94,22 @@ def ci_science_calibration_task(
91
94
  task.write(
92
95
  data=demod_hdul,
93
96
  tags=[
94
- CryonirspTag.intermediate(),
95
- CryonirspTag.frame(),
97
+ CryonirspTag.intermediate_frame(beam=1),
96
98
  CryonirspTag.task_demodulation_matrices(),
97
- CryonirspTag.beam(1),
98
99
  ],
99
100
  encoder=fits_hdulist_encoder,
100
101
  )
101
102
 
102
103
  # Create fake dark intermediate arrays
103
- task.intermediate_frame_write_arrays(
104
- all_zeros,
105
- beam=1,
106
- task_tag=CryonirspTag.task_dark(),
107
- exposure_conditions=exposure_conditions,
104
+ task.write(
105
+ data=all_zeros,
106
+ tags=[
107
+ CryonirspTag.intermediate_frame(
108
+ beam=1, exposure_conditions=exposure_conditions
109
+ ),
110
+ CryonirspTag.task_dark(),
111
+ ],
112
+ encoder=fits_array_encoder,
108
113
  )
109
114
 
110
115
  # Create fake lamp and solar gain intermediate arrays
@@ -113,10 +118,8 @@ def ci_science_calibration_task(
113
118
  task.write(
114
119
  data=gain_hdul,
115
120
  tags=[
116
- CryonirspTag.intermediate(),
117
- CryonirspTag.frame(),
121
+ CryonirspTag.intermediate_frame(beam=1),
118
122
  CryonirspTag.task_lamp_gain(),
119
- CryonirspTag.beam(1),
120
123
  CryonirspTag.modstate(modstate),
121
124
  ],
122
125
  encoder=fits_hdulist_encoder,
@@ -124,10 +127,8 @@ def ci_science_calibration_task(
124
127
  task.write(
125
128
  data=gain_hdul,
126
129
  tags=[
127
- CryonirspTag.intermediate(),
128
- CryonirspTag.frame(),
130
+ CryonirspTag.intermediate_frame(beam=1),
129
131
  CryonirspTag.task_solar_gain(),
130
- CryonirspTag.beam(1),
131
132
  CryonirspTag.modstate(modstate),
132
133
  ],
133
134
  encoder=fits_hdulist_encoder,
@@ -172,9 +173,9 @@ def ci_science_calibration_task(
172
173
  CryonirspTag.scan_step(scan_step),
173
174
  CryonirspTag.map_scan(map_scan),
174
175
  CryonirspTag.modstate(modstate),
175
- CryonirspTag.linearized(),
176
- CryonirspTag.frame(),
177
- CryonirspTag.exposure_conditions(exposure_conditions),
176
+ CryonirspTag.linearized_frame(
177
+ exposure_conditions=exposure_conditions
178
+ ),
178
179
  CryonirspTag.meas_num(meas_num),
179
180
  ],
180
181
  encoder=fits_hdulist_encoder,
@@ -283,7 +284,7 @@ def test_ci_science_calibration_task(ci_science_calibration_task, mocker):
283
284
  data = json.load(f)
284
285
  assert isinstance(data, dict)
285
286
  assert data["total_frames"] == task.scratch.count_all(
286
- tags=[CryonirspTag.linearized(), CryonirspTag.frame(), CryonirspTag.task_observe()]
287
+ tags=[CryonirspTag.linearized_frame(), CryonirspTag.task_observe()]
287
288
  )
288
289
 
289
290
 
@@ -2,14 +2,12 @@ import numpy as np
2
2
  import pytest
3
3
  from astropy.io import fits
4
4
  from dkist_processing_common._util.scratch import WorkflowFileSystem
5
+ from dkist_processing_common.codecs.fits import fits_array_encoder
5
6
  from dkist_processing_common.codecs.fits import fits_hdu_decoder
6
7
 
8
+ from dkist_processing_cryonirsp.codecs.fits import cryo_fits_array_decoder
7
9
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
8
- from dkist_processing_cryonirsp.models.task_name import CryonirspTaskName
9
10
  from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
10
- from dkist_processing_cryonirsp.tasks.mixin.intermediate_frame import (
11
- IntermediateFrameMixin,
12
- )
13
11
  from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
14
12
  from dkist_processing_cryonirsp.tests.conftest import CryonirspConstantsDb
15
13
 
@@ -24,7 +22,7 @@ WAVE = 1082.0
24
22
  def cryo_science_task(
25
23
  tmp_path, recipe_run_id, assign_input_dataset_doc_to_task, init_cryonirsp_constants_db
26
24
  ):
27
- class Task(CryonirspTaskBase, IntermediateFrameMixin):
25
+ class Task(CryonirspTaskBase):
28
26
  def run(self):
29
27
  ...
30
28
 
@@ -54,21 +52,27 @@ def cryo_science_task(
54
52
  def test_write_intermediate_arrays(cryo_science_task):
55
53
  """
56
54
  Given: A CryonirspTaskBase task
57
- When: Using the helper to write a single intermediate array
55
+ When: Writing a single intermediate array
58
56
  Then: The array is written and tagged correctly
59
57
  """
60
58
  data = np.random.random((10, 10))
61
59
  head = fits.Header()
62
60
  head["TEST"] = "foo"
63
- cryo_science_task.intermediate_frame_write_arrays(
64
- arrays=data, headers=head, beam=1, map_scan=2, scan_step=3, task="BAR"
61
+ cryo_science_task.write(
62
+ data=data,
63
+ header=head,
64
+ tags=[
65
+ CryonirspTag.intermediate_frame(beam=1),
66
+ CryonirspTag.map_scan(2),
67
+ CryonirspTag.scan_step(3),
68
+ CryonirspTag.task("BAR"),
69
+ ],
70
+ encoder=fits_array_encoder,
65
71
  )
66
72
  loaded_list = list(
67
73
  cryo_science_task.read(
68
74
  tags=[
69
- CryonirspTag.intermediate(),
70
- CryonirspTag.frame(),
71
- CryonirspTag.beam(1),
75
+ CryonirspTag.intermediate_frame(beam=1),
72
76
  CryonirspTag.map_scan(2),
73
77
  CryonirspTag.scan_step(3),
74
78
  CryonirspTag.task("BAR"),
@@ -85,7 +89,7 @@ def test_write_intermediate_arrays(cryo_science_task):
85
89
  def test_write_intermediate_arrays_task_tag(cryo_science_task):
86
90
  """
87
91
  Given: A CryonirspTaskBase task
88
- When: Using the helper to write a single intermediate array with a formatted task tag input arg
92
+ When: Writing a single intermediate array with a formatted task tag input arg
89
93
  Then: The array is written and tagged correctly
90
94
  """
91
95
  data = np.random.random((10, 10))
@@ -93,8 +97,11 @@ def test_write_intermediate_arrays_task_tag(cryo_science_task):
93
97
  head["TEST"] = "foo"
94
98
 
95
99
  # bad_pixel_map chosen for no particular reason
96
- cryo_science_task.intermediate_frame_write_arrays(
97
- arrays=data, headers=head, task_tag=CryonirspTag.task_bad_pixel_map()
100
+ cryo_science_task.write(
101
+ data=data,
102
+ header=head,
103
+ tags=[CryonirspTag.intermediate_frame(), CryonirspTag.task_bad_pixel_map()],
104
+ encoder=fits_array_encoder,
98
105
  )
99
106
  loaded_list = list(
100
107
  cryo_science_task.read(
@@ -108,41 +115,27 @@ def test_write_intermediate_arrays_task_tag(cryo_science_task):
108
115
  assert hdu.header["TEST"] == "foo"
109
116
 
110
117
 
111
- def test_write_intermediate_arrays_task_collisions(cryo_science_task):
112
- """
113
- Given: A CryonirspTaskBase task
114
- When: Using the helper but providing invalid `task` or `task_tag` inputs
115
- Then: An error is raised
116
- """
117
- data = np.random.random((10, 10))
118
-
119
- # Test both given
120
- with pytest.raises(ValueError, match="Cannot specify"):
121
- cryo_science_task.intermediate_frame_write_arrays(
122
- arrays=data, task_tag=CryonirspTag.task_bad_pixel_map(), task="DARK"
123
- )
124
-
125
- # Test neither given
126
- with pytest.raises(ValueError, match="Must specify"):
127
- cryo_science_task.intermediate_frame_write_arrays(arrays=data)
128
-
129
-
130
118
  def test_write_intermediate_arrays_none_header(cryo_science_task):
131
119
  """
132
120
  Given: A CryonirspTaskBase task
133
- When: Using the helper to write a single intermediate array with no header
121
+ When: Writing a single intermediate array with no header
134
122
  Then: The array is written and tagged correctly
135
123
  """
136
124
  data = np.random.random((10, 10))
137
- cryo_science_task.intermediate_frame_write_arrays(
138
- arrays=data, headers=None, beam=1, map_scan=2, scan_step=3, task="BAR"
125
+ cryo_science_task.write(
126
+ data=data,
127
+ tags=[
128
+ CryonirspTag.intermediate_frame(beam=1),
129
+ CryonirspTag.map_scan(2),
130
+ CryonirspTag.scan_step(3),
131
+ CryonirspTag.task("BAR"),
132
+ ],
133
+ encoder=fits_array_encoder,
139
134
  )
140
135
  loaded_list = list(
141
136
  cryo_science_task.read(
142
137
  tags=[
143
- CryonirspTag.intermediate(),
144
- CryonirspTag.frame(),
145
- CryonirspTag.beam(1),
138
+ CryonirspTag.intermediate_frame(beam=1),
146
139
  CryonirspTag.map_scan(2),
147
140
  CryonirspTag.scan_step(3),
148
141
  CryonirspTag.task("BAR"),
@@ -159,7 +152,7 @@ def test_write_intermediate_arrays_none_header(cryo_science_task):
159
152
  def cryo_science_task_with_tagged_intermediates(
160
153
  recipe_run_id, tmpdir_factory, init_cryonirsp_constants_db
161
154
  ):
162
- class Task(CryonirspTaskBase, IntermediateFrameMixin):
155
+ class Task(CryonirspTaskBase):
163
156
  def run(self):
164
157
  ...
165
158
 
@@ -179,7 +172,7 @@ def cryo_science_task_with_tagged_intermediates(
179
172
  hdul = fits.HDUList([fits.PrimaryHDU(data=np.ones((2, 2)) * i)])
180
173
  fname = task.scratch.workflow_base_path / f"file{i}.fits"
181
174
  hdul.writeto(fname)
182
- task.tag(fname, tags + [CryonirspTag.intermediate(), CryonirspTag.frame()])
175
+ task.tag(fname, tags + CryonirspTag.intermediate_frame())
183
176
 
184
177
  yield task, tag_names, tag_vals
185
178
  finally:
@@ -189,7 +182,7 @@ def cryo_science_task_with_tagged_intermediates(
189
182
  def test_load_intermediate_arrays(cryo_science_task_with_tagged_intermediates):
190
183
  """
191
184
  Given: A task with tagged intermediate frames
192
- When: Using intermediate frame loaders to grab the intermediate frames
185
+ When: Reading intermediate frames
193
186
  Then: The correct arrays are returned
194
187
  """
195
188
  task, tag_names, tag_vals = cryo_science_task_with_tagged_intermediates
@@ -197,6 +190,11 @@ def test_load_intermediate_arrays(cryo_science_task_with_tagged_intermediates):
197
190
  [getattr(CryonirspTag, n)(v) for n, v in zip(nl, vl)] for nl, vl in zip(tag_names, tag_vals)
198
191
  ]
199
192
  for i, tags in enumerate(tag_list_list):
200
- arrays = list(task.intermediate_frame_load_intermediate_arrays(tags=tags))
193
+ arrays = list(
194
+ task.read(
195
+ tags=[CryonirspTag.intermediate_frame(), tags],
196
+ decoder=cryo_fits_array_decoder,
197
+ )
198
+ )
201
199
  assert len(arrays) == 1
202
200
  np.testing.assert_equal(arrays[0], np.ones((2, 2)) * i)
@@ -5,6 +5,7 @@ import pytest
5
5
  from astropy.io import fits
6
6
  from dkist_header_validator import spec122_validator
7
7
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
+ from dkist_processing_common.codecs.fits import fits_array_encoder
8
9
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
9
10
  from dkist_processing_common.tests.conftest import FakeGQLClient
10
11
 
@@ -65,10 +66,13 @@ def sp_dark_calibration_task(
65
66
  spectral_starting_pixel + illuminated_beam_shape[1],
66
67
  ]
67
68
  )
68
- task.intermediate_frame_write_arrays(
69
- arrays=beam_boundaries,
70
- task_tag=CryonirspTag.task_beam_boundaries(),
71
- beam=beam,
69
+ task.write(
70
+ data=beam_boundaries,
71
+ tags=[
72
+ CryonirspTag.intermediate_frame(beam=beam),
73
+ CryonirspTag.task_beam_boundaries(),
74
+ ],
75
+ encoder=fits_array_encoder,
72
76
  )
73
77
 
74
78
  ds = CryonirspHeadersValidDarkFrames(
@@ -91,10 +95,8 @@ def sp_dark_calibration_task(
91
95
  task.write(
92
96
  data=hdul,
93
97
  tags=[
94
- CryonirspTag.linearized(),
95
- CryonirspTag.frame(),
98
+ CryonirspTag.linearized_frame(exposure_conditions=condition),
96
99
  CryonirspTag.task_dark(),
97
- CryonirspTag.exposure_conditions(condition),
98
100
  ],
99
101
  encoder=fits_hdulist_encoder,
100
102
  )
@@ -139,10 +141,10 @@ def ci_dark_calibration_task(
139
141
  assign_input_dataset_doc_to_task(task, param_class())
140
142
 
141
143
  # Need a beam boundary file
142
- task.intermediate_frame_write_arrays(
143
- arrays=np.array([0, 10, 0, 10]),
144
- task_tag=CryonirspTag.task_beam_boundaries(),
145
- beam=1,
144
+ task.write(
145
+ data=np.array([0, 10, 0, 10]),
146
+ tags=[CryonirspTag.intermediate_frame(beam=1), CryonirspTag.task_beam_boundaries()],
147
+ encoder=fits_array_encoder,
146
148
  )
147
149
 
148
150
  ds = CryonirspHeadersValidDarkFrames(
@@ -164,10 +166,8 @@ def ci_dark_calibration_task(
164
166
  task.write(
165
167
  data=hdul,
166
168
  tags=[
167
- CryonirspTag.linearized(),
168
- CryonirspTag.frame(),
169
+ CryonirspTag.linearized_frame(exposure_conditions=condition),
169
170
  CryonirspTag.task_dark(),
170
- CryonirspTag.exposure_conditions(condition),
171
171
  ],
172
172
  encoder=fits_hdulist_encoder,
173
173
  )
@@ -201,9 +201,7 @@ def test_sp_dark_calibration_task(sp_dark_calibration_task, mocker):
201
201
  task.read(
202
202
  tags=[
203
203
  CryonirspTag.task_dark(),
204
- CryonirspTag.intermediate(),
205
- CryonirspTag.frame(),
206
- CryonirspTag.beam(b + 1),
204
+ CryonirspTag.intermediate_frame(beam=b + 1),
207
205
  CryonirspTag.exposure_conditions(condition),
208
206
  ]
209
207
  )
@@ -217,8 +215,7 @@ def test_sp_dark_calibration_task(sp_dark_calibration_task, mocker):
217
215
  unused_time_read = task.read(
218
216
  tags=[
219
217
  CryonirspTag.task_dark(),
220
- CryonirspTag.intermediate(),
221
- CryonirspTag.frame(),
218
+ CryonirspTag.intermediate_frame(),
222
219
  CryonirspTag.exposure_conditions(unused_condition),
223
220
  ]
224
221
  )
@@ -230,7 +227,7 @@ def test_sp_dark_calibration_task(sp_dark_calibration_task, mocker):
230
227
  data = json.load(f)
231
228
  assert isinstance(data, dict)
232
229
  assert data["total_frames"] == task.scratch.count_all(
233
- tags=[CryonirspTag.linearized(), CryonirspTag.frame(), CryonirspTag.task_dark()]
230
+ tags=[CryonirspTag.linearized_frame(), CryonirspTag.task_dark()]
234
231
  )
235
232
  assert data["frames_not_used"] == 3
236
233
 
@@ -253,10 +250,7 @@ def test_ci_dark_calibration_task(ci_dark_calibration_task, mocker):
253
250
  task.read(
254
251
  tags=[
255
252
  CryonirspTag.task_dark(),
256
- CryonirspTag.beam(1),
257
- CryonirspTag.intermediate(),
258
- CryonirspTag.frame(),
259
- CryonirspTag.exposure_conditions(condition),
253
+ CryonirspTag.intermediate_frame(beam=1, exposure_conditions=condition),
260
254
  ]
261
255
  )
262
256
  )
@@ -269,9 +263,7 @@ def test_ci_dark_calibration_task(ci_dark_calibration_task, mocker):
269
263
  unused_time_read = task.read(
270
264
  tags=[
271
265
  CryonirspTag.task_dark(),
272
- CryonirspTag.intermediate(),
273
- CryonirspTag.frame(),
274
- CryonirspTag.exposure_conditions(unused_condition),
266
+ CryonirspTag.intermediate_frame(exposure_conditions=unused_condition),
275
267
  ]
276
268
  )
277
269
  assert len(list(unused_time_read)) == 0
@@ -282,6 +274,6 @@ def test_ci_dark_calibration_task(ci_dark_calibration_task, mocker):
282
274
  data = json.load(f)
283
275
  assert isinstance(data, dict)
284
276
  assert data["total_frames"] == task.scratch.count_all(
285
- tags=[CryonirspTag.linearized(), CryonirspTag.frame(), CryonirspTag.task_dark()]
277
+ tags=[CryonirspTag.linearized_frame(), CryonirspTag.task_dark()]
286
278
  )
287
279
  assert data["frames_not_used"] == 3