dkist-processing-cryonirsp 1.3.4__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 (111) hide show
  1. changelog/.gitempty +0 -0
  2. dkist_processing_cryonirsp/__init__.py +11 -0
  3. dkist_processing_cryonirsp/config.py +12 -0
  4. dkist_processing_cryonirsp/models/__init__.py +1 -0
  5. dkist_processing_cryonirsp/models/constants.py +248 -0
  6. dkist_processing_cryonirsp/models/exposure_conditions.py +26 -0
  7. dkist_processing_cryonirsp/models/parameters.py +296 -0
  8. dkist_processing_cryonirsp/models/tags.py +168 -0
  9. dkist_processing_cryonirsp/models/task_name.py +14 -0
  10. dkist_processing_cryonirsp/parsers/__init__.py +1 -0
  11. dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +111 -0
  12. dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +30 -0
  13. dkist_processing_cryonirsp/parsers/exposure_conditions.py +163 -0
  14. dkist_processing_cryonirsp/parsers/map_repeats.py +40 -0
  15. dkist_processing_cryonirsp/parsers/measurements.py +55 -0
  16. dkist_processing_cryonirsp/parsers/modstates.py +31 -0
  17. dkist_processing_cryonirsp/parsers/optical_density_filters.py +40 -0
  18. dkist_processing_cryonirsp/parsers/polarimetric_check.py +120 -0
  19. dkist_processing_cryonirsp/parsers/scan_step.py +412 -0
  20. dkist_processing_cryonirsp/parsers/time.py +80 -0
  21. dkist_processing_cryonirsp/parsers/wavelength.py +26 -0
  22. dkist_processing_cryonirsp/tasks/__init__.py +19 -0
  23. dkist_processing_cryonirsp/tasks/assemble_movie.py +202 -0
  24. dkist_processing_cryonirsp/tasks/bad_pixel_map.py +96 -0
  25. dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +279 -0
  26. dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +55 -0
  27. dkist_processing_cryonirsp/tasks/ci_science.py +169 -0
  28. dkist_processing_cryonirsp/tasks/cryonirsp_base.py +67 -0
  29. dkist_processing_cryonirsp/tasks/dark.py +98 -0
  30. dkist_processing_cryonirsp/tasks/gain.py +251 -0
  31. dkist_processing_cryonirsp/tasks/instrument_polarization.py +447 -0
  32. dkist_processing_cryonirsp/tasks/l1_output_data.py +44 -0
  33. dkist_processing_cryonirsp/tasks/linearity_correction.py +582 -0
  34. dkist_processing_cryonirsp/tasks/make_movie_frames.py +302 -0
  35. dkist_processing_cryonirsp/tasks/mixin/__init__.py +1 -0
  36. dkist_processing_cryonirsp/tasks/mixin/beam_access.py +52 -0
  37. dkist_processing_cryonirsp/tasks/mixin/corrections.py +177 -0
  38. dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +193 -0
  39. dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +309 -0
  40. dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +297 -0
  41. dkist_processing_cryonirsp/tasks/parse.py +281 -0
  42. dkist_processing_cryonirsp/tasks/quality_metrics.py +271 -0
  43. dkist_processing_cryonirsp/tasks/science_base.py +511 -0
  44. dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +270 -0
  45. dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +484 -0
  46. dkist_processing_cryonirsp/tasks/sp_geometric.py +585 -0
  47. dkist_processing_cryonirsp/tasks/sp_science.py +299 -0
  48. dkist_processing_cryonirsp/tasks/sp_solar_gain.py +475 -0
  49. dkist_processing_cryonirsp/tasks/trial_output_data.py +61 -0
  50. dkist_processing_cryonirsp/tasks/write_l1.py +1033 -0
  51. dkist_processing_cryonirsp/tests/__init__.py +1 -0
  52. dkist_processing_cryonirsp/tests/conftest.py +456 -0
  53. dkist_processing_cryonirsp/tests/header_models.py +592 -0
  54. dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
  55. dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +541 -0
  56. dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +615 -0
  57. dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +96 -0
  58. dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +592 -0
  59. dkist_processing_cryonirsp/tests/test_assemble_movie.py +144 -0
  60. dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +517 -0
  61. dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +115 -0
  62. dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +106 -0
  63. dkist_processing_cryonirsp/tests/test_ci_science.py +355 -0
  64. dkist_processing_cryonirsp/tests/test_corrections.py +126 -0
  65. dkist_processing_cryonirsp/tests/test_cryo_base.py +202 -0
  66. dkist_processing_cryonirsp/tests/test_cryo_constants.py +76 -0
  67. dkist_processing_cryonirsp/tests/test_dark.py +287 -0
  68. dkist_processing_cryonirsp/tests/test_gain.py +278 -0
  69. dkist_processing_cryonirsp/tests/test_instrument_polarization.py +531 -0
  70. dkist_processing_cryonirsp/tests/test_linearity_correction.py +245 -0
  71. dkist_processing_cryonirsp/tests/test_make_movie_frames.py +111 -0
  72. dkist_processing_cryonirsp/tests/test_parameters.py +266 -0
  73. dkist_processing_cryonirsp/tests/test_parse.py +1439 -0
  74. dkist_processing_cryonirsp/tests/test_quality.py +203 -0
  75. dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +112 -0
  76. dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +155 -0
  77. dkist_processing_cryonirsp/tests/test_sp_geometric.py +319 -0
  78. dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +121 -0
  79. dkist_processing_cryonirsp/tests/test_sp_science.py +483 -0
  80. dkist_processing_cryonirsp/tests/test_sp_solar.py +198 -0
  81. dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +79 -0
  82. dkist_processing_cryonirsp/tests/test_trial_output_data.py +251 -0
  83. dkist_processing_cryonirsp/tests/test_workflows.py +9 -0
  84. dkist_processing_cryonirsp/tests/test_write_l1.py +436 -0
  85. dkist_processing_cryonirsp/workflows/__init__.py +2 -0
  86. dkist_processing_cryonirsp/workflows/ci_l0_processing.py +77 -0
  87. dkist_processing_cryonirsp/workflows/sp_l0_processing.py +84 -0
  88. dkist_processing_cryonirsp/workflows/trial_workflows.py +190 -0
  89. dkist_processing_cryonirsp-1.3.4.dist-info/METADATA +194 -0
  90. dkist_processing_cryonirsp-1.3.4.dist-info/RECORD +111 -0
  91. dkist_processing_cryonirsp-1.3.4.dist-info/WHEEL +5 -0
  92. dkist_processing_cryonirsp-1.3.4.dist-info/top_level.txt +4 -0
  93. docs/Makefile +134 -0
  94. docs/bad_pixel_calibration.rst +47 -0
  95. docs/beam_angle_calculation.rst +53 -0
  96. docs/beam_boundary_computation.rst +88 -0
  97. docs/changelog.rst +7 -0
  98. docs/ci_science_calibration.rst +33 -0
  99. docs/conf.py +52 -0
  100. docs/index.rst +21 -0
  101. docs/l0_to_l1_cryonirsp_ci-full-trial.rst +10 -0
  102. docs/l0_to_l1_cryonirsp_ci.rst +10 -0
  103. docs/l0_to_l1_cryonirsp_sp-full-trial.rst +10 -0
  104. docs/l0_to_l1_cryonirsp_sp.rst +10 -0
  105. docs/linearization.rst +43 -0
  106. docs/make.bat +170 -0
  107. docs/requirements.txt +1 -0
  108. docs/requirements_table.rst +8 -0
  109. docs/scientific_changelog.rst +10 -0
  110. docs/sp_science_calibration.rst +59 -0
  111. licenses/LICENSE.rst +11 -0
@@ -0,0 +1,615 @@
1
+ import argparse
2
+ import json
3
+ import os
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ from astropy.io import fits
8
+ from dkist_header_validator import spec214_validator
9
+ from dkist_processing_common.manual import ManualProcessing
10
+ from dkist_processing_common.tasks import CreateTrialAsdf
11
+ from dkist_processing_common.tasks import CreateTrialQualityReport
12
+ from dkist_processing_common.tasks import QualityL1Metrics
13
+ from dkist_processing_common.tasks import WorkflowTaskBase
14
+ from dkist_service_configuration.logging import logger
15
+
16
+ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
17
+ from dkist_processing_cryonirsp.models.tags import CryonirspTag
18
+ from dkist_processing_cryonirsp.tasks import CIBeamBoundariesCalibration
19
+ from dkist_processing_cryonirsp.tasks import CIScienceCalibration
20
+ from dkist_processing_cryonirsp.tasks.assemble_movie import AssembleCryonirspMovie
21
+ from dkist_processing_cryonirsp.tasks.bad_pixel_map import BadPixelMapCalibration
22
+ from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
23
+ from dkist_processing_cryonirsp.tasks.dark import DarkCalibration
24
+ from dkist_processing_cryonirsp.tasks.gain import CISolarGainCalibration
25
+ from dkist_processing_cryonirsp.tasks.gain import LampGainCalibration
26
+ from dkist_processing_cryonirsp.tasks.instrument_polarization import (
27
+ CIInstrumentPolarizationCalibration,
28
+ )
29
+ from dkist_processing_cryonirsp.tasks.instrument_polarization import (
30
+ SPInstrumentPolarizationCalibration,
31
+ )
32
+ from dkist_processing_cryonirsp.tasks.l1_output_data import CIAssembleQualityData
33
+ from dkist_processing_cryonirsp.tasks.l1_output_data import SPAssembleQualityData
34
+ from dkist_processing_cryonirsp.tasks.linearity_correction import LinearityCorrection
35
+ from dkist_processing_cryonirsp.tasks.make_movie_frames import MakeCryonirspMovieFrames
36
+ from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspCILinearizedData
37
+ from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspRampData
38
+ from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspSPLinearizedData
39
+ from dkist_processing_cryonirsp.tasks.quality_metrics import CryonirspL0QualityMetrics
40
+ from dkist_processing_cryonirsp.tasks.quality_metrics import CryonirspL1QualityMetrics
41
+ 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
+ from dkist_processing_cryonirsp.tasks.sp_geometric import SPGeometricCalibration
46
+ from dkist_processing_cryonirsp.tasks.sp_science import SPScienceCalibration
47
+ from dkist_processing_cryonirsp.tasks.sp_solar_gain import SPSolarGainCalibration
48
+ from dkist_processing_cryonirsp.tasks.write_l1 import CIWriteL1Frame
49
+ 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
+ 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
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
58
+ LoadBadPixelMap,
59
+ )
60
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
61
+ LoadBeamBoundaryCal,
62
+ )
63
+ 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
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
68
+ LoadGeometricCal,
69
+ )
70
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
71
+ LoadInstPolCal,
72
+ )
73
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import LoadLampCal
74
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
75
+ LoadLinearizedFiles,
76
+ )
77
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import LoadSolarCal
78
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
79
+ save_parsing_task,
80
+ )
81
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
82
+ SaveBadPixelMap,
83
+ )
84
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
85
+ SaveBeamBoundaryCal,
86
+ )
87
+ 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
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
92
+ SaveGeometricCal,
93
+ )
94
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
95
+ SaveInstPolCal,
96
+ )
97
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import SaveLampCal
98
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
99
+ SaveLinearizedFiles,
100
+ )
101
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import SaveSolarCal
102
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
103
+ tag_inputs_task,
104
+ )
105
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
106
+ transfer_trial_data_locally_task,
107
+ )
108
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
109
+ translate_122_to_214_task,
110
+ )
111
+
112
+ INV = False
113
+ try:
114
+ from dkist_inventory.asdf_generator import dataset_from_fits
115
+
116
+ INV = True
117
+ except ModuleNotFoundError:
118
+ logger.warning(
119
+ "Could not load dkist-inventory. CreateTrialDatasetInventory and CreateTrialAsdf require dkist-inventory."
120
+ )
121
+
122
+ QUALITY = False
123
+ try:
124
+ import dkist_quality
125
+
126
+ QUALITY = True
127
+ except ModuleNotFoundError:
128
+ logger.warning("Could not load dkist-quality. CreateTrialQualityReport requires dkist-quality.")
129
+
130
+ if QUALITY:
131
+ import matplotlib.pyplot as plt
132
+
133
+ plt.ioff()
134
+
135
+
136
+ def tag_linearized_inputs_task(suffix: str):
137
+ class TagLinearizedInputs(WorkflowTaskBase):
138
+ def run(self) -> None:
139
+ logger.info(f"Looking in {os.path.abspath(self.scratch.workflow_base_path)}")
140
+ input_file_list = list(self.scratch.workflow_base_path.glob(f"*.{suffix}"))
141
+ if len(input_file_list) == 0:
142
+ raise FileNotFoundError(
143
+ f"Did not find any files matching '*.{suffix}' in {self.scratch.workflow_base_path}"
144
+ )
145
+ for file in input_file_list:
146
+ logger.info(f"Found {file}")
147
+ self.tag(path=file, tags=[CryonirspTag.linearized(), CryonirspTag.frame()])
148
+ # Update the arm_id constant, as it is derived in linearity processing
149
+ with fits.open(file) as hdul:
150
+ if len(hdul) == 1:
151
+ hdu = hdul[0]
152
+ else:
153
+ hdu = hdul[1]
154
+ arm_id = hdu.header["CNARMID"]
155
+ self.constants._update({CryonirspBudName.arm_id.value: arm_id})
156
+
157
+ return TagLinearizedInputs
158
+
159
+
160
+ class ShowPolMode(CryonirspTaskBase):
161
+ def run(self) -> None:
162
+ logger.info(f"{self.constants.correct_for_polarization = }")
163
+
164
+
165
+ class ShowExposureConditions(CryonirspTaskBase):
166
+ def run(self) -> None:
167
+ logger.info(f"{self.constants.dark_exposure_conditions_list = }")
168
+ logger.info(f"{self.constants.lamp_gain_exposure_conditions_list = }")
169
+ logger.info(f"{self.constants.solar_gain_exposure_conditions_list = }")
170
+ if self.constants.correct_for_polarization:
171
+ try:
172
+ getattr(self.constants, "polcal_exposure_conditions_list")
173
+ except KeyError:
174
+ logger.info(
175
+ f"polcal_exposure_conditions_list is not defined, initializing it to []"
176
+ )
177
+ self.constants._update({CryonirspBudName.polcal_exposure_conditions_list.value: []})
178
+ finally:
179
+ logger.info(f"{self.constants.polcal_exposure_conditions_list = }")
180
+ logger.info(f"{self.constants.observe_exposure_conditions_list = }")
181
+
182
+
183
+ class ValidateL1Output(CryonirspTaskBase):
184
+ def run(self) -> None:
185
+ files = self.read(tags=[CryonirspTag.output(), CryonirspTag.frame()])
186
+ for f in files:
187
+ logger.info(f"Validating {f}")
188
+ spec214_validator.validate(f, extra=False)
189
+
190
+
191
+ def setup_APM_config() -> None:
192
+ mesh_config = {
193
+ "system-monitoring-log-apm": {
194
+ "mesh_address": "system-monitoring-log-apm.service.sim.consul",
195
+ "mesh_port": 8200,
196
+ },
197
+ "automated-processing-scratch-inventory": {"mesh_address": "localhost", "mesh_port": 6379},
198
+ "internal-api-gateway": {"mesh_address": "localhost", "mesh_port": 80},
199
+ }
200
+ apm_options = {"TRANSACTION_MAX_SPANS": 10000}
201
+ os.environ["MESH_CONFIG"] = json.dumps(mesh_config)
202
+ os.environ["ELASTIC_APM_ENABLED"] = "true"
203
+ os.environ["ELASTIC_APM_OTHER_OPTIONS"] = json.dumps(apm_options)
204
+
205
+
206
+ def CI_workflow(
207
+ manual_processing_run: ManualProcessing,
208
+ load_beam_boundaries: bool = False,
209
+ load_dark: bool = False,
210
+ load_lamp: bool = False,
211
+ load_solar: bool = False,
212
+ load_inst_pol: bool = False,
213
+ ) -> None:
214
+ if load_beam_boundaries:
215
+ manual_processing_run.run_task(task=LoadBeamBoundaryCal)
216
+ else:
217
+ manual_processing_run.run_task(task=CIBeamBoundariesCalibration)
218
+ manual_processing_run.run_task(task=SaveBeamBoundaryCal)
219
+
220
+ if load_dark:
221
+ manual_processing_run.run_task(task=LoadDarkCal)
222
+ else:
223
+ manual_processing_run.run_task(task=DarkCalibration)
224
+ manual_processing_run.run_task(task=SaveDarkCal)
225
+
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
+ if load_solar:
233
+ manual_processing_run.run_task(task=LoadSolarCal)
234
+ else:
235
+ manual_processing_run.run_task(task=CISolarGainCalibration)
236
+ manual_processing_run.run_task(task=SaveSolarCal)
237
+
238
+ if load_inst_pol:
239
+ manual_processing_run.run_task(task=LoadInstPolCal)
240
+ else:
241
+ manual_processing_run.run_task(task=CIInstrumentPolarizationCalibration)
242
+ manual_processing_run.run_task(task=SaveInstPolCal)
243
+
244
+ manual_processing_run.run_task(task=CIScienceCalibration)
245
+ manual_processing_run.run_task(task=CIWriteL1Frame)
246
+
247
+ manual_processing_run.run_task(task=MakeCryonirspMovieFrames)
248
+ manual_processing_run.run_task(task=AssembleCryonirspMovie)
249
+
250
+
251
+ def SP_workflow(
252
+ manual_processing_run: ManualProcessing,
253
+ load_beam_boundaries: bool = False,
254
+ load_dark: bool = False,
255
+ load_lamp: bool = False,
256
+ load_geometric: bool = False,
257
+ load_solar: bool = False,
258
+ load_inst_pol: bool = False,
259
+ load_dispersion_correction: bool = False,
260
+ ) -> None:
261
+ if load_beam_boundaries:
262
+ manual_processing_run.run_task(task=LoadBeamBoundaryCal)
263
+ else:
264
+ manual_processing_run.run_task(task=SPBeamBoundariesCalibration)
265
+ manual_processing_run.run_task(task=SaveBeamBoundaryCal)
266
+
267
+ if load_dark:
268
+ manual_processing_run.run_task(task=LoadDarkCal)
269
+ else:
270
+ manual_processing_run.run_task(task=DarkCalibration)
271
+ manual_processing_run.run_task(task=SaveDarkCal)
272
+
273
+ if load_lamp:
274
+ manual_processing_run.run_task(task=LoadLampCal)
275
+ else:
276
+ manual_processing_run.run_task(task=LampGainCalibration)
277
+ manual_processing_run.run_task(task=SaveLampCal)
278
+
279
+ if load_geometric:
280
+ manual_processing_run.run_task(task=LoadGeometricCal)
281
+ else:
282
+ manual_processing_run.run_task(task=SPGeometricCalibration)
283
+ manual_processing_run.run_task(task=SaveGeometricCal)
284
+
285
+ if load_solar:
286
+ manual_processing_run.run_task(task=LoadSolarCal)
287
+ else:
288
+ manual_processing_run.run_task(task=SPSolarGainCalibration)
289
+ manual_processing_run.run_task(task=SaveSolarCal)
290
+
291
+ if load_dispersion_correction:
292
+ manual_processing_run.run_task(task=LoadDispersionAxisCorrection)
293
+ else:
294
+ manual_processing_run.run_task(task=SPDispersionAxisCorrection)
295
+ manual_processing_run.run_task(task=SaveDispersionAxisCorrection)
296
+
297
+ if load_inst_pol:
298
+ manual_processing_run.run_task(task=LoadInstPolCal)
299
+ else:
300
+ manual_processing_run.run_task(task=SPInstrumentPolarizationCalibration)
301
+ manual_processing_run.run_task(task=SaveInstPolCal)
302
+
303
+ manual_processing_run.run_task(task=SPScienceCalibration)
304
+ manual_processing_run.run_task(task=SPWriteL1Frame)
305
+
306
+ manual_processing_run.run_task(task=MakeCryonirspMovieFrames)
307
+ manual_processing_run.run_task(task=AssembleCryonirspMovie)
308
+
309
+
310
+ def main(
311
+ scratch_path: str,
312
+ suffix: str = "FITS",
313
+ recipe_run_id: int = 2,
314
+ skip_translation: bool = False,
315
+ only_translate: bool = False,
316
+ skip_saving_parse: bool = False,
317
+ load_input_parsing: bool = False,
318
+ load_linearized: bool = False,
319
+ only_linearize: bool = False,
320
+ load_linearized_parsing: bool = False,
321
+ load_bad_pixel_map: bool = False,
322
+ load_beam_boundaries: bool = False,
323
+ load_dark: bool = False,
324
+ load_lamp: bool = False,
325
+ load_geometric: bool = False,
326
+ load_solar: bool = False,
327
+ load_dispersion_correction: bool = False,
328
+ load_inst_pol: bool = False,
329
+ use_apm: bool = False,
330
+ param_path: Path = None,
331
+ transfer_trial_data: str | None = None,
332
+ ):
333
+ if use_apm:
334
+ setup_APM_config()
335
+ with ManualProcessing(
336
+ workflow_path=Path(scratch_path),
337
+ recipe_run_id=recipe_run_id,
338
+ testing=True,
339
+ workflow_name="sp_l0_to_l1_cryonirsp",
340
+ workflow_version="GROGU",
341
+ ) as manual_processing_run:
342
+ if not skip_translation:
343
+ manual_processing_run.run_task(task=translate_122_to_214_task(suffix))
344
+ if only_translate:
345
+ return
346
+ manual_processing_run.run_task(
347
+ task=create_input_dataset_parameter_document(param_path=param_path)
348
+ )
349
+
350
+ if not load_linearized:
351
+ manual_processing_run.run_task(task=tag_inputs_task(suffix))
352
+
353
+ if load_input_parsing or load_linearized:
354
+ manual_processing_run.run_task(task=load_parsing_task(save_file="input_parsing.asdf"))
355
+ else:
356
+ manual_processing_run.run_task(task=ParseL0CryonirspRampData)
357
+ manual_processing_run.run_task(
358
+ task=save_parsing_task(
359
+ tag_list=[CryonirspTag.input(), CryonirspTag.frame()],
360
+ save_file="input_parsing.asdf",
361
+ save_file_tags=False,
362
+ )
363
+ )
364
+
365
+ if load_linearized:
366
+ manual_processing_run.run_task(task=LoadLinearizedFiles)
367
+ else:
368
+ manual_processing_run.run_task(task=LinearityCorrection)
369
+ manual_processing_run.run_task(task=SaveLinearizedFiles)
370
+ manual_processing_run.run_task(task=LoadLinearizedFiles)
371
+
372
+ if only_linearize:
373
+ logger.info("Linearization complete. All done.")
374
+ return
375
+
376
+ db_access = DBAccess(recipe_run_id=recipe_run_id)
377
+ arm_id = db_access.constants.arm_id
378
+
379
+ if load_linearized_parsing:
380
+ manual_processing_run.run_task(
381
+ task=load_parsing_task(save_file="linearized_parsing.asdf")
382
+ )
383
+ else:
384
+ if arm_id == "SP":
385
+ manual_processing_run.run_task(task=ParseL0CryonirspSPLinearizedData)
386
+ elif arm_id == "CI":
387
+ manual_processing_run.run_task(task=ParseL0CryonirspCILinearizedData)
388
+ else:
389
+ raise ValueError(f"Did not recognize {arm_id = }")
390
+ if not skip_saving_parse:
391
+ manual_processing_run.run_task(
392
+ task=save_parsing_task(
393
+ tag_list=[CryonirspTag.linearized(), CryonirspTag.frame()],
394
+ save_file="linearized_parsing.asdf",
395
+ )
396
+ )
397
+
398
+ # manual_processing_run.run_task(task=tag_linearized_inputs_task(suffix))
399
+ # manual_processing_run.run_task(task=SetWavelengthForTesting)
400
+ # manual_processing_run.run_task(task=SpoofExposureTimeLists)
401
+ manual_processing_run.run_task(task=CryonirspL0QualityMetrics)
402
+ manual_processing_run.run_task(task=ShowPolMode)
403
+ manual_processing_run.run_task(task=ShowExposureConditions)
404
+ if load_bad_pixel_map:
405
+ manual_processing_run.run_task(task=LoadBadPixelMap)
406
+ else:
407
+ manual_processing_run.run_task(task=BadPixelMapCalibration)
408
+ manual_processing_run.run_task(task=SaveBadPixelMap)
409
+
410
+ if arm_id == "SP":
411
+ logger.info("Running SP pipeline")
412
+ SP_workflow(
413
+ manual_processing_run,
414
+ load_beam_boundaries=load_beam_boundaries,
415
+ load_dark=load_dark,
416
+ load_lamp=load_lamp,
417
+ load_geometric=load_geometric,
418
+ load_solar=load_solar,
419
+ load_dispersion_correction=load_dispersion_correction,
420
+ load_inst_pol=load_inst_pol,
421
+ )
422
+ elif arm_id == "CI":
423
+ logger.info("Running CI pipeline")
424
+ CI_workflow(
425
+ manual_processing_run,
426
+ load_beam_boundaries=load_beam_boundaries,
427
+ load_dark=load_dark,
428
+ load_lamp=load_lamp,
429
+ load_solar=load_solar,
430
+ load_inst_pol=load_inst_pol,
431
+ )
432
+ else:
433
+ raise ValueError(f"Did not recognize {arm_id = }")
434
+
435
+ manual_processing_run.run_task(task=QualityL1Metrics)
436
+ manual_processing_run.run_task(task=CryonirspL1QualityMetrics)
437
+
438
+ if arm_id == "SP":
439
+ manual_processing_run.run_task(task=SPAssembleQualityData)
440
+ elif arm_id == "CI":
441
+ manual_processing_run.run_task(task=CIAssembleQualityData)
442
+
443
+ manual_processing_run.run_task(task=ValidateL1Output)
444
+
445
+ if transfer_trial_data:
446
+ if transfer_trial_data == "default":
447
+ trial_output_dir = (
448
+ Path(manual_processing_run.workflow_path) / str(recipe_run_id) / "trial_output"
449
+ )
450
+ else:
451
+ trial_output_dir = Path(transfer_trial_data).absolute()
452
+
453
+ logger.info(f"Writing trial output to {trial_output_dir}")
454
+ transfer_local_task = transfer_trial_data_locally_task(trial_dir=trial_output_dir)
455
+ manual_processing_run.run_task(transfer_local_task)
456
+
457
+ # Test some downstream services
458
+ if INV:
459
+ manual_processing_run.run_task(task=CreateTrialAsdf)
460
+ else:
461
+ logger.warning(
462
+ "Did NOT make dataset asdf file because the asdf generator is not installed"
463
+ )
464
+
465
+ if QUALITY:
466
+ manual_processing_run.run_task(task=CreateTrialQualityReport)
467
+ else:
468
+ logger.warning("Did NOT make quality report pdf because dkist-quality is not installed")
469
+
470
+ if any([load_dark, load_lamp, load_geometric, load_solar, load_inst_pol]):
471
+ logger.info("NOT counting provenance records because some tasks were skipped")
472
+ else:
473
+ manual_processing_run.count_provenance()
474
+
475
+
476
+ if __name__ == "__main__":
477
+ parser = argparse.ArgumentParser(
478
+ description="Run an end-to-end test of the Cryonirsp DC Science pipeline"
479
+ )
480
+ parser.add_argument("scratch_path", help="Location to use as the DC 'scratch' disk")
481
+ parser.add_argument(
482
+ "-i",
483
+ "--run-id",
484
+ help="Which subdir to use. This will become the recipe run id",
485
+ type=int,
486
+ default=4,
487
+ )
488
+ parser.add_argument("--suffix", help="File suffix to treat as INPUT frames", default="FITS")
489
+ parser.add_argument(
490
+ "-X",
491
+ "--transfer-trial-data",
492
+ help="Transfer trial data to a different location.",
493
+ nargs="?",
494
+ const="default",
495
+ default=None,
496
+ )
497
+ parser.add_argument(
498
+ "-T",
499
+ "--skip-translation",
500
+ help="Skip the translation of raw 122 l0 frames to 214 l0",
501
+ action="store_true",
502
+ )
503
+ parser.add_argument(
504
+ "-t", "--only-translate", help="Do ONLY the translation step", action="store_true"
505
+ )
506
+ parser.add_argument(
507
+ "--skip-saving-parse",
508
+ help="DON'T save the results of either parsing. Useful for really large "
509
+ "datasets that you know will only be run once.",
510
+ action="store_true",
511
+ )
512
+ parser.add_argument(
513
+ "-I",
514
+ "--load-input-parsing",
515
+ help="Load constants on input files",
516
+ action="store_true",
517
+ )
518
+ parser.add_argument(
519
+ "-Z",
520
+ "--load-linearized",
521
+ help="Load linearized tags from a previous run",
522
+ action="store_true",
523
+ )
524
+ parser.add_argument(
525
+ "-z", "--only-linearize", help="Don't continue after linearization", action="store_true"
526
+ )
527
+ parser.add_argument(
528
+ "-R",
529
+ "--load-linearized-parsing",
530
+ help="Load tags and constants from linearized files",
531
+ action="store_true",
532
+ )
533
+ parser.add_argument(
534
+ "-M",
535
+ "--load-bad-pixel-map",
536
+ help="Load bad pixel map from previously saved run",
537
+ action="store_true",
538
+ )
539
+ parser.add_argument(
540
+ "-B",
541
+ "--load-beam-boundaries",
542
+ help="Load beam boundaries from a previously saved run",
543
+ action="store_true",
544
+ )
545
+ parser.add_argument(
546
+ "-D",
547
+ "--load-dark",
548
+ help="Load dark calibration from previously saved run",
549
+ action="store_true",
550
+ )
551
+ parser.add_argument(
552
+ "-L",
553
+ "--load-lamp",
554
+ help="Load lamp calibration from previously saved run",
555
+ action="store_true",
556
+ )
557
+ parser.add_argument(
558
+ "-G",
559
+ "--load-geometric",
560
+ help="Load geometric calibration from previously saved run",
561
+ action="store_true",
562
+ )
563
+ parser.add_argument(
564
+ "-S",
565
+ "--load-solar",
566
+ help="Load solar calibration from previously saved run",
567
+ action="store_true",
568
+ )
569
+ parser.add_argument(
570
+ "-W",
571
+ "--load-dispersion-correction",
572
+ help="Load dispersion correction solution from previously saved run",
573
+ action="store_true",
574
+ )
575
+ parser.add_argument(
576
+ "-P",
577
+ "--load-inst-pol",
578
+ help="Load instrument polarization calibration from previously saved run",
579
+ action="store_true",
580
+ )
581
+ parser.add_argument("-A", "--use-apm", help="Send APM spans to SIM", action="store_true")
582
+ parser.add_argument(
583
+ "-p",
584
+ "--param-path",
585
+ help="Path to parameter directory",
586
+ type=str,
587
+ default=None,
588
+ )
589
+
590
+ args = parser.parse_args()
591
+ sys.exit(
592
+ main(
593
+ scratch_path=args.scratch_path,
594
+ suffix=args.suffix,
595
+ recipe_run_id=args.run_id,
596
+ skip_translation=args.skip_translation,
597
+ only_translate=args.only_translate,
598
+ skip_saving_parse=args.skip_saving_parse,
599
+ load_input_parsing=args.load_input_parsing,
600
+ load_linearized=args.load_linearized,
601
+ only_linearize=args.only_linearize,
602
+ load_linearized_parsing=args.load_linearized_parsing,
603
+ load_bad_pixel_map=args.load_bad_pixel_map,
604
+ load_beam_boundaries=args.load_beam_boundaries,
605
+ load_dark=args.load_dark,
606
+ load_lamp=args.load_lamp,
607
+ load_geometric=args.load_geometric,
608
+ load_solar=args.load_solar,
609
+ load_dispersion_correction=args.load_dispersion_correction,
610
+ load_inst_pol=args.load_inst_pol,
611
+ use_apm=args.use_apm,
612
+ param_path=Path(args.param_path),
613
+ transfer_trial_data=args.transfer_trial_data,
614
+ )
615
+ )