dkist-processing-cryonirsp 1.4.20__py3-none-any.whl → 1.14.9rc1__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 (95) hide show
  1. changelog/232.misc.rst +1 -0
  2. dkist_processing_cryonirsp/__init__.py +1 -0
  3. dkist_processing_cryonirsp/codecs/fits.py +1 -0
  4. dkist_processing_cryonirsp/config.py +5 -1
  5. dkist_processing_cryonirsp/models/beam_boundaries.py +1 -0
  6. dkist_processing_cryonirsp/models/constants.py +31 -30
  7. dkist_processing_cryonirsp/models/exposure_conditions.py +6 -5
  8. dkist_processing_cryonirsp/models/fits_access.py +40 -0
  9. dkist_processing_cryonirsp/models/parameters.py +14 -26
  10. dkist_processing_cryonirsp/models/tags.py +1 -0
  11. dkist_processing_cryonirsp/models/task_name.py +1 -0
  12. dkist_processing_cryonirsp/parsers/check_for_gains.py +1 -0
  13. dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +40 -47
  14. dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +1 -0
  15. dkist_processing_cryonirsp/parsers/exposure_conditions.py +14 -13
  16. dkist_processing_cryonirsp/parsers/map_repeats.py +1 -0
  17. dkist_processing_cryonirsp/parsers/measurements.py +29 -16
  18. dkist_processing_cryonirsp/parsers/modstates.py +5 -1
  19. dkist_processing_cryonirsp/parsers/optical_density_filters.py +1 -0
  20. dkist_processing_cryonirsp/parsers/polarimetric_check.py +18 -7
  21. dkist_processing_cryonirsp/parsers/scan_step.py +12 -4
  22. dkist_processing_cryonirsp/parsers/time.py +7 -7
  23. dkist_processing_cryonirsp/parsers/wavelength.py +6 -1
  24. dkist_processing_cryonirsp/tasks/__init__.py +2 -1
  25. dkist_processing_cryonirsp/tasks/assemble_movie.py +1 -0
  26. dkist_processing_cryonirsp/tasks/bad_pixel_map.py +6 -5
  27. dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +12 -11
  28. dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +1 -0
  29. dkist_processing_cryonirsp/tasks/ci_science.py +1 -0
  30. dkist_processing_cryonirsp/tasks/cryonirsp_base.py +2 -3
  31. dkist_processing_cryonirsp/tasks/dark.py +5 -4
  32. dkist_processing_cryonirsp/tasks/gain.py +7 -6
  33. dkist_processing_cryonirsp/tasks/instrument_polarization.py +17 -16
  34. dkist_processing_cryonirsp/tasks/l1_output_data.py +1 -0
  35. dkist_processing_cryonirsp/tasks/linearity_correction.py +1 -0
  36. dkist_processing_cryonirsp/tasks/make_movie_frames.py +3 -2
  37. dkist_processing_cryonirsp/tasks/mixin/corrections.py +1 -0
  38. dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +9 -2
  39. dkist_processing_cryonirsp/tasks/parse.py +70 -52
  40. dkist_processing_cryonirsp/tasks/quality_metrics.py +15 -14
  41. dkist_processing_cryonirsp/tasks/science_base.py +8 -6
  42. dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +2 -1
  43. dkist_processing_cryonirsp/tasks/sp_geometric.py +11 -10
  44. dkist_processing_cryonirsp/tasks/sp_science.py +1 -0
  45. dkist_processing_cryonirsp/tasks/sp_solar_gain.py +15 -12
  46. dkist_processing_cryonirsp/tasks/sp_wavelength_calibration.py +300 -0
  47. dkist_processing_cryonirsp/tasks/write_l1.py +59 -38
  48. dkist_processing_cryonirsp/tests/conftest.py +75 -53
  49. dkist_processing_cryonirsp/tests/header_models.py +62 -11
  50. dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +26 -46
  51. dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +26 -47
  52. dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +3 -3
  53. dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +57 -26
  54. dkist_processing_cryonirsp/tests/test_assemble_movie.py +4 -5
  55. dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +5 -1
  56. dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +4 -5
  57. dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +4 -5
  58. dkist_processing_cryonirsp/tests/test_ci_science.py +4 -5
  59. dkist_processing_cryonirsp/tests/test_corrections.py +5 -6
  60. dkist_processing_cryonirsp/tests/test_cryo_base.py +4 -6
  61. dkist_processing_cryonirsp/tests/test_cryo_constants.py +7 -3
  62. dkist_processing_cryonirsp/tests/test_dark.py +7 -8
  63. dkist_processing_cryonirsp/tests/test_fits_access.py +44 -0
  64. dkist_processing_cryonirsp/tests/test_gain.py +7 -8
  65. dkist_processing_cryonirsp/tests/test_instrument_polarization.py +19 -10
  66. dkist_processing_cryonirsp/tests/test_linearity_correction.py +5 -4
  67. dkist_processing_cryonirsp/tests/test_make_movie_frames.py +2 -3
  68. dkist_processing_cryonirsp/tests/test_parameters.py +23 -28
  69. dkist_processing_cryonirsp/tests/test_parse.py +48 -12
  70. dkist_processing_cryonirsp/tests/test_quality.py +2 -3
  71. dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +5 -5
  72. dkist_processing_cryonirsp/tests/test_sp_geometric.py +5 -6
  73. dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +2 -3
  74. dkist_processing_cryonirsp/tests/test_sp_science.py +4 -5
  75. dkist_processing_cryonirsp/tests/test_sp_solar.py +6 -5
  76. dkist_processing_cryonirsp/tests/{test_sp_dispersion_axis_correction.py → test_sp_wavelength_calibration.py} +11 -29
  77. dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +1 -1
  78. dkist_processing_cryonirsp/tests/test_workflows.py +1 -0
  79. dkist_processing_cryonirsp/tests/test_write_l1.py +29 -31
  80. dkist_processing_cryonirsp/workflows/__init__.py +1 -0
  81. dkist_processing_cryonirsp/workflows/ci_l0_processing.py +9 -5
  82. dkist_processing_cryonirsp/workflows/sp_l0_processing.py +12 -8
  83. dkist_processing_cryonirsp/workflows/trial_workflows.py +12 -11
  84. dkist_processing_cryonirsp-1.14.9rc1.dist-info/METADATA +552 -0
  85. dkist_processing_cryonirsp-1.14.9rc1.dist-info/RECORD +115 -0
  86. {dkist_processing_cryonirsp-1.4.20.dist-info → dkist_processing_cryonirsp-1.14.9rc1.dist-info}/WHEEL +1 -1
  87. docs/ci_science_calibration.rst +10 -0
  88. docs/conf.py +1 -0
  89. docs/index.rst +1 -0
  90. docs/sp_science_calibration.rst +7 -0
  91. docs/wavelength_calibration.rst +62 -0
  92. dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +0 -492
  93. dkist_processing_cryonirsp-1.4.20.dist-info/METADATA +0 -452
  94. dkist_processing_cryonirsp-1.4.20.dist-info/RECORD +0 -111
  95. {dkist_processing_cryonirsp-1.4.20.dist-info → dkist_processing_cryonirsp-1.14.9rc1.dist-info}/top_level.txt +0 -0
@@ -14,6 +14,7 @@ from dkist_processing_common.tasks import WorkflowTaskBase
14
14
  from dkist_service_configuration.logging import logger
15
15
 
16
16
  from dkist_processing_cryonirsp.models.constants import CryonirspBudName
17
+ from dkist_processing_cryonirsp.models.fits_access import CryonirspMetadataKey
17
18
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
18
19
  from dkist_processing_cryonirsp.tasks import CIBeamBoundariesCalibration
19
20
  from dkist_processing_cryonirsp.tasks import CIScienceCalibration
@@ -39,21 +40,13 @@ from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspSPLinearizedD
39
40
  from dkist_processing_cryonirsp.tasks.quality_metrics import CryonirspL0QualityMetrics
40
41
  from dkist_processing_cryonirsp.tasks.quality_metrics import CryonirspL1QualityMetrics
41
42
  from dkist_processing_cryonirsp.tasks.sp_beam_boundaries import SPBeamBoundariesCalibration
42
- from dkist_processing_cryonirsp.tasks.sp_dispersion_axis_correction import (
43
- SPDispersionAxisCorrection,
44
- )
45
43
  from dkist_processing_cryonirsp.tasks.sp_geometric import SPGeometricCalibration
46
44
  from dkist_processing_cryonirsp.tasks.sp_science import SPScienceCalibration
47
45
  from dkist_processing_cryonirsp.tasks.sp_solar_gain import SPSolarGainCalibration
46
+ from dkist_processing_cryonirsp.tasks.sp_wavelength_calibration import SPWavelengthCalibration
48
47
  from dkist_processing_cryonirsp.tasks.write_l1 import CIWriteL1Frame
49
48
  from dkist_processing_cryonirsp.tasks.write_l1 import SPWriteL1Frame
50
- from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
51
- create_input_dataset_parameter_document,
52
- )
53
49
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import DBAccess
54
- from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
55
- load_parsing_task,
56
- )
57
50
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
58
51
  LoadBadPixelMap,
59
52
  )
@@ -61,9 +54,6 @@ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers
61
54
  LoadBeamBoundaryCal,
62
55
  )
63
56
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import LoadDarkCal
64
- from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
65
- LoadDispersionAxisCorrection,
66
- )
67
57
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
68
58
  LoadGeometricCal,
69
59
  )
@@ -76,7 +66,7 @@ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers
76
66
  )
77
67
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import LoadSolarCal
78
68
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
79
- save_parsing_task,
69
+ LoadWavelengthCorrection,
80
70
  )
81
71
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
82
72
  SaveBadPixelMap,
@@ -85,9 +75,6 @@ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers
85
75
  SaveBeamBoundaryCal,
86
76
  )
87
77
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import SaveDarkCal
88
- from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
89
- SaveDispersionAxisCorrection,
90
- )
91
78
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
92
79
  SaveGeometricCal,
93
80
  )
@@ -99,6 +86,18 @@ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers
99
86
  SaveLinearizedFiles,
100
87
  )
101
88
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import SaveSolarCal
89
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
90
+ SaveWavelengthCorrection,
91
+ )
92
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
93
+ create_input_dataset_parameter_document,
94
+ )
95
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
96
+ load_parsing_task,
97
+ )
98
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
99
+ save_parsing_task,
100
+ )
102
101
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
103
102
  tag_inputs_task,
104
103
  )
@@ -151,7 +150,7 @@ def tag_linearized_inputs_task(suffix: str):
151
150
  hdu = hdul[0]
152
151
  else:
153
152
  hdu = hdul[1]
154
- arm_id = hdu.header["CNARMID"]
153
+ arm_id = hdu.header[CryonirspMetadataKey.arm_id]
155
154
  self.constants._update({CryonirspBudName.arm_id.value: arm_id})
156
155
 
157
156
  return TagLinearizedInputs
@@ -193,21 +192,6 @@ class ValidateL1Output(CryonirspTaskBase):
193
192
  spec214_validator.validate(f, extra=False)
194
193
 
195
194
 
196
- def setup_APM_config() -> None:
197
- mesh_config = {
198
- "system-monitoring-log-apm": {
199
- "mesh_address": "system-monitoring-log-apm.service.sim.consul",
200
- "mesh_port": 8200,
201
- },
202
- "automated-processing-scratch-inventory": {"mesh_address": "localhost", "mesh_port": 6379},
203
- "internal-api-gateway": {"mesh_address": "localhost", "mesh_port": 80},
204
- }
205
- apm_options = {"TRANSACTION_MAX_SPANS": 10000}
206
- os.environ["MESH_CONFIG"] = json.dumps(mesh_config)
207
- os.environ["ELASTIC_APM_ENABLED"] = "true"
208
- os.environ["ELASTIC_APM_OTHER_OPTIONS"] = json.dumps(apm_options)
209
-
210
-
211
195
  def CI_workflow(
212
196
  manual_processing_run: ManualProcessing,
213
197
  load_beam_boundaries: bool = False,
@@ -254,7 +238,7 @@ def SP_workflow(
254
238
  load_geometric: bool = False,
255
239
  load_solar: bool = False,
256
240
  load_inst_pol: bool = False,
257
- load_dispersion_correction: bool = False,
241
+ load_wavelength_correction: bool = False,
258
242
  ) -> None:
259
243
  if load_beam_boundaries:
260
244
  manual_processing_run.run_task(task=LoadBeamBoundaryCal)
@@ -286,11 +270,11 @@ def SP_workflow(
286
270
  manual_processing_run.run_task(task=SPSolarGainCalibration)
287
271
  manual_processing_run.run_task(task=SaveSolarCal)
288
272
 
289
- if load_dispersion_correction:
290
- manual_processing_run.run_task(task=LoadDispersionAxisCorrection)
273
+ if load_wavelength_correction:
274
+ manual_processing_run.run_task(task=LoadWavelengthCorrection)
291
275
  else:
292
- manual_processing_run.run_task(task=SPDispersionAxisCorrection)
293
- manual_processing_run.run_task(task=SaveDispersionAxisCorrection)
276
+ manual_processing_run.run_task(task=SPWavelengthCalibration)
277
+ manual_processing_run.run_task(task=SaveWavelengthCorrection)
294
278
 
295
279
  if load_inst_pol:
296
280
  manual_processing_run.run_task(task=LoadInstPolCal)
@@ -322,14 +306,11 @@ def main(
322
306
  load_lamp: bool = False,
323
307
  load_geometric: bool = False,
324
308
  load_solar: bool = False,
325
- load_dispersion_correction: bool = False,
326
309
  load_inst_pol: bool = False,
327
- use_apm: bool = False,
310
+ load_wavelength_calibration: bool = False,
328
311
  param_path: Path = None,
329
312
  transfer_trial_data: str | None = None,
330
313
  ):
331
- if use_apm:
332
- setup_APM_config()
333
314
  with ManualProcessing(
334
315
  workflow_path=Path(scratch_path),
335
316
  recipe_run_id=recipe_run_id,
@@ -414,7 +395,7 @@ def main(
414
395
  load_lamp=load_lamp,
415
396
  load_geometric=load_geometric,
416
397
  load_solar=load_solar,
417
- load_dispersion_correction=load_dispersion_correction,
398
+ load_wavelength_correction=load_wavelength_calibration,
418
399
  load_inst_pol=load_inst_pol,
419
400
  )
420
401
  elif arm_id == "CI":
@@ -565,8 +546,8 @@ if __name__ == "__main__":
565
546
  )
566
547
  parser.add_argument(
567
548
  "-W",
568
- "--load-dispersion-correction",
569
- help="Load dispersion correction solution from previously saved run",
549
+ "--load-wavelength-calibration",
550
+ help="Load wavelength calibration solution from previously saved run",
570
551
  action="store_true",
571
552
  )
572
553
  parser.add_argument(
@@ -575,7 +556,6 @@ if __name__ == "__main__":
575
556
  help="Load instrument polarization calibration from previously saved run",
576
557
  action="store_true",
577
558
  )
578
- parser.add_argument("-A", "--use-apm", help="Send APM spans to SIM", action="store_true")
579
559
  parser.add_argument(
580
560
  "-p",
581
561
  "--param-path",
@@ -603,9 +583,8 @@ if __name__ == "__main__":
603
583
  load_lamp=args.load_lamp,
604
584
  load_geometric=args.load_geometric,
605
585
  load_solar=args.load_solar,
606
- load_dispersion_correction=args.load_dispersion_correction,
586
+ load_wavelength_calibration=args.load_wavelength_calibration,
607
587
  load_inst_pol=args.load_inst_pol,
608
- use_apm=args.use_apm,
609
588
  param_path=Path(args.param_path),
610
589
  transfer_trial_data=args.transfer_trial_data,
611
590
  )
@@ -8,13 +8,13 @@ from dkist_processing_cryonirsp.models.tags import CryonirspTag
8
8
  from dkist_processing_cryonirsp.tasks.linearity_correction import LinearityCorrection
9
9
  from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspRampData
10
10
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
11
- create_input_dataset_parameter_document,
11
+ SaveLinearizedFiles,
12
12
  )
13
13
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
14
- save_parsing_task,
14
+ create_input_dataset_parameter_document,
15
15
  )
16
16
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
17
- SaveLinearizedFiles,
17
+ save_parsing_task,
18
18
  )
19
19
  from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
20
20
  tag_inputs_task,
@@ -8,6 +8,8 @@ from random import randint
8
8
  import asdf
9
9
  from astropy.io import fits
10
10
  from dkist_header_validator import spec122_validator
11
+ from dkist_processing_common.codecs.basemodel import basemodel_encoder
12
+ from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
11
13
  from dkist_processing_common.models.task_name import TaskName
12
14
  from dkist_processing_common.tasks import TransferTrialData
13
15
  from dkist_processing_common.tasks import WorkflowTaskBase
@@ -17,22 +19,22 @@ from dkist_service_configuration.logging import logger
17
19
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
18
20
  from dkist_processing_cryonirsp.models.task_name import CryonirspTaskName
19
21
  from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
22
+ from dkist_processing_cryonirsp.tests.conftest import FileParameter
20
23
  from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
21
24
 
22
-
23
25
  # These are the workflow versions of the polyfit coefficient parameters
24
26
  WORKFLOW_LINEARIZATION_POLYFIT_COEFFS_CI = [
25
- 1.1565851e00,
26
- -1.1925439e-05,
27
- 2.6748548e-10,
28
- -2.7366326e-15,
27
+ 1.10505215e00,
28
+ -7.50178863e-06,
29
+ 1.43050375e-10,
30
+ -1.62898848e-15,
29
31
  ]
30
32
 
31
33
  WORKFLOW_LINEARIZATION_POLYFIT_COEFFS_SP = [
32
- 1.1421334e00,
33
- -1.0536260e-05,
34
- 2.2702712e-10,
35
- -2.5632187e-15,
34
+ 1.14636662,
35
+ -1.05173302e-05,
36
+ 2.18059789e-10,
37
+ -3.00894653e-15,
36
38
  ]
37
39
 
38
40
 
@@ -356,14 +358,14 @@ class SaveSolarCal(SaveTaskTags):
356
358
  ]
357
359
 
358
360
 
359
- class SaveDispersionAxisCorrection(SaveTaskTags):
361
+ class SaveWavelengthCorrection(SaveTaskTags):
360
362
  @property
361
363
  def task_str(self) -> str:
362
364
  return CryonirspTaskName.spectral_fit.value
363
365
 
364
366
  @property
365
367
  def relative_save_file(self) -> str:
366
- return "sp_dispersion_axis_correction.asdf"
368
+ return "sp_wavelength_correction.asdf"
367
369
 
368
370
  @property
369
371
  def tag_lists_to_save(self) -> list[list[str]]:
@@ -381,10 +383,10 @@ class LoadSolarCal(LoadTaskTags):
381
383
  return "solar_cal.asdf"
382
384
 
383
385
 
384
- class LoadDispersionAxisCorrection(LoadTaskTags):
386
+ class LoadWavelengthCorrection(LoadTaskTags):
385
387
  @property
386
388
  def relative_save_file(self) -> str:
387
- return "sp_dispersion_axis_correction.asdf"
389
+ return "sp_wavelength_correction.asdf"
388
390
 
389
391
 
390
392
  class SaveInstPolCal(SaveTaskTags):
@@ -424,13 +426,13 @@ class LoadInstPolCal(LoadTaskTags):
424
426
  def translate_122_to_214_task(suffix: str):
425
427
  class Translate122To214L0(WorkflowTaskBase):
426
428
  def run(self) -> None:
427
- raw_dir = Path(self.scratch.scratch_base_path) / f"CRYO-NIRSP{self.recipe_run_id:03n}"
429
+ raw_dir = Path(self.scratch.scratch_base_path) / f"CRYONIRSP{self.recipe_run_id:03n}"
428
430
  if not os.path.exists(self.scratch.workflow_base_path):
429
431
  os.makedirs(self.scratch.workflow_base_path)
430
432
 
431
433
  if not raw_dir.exists():
432
434
  raise FileNotFoundError(
433
- f"Expected to find a raw CRYO-NIRSP{self.recipe_run_id:03n} folder in {self.scratch.scratch_base_path}"
435
+ f"Expected to find a raw CRYONIRSP{self.recipe_run_id:03n} folder in {self.scratch.scratch_base_path}"
434
436
  )
435
437
 
436
438
  for file in raw_dir.glob(f"*.{suffix}"):
@@ -465,26 +467,39 @@ def translate_122_to_214_task(suffix: str):
465
467
  def create_input_dataset_parameter_document(param_path: Path):
466
468
  class CreateInputDatasetParameterDocument(WorkflowTaskBase):
467
469
  def run(self) -> None:
468
- doc_path = self.scratch.workflow_base_path / "input_dataset_parameters.json"
469
- with open(doc_path, "w") as f:
470
- f.write(json.dumps(self.input_dataset_document_simple_parameters_part))
471
- self.tag(doc_path, CryonirspTag.input_dataset_parameters())
472
- logger.info(f"Wrote input dataset doc to {doc_path}")
470
+ relative_path = "input_dataset_parameters.json"
471
+ self.write(
472
+ data=InputDatasetPartDocumentList(
473
+ doc_list=self.input_dataset_document_simple_parameters_part
474
+ ),
475
+ relative_path=relative_path,
476
+ tags=CryonirspTag.input_dataset_parameters(),
477
+ encoder=basemodel_encoder,
478
+ overwrite=True,
479
+ )
480
+ logger.info(f"Wrote input dataset parameter doc to {relative_path}")
481
+ self.copy_and_tag_parameter_files(param_path=param_path)
482
+ logger.info(f"Copied input dataset parameter files from {param_path}")
473
483
 
474
484
  @property
475
- def input_dataset_document_simple_parameters_part(self):
476
- parameters_list = []
477
- value_id = randint(1000, 2000)
478
- param_class = cryonirsp_testing_parameters_factory(
479
- param_path=param_path, create_files=False
480
- )
485
+ def parameter_dict(self):
486
+ param_class = cryonirsp_testing_parameters_factory(task=self, create_files=False)
481
487
  params = asdict(
482
488
  param_class(
483
489
  cryonirsp_linearization_polyfit_coeffs_ci=WORKFLOW_LINEARIZATION_POLYFIT_COEFFS_CI,
484
490
  cryonirsp_linearization_polyfit_coeffs_sp=WORKFLOW_LINEARIZATION_POLYFIT_COEFFS_SP,
485
491
  )
486
492
  )
493
+ return params
494
+
495
+ @property
496
+ def input_dataset_document_simple_parameters_part(self):
497
+ parameters_list = []
498
+ value_id = randint(1000, 2000)
499
+ params = self.parameter_dict
487
500
  for pn, pv in params.items():
501
+ if isinstance(pv, FileParameter):
502
+ pv = pv.model_dump()
488
503
  values = [
489
504
  {
490
505
  "parameterValueId": value_id,
@@ -497,6 +512,22 @@ def create_input_dataset_parameter_document(param_path: Path):
497
512
 
498
513
  return parameters_list
499
514
 
515
+ def copy_and_tag_parameter_files(self, param_path=param_path):
516
+ # Copy parameter files from param_path to a place where they can be tagged
517
+ params = self.parameter_dict
518
+ destination_dir = Path(self.scratch.workflow_base_path) / "parameters"
519
+ destination_dir.mkdir(parents=True, exist_ok=True)
520
+ for pn, pv in params.items():
521
+ if isinstance(pv, FileParameter):
522
+ file_path = next(param_path.rglob(pv.file_pointer.object_key))
523
+ if file_path.parent != destination_dir:
524
+ shutil.copy(file_path, destination_dir)
525
+ logger.info(
526
+ f"Copied parameter file for '{pn}' to {destination_dir / file_path}"
527
+ )
528
+ file_path = next(destination_dir.rglob(pv.file_pointer.object_key))
529
+ self.tag(path=file_path, tags=pv.file_pointer.tag)
530
+
500
531
  return CreateInputDatasetParameterDocument
501
532
 
502
533
 
@@ -2,7 +2,6 @@ import numpy as np
2
2
  import pytest
3
3
  from dkist_processing_common._util.scratch import WorkflowFileSystem
4
4
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
5
- from dkist_processing_common.tests.conftest import FakeGQLClient
6
5
 
7
6
  from dkist_processing_cryonirsp.models.constants import CryonirspBudName
8
7
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
@@ -68,9 +67,9 @@ def assemble_movie_task_with_tagged_movie_frames(
68
67
  task._purge()
69
68
 
70
69
 
71
- def test_assemble_movie(assemble_movie_task_with_tagged_movie_frames, mocker):
70
+ def test_assemble_movie(assemble_movie_task_with_tagged_movie_frames, mocker, fake_gql_client):
72
71
  mocker.patch(
73
- "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=FakeGQLClient
72
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
74
73
  )
75
74
  task, _, _ = assemble_movie_task_with_tagged_movie_frames
76
75
  task()
@@ -134,9 +133,9 @@ def assemble_sp_task_with_tagged_movie_frames(tmp_path, recipe_run_id, init_cryo
134
133
  task._purge()
135
134
 
136
135
 
137
- def test_assemble_sp_movie(assemble_sp_task_with_tagged_movie_frames, mocker):
136
+ def test_assemble_sp_movie(assemble_sp_task_with_tagged_movie_frames, mocker, fake_gql_client):
138
137
  mocker.patch(
139
- "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=FakeGQLClient
138
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
140
139
  )
141
140
  assemble_sp_task_with_tagged_movie_frames()
142
141
  movie_file = list(assemble_sp_task_with_tagged_movie_frames.read(tags=[CryonirspTag.movie()]))
@@ -474,7 +474,11 @@ def test_assemble_quality_data(
474
474
  # Then
475
475
  # each quality_data file is a list - this will combine the elements of multiple lists into a single list
476
476
  quality_data = list(
477
- chain.from_iterable(task.read(tags=CryonirspTag.quality_data(), decoder=json_decoder))
477
+ chain.from_iterable(
478
+ task.read(
479
+ tags=[CryonirspTag.output(), CryonirspTag.quality_data()], decoder=json_decoder
480
+ )
481
+ )
478
482
  )
479
483
  # 19 with polcal
480
484
  assert len(quality_data) == 19
@@ -6,13 +6,12 @@ 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
8
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
9
- from dkist_processing_common.tests.conftest import FakeGQLClient
10
9
  from dkist_service_configuration.logging import logger
11
10
 
12
11
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
13
12
  from dkist_processing_cryonirsp.tasks.bad_pixel_map import BadPixelMapCalibration
14
- from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
15
13
  from dkist_processing_cryonirsp.tests.conftest import CryonirspConstantsDb
14
+ from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
16
15
  from dkist_processing_cryonirsp.tests.conftest import generate_fits_frame
17
16
  from dkist_processing_cryonirsp.tests.header_models import CryonirspHeadersValidCISolarGainFrames
18
17
 
@@ -43,7 +42,7 @@ def compute_bad_pixel_map_task(
43
42
  task.scratch = WorkflowFileSystem(
44
43
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
45
44
  )
46
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
45
+ param_class = cryonirsp_testing_parameters_factory(task)
47
46
  assign_input_dataset_doc_to_task(task, param_class())
48
47
  start_time = datetime.now()
49
48
  ds = CryonirspHeadersValidCISolarGainFrames(
@@ -91,14 +90,14 @@ def compute_bad_pixel_map_task(
91
90
  task._purge()
92
91
 
93
92
 
94
- def test_compute_bad_pixel_map_task(compute_bad_pixel_map_task, mocker):
93
+ def test_compute_bad_pixel_map_task(compute_bad_pixel_map_task, mocker, fake_gql_client):
95
94
  """
96
95
  Given: An BadPixelMapCalibration task
97
96
  When: Calling the task instance with known input data
98
97
  Then: The correct beam boundary values are created and saved as intermediate files
99
98
  """
100
99
  mocker.patch(
101
- "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=FakeGQLClient
100
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
102
101
  )
103
102
  # Given
104
103
  task, num_zeros, num_hot = compute_bad_pixel_map_task
@@ -7,12 +7,11 @@ from dkist_header_validator import spec122_validator
7
7
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
8
  from dkist_processing_common.codecs.fits import fits_array_encoder
9
9
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
10
- from dkist_processing_common.tests.conftest import FakeGQLClient
11
10
 
12
11
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
13
12
  from dkist_processing_cryonirsp.tasks.ci_beam_boundaries import CIBeamBoundariesCalibration
14
- from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
15
13
  from dkist_processing_cryonirsp.tests.conftest import CryonirspConstantsDb
14
+ from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
16
15
  from dkist_processing_cryonirsp.tests.conftest import generate_fits_frame
17
16
  from dkist_processing_cryonirsp.tests.header_models import CryonirspHeadersValidCISolarGainFrames
18
17
 
@@ -38,7 +37,7 @@ def compute_beam_boundaries_task(
38
37
  task.scratch = WorkflowFileSystem(
39
38
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
40
39
  )
41
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
40
+ param_class = cryonirsp_testing_parameters_factory(task)
42
41
  assign_input_dataset_doc_to_task(task, param_class())
43
42
  # Create fake bad pixel map
44
43
  task.write(
@@ -85,14 +84,14 @@ def compute_beam_boundaries_task(
85
84
  task._purge()
86
85
 
87
86
 
88
- def test_compute_beam_boundaries_task(compute_beam_boundaries_task, mocker):
87
+ def test_compute_beam_boundaries_task(compute_beam_boundaries_task, mocker, fake_gql_client):
89
88
  """
90
89
  Given: A CIBeamBoundariesCalibration task
91
90
  When: Calling the task instance with known input data
92
91
  Then: The correct beam boundary values are created and saved as intermediate files
93
92
  """
94
93
  mocker.patch(
95
- "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=FakeGQLClient
94
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
96
95
  )
97
96
  # Given
98
97
  task, arm_id = compute_beam_boundaries_task
@@ -11,15 +11,14 @@ from dkist_header_validator import spec122_validator
11
11
  from dkist_processing_common._util.scratch import WorkflowFileSystem
12
12
  from dkist_processing_common.codecs.fits import fits_array_encoder
13
13
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
14
- from dkist_processing_common.tests.conftest import FakeGQLClient
15
14
 
16
15
  from dkist_processing_cryonirsp.models.exposure_conditions import AllowableOpticalDensityFilterNames
17
16
  from dkist_processing_cryonirsp.models.exposure_conditions import ExposureConditions
18
17
  from dkist_processing_cryonirsp.models.tags import CryonirspStemName
19
18
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
20
19
  from dkist_processing_cryonirsp.tasks.ci_science import CIScienceCalibration
21
- from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
22
20
  from dkist_processing_cryonirsp.tests.conftest import CryonirspConstantsDb
21
+ from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
23
22
  from dkist_processing_cryonirsp.tests.conftest import generate_fits_frame
24
23
  from dkist_processing_cryonirsp.tests.header_models import CryonirspHeadersValidObserveFrames
25
24
 
@@ -70,7 +69,7 @@ def ci_science_calibration_task(
70
69
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
71
70
  )
72
71
 
73
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
72
+ param_class = cryonirsp_testing_parameters_factory(task)
74
73
  assign_input_dataset_doc_to_task(task, param_class())
75
74
 
76
75
  # Need a beam boundary file
@@ -228,7 +227,7 @@ def ci_compressed_headers_with_dates(
228
227
  return comp_headers, start_time, exp_time, time_delta
229
228
 
230
229
 
231
- def test_ci_science_calibration_task(ci_science_calibration_task, mocker):
230
+ def test_ci_science_calibration_task(ci_science_calibration_task, mocker, fake_gql_client):
232
231
  """
233
232
  Given: A CIScienceCalibration task
234
233
  When: Calling the task instance
@@ -236,7 +235,7 @@ def test_ci_science_calibration_task(ci_science_calibration_task, mocker):
236
235
  """
237
236
 
238
237
  mocker.patch(
239
- "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=FakeGQLClient
238
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
240
239
  )
241
240
 
242
241
  # When
@@ -4,13 +4,11 @@ import numpy as np
4
4
  import pytest
5
5
  from dkist_processing_common._util.scratch import WorkflowFileSystem
6
6
  from dkist_processing_common.tasks import WorkflowTaskBase
7
- from dkist_processing_common.tasks.mixin.input_dataset import InputDatasetMixin
8
- from dkist_processing_common.tests.conftest import FakeGQLClient
9
7
 
10
8
  from dkist_processing_cryonirsp.models.constants import CryonirspConstants
11
9
  from dkist_processing_cryonirsp.tasks.mixin.corrections import CorrectionsMixin
12
- from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
13
10
  from dkist_processing_cryonirsp.tests.conftest import CryonirspConstantsDb
11
+ from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
14
12
 
15
13
  base_bad_pixel_map = np.zeros(shape=(10, 10))
16
14
 
@@ -21,7 +19,7 @@ column_error_bad_pixel_map = base_bad_pixel_map.copy()
21
19
  column_error_bad_pixel_map[:, 6] = 1
22
20
 
23
21
 
24
- class BadPixelMapTask(WorkflowTaskBase, CorrectionsMixin, InputDatasetMixin):
22
+ class BadPixelMapTask(WorkflowTaskBase, CorrectionsMixin):
25
23
  constants: CryonirspConstants
26
24
 
27
25
  @property
@@ -39,11 +37,12 @@ def bad_pixel_mask_task(
39
37
  recipe_run_id,
40
38
  assign_input_dataset_doc_to_task,
41
39
  mocker,
40
+ fake_gql_client,
42
41
  request,
43
42
  init_cryonirsp_constants_db,
44
43
  ):
45
44
  mocker.patch(
46
- "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=FakeGQLClient
45
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
47
46
  )
48
47
  constants_db = CryonirspConstantsDb(
49
48
  ARM_ID=request.param,
@@ -58,7 +57,7 @@ def bad_pixel_mask_task(
58
57
  task.scratch = WorkflowFileSystem(
59
58
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
60
59
  )
61
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
60
+ param_class = cryonirsp_testing_parameters_factory(task)
62
61
  assign_input_dataset_doc_to_task(task, param_class())
63
62
  yield task
64
63
  finally:
@@ -8,8 +8,8 @@ from dkist_processing_common.codecs.fits import fits_hdu_decoder
8
8
  from dkist_processing_cryonirsp.codecs.fits import cryo_fits_array_decoder
9
9
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
10
10
  from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
11
- from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
12
11
  from dkist_processing_cryonirsp.tests.conftest import CryonirspConstantsDb
12
+ from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
13
13
 
14
14
  NUM_BEAMS = 2
15
15
  NUM_MODSTATES = 8
@@ -23,8 +23,7 @@ def cryo_science_task(
23
23
  tmp_path, recipe_run_id, assign_input_dataset_doc_to_task, init_cryonirsp_constants_db
24
24
  ):
25
25
  class Task(CryonirspTaskBase):
26
- def run(self):
27
- ...
26
+ def run(self): ...
28
27
 
29
28
  constants_db = CryonirspConstantsDb(
30
29
  NUM_MODSTATES=NUM_MODSTATES,
@@ -42,7 +41,7 @@ def cryo_science_task(
42
41
  task.scratch = WorkflowFileSystem(
43
42
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
44
43
  )
45
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
44
+ param_class = cryonirsp_testing_parameters_factory(task)
46
45
  assign_input_dataset_doc_to_task(task, param_class())
47
46
  yield task
48
47
  finally:
@@ -153,8 +152,7 @@ def cryo_science_task_with_tagged_intermediates(
153
152
  recipe_run_id, tmpdir_factory, init_cryonirsp_constants_db
154
153
  ):
155
154
  class Task(CryonirspTaskBase):
156
- def run(self):
157
- ...
155
+ def run(self): ...
158
156
 
159
157
  init_cryonirsp_constants_db(recipe_run_id, CryonirspConstantsDb())
160
158
  with Task(
@@ -1,6 +1,7 @@
1
1
  from dataclasses import asdict
2
2
  from dataclasses import dataclass
3
3
 
4
+ import astropy.units as u
4
5
  import pytest
5
6
 
6
7
  from dkist_processing_cryonirsp.models.exposure_conditions import AllowableOpticalDensityFilterNames
@@ -28,6 +29,8 @@ def testing_constants(polarimetric):
28
29
  ExposureConditions(0.01, AllowableOpticalDensityFilterNames.OPEN.value),
29
30
  )
30
31
  modulator_spin_mode: str = "Continuous" if polarimetric else "Off"
32
+ retarder_name: str = "SiO2 OC"
33
+ grating_constant: float = 6.28
31
34
  # We don't need all the common ones, but let's put one just to check
32
35
  instrument: str = "CHECK_OUT_THIS_INSTRUMENT"
33
36
  arm_id: str = "SP"
@@ -46,8 +49,7 @@ def cryo_science_task_with_constants(
46
49
  recipe_run_id, expected_constant_dict, init_cryonirsp_constants_db
47
50
  ):
48
51
  class Task(CryonirspTaskBase):
49
- def run(self):
50
- ...
52
+ def run(self): ...
51
53
 
52
54
  init_cryonirsp_constants_db(recipe_run_id, expected_constant_dict)
53
55
  task = Task(
@@ -68,9 +70,11 @@ def cryo_science_task_with_constants(
68
70
  def test_cryo_constants(cryo_science_task_with_constants, expected_constant_dict, polarimetric):
69
71
  task = cryo_science_task_with_constants
70
72
  for k, v in expected_constant_dict.items():
71
- if k.lower() == "modulator_spin_mode":
73
+ if k.lower() in ["modulator_spin_mode", "retarder_name", "grating_constant"]:
72
74
  continue
73
75
  if type(v) is tuple:
74
76
  v = list(v)
75
77
  assert getattr(task.constants, k.lower()) == v
76
78
  assert task.constants.correct_for_polarization == polarimetric
79
+ assert task.constants.pac_init_set == "OCCal_VIS"
80
+ assert task.constants.grating_constant == expected_constant_dict["GRATING_CONSTANT"] / u.mm