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.
- dkist_processing_dlnirsp/models/constants.py +6 -0
- dkist_processing_dlnirsp/models/parameters.py +33 -3
- dkist_processing_dlnirsp/parsers/task.py +2 -25
- dkist_processing_dlnirsp/parsers/time.py +2 -2
- dkist_processing_dlnirsp/tasks/__init__.py +1 -2
- dkist_processing_dlnirsp/tasks/movie.py +1121 -0
- dkist_processing_dlnirsp/tasks/parse.py +13 -8
- dkist_processing_dlnirsp/tasks/solar.py +129 -30
- dkist_processing_dlnirsp/tests/conftest.py +46 -7
- dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py +21 -18
- dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py +21 -18
- dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py +21 -18
- dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py +1 -1
- dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py +2 -0
- dkist_processing_dlnirsp/tests/test_movie.py +141 -0
- dkist_processing_dlnirsp/tests/test_parameters.py +8 -0
- dkist_processing_dlnirsp/tests/test_parse.py +10 -0
- dkist_processing_dlnirsp/tests/test_science.py +0 -9
- dkist_processing_dlnirsp/tests/test_solar.py +114 -17
- dkist_processing_dlnirsp/tests/test_wavelength_calibration.py +4 -1
- dkist_processing_dlnirsp/workflows/l0_processing.py +6 -8
- dkist_processing_dlnirsp/workflows/trial_workflow.py +7 -7
- {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/METADATA +52 -35
- {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/RECORD +28 -30
- docs/gain.rst +7 -3
- dkist_processing_dlnirsp/tasks/assemble_movie.py +0 -150
- dkist_processing_dlnirsp/tasks/make_movie_frames.py +0 -156
- dkist_processing_dlnirsp/tests/test_assemble_movie.py +0 -169
- dkist_processing_dlnirsp/tests/test_make_movie_frames.py +0 -98
- {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/WHEEL +0 -0
- {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/entry_points.txt +0 -0
- {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
|
|
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.
|
|
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[
|
|
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,
|