dkist-processing-dlnirsp 0.32.8__py3-none-any.whl → 0.33.0__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.
Files changed (32) hide show
  1. dkist_processing_dlnirsp/models/constants.py +6 -0
  2. dkist_processing_dlnirsp/models/parameters.py +33 -3
  3. dkist_processing_dlnirsp/parsers/task.py +2 -25
  4. dkist_processing_dlnirsp/parsers/time.py +2 -2
  5. dkist_processing_dlnirsp/tasks/__init__.py +1 -2
  6. dkist_processing_dlnirsp/tasks/movie.py +1121 -0
  7. dkist_processing_dlnirsp/tasks/parse.py +13 -8
  8. dkist_processing_dlnirsp/tasks/solar.py +129 -30
  9. dkist_processing_dlnirsp/tests/conftest.py +46 -7
  10. dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py +21 -18
  11. dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py +21 -18
  12. dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py +21 -18
  13. dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py +1 -1
  14. dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py +2 -0
  15. dkist_processing_dlnirsp/tests/test_movie.py +141 -0
  16. dkist_processing_dlnirsp/tests/test_parameters.py +8 -0
  17. dkist_processing_dlnirsp/tests/test_parse.py +10 -0
  18. dkist_processing_dlnirsp/tests/test_science.py +0 -9
  19. dkist_processing_dlnirsp/tests/test_solar.py +114 -17
  20. dkist_processing_dlnirsp/tests/test_wavelength_calibration.py +4 -1
  21. dkist_processing_dlnirsp/workflows/l0_processing.py +6 -8
  22. dkist_processing_dlnirsp/workflows/trial_workflow.py +7 -7
  23. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/METADATA +52 -35
  24. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/RECORD +28 -30
  25. docs/gain.rst +7 -3
  26. dkist_processing_dlnirsp/tasks/assemble_movie.py +0 -150
  27. dkist_processing_dlnirsp/tasks/make_movie_frames.py +0 -156
  28. dkist_processing_dlnirsp/tests/test_assemble_movie.py +0 -169
  29. dkist_processing_dlnirsp/tests/test_make_movie_frames.py +0 -98
  30. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/WHEEL +0 -0
  31. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/entry_points.txt +0 -0
  32. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/top_level.txt +0 -0
@@ -13,11 +13,10 @@ from dkist_processing_common.tasks import WorkflowTaskBase
13
13
  from dkist_service_configuration.logging import logger
14
14
 
15
15
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
16
- from dkist_processing_dlnirsp.tasks import AssembleDlnirspMovie
17
16
  from dkist_processing_dlnirsp.tasks import DlnirspAssembleQualityData
18
17
  from dkist_processing_dlnirsp.tasks import DlnirspL0QualityMetrics
19
18
  from dkist_processing_dlnirsp.tasks import DlnirspL1QualityMetrics
20
- from dkist_processing_dlnirsp.tasks import MakeDlnirspMovieFrames
19
+ from dkist_processing_dlnirsp.tasks import MakeDlnirspMovie
21
20
  from dkist_processing_dlnirsp.tasks.bad_pixel_map import BadPixelCalibration
22
21
  from dkist_processing_dlnirsp.tasks.dark import DarkCalibration
23
22
  from dkist_processing_dlnirsp.tasks.geometric import GeometricCalibration
@@ -203,10 +202,11 @@ def main(
203
202
  load_bad_pixel: bool = False,
204
203
  load_geometric: bool = False,
205
204
  load_wavelength_calibration: bool = False,
206
- load_solar: bool = False,
207
205
  load_inst_polcal: bool = False,
206
+ load_solar: bool = False,
208
207
  load_solar_gain_as_science: bool = False,
209
208
  load_calibrated_data: bool = False,
209
+ skip_movie: bool = False,
210
210
  force_intensity_only: bool = False,
211
211
  transfer_trial_data: str | None = None,
212
212
  ):
@@ -305,18 +305,18 @@ def main(
305
305
  manual_processing_run.run_task(task=WavelengthCalibration)
306
306
  manual_processing_run.run_task(task=SaveWavelengthCal)
307
307
 
308
- if load_solar:
309
- manual_processing_run.run_task(task=LoadSolarCal)
310
- else:
311
- manual_processing_run.run_task(task=SolarCalibration)
312
- manual_processing_run.run_task(task=SaveSolarCal)
313
-
314
308
  if load_inst_polcal:
315
309
  manual_processing_run.run_task(task=LoadInstPolCal)
316
310
  else:
317
311
  manual_processing_run.run_task(task=InstrumentPolarizationCalibration)
318
312
  manual_processing_run.run_task(task=SaveInstPolCal)
319
313
 
314
+ if load_solar:
315
+ manual_processing_run.run_task(task=LoadSolarCal)
316
+ else:
317
+ manual_processing_run.run_task(task=SolarCalibration)
318
+ manual_processing_run.run_task(task=SaveSolarCal)
319
+
320
320
  if load_solar_gain_as_science:
321
321
  manual_processing_run.run_task(
322
322
  task=load_solar_gain_as_science_task(force_intensity_only=force_intensity_only)
@@ -338,8 +338,6 @@ def main(
338
338
  task=permissive_write_l1_task(force_intensity_only=force_intensity_only)
339
339
  )
340
340
  manual_processing_run.run_task(task=ValidateL1Output)
341
- manual_processing_run.run_task(task=MakeDlnirspMovieFrames)
342
- manual_processing_run.run_task(task=AssembleDlnirspMovie)
343
341
 
344
342
  manual_processing_run.run_task(task=DlnirspL0QualityMetrics)
345
343
  manual_processing_run.run_task(task=DlnirspL1QualityMetrics)
@@ -348,6 +346,9 @@ def main(
348
346
 
349
347
  manual_processing_run.run_task(task=CreateTrialQualityReport)
350
348
 
349
+ if not skip_movie:
350
+ manual_processing_run.run_task(task=MakeDlnirspMovie)
351
+
351
352
  if transfer_trial_data:
352
353
  transfer_trial_data_locally(
353
354
  trial_output_location=transfer_trial_data, processing_run=manual_processing_run
@@ -444,18 +445,18 @@ if __name__ == "__main__":
444
445
  help="Load wavelength calibration solution from previously saved run",
445
446
  action="store_true",
446
447
  )
447
- parser.add_argument(
448
- "-S",
449
- "--load-solar",
450
- help="Load solar calibration from previously saved run",
451
- action="store_true",
452
- )
453
448
  parser.add_argument(
454
449
  "-P",
455
450
  "--load-inst-polcal",
456
451
  help="Load instrument polarization calibration from previously saved run",
457
452
  action="store_true",
458
453
  )
454
+ parser.add_argument(
455
+ "-S",
456
+ "--load-solar",
457
+ help="Load solar calibration from previously saved run",
458
+ action="store_true",
459
+ )
459
460
  parser.add_argument(
460
461
  "-O",
461
462
  "--load-solar-gain-as-science",
@@ -465,6 +466,7 @@ if __name__ == "__main__":
465
466
  parser.add_argument(
466
467
  "-C", "--load-calibrated-data", help="Load CALIBRATED 'science' frames", action="store_true"
467
468
  )
469
+ parser.add_argument("-V", "--skip-movie", help="Don't make a browse movie", action="store_true")
468
470
  parser.add_argument(
469
471
  "-p",
470
472
  "--param-dir",
@@ -491,10 +493,11 @@ if __name__ == "__main__":
491
493
  load_bad_pixel=args.load_bad_pixel,
492
494
  load_geometric=args.load_geometric,
493
495
  load_wavelength_calibration=args.load_wavelength_calibration,
494
- load_solar=args.load_solar,
495
496
  load_inst_polcal=args.load_inst_polcal,
497
+ load_solar=args.load_solar,
496
498
  load_solar_gain_as_science=args.load_solar_gain_as_science,
497
499
  load_calibrated_data=args.load_calibrated_data,
500
+ skip_movie=args.skip_movie,
498
501
  force_intensity_only=args.force_I_only,
499
502
  transfer_trial_data=args.transfer_trial_data,
500
503
  )
@@ -13,7 +13,6 @@ from dkist_processing_common.tasks import WorkflowTaskBase
13
13
  from dkist_service_configuration.logging import logger
14
14
 
15
15
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
16
- from dkist_processing_dlnirsp.tasks.assemble_movie import AssembleDlnirspMovie
17
16
  from dkist_processing_dlnirsp.tasks.bad_pixel_map import BadPixelCalibration
18
17
  from dkist_processing_dlnirsp.tasks.dark import DarkCalibration
19
18
  from dkist_processing_dlnirsp.tasks.geometric import GeometricCalibration
@@ -22,7 +21,7 @@ from dkist_processing_dlnirsp.tasks.instrument_polarization import InstrumentPol
22
21
  from dkist_processing_dlnirsp.tasks.l1_output_data import DlnirspAssembleQualityData
23
22
  from dkist_processing_dlnirsp.tasks.lamp import LampCalibration
24
23
  from dkist_processing_dlnirsp.tasks.linearity_correction import LinearityCorrection
25
- from dkist_processing_dlnirsp.tasks.make_movie_frames import MakeDlnirspMovieFrames
24
+ from dkist_processing_dlnirsp.tasks.movie import MakeDlnirspMovie
26
25
  from dkist_processing_dlnirsp.tasks.parse import ParseL0DlnirspLinearizedData
27
26
  from dkist_processing_dlnirsp.tasks.parse import ParseL0DlnirspRampData
28
27
  from dkist_processing_dlnirsp.tasks.quality_metrics import DlnirspL0QualityMetrics
@@ -171,9 +170,10 @@ def main(
171
170
  load_bad_pixel: bool = False,
172
171
  load_geometric: bool = False,
173
172
  load_wavelength_calibration: bool = False,
174
- load_solar: bool = False,
175
173
  load_inst_polcal: bool = False,
174
+ load_solar: bool = False,
176
175
  load_calibrated_data: bool = False,
176
+ skip_movie: bool = False,
177
177
  transfer_trial_data: str | None = None,
178
178
  ):
179
179
  with ManualProcessing(
@@ -261,18 +261,18 @@ def main(
261
261
  manual_processing_run.run_task(task=WavelengthCalibration)
262
262
  manual_processing_run.run_task(task=SaveWavelengthCal)
263
263
 
264
- if load_solar:
265
- manual_processing_run.run_task(task=LoadSolarCal)
266
- else:
267
- manual_processing_run.run_task(task=SolarCalibration)
268
- manual_processing_run.run_task(task=SaveSolarCal)
269
-
270
264
  if load_inst_polcal:
271
265
  manual_processing_run.run_task(task=LoadInstPolCal)
272
266
  else:
273
267
  manual_processing_run.run_task(task=InstrumentPolarizationCalibration)
274
268
  manual_processing_run.run_task(task=SaveInstPolCal)
275
269
 
270
+ if load_solar:
271
+ manual_processing_run.run_task(task=LoadSolarCal)
272
+ else:
273
+ manual_processing_run.run_task(task=SolarCalibration)
274
+ manual_processing_run.run_task(task=SaveSolarCal)
275
+
276
276
  if load_calibrated_data:
277
277
  manual_processing_run.run_task(task=LoadCalibratedData)
278
278
  else:
@@ -281,8 +281,6 @@ def main(
281
281
 
282
282
  manual_processing_run.run_task(task=DlnirspWriteL1Frame)
283
283
  manual_processing_run.run_task(task=ValidateL1Output)
284
- manual_processing_run.run_task(task=MakeDlnirspMovieFrames)
285
- manual_processing_run.run_task(task=AssembleDlnirspMovie)
286
284
 
287
285
  manual_processing_run.run_task(task=DlnirspL0QualityMetrics)
288
286
  manual_processing_run.run_task(task=DlnirspL1QualityMetrics)
@@ -293,6 +291,9 @@ def main(
293
291
 
294
292
  manual_processing_run.run_task(task=CreateTrialAsdf)
295
293
 
294
+ if not skip_movie:
295
+ manual_processing_run.run_task(task=MakeDlnirspMovie)
296
+
296
297
  if transfer_trial_data:
297
298
  transfer_trial_data_locally(
298
299
  trial_output_location=transfer_trial_data, processing_run=manual_processing_run
@@ -391,21 +392,22 @@ if __name__ == "__main__":
391
392
  help="Load wavelength calibration solution from previously saved run",
392
393
  action="store_true",
393
394
  )
394
- parser.add_argument(
395
- "-S",
396
- "--load-solar",
397
- help="Load solar calibration from previously saved run",
398
- action="store_true",
399
- )
400
395
  parser.add_argument(
401
396
  "-P",
402
397
  "--load-inst-polcal",
403
398
  help="Load instrument polarization calibration from previously saved run",
404
399
  action="store_true",
405
400
  )
401
+ parser.add_argument(
402
+ "-S",
403
+ "--load-solar",
404
+ help="Load solar calibration from previously saved run",
405
+ action="store_true",
406
+ )
406
407
  parser.add_argument(
407
408
  "-C", "--load-calibrated-data", help="Load CALIBRATED science frames", action="store_true"
408
409
  )
410
+ parser.add_argument("-V", "--skip-movie", help="Don't make a browse movie", action="store_true")
409
411
  parser.add_argument(
410
412
  "-p",
411
413
  "--param-dir",
@@ -432,9 +434,10 @@ if __name__ == "__main__":
432
434
  load_bad_pixel=args.load_bad_pixel,
433
435
  load_geometric=args.load_geometric,
434
436
  load_wavelength_calibration=args.load_wavelength_calibration,
435
- load_solar=args.load_solar,
436
437
  load_inst_polcal=args.load_inst_polcal,
438
+ load_solar=args.load_solar,
437
439
  load_calibrated_data=args.load_calibrated_data,
440
+ skip_movie=args.skip_movie,
438
441
  transfer_trial_data=args.transfer_trial_data,
439
442
  )
440
443
  )
@@ -89,7 +89,7 @@ def permissive_write_l1_task(force_intensity_only: bool):
89
89
  self, header: fits.Header, stokes: Literal["I", "Q", "U", "V"]
90
90
  ) -> fits.Header:
91
91
  if force_intensity_only:
92
- header[MetadataKey.polarimeter_mode] = "Stokes I"
92
+ header[DlnirspMetadataKey.polarimeter_mode] = "Stokes I"
93
93
 
94
94
  return super().add_dataset_headers(header=header, stokes=stokes)
95
95
 
@@ -28,6 +28,7 @@ class test_constants:
28
28
  arm_position_mm: float = 39.2
29
29
  grating_constant_inverse_mm: float = 19.0
30
30
  grating_position_deg: float = 87.4
31
+ obs_ip_end_time: str = "2000-01-01T00:01:00"
31
32
  # We don't need all the common ones, but let's put one just to check
32
33
  instrument: str = "CHECK_OUT_THIS_INSTRUMENT"
33
34
 
@@ -47,6 +48,7 @@ def simple_constant_names():
47
48
  "observe_exposure_times",
48
49
  "num_modstates",
49
50
  "solar_gain_ip_start_time",
51
+ "obs_ip_end_time",
50
52
  "instrument",
51
53
  ]
52
54
 
@@ -0,0 +1,141 @@
1
+ import shutil
2
+
3
+ import numpy as np
4
+ import pytest
5
+ from dkist_processing_common._util.scratch import WorkflowFileSystem
6
+ from dkist_processing_common.codecs.json import json_encoder
7
+
8
+ from dkist_processing_dlnirsp.models.tags import DlnirspTag
9
+ from dkist_processing_dlnirsp.tasks.movie import MakeDlnirspMovie
10
+ from dkist_processing_dlnirsp.tests.conftest import CalibratedHeaders
11
+ from dkist_processing_dlnirsp.tests.conftest import DlnirspTestingConstants
12
+ from dkist_processing_dlnirsp.tests.conftest import DlnirspTestingParameters
13
+ from dkist_processing_dlnirsp.tests.conftest import write_calibrated_frames_to_task
14
+
15
+
16
+ @pytest.fixture
17
+ def movie_task(recipe_run_id, tmp_path, link_constants_db, assign_input_dataset_doc_to_task):
18
+ link_constants_db(
19
+ recipe_run_id=recipe_run_id,
20
+ constants_obj=DlnirspTestingConstants(),
21
+ )
22
+ with MakeDlnirspMovie(
23
+ recipe_run_id=recipe_run_id,
24
+ workflow_name="workflow_name",
25
+ workflow_version="workflow_version",
26
+ ) as task:
27
+ assign_input_dataset_doc_to_task(
28
+ task,
29
+ DlnirspTestingParameters(),
30
+ arm_id="VIS",
31
+ )
32
+ task.scratch = WorkflowFileSystem(scratch_base_path=tmp_path, recipe_run_id=recipe_run_id)
33
+
34
+ yield task
35
+ task._purge()
36
+
37
+
38
+ @pytest.fixture(scope="session")
39
+ def num_spectral_pix() -> int:
40
+ return 396
41
+
42
+
43
+ @pytest.fixture(scope="session")
44
+ def valid_wavelength_solution_header(num_spectral_pix) -> dict[str, str | int | float]:
45
+ """A valid wavelength solution header that depends on `arm_id='vis'` in `movie_task`."""
46
+ return {
47
+ "CTYPE3": "AWAV-GRA",
48
+ "CUNIT3": "nm",
49
+ "CRPIX3": num_spectral_pix // 2,
50
+ "CRVAL3": 854.17,
51
+ "CDELT3": 0.00229,
52
+ "PV3_0": 23000,
53
+ "PV3_1": 90,
54
+ "PV3_2": 65.69,
55
+ }
56
+
57
+
58
+ def mindices_data_func(frame: CalibratedHeaders) -> np.ndarray:
59
+ shape = frame.array_shape
60
+
61
+ return np.ones(shape) * (1000 * frame.current_MINDEX1_value + 100 * frame.current_MINDEX2_value)
62
+
63
+
64
+ @pytest.mark.parametrize(
65
+ "has_multiple_mosaics",
66
+ [pytest.param(True, id="multi_mosaic"), pytest.param(False, id="single_mosaic")],
67
+ )
68
+ @pytest.mark.parametrize(
69
+ "is_polarimetric",
70
+ [pytest.param(True, id="polarimetric"), pytest.param(False, id="spectrographic")],
71
+ )
72
+ @pytest.mark.parametrize(
73
+ "is_mosaiced", [pytest.param(True, id="mosaiced"), pytest.param(False, id="no_mosaic")]
74
+ )
75
+ def test_movie_task(
76
+ movie_task,
77
+ has_multiple_mosaics,
78
+ is_polarimetric,
79
+ is_mosaiced,
80
+ num_spectral_pix,
81
+ valid_wavelength_solution_header,
82
+ link_constants_db,
83
+ mocker,
84
+ fake_gql_client,
85
+ ):
86
+ """
87
+ Given: A `MakeDlnirspMovie` task with CALIBRATED frames
88
+ When: Running the task
89
+ Then: The dang thing runs and produces the expected movie file
90
+ """
91
+ mocker.patch(
92
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
93
+ )
94
+
95
+ num_dither = 1
96
+ num_mosaics = 2 if has_multiple_mosaics else 1
97
+ num_X_tiles = 2 if is_mosaiced else 1
98
+ num_Y_tiles = 2 if is_mosaiced else 1
99
+ stokes_params = ["I"]
100
+ if is_polarimetric:
101
+ stokes_params += ["Q", "U", "V"]
102
+ num_modstates = 8
103
+ pol_mode = "Full Stokes"
104
+ else:
105
+ num_modstates = 1
106
+ pol_mode = "Stokes I"
107
+
108
+ task = movie_task
109
+
110
+ constants_db = DlnirspTestingConstants(
111
+ POLARIMETER_MODE=pol_mode,
112
+ NUM_DITHER_STEPS=num_dither,
113
+ NUM_MOSAIC_REPEATS=num_mosaics,
114
+ NUM_MOSAIC_TILES_X=num_X_tiles,
115
+ NUM_MOSAIC_TILES_Y=num_Y_tiles,
116
+ NUM_MODSTATES=num_modstates,
117
+ )
118
+ link_constants_db(task.recipe_run_id, constants_db)
119
+
120
+ write_calibrated_frames_to_task(
121
+ task,
122
+ num_mosaics=num_mosaics,
123
+ num_X_tiles=num_X_tiles,
124
+ num_Y_tiles=num_Y_tiles,
125
+ dither_mode_on=False,
126
+ is_polarimetric=is_polarimetric,
127
+ array_shape=(num_spectral_pix, 20, 30),
128
+ data_func=mindices_data_func,
129
+ )
130
+
131
+ task.write(
132
+ data=valid_wavelength_solution_header,
133
+ tags=[DlnirspTag.intermediate(), DlnirspTag.task_wavelength_solution()],
134
+ encoder=json_encoder,
135
+ )
136
+
137
+ task()
138
+
139
+ movie_file_list = list(task.read(tags=[DlnirspTag.output(), DlnirspTag.movie()]))
140
+
141
+ assert len(movie_file_list) == 1
@@ -53,6 +53,12 @@ def arm_parameter_names() -> list[str]:
53
53
  "ifu_y_pos_file_vis",
54
54
  "ifu_y_pos_file_jband",
55
55
  "ifu_y_pos_file_hband",
56
+ "movie_core_wave_value_nm_vis",
57
+ "movie_core_wave_value_nm_jband",
58
+ "movie_core_wave_value_nm_hband",
59
+ "movie_cont_wave_value_nm_vis",
60
+ "movie_cont_wave_value_nm_jband",
61
+ "movie_cont_wave_value_nm_hband",
56
62
  ]
57
63
 
58
64
 
@@ -170,6 +176,8 @@ def test_standard_parameters(
170
176
  np.testing.assert_array_equal(param_obj_value, pv)
171
177
  elif isinstance(param_obj_value, BaseModel):
172
178
  assert param_obj_value.model_dump() == pv
179
+ elif property_name == "movie_vertical_nan_slices":
180
+ assert [slice(*i) for i in pv] == param_obj_value
173
181
  else:
174
182
  assert param_obj_value == pv
175
183
 
@@ -1,3 +1,5 @@
1
+ import datetime
2
+
1
3
  import numpy as np
2
4
  import pytest
3
5
  from astropy.io import fits
@@ -255,6 +257,8 @@ def test_parse_linearized_data(
255
257
  grating_constant=grating_constant * 300,
256
258
  grating_angle=grating_angle * -6,
257
259
  )
260
+ obs_start_time = "2020-01-01T01:23:45"
261
+ modstate_length_sec = 0.5
258
262
  num_obs = write_observe_frames_to_task(
259
263
  task,
260
264
  num_modstates=num_mod,
@@ -267,8 +271,13 @@ def test_parse_linearized_data(
267
271
  grating_constant=grating_constant,
268
272
  grating_angle=grating_angle,
269
273
  dither_mode_on=dither_mode_on,
274
+ start_date=obs_start_time,
275
+ modstate_length_sec=modstate_length_sec,
270
276
  swap_crpix_values="swap" in task.parameters.wcs_crpix_correction_method,
271
277
  )
278
+ obs_end_time = datetime.datetime.fromisoformat(obs_start_time) + datetime.timedelta(
279
+ seconds=num_obs * modstate_length_sec
280
+ )
272
281
 
273
282
  task()
274
283
 
@@ -350,6 +359,7 @@ def test_parse_linearized_data(
350
359
  assert task.constants._db_dict[BudName.solar_gain_gos_level3_status] == "clear"
351
360
  assert task.constants._db_dict[BudName.solar_gain_num_raw_frames_per_fpa] == 30
352
361
  assert task.constants._db_dict[BudName.polcal_num_raw_frames_per_fpa] == 10
362
+ assert task.constants._db_dict[DlnirspBudName.obs_ip_end_time] == obs_end_time.isoformat("T")
353
363
 
354
364
 
355
365
  def test_crpix_and_spatial_step_association_swapped(
@@ -70,15 +70,6 @@ def make_solar_data(solar_signal):
70
70
  return make_array
71
71
 
72
72
 
73
- @pytest.fixture
74
- def make_full_demodulation_matrix(demodulation_matrix):
75
- def make_array(frame: Spec122Dataset):
76
- array_shape = frame.array_shape[1:]
77
- return np.ones(array_shape + demodulation_matrix.shape) * demodulation_matrix
78
-
79
- return make_array
80
-
81
-
82
73
  @pytest.fixture
83
74
  def make_linearized_science_data(
84
75
  dark_signal,