dkist-processing-visp 2.20.14__py3-none-any.whl → 5.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dkist_processing_visp/__init__.py +1 -0
- dkist_processing_visp/config.py +1 -0
- dkist_processing_visp/models/constants.py +61 -20
- dkist_processing_visp/models/fits_access.py +20 -0
- dkist_processing_visp/models/metric_code.py +10 -0
- dkist_processing_visp/models/parameters.py +129 -24
- dkist_processing_visp/models/tags.py +22 -1
- dkist_processing_visp/models/task_name.py +1 -0
- dkist_processing_visp/parsers/map_repeats.py +1 -0
- dkist_processing_visp/parsers/modulator_states.py +1 -0
- dkist_processing_visp/parsers/polarimeter_mode.py +4 -2
- dkist_processing_visp/parsers/raster_step.py +4 -1
- dkist_processing_visp/parsers/spectrograph_configuration.py +75 -0
- dkist_processing_visp/parsers/time.py +24 -14
- dkist_processing_visp/parsers/visp_l0_fits_access.py +19 -8
- dkist_processing_visp/parsers/visp_l1_fits_access.py +1 -0
- dkist_processing_visp/tasks/__init__.py +1 -0
- dkist_processing_visp/tasks/assemble_movie.py +1 -0
- dkist_processing_visp/tasks/background_light.py +2 -1
- dkist_processing_visp/tasks/dark.py +5 -4
- dkist_processing_visp/tasks/geometric.py +132 -20
- dkist_processing_visp/tasks/instrument_polarization.py +128 -18
- dkist_processing_visp/tasks/l1_output_data.py +203 -0
- dkist_processing_visp/tasks/lamp.py +53 -93
- dkist_processing_visp/tasks/make_movie_frames.py +8 -6
- dkist_processing_visp/tasks/mixin/beam_access.py +1 -0
- dkist_processing_visp/tasks/mixin/corrections.py +54 -4
- dkist_processing_visp/tasks/mixin/downsample.py +1 -0
- dkist_processing_visp/tasks/parse.py +50 -17
- dkist_processing_visp/tasks/quality_metrics.py +5 -4
- dkist_processing_visp/tasks/science.py +126 -46
- dkist_processing_visp/tasks/solar.py +896 -456
- dkist_processing_visp/tasks/visp_base.py +4 -3
- dkist_processing_visp/tasks/write_l1.py +38 -10
- dkist_processing_visp/tests/conftest.py +145 -47
- dkist_processing_visp/tests/header_models.py +157 -20
- dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +21 -78
- dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +421 -0
- dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +387 -0
- dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +18 -75
- dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +346 -14
- dkist_processing_visp/tests/test_assemble_movie.py +2 -3
- dkist_processing_visp/tests/test_assemble_quality.py +89 -4
- dkist_processing_visp/tests/test_background_light.py +51 -44
- dkist_processing_visp/tests/test_dark.py +4 -3
- dkist_processing_visp/tests/test_downsample.py +1 -0
- dkist_processing_visp/tests/test_fits_access.py +43 -0
- dkist_processing_visp/tests/test_geometric.py +45 -4
- dkist_processing_visp/tests/test_instrument_polarization.py +72 -9
- dkist_processing_visp/tests/test_lamp.py +22 -26
- dkist_processing_visp/tests/test_make_movie_frames.py +4 -4
- dkist_processing_visp/tests/test_map_repeats.py +3 -1
- dkist_processing_visp/tests/test_parameters.py +122 -21
- dkist_processing_visp/tests/test_parse.py +164 -18
- dkist_processing_visp/tests/test_quality.py +3 -4
- dkist_processing_visp/tests/test_science.py +113 -15
- dkist_processing_visp/tests/test_solar.py +318 -99
- dkist_processing_visp/tests/test_visp_constants.py +38 -8
- dkist_processing_visp/tests/test_workflows.py +1 -0
- dkist_processing_visp/tests/test_write_l1.py +22 -3
- dkist_processing_visp/workflows/__init__.py +1 -0
- dkist_processing_visp/workflows/l0_processing.py +10 -3
- dkist_processing_visp/workflows/trial_workflows.py +8 -2
- dkist_processing_visp-5.1.1.dist-info/METADATA +552 -0
- dkist_processing_visp-5.1.1.dist-info/RECORD +94 -0
- {dkist_processing_visp-2.20.14.dist-info → dkist_processing_visp-5.1.1.dist-info}/WHEEL +1 -1
- docs/conf.py +5 -1
- docs/gain_correction.rst +52 -44
- docs/science_calibration.rst +7 -0
- dkist_processing_visp/tasks/mixin/line_zones.py +0 -115
- dkist_processing_visp-2.20.14.dist-info/METADATA +0 -196
- dkist_processing_visp-2.20.14.dist-info/RECORD +0 -89
- {dkist_processing_visp-2.20.14.dist-info → dkist_processing_visp-5.1.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from dataclasses import asdict
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from random import randint
|
|
9
|
+
|
|
10
|
+
from dkist_processing_common.codecs.basemodel import basemodel_encoder
|
|
11
|
+
from dkist_processing_common.manual import ManualProcessing
|
|
12
|
+
from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
|
|
13
|
+
from dkist_processing_common.tasks import CreateTrialQualityReport
|
|
14
|
+
from dkist_processing_common.tasks import QualityL1Metrics
|
|
15
|
+
from dkist_processing_common.tasks import WorkflowTaskBase
|
|
16
|
+
from dkist_service_configuration.logging import logger
|
|
17
|
+
|
|
18
|
+
from dkist_processing_visp.models.tags import VispTag
|
|
19
|
+
from dkist_processing_visp.tasks import AssembleVispMovie
|
|
20
|
+
from dkist_processing_visp.tasks import MakeVispMovieFrames
|
|
21
|
+
from dkist_processing_visp.tasks import ScienceCalibration
|
|
22
|
+
from dkist_processing_visp.tasks import VispAssembleQualityData
|
|
23
|
+
from dkist_processing_visp.tasks import VispL1QualityMetrics
|
|
24
|
+
from dkist_processing_visp.tasks import VispWriteL1Frame
|
|
25
|
+
from dkist_processing_visp.tasks.background_light import BackgroundLightCalibration
|
|
26
|
+
from dkist_processing_visp.tasks.dark import DarkCalibration
|
|
27
|
+
from dkist_processing_visp.tasks.geometric import GeometricCalibration
|
|
28
|
+
from dkist_processing_visp.tasks.instrument_polarization import InstrumentPolarizationCalibration
|
|
29
|
+
from dkist_processing_visp.tasks.lamp import LampCalibration
|
|
30
|
+
from dkist_processing_visp.tasks.solar import SolarCalibration
|
|
31
|
+
from dkist_processing_visp.tests.conftest import VispInputDatasetParameterValues
|
|
32
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadBackgroundCal
|
|
33
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadCalibratedData
|
|
34
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadDarkCal
|
|
35
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadGeometricCal
|
|
36
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadInputParsing
|
|
37
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadInstPolCal
|
|
38
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadLampCal
|
|
39
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import LoadSolarCal
|
|
40
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
41
|
+
ParseCalOnlyL0InputData,
|
|
42
|
+
)
|
|
43
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveBackgroundCal
|
|
44
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveCalibratedData
|
|
45
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveDarkCal
|
|
46
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveGeometricCal
|
|
47
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveInputParsing
|
|
48
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveInstPolCal
|
|
49
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveLampCal
|
|
50
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveSolarCal
|
|
51
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
52
|
+
SaveSolarGainAsScience,
|
|
53
|
+
)
|
|
54
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SetAxesTypes
|
|
55
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
56
|
+
SetCadenceConstants,
|
|
57
|
+
)
|
|
58
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SetNumModstates
|
|
59
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SetObserveExpTime
|
|
60
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
61
|
+
SetObserveIpStartTime,
|
|
62
|
+
)
|
|
63
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SetPolarimeterMode
|
|
64
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
65
|
+
TagModulatedSolarGainsAsScience,
|
|
66
|
+
)
|
|
67
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
68
|
+
TagSingleSolarGainAsScience,
|
|
69
|
+
)
|
|
70
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import ValidateL1Output
|
|
71
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
72
|
+
load_solar_gain_as_science_task,
|
|
73
|
+
)
|
|
74
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
75
|
+
set_observe_wavelength_task,
|
|
76
|
+
)
|
|
77
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import tag_inputs_task
|
|
78
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
79
|
+
transfer_trial_data_locally_task,
|
|
80
|
+
)
|
|
81
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
82
|
+
translate_122_to_214l0_task,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
QUALITY = False
|
|
86
|
+
try:
|
|
87
|
+
import dkist_quality
|
|
88
|
+
|
|
89
|
+
QUALITY = True
|
|
90
|
+
except ModuleNotFoundError:
|
|
91
|
+
logger.warning("Could not load dkist-quality. CreateTrialQualityReport requires dkist-quality.")
|
|
92
|
+
|
|
93
|
+
if QUALITY:
|
|
94
|
+
import matplotlib.pyplot as plt
|
|
95
|
+
|
|
96
|
+
plt.ioff()
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class DatetimeEncoder(json.JSONEncoder):
|
|
100
|
+
# Copied from quality_report_maker
|
|
101
|
+
"""
|
|
102
|
+
A JSON encoder which encodes datetime(s) as iso formatted strings.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
def default(self, obj):
|
|
106
|
+
if isinstance(obj, datetime):
|
|
107
|
+
return {"iso_date": obj.isoformat("T")}
|
|
108
|
+
return super().default(obj)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class CreateInputDatasetParameterDocument(WorkflowTaskBase):
|
|
112
|
+
def run(self) -> None:
|
|
113
|
+
relative_path = "input_dataset_parameters.json"
|
|
114
|
+
self.write(
|
|
115
|
+
data=InputDatasetPartDocumentList(
|
|
116
|
+
doc_list=self.input_dataset_document_simple_parameters_part
|
|
117
|
+
),
|
|
118
|
+
relative_path=relative_path,
|
|
119
|
+
tags=VispTag.input_dataset_parameters(),
|
|
120
|
+
encoder=basemodel_encoder,
|
|
121
|
+
overwrite=True,
|
|
122
|
+
)
|
|
123
|
+
logger.info(f"Wrote input dataset parameter doc to {relative_path}")
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def input_dataset_document_simple_parameters_part(self):
|
|
127
|
+
parameters_list = []
|
|
128
|
+
value_id = randint(1000, 2000)
|
|
129
|
+
for pn, pv in asdict(
|
|
130
|
+
VispInputDatasetParameterValues(
|
|
131
|
+
visp_background_on=False,
|
|
132
|
+
visp_geo_upsample_factor=10000,
|
|
133
|
+
visp_polcal_num_spatial_bins=2560,
|
|
134
|
+
)
|
|
135
|
+
).items():
|
|
136
|
+
values = [
|
|
137
|
+
{
|
|
138
|
+
"parameterValueId": value_id,
|
|
139
|
+
"parameterValue": json.dumps(pv),
|
|
140
|
+
"parameterValueStartDate": "1946-11-20",
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
parameter = {"parameterName": pn, "parameterValues": values}
|
|
144
|
+
parameters_list.append(parameter)
|
|
145
|
+
|
|
146
|
+
return parameters_list
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def main(
|
|
150
|
+
scratch_path: str,
|
|
151
|
+
suffix: str = "FITS",
|
|
152
|
+
recipe_run_id: int = 2,
|
|
153
|
+
skip_translation: bool = False,
|
|
154
|
+
only_translate: bool = False,
|
|
155
|
+
load_input_parsing: bool = False,
|
|
156
|
+
load_dark: bool = False,
|
|
157
|
+
load_background: bool = False,
|
|
158
|
+
load_lamp: bool = False,
|
|
159
|
+
load_geometric: bool = False,
|
|
160
|
+
load_solar: bool = False,
|
|
161
|
+
load_inst_pol: bool = False,
|
|
162
|
+
load_solar_gain_as_science: bool = False,
|
|
163
|
+
load_calibrated_data: bool = False,
|
|
164
|
+
force_intensity_only: bool = False,
|
|
165
|
+
transfer_trial_data: str | None = None,
|
|
166
|
+
dummy_wavelength: float = 630.0,
|
|
167
|
+
):
|
|
168
|
+
with ManualProcessing(
|
|
169
|
+
workflow_path=scratch_path,
|
|
170
|
+
recipe_run_id=recipe_run_id,
|
|
171
|
+
testing=True,
|
|
172
|
+
workflow_name="visp-l0-pipeline",
|
|
173
|
+
workflow_version="GROGU",
|
|
174
|
+
) as manual_processing_run:
|
|
175
|
+
if not skip_translation:
|
|
176
|
+
manual_processing_run.run_task(task=translate_122_to_214l0_task(suffix=suffix))
|
|
177
|
+
if only_translate:
|
|
178
|
+
return
|
|
179
|
+
manual_processing_run.run_task(task=CreateInputDatasetParameterDocument)
|
|
180
|
+
|
|
181
|
+
if load_input_parsing:
|
|
182
|
+
manual_processing_run.run_task(task=LoadInputParsing)
|
|
183
|
+
else:
|
|
184
|
+
manual_processing_run.run_task(task=tag_inputs_task(suffix))
|
|
185
|
+
manual_processing_run.run_task(task=ParseCalOnlyL0InputData)
|
|
186
|
+
manual_processing_run.run_task(
|
|
187
|
+
task=set_observe_wavelength_task(wavelength=dummy_wavelength)
|
|
188
|
+
)
|
|
189
|
+
manual_processing_run.run_task(task=SetObserveIpStartTime)
|
|
190
|
+
manual_processing_run.run_task(task=SetObserveExpTime)
|
|
191
|
+
manual_processing_run.run_task(task=SetPolarimeterMode)
|
|
192
|
+
manual_processing_run.run_task(task=SetNumModstates)
|
|
193
|
+
manual_processing_run.run_task(task=SetCadenceConstants)
|
|
194
|
+
manual_processing_run.run_task(task=SetAxesTypes)
|
|
195
|
+
manual_processing_run.run_task(task=SaveInputParsing)
|
|
196
|
+
|
|
197
|
+
if load_dark:
|
|
198
|
+
manual_processing_run.run_task(task=LoadDarkCal)
|
|
199
|
+
else:
|
|
200
|
+
manual_processing_run.run_task(task=DarkCalibration)
|
|
201
|
+
manual_processing_run.run_task(task=SaveDarkCal)
|
|
202
|
+
|
|
203
|
+
if load_background:
|
|
204
|
+
manual_processing_run.run_task(task=LoadBackgroundCal)
|
|
205
|
+
else:
|
|
206
|
+
manual_processing_run.run_task(task=BackgroundLightCalibration)
|
|
207
|
+
manual_processing_run.run_task(task=SaveBackgroundCal)
|
|
208
|
+
|
|
209
|
+
if load_lamp:
|
|
210
|
+
manual_processing_run.run_task(task=LoadLampCal)
|
|
211
|
+
else:
|
|
212
|
+
manual_processing_run.run_task(task=LampCalibration)
|
|
213
|
+
manual_processing_run.run_task(task=SaveLampCal)
|
|
214
|
+
|
|
215
|
+
if load_geometric:
|
|
216
|
+
manual_processing_run.run_task(task=LoadGeometricCal)
|
|
217
|
+
else:
|
|
218
|
+
manual_processing_run.run_task(task=GeometricCalibration)
|
|
219
|
+
manual_processing_run.run_task(task=SaveGeometricCal)
|
|
220
|
+
|
|
221
|
+
if load_solar:
|
|
222
|
+
manual_processing_run.run_task(task=LoadSolarCal)
|
|
223
|
+
else:
|
|
224
|
+
manual_processing_run.run_task(task=SolarCalibration)
|
|
225
|
+
manual_processing_run.run_task(task=SaveSolarCal)
|
|
226
|
+
|
|
227
|
+
if load_inst_pol:
|
|
228
|
+
manual_processing_run.run_task(task=LoadInstPolCal)
|
|
229
|
+
else:
|
|
230
|
+
manual_processing_run.run_task(task=InstrumentPolarizationCalibration)
|
|
231
|
+
manual_processing_run.run_task(task=SaveInstPolCal)
|
|
232
|
+
|
|
233
|
+
if load_solar_gain_as_science:
|
|
234
|
+
manual_processing_run.run_task(
|
|
235
|
+
task=load_solar_gain_as_science_task(force_intensity_only=force_intensity_only)
|
|
236
|
+
)
|
|
237
|
+
else:
|
|
238
|
+
if force_intensity_only:
|
|
239
|
+
manual_processing_run.run_task(task=TagSingleSolarGainAsScience)
|
|
240
|
+
else:
|
|
241
|
+
manual_processing_run.run_task(task=TagModulatedSolarGainsAsScience)
|
|
242
|
+
manual_processing_run.run_task(task=SaveSolarGainAsScience)
|
|
243
|
+
|
|
244
|
+
if load_calibrated_data:
|
|
245
|
+
manual_processing_run.run_task(task=LoadCalibratedData)
|
|
246
|
+
else:
|
|
247
|
+
manual_processing_run.run_task(task=ScienceCalibration)
|
|
248
|
+
manual_processing_run.run_task(task=SaveCalibratedData)
|
|
249
|
+
|
|
250
|
+
manual_processing_run.run_task(task=VispWriteL1Frame)
|
|
251
|
+
manual_processing_run.run_task(task=QualityL1Metrics)
|
|
252
|
+
manual_processing_run.run_task(task=VispL1QualityMetrics)
|
|
253
|
+
manual_processing_run.run_task(task=VispAssembleQualityData)
|
|
254
|
+
manual_processing_run.run_task(task=ValidateL1Output)
|
|
255
|
+
manual_processing_run.run_task(task=MakeVispMovieFrames)
|
|
256
|
+
manual_processing_run.run_task(task=AssembleVispMovie)
|
|
257
|
+
|
|
258
|
+
if transfer_trial_data:
|
|
259
|
+
if transfer_trial_data == "default":
|
|
260
|
+
trial_output_dir = (
|
|
261
|
+
Path(manual_processing_run.workflow_path) / str(recipe_run_id) / "trial_output"
|
|
262
|
+
)
|
|
263
|
+
else:
|
|
264
|
+
trial_output_dir = Path(transfer_trial_data).absolute()
|
|
265
|
+
|
|
266
|
+
logger.info(f"Writing trial output to {trial_output_dir}")
|
|
267
|
+
transfer_local_task = transfer_trial_data_locally_task(trial_dir=trial_output_dir)
|
|
268
|
+
manual_processing_run.run_task(transfer_local_task)
|
|
269
|
+
|
|
270
|
+
# Test some downstream services
|
|
271
|
+
if QUALITY:
|
|
272
|
+
manual_processing_run.run_task(task=CreateTrialQualityReport)
|
|
273
|
+
else:
|
|
274
|
+
logger.warning("Did NOT make quality report pdf because dkist-quality is not installed")
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
if __name__ == "__main__":
|
|
278
|
+
parser = argparse.ArgumentParser(
|
|
279
|
+
description="Run an end-to-end test of the ViSP DC Science pipeline"
|
|
280
|
+
)
|
|
281
|
+
parser.add_argument("scratch_path", help="Location to use as the DC 'scratch' disk")
|
|
282
|
+
parser.add_argument(
|
|
283
|
+
"-i",
|
|
284
|
+
"--run-id",
|
|
285
|
+
help="Which subdir to use. This will become the recipe run id",
|
|
286
|
+
type=int,
|
|
287
|
+
default=4,
|
|
288
|
+
)
|
|
289
|
+
parser.add_argument("--suffix", help="File suffix to treat as INPUT frames", default="FITS")
|
|
290
|
+
parser.add_argument(
|
|
291
|
+
"-w",
|
|
292
|
+
"--wavelength",
|
|
293
|
+
help="Dummy wavelength to use for loading parameters, etc.",
|
|
294
|
+
type=float,
|
|
295
|
+
default=630.0,
|
|
296
|
+
)
|
|
297
|
+
parser.add_argument(
|
|
298
|
+
"--force-I-only",
|
|
299
|
+
help="Force the dataset to be treated as non-polarimetric",
|
|
300
|
+
action="store_true",
|
|
301
|
+
)
|
|
302
|
+
parser.add_argument(
|
|
303
|
+
"-T",
|
|
304
|
+
"--skip-translation",
|
|
305
|
+
help="Skip the translation of raw 122 l0 frames to 214 l0",
|
|
306
|
+
action="store_true",
|
|
307
|
+
)
|
|
308
|
+
parser.add_argument(
|
|
309
|
+
"-t", "--only-translate", help="Do ONLY the translation step", action="store_true"
|
|
310
|
+
)
|
|
311
|
+
parser.add_argument(
|
|
312
|
+
"-X",
|
|
313
|
+
"--transfer-trial-data",
|
|
314
|
+
help="Transfer trial data to a different location.",
|
|
315
|
+
nargs="?",
|
|
316
|
+
const="default",
|
|
317
|
+
default=None,
|
|
318
|
+
)
|
|
319
|
+
parser.add_argument(
|
|
320
|
+
"-I", "--load-input-parsing", help="Load tags on input files", action="store_true"
|
|
321
|
+
)
|
|
322
|
+
parser.add_argument(
|
|
323
|
+
"-D",
|
|
324
|
+
"--load-dark",
|
|
325
|
+
help="Load dark calibration from previously saved run",
|
|
326
|
+
action="store_true",
|
|
327
|
+
)
|
|
328
|
+
parser.add_argument(
|
|
329
|
+
"-B",
|
|
330
|
+
"--load-background",
|
|
331
|
+
help="Load background light calibration from previously saved run",
|
|
332
|
+
action="store_true",
|
|
333
|
+
)
|
|
334
|
+
parser.add_argument(
|
|
335
|
+
"-L",
|
|
336
|
+
"--load-lamp",
|
|
337
|
+
help="Load lamp calibration from previously saved run",
|
|
338
|
+
action="store_true",
|
|
339
|
+
)
|
|
340
|
+
parser.add_argument(
|
|
341
|
+
"-G",
|
|
342
|
+
"--load-geometric",
|
|
343
|
+
help="Load geometric calibration from previously saved run",
|
|
344
|
+
action="store_true",
|
|
345
|
+
)
|
|
346
|
+
parser.add_argument(
|
|
347
|
+
"-S",
|
|
348
|
+
"--load-solar",
|
|
349
|
+
help="Load solar calibration from previously saved run",
|
|
350
|
+
action="store_true",
|
|
351
|
+
)
|
|
352
|
+
parser.add_argument(
|
|
353
|
+
"-P",
|
|
354
|
+
"--load-inst-pol",
|
|
355
|
+
help="Load instrument polarization calibration from previously saved run",
|
|
356
|
+
action="store_true",
|
|
357
|
+
)
|
|
358
|
+
parser.add_argument(
|
|
359
|
+
"-O",
|
|
360
|
+
"--load-solar-gain-as-science",
|
|
361
|
+
help="Don't re-make the solar-gain-as-science frames",
|
|
362
|
+
action="store_true",
|
|
363
|
+
)
|
|
364
|
+
parser.add_argument(
|
|
365
|
+
"-C", "--load-calibrated-data", help="Load CALIBRATED 'science' frames", action="store_true"
|
|
366
|
+
)
|
|
367
|
+
args = parser.parse_args()
|
|
368
|
+
sys.exit(
|
|
369
|
+
main(
|
|
370
|
+
scratch_path=args.scratch_path,
|
|
371
|
+
suffix=args.suffix,
|
|
372
|
+
recipe_run_id=args.run_id,
|
|
373
|
+
skip_translation=args.skip_translation,
|
|
374
|
+
only_translate=args.only_translate,
|
|
375
|
+
load_input_parsing=args.load_input_parsing,
|
|
376
|
+
load_dark=args.load_dark,
|
|
377
|
+
load_background=args.load_background,
|
|
378
|
+
load_lamp=args.load_lamp,
|
|
379
|
+
load_geometric=args.load_geometric,
|
|
380
|
+
load_solar=args.load_solar,
|
|
381
|
+
load_inst_pol=args.load_inst_pol,
|
|
382
|
+
load_solar_gain_as_science=args.load_solar_gain_as_science,
|
|
383
|
+
load_calibrated_data=args.load_calibrated_data,
|
|
384
|
+
force_intensity_only=args.force_I_only,
|
|
385
|
+
transfer_trial_data=args.transfer_trial_data,
|
|
386
|
+
)
|
|
387
|
+
)
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import json
|
|
3
|
-
import os
|
|
4
3
|
import sys
|
|
5
4
|
from dataclasses import asdict
|
|
6
5
|
from pathlib import Path
|
|
7
6
|
from random import randint
|
|
8
7
|
|
|
9
|
-
from astropy.io import fits
|
|
10
|
-
from dkist_header_validator import spec122_validator
|
|
11
8
|
from dkist_header_validator import spec214_validator
|
|
9
|
+
from dkist_processing_common.codecs.basemodel import basemodel_encoder
|
|
12
10
|
from dkist_processing_common.codecs.fits import fits_access_decoder
|
|
13
11
|
from dkist_processing_common.manual import ManualProcessing
|
|
12
|
+
from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
|
|
14
13
|
from dkist_processing_common.tasks import CreateTrialAsdf
|
|
15
14
|
from dkist_processing_common.tasks import CreateTrialQualityReport
|
|
16
15
|
from dkist_processing_common.tasks import QualityL1Metrics
|
|
@@ -49,9 +48,13 @@ from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers impor
|
|
|
49
48
|
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveInstPolCal
|
|
50
49
|
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveLampCal
|
|
51
50
|
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import SaveSolarCal
|
|
51
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import tag_inputs_task
|
|
52
52
|
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
53
53
|
transfer_trial_data_locally_task,
|
|
54
54
|
)
|
|
55
|
+
from dkist_processing_visp.tests.local_trial_workflows.local_trial_helpers import (
|
|
56
|
+
translate_122_to_214l0_task,
|
|
57
|
+
)
|
|
55
58
|
|
|
56
59
|
INV = False
|
|
57
60
|
try:
|
|
@@ -77,43 +80,19 @@ if QUALITY:
|
|
|
77
80
|
plt.ioff()
|
|
78
81
|
|
|
79
82
|
|
|
80
|
-
class Translate122To214L0(WorkflowTaskBase):
|
|
81
|
-
def run(self) -> None:
|
|
82
|
-
raw_dir = Path(self.scratch.scratch_base_path) / f"VISP{self.recipe_run_id:03n}"
|
|
83
|
-
if not os.path.exists(self.scratch.workflow_base_path):
|
|
84
|
-
os.makedirs(self.scratch.workflow_base_path)
|
|
85
|
-
|
|
86
|
-
if not raw_dir.exists():
|
|
87
|
-
raise FileNotFoundError(
|
|
88
|
-
f"Expected to find a raw VISP{{run_id:03n}} folder in {self.scratch.scratch_base_path}"
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
for file in raw_dir.glob("*.FITS"):
|
|
92
|
-
translated_file_name = Path(self.scratch.workflow_base_path) / os.path.basename(file)
|
|
93
|
-
logger.info(f"Translating {file} -> {translated_file_name}")
|
|
94
|
-
hdl = fits.open(file)
|
|
95
|
-
|
|
96
|
-
header = spec122_validator.validate_and_translate_to_214_l0(
|
|
97
|
-
hdl[0].header, return_type=fits.HDUList
|
|
98
|
-
)[0].header
|
|
99
|
-
|
|
100
|
-
comp_hdu = fits.CompImageHDU(header=header, data=hdl[0].data)
|
|
101
|
-
comp_hdl = fits.HDUList([fits.PrimaryHDU(), comp_hdu])
|
|
102
|
-
comp_hdl.writeto(translated_file_name, overwrite=True)
|
|
103
|
-
|
|
104
|
-
hdl.close()
|
|
105
|
-
del hdl
|
|
106
|
-
comp_hdl.close()
|
|
107
|
-
del comp_hdl
|
|
108
|
-
|
|
109
|
-
|
|
110
83
|
class CreateInputDatasetParameterDocument(WorkflowTaskBase):
|
|
111
84
|
def run(self) -> None:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
85
|
+
relative_path = "input_dataset_parameters.json"
|
|
86
|
+
self.write(
|
|
87
|
+
data=InputDatasetPartDocumentList(
|
|
88
|
+
doc_list=self.input_dataset_document_simple_parameters_part
|
|
89
|
+
),
|
|
90
|
+
relative_path=relative_path,
|
|
91
|
+
tags=VispTag.input_dataset_parameters(),
|
|
92
|
+
encoder=basemodel_encoder,
|
|
93
|
+
overwrite=True,
|
|
94
|
+
)
|
|
95
|
+
logger.info(f"Wrote input dataset parameter doc to {relative_path}")
|
|
117
96
|
|
|
118
97
|
@property
|
|
119
98
|
def input_dataset_document_simple_parameters_part(self):
|
|
@@ -133,22 +112,6 @@ class CreateInputDatasetParameterDocument(WorkflowTaskBase):
|
|
|
133
112
|
return parameters_list
|
|
134
113
|
|
|
135
114
|
|
|
136
|
-
def tag_inputs_task(suffix: str):
|
|
137
|
-
class TagInputs(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=[VispTag.input(), VispTag.frame()])
|
|
148
|
-
|
|
149
|
-
return TagInputs
|
|
150
|
-
|
|
151
|
-
|
|
152
115
|
class ShowPolMode(VispTaskBase):
|
|
153
116
|
def run(self) -> None:
|
|
154
117
|
logger.info(f"{self.constants.correct_for_polarization = }")
|
|
@@ -203,21 +166,6 @@ class ValidateL1Output(VispTaskBase):
|
|
|
203
166
|
spec214_validator.validate(f, extra=False)
|
|
204
167
|
|
|
205
168
|
|
|
206
|
-
def setup_APM_config() -> None:
|
|
207
|
-
mesh_config = {
|
|
208
|
-
"system-monitoring-log-apm": {
|
|
209
|
-
"mesh_address": "system-monitoring-log-apm.service.sim.consul",
|
|
210
|
-
"mesh_port": 8200,
|
|
211
|
-
},
|
|
212
|
-
"automated-processing-scratch-inventory": {"mesh_address": "localhost", "mesh_port": 6379},
|
|
213
|
-
"internal-api-gateway": {"mesh_address": "localhost", "mesh_port": 80},
|
|
214
|
-
}
|
|
215
|
-
apm_options = {"TRANSACTION_MAX_SPANS": 10000}
|
|
216
|
-
os.environ["MESH_CONFIG"] = json.dumps(mesh_config)
|
|
217
|
-
os.environ["ELASTIC_APM_ENABLED"] = "true"
|
|
218
|
-
os.environ["ELASTIC_APM_OTHER_OPTIONS"] = json.dumps(apm_options)
|
|
219
|
-
|
|
220
|
-
|
|
221
169
|
def main(
|
|
222
170
|
scratch_path: str,
|
|
223
171
|
suffix: str = "FITS",
|
|
@@ -231,11 +179,8 @@ def main(
|
|
|
231
179
|
load_geometric: bool = False,
|
|
232
180
|
load_solar: bool = False,
|
|
233
181
|
load_inst_pol: bool = False,
|
|
234
|
-
use_apm: bool = False,
|
|
235
182
|
transfer_trial_data: str | None = None,
|
|
236
183
|
):
|
|
237
|
-
if use_apm:
|
|
238
|
-
setup_APM_config()
|
|
239
184
|
with ManualProcessing(
|
|
240
185
|
workflow_path=scratch_path,
|
|
241
186
|
recipe_run_id=recipe_run_id,
|
|
@@ -244,7 +189,7 @@ def main(
|
|
|
244
189
|
workflow_version="GROGU",
|
|
245
190
|
) as manual_processing_run:
|
|
246
191
|
if not skip_translation:
|
|
247
|
-
manual_processing_run.run_task(task=
|
|
192
|
+
manual_processing_run.run_task(task=translate_122_to_214l0_task(suffix=suffix))
|
|
248
193
|
if only_translate:
|
|
249
194
|
return
|
|
250
195
|
manual_processing_run.run_task(task=CreateInputDatasetParameterDocument)
|
|
@@ -406,7 +351,6 @@ if __name__ == "__main__":
|
|
|
406
351
|
help="Load instrument polarization calibration from previously saved run",
|
|
407
352
|
action="store_true",
|
|
408
353
|
)
|
|
409
|
-
parser.add_argument("-A", "--use-apm", help="Send APM spans to SIM", action="store_true")
|
|
410
354
|
args = parser.parse_args()
|
|
411
355
|
sys.exit(
|
|
412
356
|
main(
|
|
@@ -422,7 +366,6 @@ if __name__ == "__main__":
|
|
|
422
366
|
load_geometric=args.load_geometric,
|
|
423
367
|
load_solar=args.load_solar,
|
|
424
368
|
load_inst_pol=args.load_inst_pol,
|
|
425
|
-
use_apm=args.use_apm,
|
|
426
369
|
transfer_trial_data=args.transfer_trial_data,
|
|
427
370
|
)
|
|
428
371
|
)
|