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.
Files changed (73) hide show
  1. dkist_processing_visp/__init__.py +1 -0
  2. dkist_processing_visp/config.py +1 -0
  3. dkist_processing_visp/models/constants.py +61 -20
  4. dkist_processing_visp/models/fits_access.py +20 -0
  5. dkist_processing_visp/models/metric_code.py +10 -0
  6. dkist_processing_visp/models/parameters.py +129 -24
  7. dkist_processing_visp/models/tags.py +22 -1
  8. dkist_processing_visp/models/task_name.py +1 -0
  9. dkist_processing_visp/parsers/map_repeats.py +1 -0
  10. dkist_processing_visp/parsers/modulator_states.py +1 -0
  11. dkist_processing_visp/parsers/polarimeter_mode.py +4 -2
  12. dkist_processing_visp/parsers/raster_step.py +4 -1
  13. dkist_processing_visp/parsers/spectrograph_configuration.py +75 -0
  14. dkist_processing_visp/parsers/time.py +24 -14
  15. dkist_processing_visp/parsers/visp_l0_fits_access.py +19 -8
  16. dkist_processing_visp/parsers/visp_l1_fits_access.py +1 -0
  17. dkist_processing_visp/tasks/__init__.py +1 -0
  18. dkist_processing_visp/tasks/assemble_movie.py +1 -0
  19. dkist_processing_visp/tasks/background_light.py +2 -1
  20. dkist_processing_visp/tasks/dark.py +5 -4
  21. dkist_processing_visp/tasks/geometric.py +132 -20
  22. dkist_processing_visp/tasks/instrument_polarization.py +128 -18
  23. dkist_processing_visp/tasks/l1_output_data.py +203 -0
  24. dkist_processing_visp/tasks/lamp.py +53 -93
  25. dkist_processing_visp/tasks/make_movie_frames.py +8 -6
  26. dkist_processing_visp/tasks/mixin/beam_access.py +1 -0
  27. dkist_processing_visp/tasks/mixin/corrections.py +54 -4
  28. dkist_processing_visp/tasks/mixin/downsample.py +1 -0
  29. dkist_processing_visp/tasks/parse.py +50 -17
  30. dkist_processing_visp/tasks/quality_metrics.py +5 -4
  31. dkist_processing_visp/tasks/science.py +126 -46
  32. dkist_processing_visp/tasks/solar.py +896 -456
  33. dkist_processing_visp/tasks/visp_base.py +4 -3
  34. dkist_processing_visp/tasks/write_l1.py +38 -10
  35. dkist_processing_visp/tests/conftest.py +145 -47
  36. dkist_processing_visp/tests/header_models.py +157 -20
  37. dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +21 -78
  38. dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +421 -0
  39. dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +387 -0
  40. dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +18 -75
  41. dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +346 -14
  42. dkist_processing_visp/tests/test_assemble_movie.py +2 -3
  43. dkist_processing_visp/tests/test_assemble_quality.py +89 -4
  44. dkist_processing_visp/tests/test_background_light.py +51 -44
  45. dkist_processing_visp/tests/test_dark.py +4 -3
  46. dkist_processing_visp/tests/test_downsample.py +1 -0
  47. dkist_processing_visp/tests/test_fits_access.py +43 -0
  48. dkist_processing_visp/tests/test_geometric.py +45 -4
  49. dkist_processing_visp/tests/test_instrument_polarization.py +72 -9
  50. dkist_processing_visp/tests/test_lamp.py +22 -26
  51. dkist_processing_visp/tests/test_make_movie_frames.py +4 -4
  52. dkist_processing_visp/tests/test_map_repeats.py +3 -1
  53. dkist_processing_visp/tests/test_parameters.py +122 -21
  54. dkist_processing_visp/tests/test_parse.py +164 -18
  55. dkist_processing_visp/tests/test_quality.py +3 -4
  56. dkist_processing_visp/tests/test_science.py +113 -15
  57. dkist_processing_visp/tests/test_solar.py +318 -99
  58. dkist_processing_visp/tests/test_visp_constants.py +38 -8
  59. dkist_processing_visp/tests/test_workflows.py +1 -0
  60. dkist_processing_visp/tests/test_write_l1.py +22 -3
  61. dkist_processing_visp/workflows/__init__.py +1 -0
  62. dkist_processing_visp/workflows/l0_processing.py +10 -3
  63. dkist_processing_visp/workflows/trial_workflows.py +8 -2
  64. dkist_processing_visp-5.1.1.dist-info/METADATA +552 -0
  65. dkist_processing_visp-5.1.1.dist-info/RECORD +94 -0
  66. {dkist_processing_visp-2.20.14.dist-info → dkist_processing_visp-5.1.1.dist-info}/WHEEL +1 -1
  67. docs/conf.py +5 -1
  68. docs/gain_correction.rst +52 -44
  69. docs/science_calibration.rst +7 -0
  70. dkist_processing_visp/tasks/mixin/line_zones.py +0 -115
  71. dkist_processing_visp-2.20.14.dist-info/METADATA +0 -196
  72. dkist_processing_visp-2.20.14.dist-info/RECORD +0 -89
  73. {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
- doc_path = self.scratch.workflow_base_path / "input_dataset_parameters.json"
113
- with open(doc_path, "w") as f:
114
- f.write(json.dumps(self.input_dataset_document_simple_parameters_part))
115
- self.tag(doc_path, VispTag.input_dataset_parameters())
116
- logger.info(f"Wrote input dataset doc to {doc_path}")
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=Translate122To214L0)
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
  )