dkist-processing-dlnirsp 0.32.2__py3-none-any.whl → 0.32.3__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.
@@ -0,0 +1,32 @@
1
+ """DLNIRSP control of FITS key names and values."""
2
+
3
+ from enum import StrEnum
4
+
5
+ from dkist_processing_common.models.fits_access import MetadataKey
6
+
7
+
8
+ class DlnirspMetadataKey(StrEnum):
9
+ """Controlled list of names for FITS metadata header keys."""
10
+
11
+ crpix_1 = "CRPIX1"
12
+ crpix_2 = "CRPIX2"
13
+ modulator_spin_mode = "DLMOD"
14
+ camera_readout_mode = "DLCAMSMD"
15
+ num_frames_in_ramp = "DLCAMNS"
16
+ current_frame_in_ramp = "DLCAMCUR"
17
+ arm_id = "DLARMID"
18
+ camera_sample_sequence = "DLCAMSSQ"
19
+ polarimeter_mode = "DLPOLMD"
20
+ number_of_modulator_states = "DLNUMST"
21
+ modulator_state = "DLSTNUM"
22
+ num_mosaic_repeats = "DLMOSNRP"
23
+ mosaic_num = "DLCURMOS"
24
+ num_X_tiles = "DLNSSTPX"
25
+ X_tile_num = "DLCSTPX"
26
+ num_Y_tiles = "DLNSSTPY"
27
+ Y_tile_num = "DLCSTPY"
28
+ num_dither_steps = "DLDMODE"
29
+ dither_step = "DLCURSTP"
30
+ arm_position_mm = "DLARMPS"
31
+ grating_position_deg = "DLGRTAN"
32
+ grating_constant_inverse_mm = "DLGRTCN"
@@ -3,6 +3,8 @@
3
3
  from astropy.io import fits
4
4
  from dkist_processing_common.parsers.l0_fits_access import L0FitsAccess
5
5
 
6
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
7
+
6
8
 
7
9
  class DlnirspRampFitsAccess(L0FitsAccess):
8
10
  """
@@ -30,12 +32,18 @@ class DlnirspRampFitsAccess(L0FitsAccess):
30
32
  ):
31
33
  super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
32
34
 
33
- self.modulator_spin_mode: str = self.header["DLMOD"]
34
- self.camera_readout_mode: str = self.header.get("DLCAMSMD", "DEFAULT_VISIBLE_CAMERA")
35
- self.num_frames_in_ramp: int = self.header.get("DLCAMNS", -99)
36
- self.current_frame_in_ramp: int = self.header.get("DLCAMCUR", -88)
37
- self.arm_id: str = self.header["DLARMID"]
38
- self.camera_sample_sequence: str = self.header.get("DLCAMSSQ", "VISIBLE_CAMERA_SEQUENCE")
35
+ self.modulator_spin_mode: str = self.header[DlnirspMetadataKey.modulator_spin_mode]
36
+ self.camera_readout_mode: str = self.header.get(
37
+ DlnirspMetadataKey.camera_readout_mode, "DEFAULT_VISIBLE_CAMERA"
38
+ )
39
+ self.num_frames_in_ramp: int = self.header.get(DlnirspMetadataKey.num_frames_in_ramp, -99)
40
+ self.current_frame_in_ramp: int = self.header.get(
41
+ DlnirspMetadataKey.current_frame_in_ramp, -88
42
+ )
43
+ self.arm_id: str = self.header[DlnirspMetadataKey.arm_id]
44
+ self.camera_sample_sequence: str = self.header.get(
45
+ DlnirspMetadataKey.camera_sample_sequence, "VISIBLE_CAMERA_SEQUENCE"
46
+ )
39
47
 
40
48
 
41
49
  class DlnirspL0FitsAccess(L0FitsAccess):
@@ -64,24 +72,28 @@ class DlnirspL0FitsAccess(L0FitsAccess):
64
72
  ):
65
73
  super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
66
74
 
67
- self.crpix_1: float = self.header["CRPIX1"]
68
- self.crpix_2: float = self.header["CRPIX2"]
69
- self.arm_id: str = self.header["DLARMID"]
70
- self.polarimeter_mode: str = self.header["DLPOLMD"]
71
- self.number_of_modulator_states: int = self.header["DLNUMST"]
72
- self.modulator_state: int = self.header["DLSTNUM"]
73
- self.num_mosaic_repeats: int = self.header["DLMOSNRP"]
74
- self.mosaic_num: int = self.header["DLCURMOS"]
75
- self.num_X_tiles: int = self.header["DLNSSTPX"]
76
- self.X_tile_num: int = self.header["DLCSTPX"]
77
- self.num_Y_tiles: int = self.header["DLNSSTPY"]
78
- self.Y_tile_num: int = self.header["DLCSTPY"]
75
+ self.crpix_1: float = self.header[DlnirspMetadataKey.crpix_1]
76
+ self.crpix_2: float = self.header[DlnirspMetadataKey.crpix_2]
77
+ self.arm_id: str = self.header[DlnirspMetadataKey.arm_id]
78
+ self.polarimeter_mode: str = self.header[DlnirspMetadataKey.polarimeter_mode]
79
+ self.number_of_modulator_states: int = self.header[
80
+ DlnirspMetadataKey.number_of_modulator_states
81
+ ]
82
+ self.modulator_state: int = self.header[DlnirspMetadataKey.modulator_state]
83
+ self.num_mosaic_repeats: int = self.header[DlnirspMetadataKey.num_mosaic_repeats]
84
+ self.mosaic_num: int = self.header[DlnirspMetadataKey.mosaic_num]
85
+ self.num_X_tiles: int = self.header[DlnirspMetadataKey.num_X_tiles]
86
+ self.X_tile_num: int = self.header[DlnirspMetadataKey.X_tile_num]
87
+ self.num_Y_tiles: int = self.header[DlnirspMetadataKey.num_Y_tiles]
88
+ self.Y_tile_num: int = self.header[DlnirspMetadataKey.Y_tile_num]
79
89
  # DLDMODE is a bool in the header; the number of dither steps is either 1 or 2, corresponding to dither
80
90
  # mode being True or False, respectively
81
- self.num_dither_steps: int = int(self.header["DLDMODE"]) + 1
91
+ self.num_dither_steps: int = int(self.header[DlnirspMetadataKey.num_dither_steps]) + 1
82
92
  # Same with DLCURSTP. We'll index the dither loop at 0 so `False` is the first step and `True` is the second
83
93
  # Use `get` because this key only exists if DLDMODE is `True`
84
- self.dither_step: int = int(self.header.get("DLCURSTP", False))
85
- self.arm_position_mm: float = self.header["DLARMPS"]
86
- self.grating_position_deg: float = self.header["DLGRTAN"]
87
- self.grating_constant_inverse_mm: float = self.header["DLGRTCN"]
94
+ self.dither_step: int = int(self.header.get(DlnirspMetadataKey.dither_step, False))
95
+ self.arm_position_mm: float = self.header[DlnirspMetadataKey.arm_position_mm]
96
+ self.grating_position_deg: float = self.header[DlnirspMetadataKey.grating_position_deg]
97
+ self.grating_constant_inverse_mm: float = self.header[
98
+ DlnirspMetadataKey.grating_constant_inverse_mm
99
+ ]
@@ -1,15 +1,11 @@
1
1
  """Custom parsers to identify task sub-groupings not captured by a single header key."""
2
2
 
3
- from typing import Callable
4
-
5
- from dkist_processing_common.models.flower_pot import SpilledDirt
3
+ from dkist_processing_common.models.fits_access import MetadataKey
6
4
  from dkist_processing_common.models.tags import StemName
7
5
  from dkist_processing_common.models.task_name import TaskName
8
- from dkist_processing_common.parsers.near_bud import NearFloatBud
9
6
  from dkist_processing_common.parsers.single_value_single_key_flower import (
10
7
  SingleValueSingleKeyFlower,
11
8
  )
12
- from dkist_processing_common.parsers.unique_bud import UniqueBud
13
9
 
14
10
  from dkist_processing_dlnirsp.parsers.dlnirsp_l0_fits_access import DlnirspL0FitsAccess
15
11
 
@@ -41,7 +37,7 @@ class DlnirspTaskTypeFlower(SingleValueSingleKeyFlower):
41
37
  """Flower to find the DLNIRSP task type."""
42
38
 
43
39
  def __init__(self):
44
- super().__init__(tag_stem_name=StemName.task.value, metadata_key="ip_task_type")
40
+ super().__init__(tag_stem_name=StemName.task.value, metadata_key=MetadataKey.ip_task_type)
45
41
 
46
42
  def setter(self, fits_obj: DlnirspL0FitsAccess):
47
43
  """
@@ -2,6 +2,7 @@
2
2
 
3
3
  from typing import Hashable
4
4
 
5
+ from dkist_processing_common.models.fits_access import MetadataKey
5
6
  from dkist_processing_common.models.flower_pot import Stem
6
7
  from dkist_processing_common.models.task_name import TaskName
7
8
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
@@ -17,7 +18,7 @@ class DLnirspSolarGainIpStartTimeBud(TaskUniqueBud):
17
18
  def __init__(self):
18
19
  super().__init__(
19
20
  constant_name=DlnirspBudName.solar_gain_ip_start_time.value,
20
- metadata_key="ip_start_time",
21
+ metadata_key=MetadataKey.ip_start_time,
21
22
  ip_task_types=TaskName.solar_gain.value,
22
23
  task_type_parsing_function=parse_header_ip_task,
23
24
  )
@@ -1,5 +1,6 @@
1
1
  """Bud to get the wavelength."""
2
2
 
3
+ from dkist_processing_common.models.fits_access import MetadataKey
3
4
  from dkist_processing_common.models.flower_pot import SpilledDirt
4
5
  from dkist_processing_common.parsers.unique_bud import UniqueBud
5
6
 
@@ -11,7 +12,10 @@ class ObserveWavelengthBud(UniqueBud):
11
12
  """Bud to find the wavelength."""
12
13
 
13
14
  def __init__(self):
14
- super().__init__(constant_name=DlnirspBudName.wavelength.value, metadata_key="wavelength")
15
+ super().__init__(
16
+ constant_name=DlnirspBudName.wavelength.value,
17
+ metadata_key=MetadataKey.wavelength,
18
+ )
15
19
 
16
20
  def setter(self, fits_obj: DlnirspL0FitsAccess):
17
21
  """
@@ -2,6 +2,7 @@
2
2
 
3
3
  from typing import TypeVar
4
4
 
5
+ from dkist_processing_common.models.fits_access import MetadataKey
5
6
  from dkist_processing_common.models.flower_pot import Stem
6
7
  from dkist_processing_common.models.task_name import TaskName
7
8
  from dkist_processing_common.parsers.cs_step import CSStepFlower
@@ -22,6 +23,7 @@ from dkist_processing_common.tasks import default_constant_bud_factory
22
23
  from dkist_processing_common.tasks import default_tag_flower_factory
23
24
 
24
25
  from dkist_processing_dlnirsp.models.constants import DlnirspBudName
26
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
25
27
  from dkist_processing_dlnirsp.models.parameters import DlnirspParsingParameters
26
28
  from dkist_processing_dlnirsp.models.tags import DlnirspStemName
27
29
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
@@ -72,7 +74,9 @@ class ParseL0DlnirspRampData(ParseDataBase):
72
74
  # Time Obs is the unique identifier for each ramp in the data set
73
75
  DlnirspTimeObsBud(),
74
76
  # This is used to determine whether we need to do any linearity correction at all.
75
- UniqueBud(constant_name=DlnirspBudName.arm_id.value, metadata_key="arm_id"),
77
+ UniqueBud(
78
+ constant_name=DlnirspBudName.arm_id.value, metadata_key=DlnirspMetadataKey.arm_id
79
+ ),
76
80
  ]
77
81
 
78
82
  @property
@@ -81,12 +85,12 @@ class ParseL0DlnirspRampData(ParseDataBase):
81
85
  return [
82
86
  SingleValueSingleKeyFlower(
83
87
  tag_stem_name=DlnirspStemName.current_frame_in_ramp.value,
84
- metadata_key="current_frame_in_ramp",
88
+ metadata_key=DlnirspMetadataKey.current_frame_in_ramp,
85
89
  ),
86
90
  # time_obs is a unique identifier for all raw frames in a single ramp
87
91
  SingleValueSingleKeyFlower(
88
92
  tag_stem_name=DlnirspStemName.time_obs.value,
89
- metadata_key="time_obs",
93
+ metadata_key=MetadataKey.time_obs,
90
94
  ),
91
95
  ]
92
96
 
@@ -144,12 +148,13 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
144
148
  DLnirspSolarGainIpStartTimeBud(),
145
149
  NumCSStepBud(max_cs_step_time_sec=self.parameters.max_cs_step_time_sec),
146
150
  UniqueBud(
147
- constant_name=DlnirspBudName.polarimeter_mode.value, metadata_key="polarimeter_mode"
151
+ constant_name=DlnirspBudName.polarimeter_mode.value,
152
+ metadata_key=DlnirspMetadataKey.polarimeter_mode,
148
153
  ),
149
154
  RetarderNameBud(),
150
155
  UniqueBud(
151
156
  constant_name=DlnirspBudName.num_modstates.value,
152
- metadata_key="number_of_modulator_states",
157
+ metadata_key=DlnirspMetadataKey.number_of_modulator_states,
153
158
  ),
154
159
  NumMosaicRepeatsBud(
155
160
  crpix_correction_method=self.parameters.wcs_crpix_correction_method,
@@ -189,20 +194,20 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
189
194
  ),
190
195
  TaskNearFloatBud(
191
196
  constant_name=DlnirspBudName.arm_position_mm.value,
192
- metadata_key="arm_position_mm",
197
+ metadata_key=DlnirspMetadataKey.arm_position_mm,
193
198
  ip_task_types=[TaskName.solar_gain.value, TaskName.observe.value],
194
199
  tolerance=0.01,
195
200
  task_type_parsing_function=parse_header_ip_task,
196
201
  ),
197
202
  TaskUniqueBud(
198
203
  constant_name=DlnirspBudName.grating_constant_inverse_mm.value,
199
- metadata_key="grating_constant_inverse_mm",
204
+ metadata_key=DlnirspMetadataKey.grating_constant_inverse_mm,
200
205
  ip_task_types=[TaskName.solar_gain.value, TaskName.observe.value],
201
206
  task_type_parsing_function=parse_header_ip_task,
202
207
  ),
203
208
  TaskNearFloatBud(
204
209
  constant_name=DlnirspBudName.grating_position_deg.value,
205
- metadata_key="grating_position_deg",
210
+ metadata_key=DlnirspMetadataKey.grating_position_deg,
206
211
  ip_task_types=[TaskName.solar_gain.value, TaskName.observe.value],
207
212
  tolerance=0.01,
208
213
  task_type_parsing_function=parse_header_ip_task,
@@ -216,14 +221,17 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
216
221
  DlnirspTaskTypeFlower(),
217
222
  PolcalTaskFlower(),
218
223
  SingleValueSingleKeyFlower(
219
- tag_stem_name=DlnirspStemName.arm_id.value, metadata_key="arm_id"
224
+ tag_stem_name=DlnirspStemName.arm_id.value,
225
+ metadata_key=DlnirspMetadataKey.arm_id,
220
226
  ),
221
227
  ExposureTimeFlower(),
222
228
  SingleValueSingleKeyFlower(
223
- tag_stem_name=DlnirspStemName.modstate.value, metadata_key="modulator_state"
229
+ tag_stem_name=DlnirspStemName.modstate.value,
230
+ metadata_key=DlnirspMetadataKey.modulator_state,
224
231
  ),
225
232
  SingleValueSingleKeyFlower(
226
- tag_stem_name=DlnirspStemName.mosaic_num.value, metadata_key="mosaic_num"
233
+ tag_stem_name=DlnirspStemName.mosaic_num.value,
234
+ metadata_key=DlnirspMetadataKey.mosaic_num,
227
235
  ),
228
236
  MosaicStepXFlower(
229
237
  crpix_correction_method=self.parameters.wcs_crpix_correction_method,
@@ -234,7 +242,8 @@ class ParseL0DlnirspLinearizedData(ParseDataBase):
234
242
  bin_crpix_to_multiple_of=self.parameters.parse_bin_crpix_to_multiple_of,
235
243
  ),
236
244
  SingleValueSingleKeyFlower(
237
- tag_stem_name=DlnirspStemName.dither_step.value, metadata_key="dither_step"
245
+ tag_stem_name=DlnirspStemName.dither_step.value,
246
+ metadata_key=DlnirspMetadataKey.dither_step,
238
247
  ),
239
248
  CSStepFlower(max_cs_step_time_sec=self.parameters.max_cs_step_time_sec),
240
249
  ]
@@ -18,6 +18,7 @@ from dkist_processing_common.codecs.fits import fits_access_decoder
18
18
  from dkist_processing_common.codecs.fits import fits_array_decoder
19
19
  from dkist_processing_common.codecs.fits import fits_array_encoder
20
20
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
21
+ from dkist_processing_common.models.fits_access import MetadataKey
21
22
  from dkist_processing_common.models.tags import EXP_TIME_ROUND_DIGITS
22
23
  from dkist_processing_common.models.task_name import TaskName
23
24
  from dkist_processing_common.tasks.mixin.quality import QualityMixin
@@ -29,6 +30,7 @@ from dkist_processing_pac.optics.telescope import Telescope
29
30
  from dkist_service_configuration.logging import logger
30
31
  from scipy.spatial import Delaunay
31
32
 
33
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
32
34
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
33
35
  from dkist_processing_dlnirsp.parsers.dlnirsp_l0_fits_access import DlnirspL0FitsAccess
34
36
  from dkist_processing_dlnirsp.parsers.wcs_corrections import correct_crpix_values
@@ -738,7 +740,7 @@ class ScienceCalibration(
738
740
  date_end = (Time(sorted_obj_list[-1].time_obs) + exp_time).isot
739
741
 
740
742
  header = sorted_obj_list[0].header
741
- header["DATE-BEG"] = date_beg
743
+ header[MetadataKey.time_obs] = date_beg
742
744
  header["DATE-END"] = date_end
743
745
 
744
746
  return header
@@ -773,13 +775,13 @@ class ScienceCalibration(
773
775
 
774
776
  crpix_correction_method = self.parameters.wcs_crpix_correction_method
775
777
  cached_info_logger(f"Applying CRPIX correction method '{crpix_correction_method}'")
776
- OG_crpix1 = header["CRPIX1"]
777
- OG_crpix2 = header["CRPIX2"]
778
+ OG_crpix1 = header[DlnirspMetadataKey.crpix_1]
779
+ OG_crpix2 = header[DlnirspMetadataKey.crpix_2]
778
780
 
779
781
  new_crpix1, new_crpix2 = correct_crpix_values(OG_crpix1, OG_crpix2, crpix_correction_method)
780
782
 
781
- header["CRPIX1"] = new_crpix1
782
- header["CRPIX2"] = new_crpix2
783
+ header[DlnirspMetadataKey.crpix_1] = new_crpix1
784
+ header[DlnirspMetadataKey.crpix_2] = new_crpix2
783
785
 
784
786
  return header
785
787
 
@@ -12,6 +12,7 @@ from dkist_processing_common.tasks import WriteL1Frame
12
12
  from dkist_service_configuration.logging import logger
13
13
 
14
14
  from dkist_processing_dlnirsp.models.constants import DlnirspConstants
15
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
15
16
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
16
17
 
17
18
  cached_info_logger = cache(logger.info)
@@ -83,7 +84,7 @@ class DlnirspWriteL1Frame(WriteL1Frame):
83
84
  header[f"DPNAME{axis_index}"] = "dither step"
84
85
  header[f"DWNAME{axis_index}"] = "time"
85
86
  header[f"DUNIT{axis_index}"] = "s"
86
- header[f"DINDEX{axis_index}"] = int(header["DLCURSTP"]) + 1
87
+ header[f"DINDEX{axis_index}"] = int(header[DlnirspMetadataKey.dither_step]) + 1
87
88
 
88
89
  if self.constants.correct_for_polarization:
89
90
  cached_info_logger("Polarimetric data detected")
@@ -211,7 +212,7 @@ class DlnirspWriteL1Frame(WriteL1Frame):
211
212
  tile_as_temporal_axis = False
212
213
  temporal_axis_size = num_mosaic_repeats
213
214
  pname = "mosaic repeat number"
214
- dindex = header["DLCURMOS"]
215
+ dindex = header[DlnirspMetadataKey.mosaic_num]
215
216
 
216
217
  elif num_mosaic_repeats == 1 and (
217
218
  (num_X_tiles == 1 and num_Y_tiles == 1) or (num_X_tiles > 1 and num_Y_tiles > 1)
@@ -224,14 +225,14 @@ class DlnirspWriteL1Frame(WriteL1Frame):
224
225
  tile_as_temporal_axis = True
225
226
  temporal_axis_size = num_X_tiles
226
227
  pname = "repeat number"
227
- dindex = header["DLCSTPX"]
228
+ dindex = header[DlnirspMetadataKey.X_tile_num]
228
229
 
229
230
  elif num_mosaic_repeats == 1 and num_X_tiles == 1 and num_Y_tiles > 1:
230
231
  has_temporal_axis = True
231
232
  tile_as_temporal_axis = True
232
233
  temporal_axis_size = num_Y_tiles
233
234
  pname = "repeat number"
234
- dindex = header["DLCSTPY"]
235
+ dindex = header[DlnirspMetadataKey.Y_tile_num]
235
236
 
236
237
  else:
237
238
  raise ValueError(
@@ -9,6 +9,7 @@ from dkist_processing_common.codecs.fits import fits_array_decoder
9
9
  from dkist_processing_common.codecs.fits import fits_array_encoder
10
10
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
11
11
  from dkist_processing_common.models.constants import BudName
12
+ from dkist_processing_common.models.fits_access import MetadataKey
12
13
  from dkist_processing_common.models.task_name import TaskName
13
14
  from dkist_processing_common.tasks import TransferTrialData
14
15
  from dkist_processing_common.tasks import WorkflowTaskBase
@@ -17,6 +18,7 @@ from dkist_processing_math.statistics import average_numpy_arrays
17
18
  from dkist_service_configuration.logging import logger
18
19
 
19
20
  from dkist_processing_dlnirsp.models.constants import DlnirspBudName
21
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
20
22
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
21
23
  from dkist_processing_dlnirsp.tasks import DlnirspWriteL1Frame
22
24
  from dkist_processing_dlnirsp.tasks.dlnirsp_base import DlnirspTaskBase
@@ -87,7 +89,7 @@ def permissive_write_l1_task(force_intensity_only: bool):
87
89
  self, header: fits.Header, stokes: Literal["I", "Q", "U", "V"]
88
90
  ) -> fits.Header:
89
91
  if force_intensity_only:
90
- header["DLPOLMD"] = "Stokes I"
92
+ header[MetadataKey.polarimeter_mode] = "Stokes I"
91
93
 
92
94
  return super().add_dataset_headers(header=header, stokes=stokes)
93
95
 
@@ -138,11 +140,11 @@ class TagPolcasAsScience(DlnirspTaskBase):
138
140
  avg_array = average_numpy_arrays(arrays=arrays)
139
141
 
140
142
  hdul = fits.HDUList([fits.PrimaryHDU(data=avg_array, header=first_header)])
141
- hdul[0].header["DLCSTPX"] = 1
142
- hdul[0].header["DLCSTPY"] = 1
143
- hdul[0].header["DLMOSNRP"] = self.constants.num_cs_steps
144
- hdul[0].header["DLCURMOS"] = cs_step
145
- hdul[0].header["XPOSURE"] = obs_exp_time
143
+ hdul[0].header[DlnirspMetadataKey.X_tile_num] = 1
144
+ hdul[0].header[DlnirspMetadataKey.Y_tile_num] = 1
145
+ hdul[0].header[DlnirspMetadataKey.num_mosaic_repeats] = self.constants.num_cs_steps
146
+ hdul[0].header[DlnirspMetadataKey.mosaic_num] = cs_step
147
+ hdul[0].header[MetadataKey.fpa_exposure_time_ms] = obs_exp_time
146
148
 
147
149
  new_tags = [
148
150
  DlnirspTag.task_observe(),
@@ -186,11 +188,11 @@ class TagSingleSolarGainAsScience(DlnirspTaskBase):
186
188
  avg_array = average_numpy_arrays(arrays=arrays)
187
189
 
188
190
  hdul = fits.HDUList([fits.PrimaryHDU(data=avg_array, header=first_header)])
189
- hdul[0].header["DLCSTPX"] = 1
190
- hdul[0].header["DLCSTPY"] = 1
191
- hdul[0].header["DLMOSNRP"] = 1
192
- hdul[0].header["DLCURMOS"] = 0
193
- hdul[0].header["DLDMODE"] = False
191
+ hdul[0].header[DlnirspMetadataKey.X_tile_num] = 1
192
+ hdul[0].header[DlnirspMetadataKey.Y_tile_num] = 1
193
+ hdul[0].header[DlnirspMetadataKey.num_mosaic_repeats] = 1
194
+ hdul[0].header[DlnirspMetadataKey.mosaic_num] = 0
195
+ hdul[0].header[DlnirspMetadataKey.num_dither_steps] = False
194
196
 
195
197
  new_tags = [
196
198
  DlnirspTag.task_observe(),
@@ -237,11 +239,11 @@ class TagModulatedSolarGainsAsScience(DlnirspTaskBase):
237
239
  avg_array = average_numpy_arrays(arrays=arrays)
238
240
 
239
241
  hdul = fits.HDUList([fits.PrimaryHDU(data=avg_array, header=first_header)])
240
- hdul[0].header["DLCSTPX"] = 1
241
- hdul[0].header["DLCSTPY"] = 1
242
- hdul[0].header["DLMOSNRP"] = 1
243
- hdul[0].header["DLCURMOS"] = 0
244
- hdul[0].header["DLDMODE"] = False
242
+ hdul[0].header[DlnirspMetadataKey.X_tile_num] = 1
243
+ hdul[0].header[DlnirspMetadataKey.Y_tile_num] = 1
244
+ hdul[0].header[DlnirspMetadataKey.num_mosaic_repeats] = 1
245
+ hdul[0].header[DlnirspMetadataKey.mosaic_num] = 0
246
+ hdul[0].header[DlnirspMetadataKey.num_dither_steps] = False
245
247
 
246
248
  new_tags = [
247
249
  DlnirspTag.task_observe(),
@@ -20,6 +20,7 @@ from loguru import logger
20
20
 
21
21
  from dkist_processing_dlnirsp.models.constants import DlnirspBudName
22
22
  from dkist_processing_dlnirsp.models.constants import DlnirspConstants
23
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
23
24
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
24
25
  from dkist_processing_dlnirsp.models.task_name import DlnirspTaskName
25
26
  from dkist_processing_dlnirsp.tasks.dlnirsp_base import DlnirspTaskBase
@@ -38,7 +39,7 @@ def get_camera_number(scratch_dir: Path, suffix: str = "FITS", data_ext: int = 1
38
39
  header_list = [fits.getheader(f, ext=data_ext) for f in file_list]
39
40
  table = Table(header_list)
40
41
 
41
- camera_IDs = np.unique(table["DLARMID"])
42
+ camera_IDs = np.unique(table[DlnirspMetadataKey.arm_id])
42
43
  if camera_IDs.size > 1:
43
44
  raise ValueError(f"Found more than one arm in scratch dir. Found {camera_IDs}")
44
45
 
@@ -2,8 +2,10 @@ import pytest
2
2
  from astropy.io import fits
3
3
  from dkist_header_validator.translator import translate_spec122_to_spec214_l0
4
4
 
5
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
5
6
  from dkist_processing_dlnirsp.parsers.dlnirsp_l0_fits_access import DlnirspL0FitsAccess
6
7
  from dkist_processing_dlnirsp.parsers.dlnirsp_l0_fits_access import DlnirspRampFitsAccess
8
+ from dkist_processing_dlnirsp.parsers.dlnirsp_l1_fits_acess import DlnirspL1FitsAccess
7
9
  from dkist_processing_dlnirsp.tests.conftest import DlnirspHeaders
8
10
 
9
11
 
@@ -48,9 +50,11 @@ def test_dlnirsp_ramp_fits_access(ramp_header, arm_id):
48
50
  assert fits_obj.current_frame_in_ramp == -88
49
51
 
50
52
  else:
51
- assert fits_obj.camera_readout_mode == ramp_header["DLCAMSMD"]
52
- assert fits_obj.num_frames_in_ramp == ramp_header["DLCAMNS"]
53
- assert fits_obj.current_frame_in_ramp == ramp_header["DLCAMCUR"]
53
+ assert fits_obj.camera_readout_mode == ramp_header[DlnirspMetadataKey.camera_readout_mode]
54
+ assert fits_obj.num_frames_in_ramp == ramp_header[DlnirspMetadataKey.num_frames_in_ramp]
55
+ assert (
56
+ fits_obj.current_frame_in_ramp == ramp_header[DlnirspMetadataKey.current_frame_in_ramp]
57
+ )
54
58
 
55
59
 
56
60
  @pytest.mark.parametrize(
@@ -74,3 +78,52 @@ def test_dlnirsp_l0_fits_access(dither_header, dither_mode_on, dither_step):
74
78
  assert fits_obj.dither_step is 0
75
79
  else:
76
80
  assert fits_obj.dither_step == int(dither_step)
81
+
82
+
83
+ @pytest.mark.parametrize("arm_id", [pytest.param("VIS", id="vis_arm")])
84
+ def test_metadata_keys_in_access_bases(ramp_header, arm_id):
85
+ """
86
+ Given: the set of metadata key names in DlnirspMetadataKey
87
+ When: the Dlnirsp FITS access classes define a set of new attributes
88
+ Then: the sets are the same and the attributes have the correct values
89
+ """
90
+ dlnirsp_metadata_key_names = {dmk.name for dmk in DlnirspMetadataKey}
91
+ all_dlnirsp_fits_access_attrs = set()
92
+ for access_class in [DlnirspRampFitsAccess, DlnirspL0FitsAccess, DlnirspL1FitsAccess]:
93
+ fits_obj = access_class.from_header(ramp_header)
94
+ dlnirsp_instance_attrs = set(vars(fits_obj).keys())
95
+ parent_class = access_class.mro()[1]
96
+ parent_fits_obj = parent_class.from_header(ramp_header)
97
+ parent_instance_attrs = set(vars(parent_fits_obj).keys())
98
+ dlnirsp_fits_access_attrs = dlnirsp_instance_attrs - parent_instance_attrs
99
+ for attr in dlnirsp_fits_access_attrs:
100
+ match attr:
101
+ case "num_frames_in_ramp":
102
+ assert getattr(fits_obj, attr) == fits_obj.header.get(
103
+ DlnirspMetadataKey[attr], -99
104
+ )
105
+ case "current_frame_in_ramp":
106
+ assert getattr(fits_obj, attr) == fits_obj.header.get(
107
+ DlnirspMetadataKey[attr], -88
108
+ )
109
+ case "camera_sample_sequence":
110
+ assert getattr(fits_obj, attr) == fits_obj.header.get(
111
+ DlnirspMetadataKey[attr], "VISIBLE_CAMERA_SEQUENCE"
112
+ )
113
+ case "camera_readout_mode":
114
+ assert getattr(fits_obj, attr) == fits_obj.header.get(
115
+ DlnirspMetadataKey[attr], "DEFAULT_VISIBLE_CAMERA"
116
+ )
117
+ case "num_dither_steps":
118
+ assert (
119
+ getattr(fits_obj, attr)
120
+ == int(fits_obj.header[DlnirspMetadataKey[attr]]) + 1
121
+ )
122
+ case "dither_step":
123
+ assert getattr(fits_obj, attr) == int(
124
+ fits_obj.header.get(DlnirspMetadataKey[attr], False)
125
+ )
126
+ case _:
127
+ assert getattr(fits_obj, attr) == fits_obj.header[DlnirspMetadataKey[attr]]
128
+ all_dlnirsp_fits_access_attrs |= dlnirsp_fits_access_attrs
129
+ assert dlnirsp_metadata_key_names == all_dlnirsp_fits_access_attrs
@@ -10,6 +10,7 @@ from astropy.time import Time
10
10
  from astropy.time import TimeDelta
11
11
  from dkist_processing_common._util.scratch import WorkflowFileSystem
12
12
  from dkist_processing_common.models.fits_access import FitsAccessBase
13
+ from dkist_processing_common.models.fits_access import MetadataKey
13
14
  from dkist_processing_common.models.task_name import TaskName
14
15
  from dkist_service_configuration.logging import logger
15
16
  from scipy.optimize import fsolve
@@ -414,8 +415,8 @@ def test_linearity_correction(
414
415
  np.testing.assert_allclose(data, expected_value, rtol=1e-13)
415
416
 
416
417
  header = fits.getheader(files[0])
417
- assert header["XPOSURE"] == expected_total_exp
418
- assert header["TEXPOSUR"] == expected_NDR_exp
418
+ assert header[MetadataKey.fpa_exposure_time_ms] == expected_total_exp
419
+ assert header[MetadataKey.sensor_readout_exposure_time_ms] == expected_NDR_exp
419
420
 
420
421
 
421
422
  def test_VIS_linearity_correction(
@@ -11,6 +11,7 @@ from dkist_processing_common.models.constants import BudName
11
11
  from dkist_processing_common.models.task_name import TaskName
12
12
 
13
13
  from dkist_processing_dlnirsp.models.constants import DlnirspBudName
14
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
14
15
  from dkist_processing_dlnirsp.models.parameters import DlnirspParsingParameters
15
16
  from dkist_processing_dlnirsp.models.tags import DlnirspStemName
16
17
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
@@ -123,7 +124,7 @@ def test_parse_ramp_data(raw_ramp_parse_task, arm_id):
123
124
  )
124
125
  assert len(fits_obj_list) == num_line + num_read + num_reset
125
126
  for fits_obj in fits_obj_list:
126
- header_curr_frame = fits_obj.header["DLCAMCUR"]
127
+ header_curr_frame = fits_obj.header[DlnirspMetadataKey.current_frame_in_ramp]
127
128
  tags = task.tags(fits_obj.name)
128
129
  tag_curr_frame = [
129
130
  int(t.split("_")[-1])
@@ -9,6 +9,7 @@ from dkist_processing_common._util.scratch import WorkflowFileSystem
9
9
  from dkist_processing_common.codecs.fits import fits_array_encoder
10
10
  from dkist_processing_common.models.task_name import TaskName
11
11
 
12
+ from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
12
13
  from dkist_processing_dlnirsp.models.parameters import DlnirspParameters
13
14
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
14
15
  from dkist_processing_dlnirsp.tasks.science import CalibrationCollection
@@ -370,8 +371,8 @@ def test_science_task_completes(science_task_with_data, is_polarimetric, mocker,
370
371
  OG_PC_ij_matrix[1, 0] = obs_header["PC2_1"]
371
372
  OG_PC_ij_matrix[1, 1] = obs_header["PC2_2"]
372
373
 
373
- OG_CRPIX1 = obs_header["CRPIX1"]
374
- OG_CRPIX2 = obs_header["CRPIX2"]
374
+ OG_CRPIX1 = obs_header[DlnirspMetadataKey.crpix_1]
375
+ OG_CRPIX2 = obs_header[DlnirspMetadataKey.crpix_2]
375
376
 
376
377
  expected_WCS_values = compute_expected_WCS_values(
377
378
  OG_PC_ij_matrix, OG_CRPIX1, OG_CRPIX2, task.parameters
@@ -405,8 +406,8 @@ def test_science_task_completes(science_task_with_data, is_polarimetric, mocker,
405
406
  assert "DATE-END" in header
406
407
  # Need to check inequality because some randomness is added to the CRPIX
407
408
  # values in `ModulatedObserveHeaders`.
408
- assert header["CRPIX1"] - expected_CRPIX1 < 3
409
- assert header["CRPIX2"] - expected_CRPIX2 < 3
409
+ assert header[DlnirspMetadataKey.crpix_1] - expected_CRPIX1 < 3
410
+ assert header[DlnirspMetadataKey.crpix_2] - expected_CRPIX2 < 3
410
411
  assert header["PC1_1"] == expected_PC_ij_matrix[0, 0]
411
412
  assert header["PC1_2"] == expected_PC_ij_matrix[0, 1]
412
413
  assert header["PC2_1"] == expected_PC_ij_matrix[1, 0]
@@ -560,5 +561,5 @@ def test_WCS_correction(science_task_with_no_data, pc_correction_matrix, crpix_m
560
561
  assert corrected_header["PC1_2"] == expected_pc_matrix[0, 1]
561
562
  assert corrected_header["PC2_1"] == expected_pc_matrix[1, 0]
562
563
  assert corrected_header["PC2_2"] == expected_pc_matrix[1, 1]
563
- assert corrected_header["CRPIX1"] == expected_crpix1
564
- assert corrected_header["CRPIX2"] == expected_crpix2
564
+ assert corrected_header[DlnirspMetadataKey.crpix_1] == expected_crpix1
565
+ assert corrected_header[DlnirspMetadataKey.crpix_2] == expected_crpix2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 0.32.2
3
+ Version: 0.32.3
4
4
  Summary: Science processing code for the DLNIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -76,6 +76,7 @@ Requires-Dist: Flask-Login==0.6.3; extra == "frozen"
76
76
  Requires-Dist: Flask-SQLAlchemy==2.5.1; extra == "frozen"
77
77
  Requires-Dist: Flask-Session==0.5.0; extra == "frozen"
78
78
  Requires-Dist: Flask-WTF==1.2.2; extra == "frozen"
79
+ Requires-Dist: ImageIO==2.37.2; extra == "frozen"
79
80
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
80
81
  Requires-Dist: Mako==1.3.10; extra == "frozen"
81
82
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
@@ -123,8 +124,8 @@ Requires-Dist: attrs==25.4.0; extra == "frozen"
123
124
  Requires-Dist: babel==2.17.0; extra == "frozen"
124
125
  Requires-Dist: billiard==4.2.2; extra == "frozen"
125
126
  Requires-Dist: blinker==1.9.0; extra == "frozen"
126
- Requires-Dist: boto3==1.40.64; extra == "frozen"
127
- Requires-Dist: botocore==1.40.64; extra == "frozen"
127
+ Requires-Dist: boto3==1.40.65; extra == "frozen"
128
+ Requires-Dist: botocore==1.40.65; extra == "frozen"
128
129
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
129
130
  Requires-Dist: celery==5.3.1; extra == "frozen"
130
131
  Requires-Dist: certifi==2025.10.5; extra == "frozen"
@@ -149,7 +150,7 @@ Requires-Dist: dill==0.4.0; extra == "frozen"
149
150
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
150
151
  Requires-Dist: dkist-processing-common==11.8.0; extra == "frozen"
151
152
  Requires-Dist: dkist-processing-core==6.0.0; extra == "frozen"
152
- Requires-Dist: dkist-processing-dlnirsp==0.32.2; extra == "frozen"
153
+ Requires-Dist: dkist-processing-dlnirsp==0.32.3; extra == "frozen"
153
154
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
154
155
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
155
156
  Requires-Dist: dkist-service-configuration==4.1.7; extra == "frozen"
@@ -174,7 +175,6 @@ Requires-Dist: httpcore==1.0.9; extra == "frozen"
174
175
  Requires-Dist: httpx==0.28.1; extra == "frozen"
175
176
  Requires-Dist: humanize==4.14.0; extra == "frozen"
176
177
  Requires-Dist: idna==3.11; extra == "frozen"
177
- Requires-Dist: imageio==2.37.0; extra == "frozen"
178
178
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
179
179
  Requires-Dist: importlib_metadata==8.7.0; extra == "frozen"
180
180
  Requires-Dist: inflection==0.5.1; extra == "frozen"
@@ -5,16 +5,17 @@ dkist_processing_dlnirsp/dev_scripts/__init__.py,sha256=tITkbcFg1a-24sdFaWK8OyLr
5
5
  dkist_processing_dlnirsp/dev_scripts/test_slitbeam_group_assignment.py,sha256=ac-8G-P2L_xW6m3tOooFlHs1N5_C6F_7k2VAU2a9_1A,4171
6
6
  dkist_processing_dlnirsp/models/__init__.py,sha256=ItaZgbjndT5uwEv2YDQZCVAHGbiB_sjzkX8MMbIgcSo,45
7
7
  dkist_processing_dlnirsp/models/constants.py,sha256=0TV_K6WbvUlDQdNRxx_qblQ_dwN7RGU7ng2iDOBQedo,6386
8
+ dkist_processing_dlnirsp/models/fits_access.py,sha256=iXaAxey-apXzj68b33-YLk7O7o0GtKAiJ_0JLoc6VOc,963
8
9
  dkist_processing_dlnirsp/models/parameters.py,sha256=PsaZSNE4Uyov1xGMqRqh6kb5F8NnDDm3QRHkoiDAsYY,15812
9
10
  dkist_processing_dlnirsp/models/tags.py,sha256=xD_XaCjMXmd70P0FoHy92XSdlabIk07RGVEyFpXpGfM,5791
10
11
  dkist_processing_dlnirsp/models/task_name.py,sha256=LmEoI_h4UecvIMGcO5U8mGTqfToPjABuFbsYkC_rZyw,506
11
12
  dkist_processing_dlnirsp/parsers/__init__.py,sha256=O6KcssCD39an60pqLISt1aHQ4u5ADg0TMNw1dB694Ug,81
12
- dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py,sha256=l9ftyYvH5oi-WIVTtkD8jua87Cyc2Li5N6hoG-Paf8g,3561
13
+ dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py,sha256=ziUeSWPOiFV0HdkCCfFZGPOZB-PB1OhK2qjYbVdsAb4,4314
13
14
  dkist_processing_dlnirsp/parsers/dlnirsp_l1_fits_acess.py,sha256=K-9HRVZ02IUl0wRnhlTMnwSikTt7vYi_zSWYs0V_6-Y,878
14
15
  dkist_processing_dlnirsp/parsers/mosaic.py,sha256=0z0sTbDQFhg2hyCp6hSKFpuaS-rOSUBvuBOT6mSSadA,31061
15
- dkist_processing_dlnirsp/parsers/task.py,sha256=3s5aWiNJ5gYZQ001CduDWSivtvrvrBN16EHnS6m2iI4,1768
16
- dkist_processing_dlnirsp/parsers/time.py,sha256=KFDHIX5YN3ToA9jxT-u_qqJiZDtcEGEyA9lUKCx4Gcs,1995
17
- dkist_processing_dlnirsp/parsers/wavelength.py,sha256=FPpvFSBTy3OxjUXJhjRirR_sINbgvysMUmNKvvfi0PE,860
16
+ dkist_processing_dlnirsp/parsers/task.py,sha256=9_JzhqfU9os-6uUpn1FlNd2d1yWfD0dB4u0H0OruTbs,1619
17
+ dkist_processing_dlnirsp/parsers/time.py,sha256=DsnGxT4coH6FjiHsLr5gimW8lGExE5y_E6zzUH89HMM,2072
18
+ dkist_processing_dlnirsp/parsers/wavelength.py,sha256=CHZDFqOpzErhaR0MSbzQ6NiagdmkVkZ-6HWRERH5TNY,972
18
19
  dkist_processing_dlnirsp/parsers/wcs_corrections.py,sha256=yeTLowmtAIs5sjNStIKmBTZUxttOtldJSeW_adsXFYQ,1786
19
20
  dkist_processing_dlnirsp/tasks/__init__.py,sha256=6N5xdCM3FeTpzmBUgUnJ5mKF2N3vBfcj-SNqVQ9ZHiw,996
20
21
  dkist_processing_dlnirsp/tasks/assemble_movie.py,sha256=BxUO7_Zj_QGLXqNpp87bLawyLo4G0I0DTLZPMXpi5Mo,5539
@@ -28,12 +29,12 @@ dkist_processing_dlnirsp/tasks/l1_output_data.py,sha256=Psta0476jih-cfmpdnzmquys
28
29
  dkist_processing_dlnirsp/tasks/lamp.py,sha256=twoMHMnE2jm2OYxkeHFcjqcyQYVtEjSU2_z2mmn3Ybs,5390
29
30
  dkist_processing_dlnirsp/tasks/linearity_correction.py,sha256=fz16nK5q7isKz9l7_AFeDkMTaX08omlusKoIDS8wj5k,21107
30
31
  dkist_processing_dlnirsp/tasks/make_movie_frames.py,sha256=zxyAWNnPFbG7jpUEe3ekRyJGjk706T9a-yiA3eoWi5M,6290
31
- dkist_processing_dlnirsp/tasks/parse.py,sha256=-v7pkkxaAjSMxTXQCHTU-M6P9ODZmJG73TstQMicJHk,10465
32
+ dkist_processing_dlnirsp/tasks/parse.py,sha256=ZtqM6dyxxnnbVTAun040EuxfQZEQcnkXzZffXSBTYkk,10919
32
33
  dkist_processing_dlnirsp/tasks/quality_metrics.py,sha256=1ScLAinv3WG-0M7u_26gnogbJ_D84K9CP7eRvEuwb9E,7346
33
- dkist_processing_dlnirsp/tasks/science.py,sha256=JGBmJGePGGowOzN2N57TOdxCt4zALLn5mNi1v7aor6I,35513
34
+ dkist_processing_dlnirsp/tasks/science.py,sha256=sNI4AYO10qe3JL62KWXR87MnfX9m85Jo4_PkQ0qd5TQ,35737
34
35
  dkist_processing_dlnirsp/tasks/solar.py,sha256=NyLYkRophfXaVtvnGuNEvkcE8JNcmCJVuobNYAZ7KjQ,11135
35
36
  dkist_processing_dlnirsp/tasks/wavelength_calibration.py,sha256=6jidRwMbGoZcuVbnFv3IizEFFkGxHMTI249Q8pyVIUA,17023
36
- dkist_processing_dlnirsp/tasks/write_l1.py,sha256=cm2dB4n5LjwauxUfv_jtkG8ZRZCHYE4DBZWRXQYjok4,9578
37
+ dkist_processing_dlnirsp/tasks/write_l1.py,sha256=Smd9Fzp3Kx4F3nHYJJRAXqNy9n71TsYovuvFjLcUYs4,9732
37
38
  dkist_processing_dlnirsp/tasks/mixin/__init__.py,sha256=5PMbkD6K0zTfhCxv8vg2lvJCNP81qItJ_R_7Yy3Mpwc,26
38
39
  dkist_processing_dlnirsp/tasks/mixin/corrections.py,sha256=MRZXCEc0KBE-9cQUpRP-K3ioDYRH8_ORFlJcH2SsmWA,6803
39
40
  dkist_processing_dlnirsp/tasks/mixin/group_id.py,sha256=u28XLVtvZ_lmzzaSX2SuA2MOiY69GC8AJsic2Vi2OSQ,11137
@@ -46,18 +47,18 @@ dkist_processing_dlnirsp/tests/test_corrections.py,sha256=hefVNm3bgwfGQ7Wn0hi077
46
47
  dkist_processing_dlnirsp/tests/test_dark.py,sha256=qv7SvUNgafzfdyIW11I6eSFeaXjw34-9X1ipnqKE1cY,3726
47
48
  dkist_processing_dlnirsp/tests/test_dlnirsp_base.py,sha256=PCFklqGEqrgIhTYcatu7RfOxr_b_XjHotc36MRbUvnk,1853
48
49
  dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py,sha256=RFNf-Hj835NlE45vygxh01kJm8YdCJJ3UUwzJRYJHE8,6411
49
- dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py,sha256=x9TMXUSTLFkWIKrPcNLrcwkKoYRTdubGdP7FZU6Z1Jo,2855
50
+ dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py,sha256=5C5NPOkNigoNhIFNUKyrJvyt_mRjke1tkfXQcv1cnPI,5639
50
51
  dkist_processing_dlnirsp/tests/test_geometric.py,sha256=94RDg1mGEMTibD2oPOoCKil5yUQMp_0vO4cDWzG3644,7742
51
52
  dkist_processing_dlnirsp/tests/test_group_id.py,sha256=TpNllN6OZuYF8almsayk7pRTc4J8TcLGp1SHCBG6QAU,6279
52
53
  dkist_processing_dlnirsp/tests/test_ifu_drift.py,sha256=K6ushbVQVE6AATjiP3hEgF6oyZp41SbGkI_Sa_kyrNs,9066
53
54
  dkist_processing_dlnirsp/tests/test_instrument_polarization_calibration.py,sha256=pPXjfzi3EcaawNqvXsz3OcCF1XITEJeCzQ8-iOjlm7U,23430
54
55
  dkist_processing_dlnirsp/tests/test_lamp.py,sha256=umy4ydYR5M3dqXTQP14qbamOleutyD1jSj3325aitl0,3940
55
- dkist_processing_dlnirsp/tests/test_linearity_correction.py,sha256=e0XAuUwthhDSl4V4UPd2mRwpUsX-B7kVkI3juCGP4a4,27879
56
+ dkist_processing_dlnirsp/tests/test_linearity_correction.py,sha256=-XiA6uBxoESEFyyS538gFlAShD_NMkhshFVfpDg2xbY,28002
56
57
  dkist_processing_dlnirsp/tests/test_make_movie_frames.py,sha256=fR1xJEFJMK0xUu8-EyOS_6mIX_ZO2J_nM0k3ud8xtYM,3648
57
58
  dkist_processing_dlnirsp/tests/test_parameters.py,sha256=KpBeisM4BIF5Kl6ZxZqk3yCozndmLMlzNgo0ij0hmYw,10328
58
- dkist_processing_dlnirsp/tests/test_parse.py,sha256=VixU-tfpS-Y2bOddCXZ_xBfKpAm9DV9qBx6xdi2XtaA,37901
59
+ dkist_processing_dlnirsp/tests/test_parse.py,sha256=Zp-LWUaiIfCJi2S3GX9DrrKg7hrRU1wnNgiFlJ-CJC8,38006
59
60
  dkist_processing_dlnirsp/tests/test_quality.py,sha256=OBWva_E6T5RfDuo73LiTdTr7uh2FO04VpBAsSOLfjVQ,6122
60
- dkist_processing_dlnirsp/tests/test_science.py,sha256=vA7bVQWG0dxs8IuU8hEZ8KMgjtGqrxEGYPG5i47k2Og,20719
61
+ dkist_processing_dlnirsp/tests/test_science.py,sha256=1DKqKNAEZEsVCffYz_TiEc2REG7cBIfGeig1kJK4ZtE,20902
61
62
  dkist_processing_dlnirsp/tests/test_solar.py,sha256=jTNnxs5fE8R_hLvmdAU9x4RXJaSpJWGQajL7kzXTxPQ,12111
62
63
  dkist_processing_dlnirsp/tests/test_trial_create_quality_report.py,sha256=3RUOVYs5b87oHZAXcd0cH_IX9qpL9gFhlcKBRr3ThXQ,2784
63
64
  dkist_processing_dlnirsp/tests/test_wavelength_calibration.py,sha256=GFGXtl0KdClolknAwfR0aG5t-Ux5N5mynol4dKp0cn8,14830
@@ -68,8 +69,8 @@ dkist_processing_dlnirsp/tests/local_trial_workflows/l0_linearize_only.py,sha256
68
69
  dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py,sha256=ZDefUSKggIH2ebzUziQWU_A2yWeX68vjqzC11MNkzJU,19338
69
70
  dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py,sha256=Nv8qi-U2mUpWRn8rfx0ckn6v9OUGbfSND-fX9WVRaU0,20102
70
71
  dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py,sha256=MfCqHOO9RC24FRqGUKfPiTGUZh7rft9NklYKej-oM00,17757
71
- dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py,sha256=PukJUm83qiDnE7fcVGdbBMZN-RrkLutbB-XkOsMKMqY,11697
72
- dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_helpers.py,sha256=eZ7Z0BgLazGPPTuDpmItyY36yd8s243z4OGmJnGTxjw,21284
72
+ dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py,sha256=zEnx_mOTwF8QRM8BZ2Nn0MntfFIkrMVQZDUbmqCmDJk,12191
73
+ dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_helpers.py,sha256=5abEDqLyJ1mH6RYlV6ReHOqUkUste0vC6raENFQeDNY,21375
73
74
  dkist_processing_dlnirsp/tests/local_trial_workflows/translate_files.py,sha256=bsOqBtGE9SdOZL2ROJ-murJHjymYrE_nEPNHJgy7pDc,1882
74
75
  dkist_processing_dlnirsp/workflows/__init__.py,sha256=bDRNGCIayR8Z-dcOClvk5nTmHgKORTrZUVX9e3UpCc8,165
75
76
  dkist_processing_dlnirsp/workflows/l0_processing.py,sha256=qEBPV7xOacZTO3y4Pkjrxq1IxkOiPUPKjDHQ1xs98_M,4106
@@ -93,8 +94,8 @@ docs/science_calibration.rst,sha256=JUMeS7KyIsL9cUuy-IdV2tQ-wQ2lBx6j8u_51ThJzVg,
93
94
  docs/scientific_changelog.rst,sha256=01AWBSHg8zElnodCgAq-hMxhk9CkX5rtEENx4iz0sjI,300
94
95
  docs/wavelength_calibration.rst,sha256=VP45e0g4r-dReQmypQVqduvezQiKwq47STlAJn0w8iQ,4095
95
96
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
96
- dkist_processing_dlnirsp-0.32.2.dist-info/METADATA,sha256=ah-VSUvrZz2t55nmak8wmM8g5tdbngYI-Kl4_DtgqhY,29311
97
- dkist_processing_dlnirsp-0.32.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
98
- dkist_processing_dlnirsp-0.32.2.dist-info/entry_points.txt,sha256=p4-7cpIfxmQGFUDIP5n5noE5KADHN2-JvV03e0gOx9s,140
99
- dkist_processing_dlnirsp-0.32.2.dist-info/top_level.txt,sha256=4WmLV9LQM78KTFnkHmtaOJvVHAPpz0m9ruzDS-B_cUo,49
100
- dkist_processing_dlnirsp-0.32.2.dist-info/RECORD,,
97
+ dkist_processing_dlnirsp-0.32.3.dist-info/METADATA,sha256=zWE2u7yocvTgqksWAwv_PMO1IfDwc3kca3TKQ79Vavo,29311
98
+ dkist_processing_dlnirsp-0.32.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
+ dkist_processing_dlnirsp-0.32.3.dist-info/entry_points.txt,sha256=p4-7cpIfxmQGFUDIP5n5noE5KADHN2-JvV03e0gOx9s,140
100
+ dkist_processing_dlnirsp-0.32.3.dist-info/top_level.txt,sha256=4WmLV9LQM78KTFnkHmtaOJvVHAPpz0m9ruzDS-B_cUo,49
101
+ dkist_processing_dlnirsp-0.32.3.dist-info/RECORD,,