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.
- changelog/.gitempty +0 -0
- dkist_processing_cryonirsp/__init__.py +11 -0
- dkist_processing_cryonirsp/config.py +12 -0
- dkist_processing_cryonirsp/models/__init__.py +1 -0
- dkist_processing_cryonirsp/models/constants.py +248 -0
- dkist_processing_cryonirsp/models/exposure_conditions.py +26 -0
- dkist_processing_cryonirsp/models/parameters.py +296 -0
- dkist_processing_cryonirsp/models/tags.py +168 -0
- dkist_processing_cryonirsp/models/task_name.py +14 -0
- dkist_processing_cryonirsp/parsers/__init__.py +1 -0
- dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py +111 -0
- dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py +30 -0
- dkist_processing_cryonirsp/parsers/exposure_conditions.py +163 -0
- dkist_processing_cryonirsp/parsers/map_repeats.py +40 -0
- dkist_processing_cryonirsp/parsers/measurements.py +55 -0
- dkist_processing_cryonirsp/parsers/modstates.py +31 -0
- dkist_processing_cryonirsp/parsers/optical_density_filters.py +40 -0
- dkist_processing_cryonirsp/parsers/polarimetric_check.py +120 -0
- dkist_processing_cryonirsp/parsers/scan_step.py +412 -0
- dkist_processing_cryonirsp/parsers/time.py +80 -0
- dkist_processing_cryonirsp/parsers/wavelength.py +26 -0
- dkist_processing_cryonirsp/tasks/__init__.py +19 -0
- dkist_processing_cryonirsp/tasks/assemble_movie.py +202 -0
- dkist_processing_cryonirsp/tasks/bad_pixel_map.py +96 -0
- dkist_processing_cryonirsp/tasks/beam_boundaries_base.py +279 -0
- dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py +55 -0
- dkist_processing_cryonirsp/tasks/ci_science.py +169 -0
- dkist_processing_cryonirsp/tasks/cryonirsp_base.py +67 -0
- dkist_processing_cryonirsp/tasks/dark.py +98 -0
- dkist_processing_cryonirsp/tasks/gain.py +251 -0
- dkist_processing_cryonirsp/tasks/instrument_polarization.py +447 -0
- dkist_processing_cryonirsp/tasks/l1_output_data.py +44 -0
- dkist_processing_cryonirsp/tasks/linearity_correction.py +582 -0
- dkist_processing_cryonirsp/tasks/make_movie_frames.py +302 -0
- dkist_processing_cryonirsp/tasks/mixin/__init__.py +1 -0
- dkist_processing_cryonirsp/tasks/mixin/beam_access.py +52 -0
- dkist_processing_cryonirsp/tasks/mixin/corrections.py +177 -0
- dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py +193 -0
- dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py +309 -0
- dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py +297 -0
- dkist_processing_cryonirsp/tasks/parse.py +281 -0
- dkist_processing_cryonirsp/tasks/quality_metrics.py +271 -0
- dkist_processing_cryonirsp/tasks/science_base.py +511 -0
- dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py +270 -0
- dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +484 -0
- dkist_processing_cryonirsp/tasks/sp_geometric.py +585 -0
- dkist_processing_cryonirsp/tasks/sp_science.py +299 -0
- dkist_processing_cryonirsp/tasks/sp_solar_gain.py +475 -0
- dkist_processing_cryonirsp/tasks/trial_output_data.py +61 -0
- dkist_processing_cryonirsp/tasks/write_l1.py +1033 -0
- dkist_processing_cryonirsp/tests/__init__.py +1 -0
- dkist_processing_cryonirsp/tests/conftest.py +456 -0
- dkist_processing_cryonirsp/tests/header_models.py +592 -0
- dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py +0 -0
- dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py +541 -0
- dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py +615 -0
- dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py +96 -0
- dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +592 -0
- dkist_processing_cryonirsp/tests/test_assemble_movie.py +144 -0
- dkist_processing_cryonirsp/tests/test_assemble_qualilty.py +517 -0
- dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +115 -0
- dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +106 -0
- dkist_processing_cryonirsp/tests/test_ci_science.py +355 -0
- dkist_processing_cryonirsp/tests/test_corrections.py +126 -0
- dkist_processing_cryonirsp/tests/test_cryo_base.py +202 -0
- dkist_processing_cryonirsp/tests/test_cryo_constants.py +76 -0
- dkist_processing_cryonirsp/tests/test_dark.py +287 -0
- dkist_processing_cryonirsp/tests/test_gain.py +278 -0
- dkist_processing_cryonirsp/tests/test_instrument_polarization.py +531 -0
- dkist_processing_cryonirsp/tests/test_linearity_correction.py +245 -0
- dkist_processing_cryonirsp/tests/test_make_movie_frames.py +111 -0
- dkist_processing_cryonirsp/tests/test_parameters.py +266 -0
- dkist_processing_cryonirsp/tests/test_parse.py +1439 -0
- dkist_processing_cryonirsp/tests/test_quality.py +203 -0
- dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +112 -0
- dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +155 -0
- dkist_processing_cryonirsp/tests/test_sp_geometric.py +319 -0
- dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py +121 -0
- dkist_processing_cryonirsp/tests/test_sp_science.py +483 -0
- dkist_processing_cryonirsp/tests/test_sp_solar.py +198 -0
- dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py +79 -0
- dkist_processing_cryonirsp/tests/test_trial_output_data.py +251 -0
- dkist_processing_cryonirsp/tests/test_workflows.py +9 -0
- dkist_processing_cryonirsp/tests/test_write_l1.py +436 -0
- dkist_processing_cryonirsp/workflows/__init__.py +2 -0
- dkist_processing_cryonirsp/workflows/ci_l0_processing.py +77 -0
- dkist_processing_cryonirsp/workflows/sp_l0_processing.py +84 -0
- dkist_processing_cryonirsp/workflows/trial_workflows.py +190 -0
- dkist_processing_cryonirsp-1.3.4.dist-info/METADATA +194 -0
- dkist_processing_cryonirsp-1.3.4.dist-info/RECORD +111 -0
- dkist_processing_cryonirsp-1.3.4.dist-info/WHEEL +5 -0
- dkist_processing_cryonirsp-1.3.4.dist-info/top_level.txt +4 -0
- docs/Makefile +134 -0
- docs/bad_pixel_calibration.rst +47 -0
- docs/beam_angle_calculation.rst +53 -0
- docs/beam_boundary_computation.rst +88 -0
- docs/changelog.rst +7 -0
- docs/ci_science_calibration.rst +33 -0
- docs/conf.py +52 -0
- docs/index.rst +21 -0
- docs/l0_to_l1_cryonirsp_ci-full-trial.rst +10 -0
- docs/l0_to_l1_cryonirsp_ci.rst +10 -0
- docs/l0_to_l1_cryonirsp_sp-full-trial.rst +10 -0
- docs/l0_to_l1_cryonirsp_sp.rst +10 -0
- docs/linearization.rst +43 -0
- docs/make.bat +170 -0
- docs/requirements.txt +1 -0
- docs/requirements_table.rst +8 -0
- docs/scientific_changelog.rst +10 -0
- docs/sp_science_calibration.rst +59 -0
- 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
|
+
)
|