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
@@ -4,9 +4,9 @@ from astropy.io import fits
4
4
  from astropy.time import Time
5
5
  from dkist_fits_specifications import __version__ as spec_version
6
6
  from dkist_header_validator import spec214_validator
7
+ from dkist_processing_common.models.fits_access import MetadataKey
7
8
  from dkist_processing_common.models.tags import Tag
8
9
  from dkist_processing_common.models.wavelength import WavelengthRange
9
- from dkist_processing_common.tests.conftest import FakeGQLClient
10
10
  from dkist_spectral_lines import get_closest_spectral_line
11
11
  from dkist_spectral_lines import get_spectral_lines
12
12
 
@@ -40,6 +40,7 @@ def write_l1_task(
40
40
  NUM_RASTER_STEPS=2,
41
41
  SPECTRAL_LINE="VISP Ca II H",
42
42
  POLARIMETER_MODE=pol_mode,
43
+ NUM_MODSTATES=1 if pol_mode == "observe_intensity" else 10,
43
44
  )
44
45
  init_visp_constants_db(recipe_run_id, constants_db)
45
46
  with VispWriteL1Frame(
@@ -68,7 +69,13 @@ def mocked_get_wavelength_range(wavelength_range):
68
69
 
69
70
  @pytest.mark.parametrize("pol_mode", ["observe_polarimetric", "observe_intensity"])
70
71
  def test_write_l1_frame(
71
- write_l1_task, wcs_axis_names, pol_mode, wavelength_range, mocked_get_wavelength_range, mocker
72
+ write_l1_task,
73
+ wcs_axis_names,
74
+ pol_mode,
75
+ wavelength_range,
76
+ mocked_get_wavelength_range,
77
+ mocker,
78
+ fake_gql_client,
72
79
  ):
73
80
  """
74
81
  :Given: a write L1 task
@@ -76,7 +83,7 @@ def test_write_l1_frame(
76
83
  :Then: no errors are raised
77
84
  """
78
85
  mocker.patch(
79
- "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=FakeGQLClient
86
+ "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
80
87
  )
81
88
  mocker.patch(
82
89
  "dkist_processing_visp.tasks.write_l1.VispWriteL1Frame.get_wavelength_range",
@@ -156,9 +163,21 @@ def test_write_l1_frame(
156
163
  assert header["EXPRID02"] == "EXPERID2"
157
164
  assert header["EXPRID03"] == "EXPERID3"
158
165
  assert header["WAVEBAND"] == expected_waveband
166
+ assert header["BUNIT"] == ""
167
+ assert (
168
+ header.comments["BUNIT"]
169
+ == "Values are relative to disk center. See calibration docs."
170
+ )
159
171
  for i, line in enumerate(expected_spectral_lines, start=1):
160
172
  assert header[f"SPECLN{i:02}"] == line.name
161
173
 
162
174
  with pytest.raises(KeyError):
163
175
  # Make sure no more lines were added
164
176
  header[f"SPECLN{i+1:02}"]
177
+
178
+ if pol_mode == "observe_polarimetric":
179
+ assert header["CADENCE"] == 100
180
+ assert header[MetadataKey.fpa_exposure_time_ms] == 150
181
+ else:
182
+ assert header["CADENCE"] == 10
183
+ assert header[MetadataKey.fpa_exposure_time_ms] == 15
@@ -1,2 +1,3 @@
1
1
  """Workflow package."""
2
+
2
3
  from dkist_processing_visp.config import dkist_processing_visp_configurations
@@ -1,4 +1,5 @@
1
1
  """ViSP raw data processing workflow."""
2
+
2
3
  from dkist_processing_common.tasks import PublishCatalogAndQualityMessages
3
4
  from dkist_processing_common.tasks import QualityL1Metrics
4
5
  from dkist_processing_common.tasks import SubmitDatasetMetadata
@@ -40,8 +41,13 @@ l0_pipeline.add_node(
40
41
  task=SolarCalibration,
41
42
  upstreams=[LampCalibration, GeometricCalibration, BackgroundLightCalibration],
42
43
  )
43
- l0_pipeline.add_node(task=InstrumentPolarizationCalibration, upstreams=SolarCalibration)
44
- l0_pipeline.add_node(task=ScienceCalibration, upstreams=InstrumentPolarizationCalibration)
44
+ l0_pipeline.add_node(
45
+ task=InstrumentPolarizationCalibration,
46
+ upstreams=[BackgroundLightCalibration, GeometricCalibration],
47
+ )
48
+ l0_pipeline.add_node(
49
+ task=ScienceCalibration, upstreams=[SolarCalibration, InstrumentPolarizationCalibration]
50
+ )
45
51
  l0_pipeline.add_node(task=VispWriteL1Frame, upstreams=ScienceCalibration)
46
52
 
47
53
  # Movie flow
@@ -60,7 +66,8 @@ l0_pipeline.add_node(
60
66
  # Output flow
61
67
  l0_pipeline.add_node(task=TransferL1Data, upstreams=[VispWriteL1Frame, AssembleVispMovie])
62
68
  l0_pipeline.add_node(
63
- task=SubmitDatasetMetadata, upstreams=[VispWriteL1Frame, VispAssembleQualityData]
69
+ task=SubmitDatasetMetadata,
70
+ upstreams=[VispWriteL1Frame, VispAssembleQualityData, AssembleVispMovie],
64
71
  )
65
72
  l0_pipeline.add_node(
66
73
  task=PublishCatalogAndQualityMessages, upstreams=[SubmitDatasetMetadata, TransferL1Data]
@@ -1,4 +1,5 @@
1
1
  """Workflows for trial runs (i.e., not Production)."""
2
+
2
3
  from dkist_processing_common.tasks import CreateTrialAsdf
3
4
  from dkist_processing_common.tasks import CreateTrialDatasetInventory
4
5
  from dkist_processing_common.tasks import CreateTrialQualityReport
@@ -42,8 +43,13 @@ full_trial_pipeline.add_node(
42
43
  task=SolarCalibration,
43
44
  upstreams=[LampCalibration, GeometricCalibration, BackgroundLightCalibration],
44
45
  )
45
- full_trial_pipeline.add_node(task=InstrumentPolarizationCalibration, upstreams=SolarCalibration)
46
- full_trial_pipeline.add_node(task=ScienceCalibration, upstreams=InstrumentPolarizationCalibration)
46
+ full_trial_pipeline.add_node(
47
+ task=InstrumentPolarizationCalibration,
48
+ upstreams=[BackgroundLightCalibration, GeometricCalibration],
49
+ )
50
+ full_trial_pipeline.add_node(
51
+ task=ScienceCalibration, upstreams=[SolarCalibration, InstrumentPolarizationCalibration]
52
+ )
47
53
  full_trial_pipeline.add_node(task=VispWriteL1Frame, upstreams=ScienceCalibration)
48
54
 
49
55
  # Movie flow