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,541 @@
1
+ import argparse
2
+ import json
3
+ import os
4
+ import sys
5
+ from datetime import datetime
6
+ from pathlib import Path
7
+
8
+ from astropy.io import fits
9
+ from dkist_processing_common.manual import ManualProcessing
10
+ from dkist_processing_common.models.constants import BudName
11
+ from dkist_processing_common.tasks import WorkflowTaskBase
12
+ from dkist_service_configuration.logging import logger
13
+
14
+ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
15
+ from dkist_processing_cryonirsp.models.tags import CryonirspTag
16
+ from dkist_processing_cryonirsp.tasks import CIBeamBoundariesCalibration
17
+ from dkist_processing_cryonirsp.tasks import SPDispersionAxisCorrection
18
+ from dkist_processing_cryonirsp.tasks.bad_pixel_map import BadPixelMapCalibration
19
+ from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
20
+ from dkist_processing_cryonirsp.tasks.dark import DarkCalibration
21
+ from dkist_processing_cryonirsp.tasks.gain import CISolarGainCalibration
22
+ from dkist_processing_cryonirsp.tasks.gain import LampGainCalibration
23
+ from dkist_processing_cryonirsp.tasks.instrument_polarization import (
24
+ CIInstrumentPolarizationCalibration,
25
+ )
26
+ from dkist_processing_cryonirsp.tasks.instrument_polarization import (
27
+ SPInstrumentPolarizationCalibration,
28
+ )
29
+ from dkist_processing_cryonirsp.tasks.linearity_correction import LinearityCorrection
30
+ from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspCILinearizedData
31
+ from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspRampData
32
+ from dkist_processing_cryonirsp.tasks.parse import ParseL0CryonirspSPLinearizedData
33
+ from dkist_processing_cryonirsp.tasks.sp_beam_boundaries import SPBeamBoundariesCalibration
34
+ from dkist_processing_cryonirsp.tasks.sp_geometric import SPGeometricCalibration
35
+ from dkist_processing_cryonirsp.tasks.sp_solar_gain import SPSolarGainCalibration
36
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
37
+ create_input_dataset_parameter_document,
38
+ )
39
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import DBAccess
40
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
41
+ load_parsing_task,
42
+ )
43
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
44
+ LoadBadPixelMap,
45
+ )
46
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
47
+ LoadBeamBoundaryCal,
48
+ )
49
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import LoadDarkCal
50
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
51
+ LoadDispersionAxisCorrection,
52
+ )
53
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
54
+ LoadGeometricCal,
55
+ )
56
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
57
+ LoadInstPolCal,
58
+ )
59
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import LoadLampCal
60
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
61
+ LoadLinearizedFiles,
62
+ )
63
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import LoadSolarCal
64
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
65
+ save_parsing_task,
66
+ )
67
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
68
+ SaveBadPixelMap,
69
+ )
70
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
71
+ SaveBeamBoundaryCal,
72
+ )
73
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import SaveDarkCal
74
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
75
+ SaveDispersionAxisCorrection,
76
+ )
77
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
78
+ SaveGeometricCal,
79
+ )
80
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
81
+ SaveInstPolCal,
82
+ )
83
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import SaveLampCal
84
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
85
+ SaveLinearizedFiles,
86
+ )
87
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import SaveSolarCal
88
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
89
+ tag_inputs_task,
90
+ )
91
+ from dkist_processing_cryonirsp.tests.local_trial_workflows.local_trial_helpers import (
92
+ translate_122_to_214_task,
93
+ )
94
+
95
+ INV = False
96
+ try:
97
+ from dkist_inventory.asdf_generator import dataset_from_fits
98
+
99
+ INV = True
100
+ except ModuleNotFoundError:
101
+ logger.warning(
102
+ "Could not load dkist-inventory. CreateTrialDatasetInventory and CreateTrialAsdf require dkist-inventory."
103
+ )
104
+
105
+ QUALITY = False
106
+ try:
107
+ import dkist_quality
108
+
109
+ QUALITY = True
110
+ except ModuleNotFoundError:
111
+ logger.warning("Could not load dkist-quality. CreateTrialQualityReport requires dkist-quality.")
112
+
113
+ if QUALITY:
114
+ import matplotlib.pyplot as plt
115
+
116
+ plt.ioff()
117
+
118
+
119
+ def tag_linearized_inputs_task(suffix: str):
120
+ class TagLinearizedInputs(WorkflowTaskBase):
121
+ def run(self) -> None:
122
+ logger.info(f"Looking in {os.path.abspath(self.scratch.workflow_base_path)}")
123
+ input_file_list = list(self.scratch.workflow_base_path.glob(f"*.{suffix}"))
124
+ if len(input_file_list) == 0:
125
+ raise FileNotFoundError(
126
+ f"Did not find any files matching '*.{suffix}' in {self.scratch.workflow_base_path}"
127
+ )
128
+ for file in input_file_list:
129
+ logger.info(f"Found {file}")
130
+ self.tag(path=file, tags=[CryonirspTag.linearized(), CryonirspTag.frame()])
131
+ # Update the arm_id constant, as it is derived in linearity processing
132
+ with fits.open(file) as hdul:
133
+ if len(hdul) == 1:
134
+ hdu = hdul[0]
135
+ else:
136
+ hdu = hdul[1]
137
+ arm_id = hdu.header["CNARMID"]
138
+ self.constants._update({CryonirspBudName.arm_id.value: arm_id})
139
+
140
+ return TagLinearizedInputs
141
+
142
+
143
+ def spoof_obs_ramp_parsed_constants(wavelength: float = 1083.0):
144
+ class SetObsWavelength(WorkflowTaskBase):
145
+ def run(self) -> None:
146
+ self.constants._update({CryonirspBudName.wavelength.value: wavelength})
147
+ self.constants._update({BudName.obs_ip_start_time.value: datetime.now().isoformat()})
148
+
149
+ return SetObsWavelength
150
+
151
+
152
+ def spoof_obs_lin_parsed_constants(
153
+ polarimetric: bool = True,
154
+ ):
155
+ class SetCalOnlyConstants(CryonirspTaskBase):
156
+ def run(self) -> None:
157
+ self.constants._update(
158
+ {
159
+ CryonirspBudName.observe_exposure_conditions_list.value: self.constants.solar_gain_exposure_conditions_list
160
+ }
161
+ )
162
+
163
+ if polarimetric:
164
+ self.constants._update({CryonirspBudName.num_modstates.value: 8})
165
+ self.constants._update({CryonirspBudName.modulator_spin_mode.value: "Continuous"})
166
+ else:
167
+ self.constants._update({CryonirspBudName.num_modstates.value: 1})
168
+ self.constants._update({CryonirspBudName.modulator_spin_mode.value: "None"})
169
+
170
+ return SetCalOnlyConstants
171
+
172
+
173
+ def setup_APM_config() -> None:
174
+ mesh_config = {
175
+ "system-monitoring-log-apm": {
176
+ "mesh_address": "system-monitoring-log-apm.service.sim.consul",
177
+ "mesh_port": 8200,
178
+ },
179
+ "automated-processing-scratch-inventory": {"mesh_address": "localhost", "mesh_port": 6379},
180
+ "internal-api-gateway": {"mesh_address": "localhost", "mesh_port": 80},
181
+ }
182
+ apm_options = {"TRANSACTION_MAX_SPANS": 10000}
183
+ os.environ["MESH_CONFIG"] = json.dumps(mesh_config)
184
+ os.environ["ELASTIC_APM_ENABLED"] = "true"
185
+ os.environ["ELASTIC_APM_OTHER_OPTIONS"] = json.dumps(apm_options)
186
+
187
+
188
+ def CI_workflow(
189
+ manual_processing_run: ManualProcessing,
190
+ load_beam_boundaries: bool = False,
191
+ load_dark: bool = False,
192
+ load_lamp: bool = False,
193
+ load_solar: bool = False,
194
+ load_inst_pol: bool = False,
195
+ ) -> None:
196
+ if load_beam_boundaries:
197
+ manual_processing_run.run_task(task=LoadBeamBoundaryCal)
198
+ else:
199
+ manual_processing_run.run_task(task=CIBeamBoundariesCalibration)
200
+ manual_processing_run.run_task(task=SaveBeamBoundaryCal)
201
+
202
+ if load_dark:
203
+ manual_processing_run.run_task(task=LoadDarkCal)
204
+ else:
205
+ manual_processing_run.run_task(task=DarkCalibration)
206
+ manual_processing_run.run_task(task=SaveDarkCal)
207
+
208
+ if load_lamp:
209
+ manual_processing_run.run_task(task=LoadLampCal)
210
+ else:
211
+ manual_processing_run.run_task(task=LampGainCalibration)
212
+ manual_processing_run.run_task(task=SaveLampCal)
213
+
214
+ if load_solar:
215
+ manual_processing_run.run_task(task=LoadSolarCal)
216
+ else:
217
+ manual_processing_run.run_task(task=CISolarGainCalibration)
218
+ manual_processing_run.run_task(task=SaveSolarCal)
219
+
220
+ if load_inst_pol:
221
+ manual_processing_run.run_task(task=LoadInstPolCal)
222
+ else:
223
+ manual_processing_run.run_task(task=CIInstrumentPolarizationCalibration)
224
+ manual_processing_run.run_task(task=SaveInstPolCal)
225
+
226
+
227
+ def SP_workflow(
228
+ manual_processing_run: ManualProcessing,
229
+ load_beam_boundaries: bool = False,
230
+ load_dark: bool = False,
231
+ load_lamp: bool = False,
232
+ load_geometric: bool = False,
233
+ load_solar: bool = False,
234
+ load_dispersion_correction: bool = False,
235
+ load_inst_pol: bool = False,
236
+ ) -> None:
237
+ if load_beam_boundaries:
238
+ manual_processing_run.run_task(task=LoadBeamBoundaryCal)
239
+ else:
240
+ manual_processing_run.run_task(task=SPBeamBoundariesCalibration)
241
+ manual_processing_run.run_task(task=SaveBeamBoundaryCal)
242
+
243
+ if load_dark:
244
+ manual_processing_run.run_task(task=LoadDarkCal)
245
+ else:
246
+ manual_processing_run.run_task(task=DarkCalibration)
247
+ manual_processing_run.run_task(task=SaveDarkCal)
248
+
249
+ if load_lamp:
250
+ manual_processing_run.run_task(task=LoadLampCal)
251
+ else:
252
+ manual_processing_run.run_task(task=LampGainCalibration)
253
+ manual_processing_run.run_task(task=SaveLampCal)
254
+
255
+ if load_geometric:
256
+ manual_processing_run.run_task(task=LoadGeometricCal)
257
+ else:
258
+ manual_processing_run.run_task(task=SPGeometricCalibration)
259
+ manual_processing_run.run_task(task=SaveGeometricCal)
260
+
261
+ if load_solar:
262
+ manual_processing_run.run_task(task=LoadSolarCal)
263
+ else:
264
+ manual_processing_run.run_task(task=SPSolarGainCalibration)
265
+ manual_processing_run.run_task(task=SaveSolarCal)
266
+
267
+ if load_dispersion_correction:
268
+ manual_processing_run.run_task(task=LoadDispersionAxisCorrection)
269
+ else:
270
+ manual_processing_run.run_task(task=SPDispersionAxisCorrection)
271
+ manual_processing_run.run_task(task=SaveDispersionAxisCorrection)
272
+
273
+ if load_inst_pol:
274
+ manual_processing_run.run_task(task=LoadInstPolCal)
275
+ else:
276
+ manual_processing_run.run_task(task=SPInstrumentPolarizationCalibration)
277
+ manual_processing_run.run_task(task=SaveInstPolCal)
278
+
279
+
280
+ def main(
281
+ scratch_path: str,
282
+ suffix: str = "FITS",
283
+ recipe_run_id: int = 2,
284
+ skip_translation: bool = False,
285
+ only_translate: bool = False,
286
+ skip_saving_parse: bool = False,
287
+ load_input_parsing: bool = False,
288
+ load_linearized: bool = False,
289
+ only_linearize: bool = False,
290
+ load_linearized_parsing: bool = False,
291
+ load_bad_pixel_map: bool = False,
292
+ load_beam_boundaries: bool = False,
293
+ load_dark: bool = False,
294
+ load_lamp: bool = False,
295
+ load_geometric: bool = False,
296
+ load_solar: bool = False,
297
+ load_dispersion_correction: bool = False,
298
+ load_inst_pol: bool = False,
299
+ use_apm: bool = False,
300
+ param_path: Path = None,
301
+ dummy_wavelength: float = 1083.0,
302
+ polarimetric: bool = True,
303
+ ):
304
+ if use_apm:
305
+ setup_APM_config()
306
+ with ManualProcessing(
307
+ workflow_path=Path(scratch_path),
308
+ recipe_run_id=recipe_run_id,
309
+ testing=True,
310
+ workflow_name="sp_l0_to_l1_cryonirsp",
311
+ workflow_version="GROGU",
312
+ ) as manual_processing_run:
313
+ if not skip_translation:
314
+ manual_processing_run.run_task(task=translate_122_to_214_task(suffix))
315
+ if only_translate:
316
+ return
317
+ manual_processing_run.run_task(
318
+ task=create_input_dataset_parameter_document(param_path=param_path)
319
+ )
320
+
321
+ if not load_linearized:
322
+ manual_processing_run.run_task(task=tag_inputs_task(suffix))
323
+
324
+ if load_input_parsing or load_linearized:
325
+ manual_processing_run.run_task(task=load_parsing_task(save_file="input_parsing.asdf"))
326
+ else:
327
+ manual_processing_run.run_task(task=ParseL0CryonirspRampData)
328
+ manual_processing_run.run_task(task=spoof_obs_ramp_parsed_constants(dummy_wavelength))
329
+ manual_processing_run.run_task(
330
+ task=save_parsing_task(
331
+ tag_list=[CryonirspTag.input(), CryonirspTag.frame()],
332
+ save_file="input_parsing.asdf",
333
+ save_file_tags=False,
334
+ )
335
+ )
336
+
337
+ if load_linearized:
338
+ manual_processing_run.run_task(task=LoadLinearizedFiles)
339
+ else:
340
+ manual_processing_run.run_task(task=LinearityCorrection)
341
+ manual_processing_run.run_task(task=SaveLinearizedFiles)
342
+ manual_processing_run.run_task(task=LoadLinearizedFiles)
343
+
344
+ if only_linearize:
345
+ logger.info("Linearization complete. All done.")
346
+ return
347
+
348
+ db_access = DBAccess(recipe_run_id=recipe_run_id)
349
+ arm_id = db_access.constants.arm_id
350
+
351
+ if load_linearized_parsing:
352
+ manual_processing_run.run_task(
353
+ task=load_parsing_task(save_file="linearized_parsing.asdf")
354
+ )
355
+ else:
356
+ if arm_id == "SP":
357
+ manual_processing_run.run_task(task=ParseL0CryonirspSPLinearizedData)
358
+ elif arm_id == "CI":
359
+ manual_processing_run.run_task(task=ParseL0CryonirspCILinearizedData)
360
+ else:
361
+ raise ValueError(f"Did not recognize {arm_id = }")
362
+ manual_processing_run.run_task(
363
+ task=spoof_obs_lin_parsed_constants(polarimetric=polarimetric)
364
+ )
365
+ if not skip_saving_parse:
366
+ manual_processing_run.run_task(
367
+ task=save_parsing_task(
368
+ tag_list=[CryonirspTag.linearized(), CryonirspTag.frame()],
369
+ save_file="linearized_parsing.asdf",
370
+ )
371
+ )
372
+
373
+ if load_bad_pixel_map:
374
+ manual_processing_run.run_task(task=LoadBadPixelMap)
375
+ else:
376
+ manual_processing_run.run_task(task=BadPixelMapCalibration)
377
+ manual_processing_run.run_task(task=SaveBadPixelMap)
378
+
379
+ if arm_id == "SP":
380
+ logger.info("Running SP pipeline")
381
+ SP_workflow(
382
+ manual_processing_run,
383
+ load_beam_boundaries=load_beam_boundaries,
384
+ load_dark=load_dark,
385
+ load_lamp=load_lamp,
386
+ load_geometric=load_geometric,
387
+ load_solar=load_solar,
388
+ load_dispersion_correction=load_dispersion_correction,
389
+ load_inst_pol=load_inst_pol,
390
+ )
391
+ elif arm_id == "CI":
392
+ logger.info("Running CI pipeline")
393
+ CI_workflow(
394
+ manual_processing_run,
395
+ load_beam_boundaries=load_beam_boundaries,
396
+ load_dark=load_dark,
397
+ load_lamp=load_lamp,
398
+ load_solar=load_solar,
399
+ load_inst_pol=load_inst_pol,
400
+ )
401
+ else:
402
+ raise ValueError(f"Did not recognize {arm_id = }")
403
+
404
+
405
+ if __name__ == "__main__":
406
+ parser = argparse.ArgumentParser(
407
+ description="Run an end-to-end test of the Cryonirsp DC Science pipeline"
408
+ )
409
+ parser.add_argument("scratch_path", help="Location to use as the DC 'scratch' disk")
410
+ parser.add_argument(
411
+ "-i",
412
+ "--run-id",
413
+ help="Which subdir to use. This will become the recipe run id",
414
+ type=int,
415
+ default=4,
416
+ )
417
+ parser.add_argument("--suffix", help="File suffix to treat as INPUT frames", default="FITS")
418
+ parser.add_argument(
419
+ "-T",
420
+ "--skip-translation",
421
+ help="Skip the translation of raw 122 l0 frames to 214 l0",
422
+ action="store_true",
423
+ )
424
+ parser.add_argument(
425
+ "-t", "--only-translate", help="Do ONLY the translation step", action="store_true"
426
+ )
427
+ parser.add_argument(
428
+ "--skip-saving-parse",
429
+ help="DON'T save the results of either parsing. Useful for really large "
430
+ "datasets that you know will only be run once.",
431
+ action="store_true",
432
+ )
433
+ parser.add_argument(
434
+ "-I",
435
+ "--load-input-parsing",
436
+ help="Load constants on input files",
437
+ action="store_true",
438
+ )
439
+ parser.add_argument(
440
+ "-Z",
441
+ "--load-linearized",
442
+ help="Load linearized tags from a previous run",
443
+ action="store_true",
444
+ )
445
+ parser.add_argument(
446
+ "-z", "--only-linearize", help="Don't continue after linearization", action="store_true"
447
+ )
448
+ parser.add_argument(
449
+ "-R",
450
+ "--load-linearized-parsing",
451
+ help="Load tags and constants from linearized files",
452
+ action="store_true",
453
+ )
454
+ parser.add_argument(
455
+ "-M",
456
+ "--load-bad-pixel-map",
457
+ help="Load bad pixel map from previously saved run",
458
+ action="store_true",
459
+ )
460
+ parser.add_argument(
461
+ "-B",
462
+ "--load-beam-boundaries",
463
+ help="Load beam boundaries from a previously saved run",
464
+ action="store_true",
465
+ )
466
+ parser.add_argument(
467
+ "-D",
468
+ "--load-dark",
469
+ help="Load dark calibration from previously saved run",
470
+ action="store_true",
471
+ )
472
+ parser.add_argument(
473
+ "-L",
474
+ "--load-lamp",
475
+ help="Load lamp calibration from previously saved run",
476
+ action="store_true",
477
+ )
478
+ parser.add_argument(
479
+ "-G",
480
+ "--load-geometric",
481
+ help="Load geometric calibration from previously saved run",
482
+ action="store_true",
483
+ )
484
+ parser.add_argument(
485
+ "-S",
486
+ "--load-solar",
487
+ help="Load solar calibration from previously saved run",
488
+ action="store_true",
489
+ )
490
+ parser.add_argument(
491
+ "-W",
492
+ "--load-dispersion-correction",
493
+ help="Load dispersion correction solution from previously saved run",
494
+ action="store_true",
495
+ )
496
+ parser.add_argument(
497
+ "-P",
498
+ "--load-inst-pol",
499
+ help="Load instrument polarization calibration from previously saved run",
500
+ action="store_true",
501
+ )
502
+ parser.add_argument("-A", "--use-apm", help="Send APM spans to SIM", action="store_true")
503
+ parser.add_argument(
504
+ "-p",
505
+ "--param-path",
506
+ help="Path to parameter directory",
507
+ type=str,
508
+ default=None,
509
+ )
510
+ parser.add_argument(
511
+ "--intensity-only",
512
+ help="Contrive constants so pipeline thinks data are non-polarimetric",
513
+ action="store_true",
514
+ )
515
+
516
+ args = parser.parse_args()
517
+ sys.exit(
518
+ main(
519
+ scratch_path=args.scratch_path,
520
+ suffix=args.suffix,
521
+ recipe_run_id=args.run_id,
522
+ skip_translation=args.skip_translation,
523
+ only_translate=args.only_translate,
524
+ skip_saving_parse=args.skip_saving_parse,
525
+ load_input_parsing=args.load_input_parsing,
526
+ load_linearized=args.load_linearized,
527
+ only_linearize=args.only_linearize,
528
+ load_linearized_parsing=args.load_linearized_parsing,
529
+ load_bad_pixel_map=args.load_bad_pixel_map,
530
+ load_beam_boundaries=args.load_beam_boundaries,
531
+ load_dark=args.load_dark,
532
+ load_lamp=args.load_lamp,
533
+ load_geometric=args.load_geometric,
534
+ load_solar=args.load_solar,
535
+ load_dispersion_correction=args.load_dispersion_correction,
536
+ load_inst_pol=args.load_inst_pol,
537
+ use_apm=args.use_apm,
538
+ param_path=Path(args.param_path),
539
+ polarimetric=not args.intensity_only,
540
+ )
541
+ )