dkist-processing-cryonirsp 1.4.12__py3-none-any.whl → 1.4.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dkist-processing-cryonirsp might be problematic. Click here for more details.

@@ -32,10 +32,15 @@ class CryonirspBudName(Enum):
32
32
  solar_gain_exposure_conditions_list = "SOLAR_GAIN_EXPOSURE_CONDITIONS_LIST"
33
33
  polcal_exposure_conditions_list = "POLCAL_EXPOSURE_CONDITIONS_LIST"
34
34
  observe_exposure_conditions_list = "OBSERVE_EXPOSURE_CONDITIONS_LIST"
35
- non_dark_and_non_polcal_task_exposure_conditions_list = (
36
- "NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST"
35
+ sp_non_dark_and_non_polcal_task_exposure_conditions_list = (
36
+ "SP_NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST"
37
+ )
38
+ ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list = (
39
+ "CI_NON_DARK_AND_NON_POLCAL_AND_NON_LAMP_GAIN_TASK_EXPOSURE_CONDITIONS_LIST"
37
40
  )
38
41
  picky_dark_exposure_conditions_list = "PICKY_DARK_EXPOSURE_CONDITIONS_LIST"
42
+ ci_picky_dark_exposure_conditions_list = "CI_PICKY_DARK_EXPOSURE_CONDITIONS_LIST"
43
+ sp_picky_dark_exposure_conditions_list = "SP_PICKY_DARK_EXPOSURE_CONDITIONS_LIST"
39
44
  modulator_spin_mode = "MODULATOR_SPIN_MODE"
40
45
  axis_1_type = "AXIS_1_TYPE"
41
46
  axis_2_type = "AXIS_2_TYPE"
@@ -47,6 +52,8 @@ class CryonirspBudName(Enum):
47
52
  optical_density_filter_picky_bud = "OPTICAL_DENSITY_FILTER_PICKY_BUD"
48
53
  solar_gain_ip_start_time = "SOLAR_GAIN_IP_START_TIME"
49
54
  gain_frame_type_list = "GAIN_FRAME_TYPE_LIST"
55
+ lamp_gain_frame_type_list = "LAMP_GAIN_FRAME_TYPE_LIST"
56
+ solar_gain_frame_type_list = "SOLAR_GAIN_FRAME_TYPE_LIST"
50
57
 
51
58
 
52
59
  class CryonirspConstants(ConstantsBase):
@@ -188,10 +195,21 @@ class CryonirspConstants(ConstantsBase):
188
195
  return []
189
196
 
190
197
  @property
191
- def non_dark_and_non_polcal_task_exposure_conditions_list(self) -> [ExposureConditions]:
198
+ def ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list(
199
+ self,
200
+ ) -> [ExposureConditions]:
201
+ """Return a list of all exposure times required for all tasks other than dark, polcal, and lamp gain."""
202
+ raw_conditions: list[list[int, str]] = self._db_dict[
203
+ CryonirspBudName.ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list.value
204
+ ]
205
+ conditions = [ExposureConditions(*item) for item in raw_conditions]
206
+ return conditions
207
+
208
+ @property
209
+ def sp_non_dark_and_non_polcal_task_exposure_conditions_list(self) -> [ExposureConditions]:
192
210
  """Return a list of all exposure times required for all tasks other than dark and polcal."""
193
211
  raw_conditions: list[list[int, str]] = self._db_dict[
194
- CryonirspBudName.non_dark_and_non_polcal_task_exposure_conditions_list.value
212
+ CryonirspBudName.sp_non_dark_and_non_polcal_task_exposure_conditions_list.value
195
213
  ]
196
214
  conditions = [ExposureConditions(*item) for item in raw_conditions]
197
215
  return conditions
@@ -12,11 +12,12 @@ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
12
12
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
13
13
 
14
14
 
15
- class CheckGainFramesPickyBud(Stem):
16
- """Pickybud to check for lamp gain and solar gain frames."""
15
+ class CheckGainFramesPickyBudBase(Stem):
16
+ """Pickybud to check for gain frames."""
17
17
 
18
- def __init__(self):
19
- super().__init__(stem_name=CryonirspBudName.gain_frame_type_list.value)
18
+ def __init__(self, stem_name: str, task_name: str):
19
+ super().__init__(stem_name=stem_name)
20
+ self.task_name = task_name.casefold()
20
21
 
21
22
  def setter(self, fits_obj: CryonirspL0FitsAccess) -> Type[SpilledDirt] | str:
22
23
  """
@@ -30,15 +31,11 @@ class CheckGainFramesPickyBud(Stem):
30
31
  -------
31
32
  The calibration frame object associated with this fits object
32
33
  """
33
- task = parse_header_ip_task_with_gains(fits_obj).casefold()
34
-
35
- if task in [TaskName.lamp_gain.value.casefold(), TaskName.solar_gain.value.casefold()]:
36
- return task
37
- return SpilledDirt
34
+ return parse_header_ip_task_with_gains(fits_obj).casefold()
38
35
 
39
- def getter(self, key: Hashable) -> Thorn:
36
+ def getter(self, key: Hashable) -> Type[Thorn]:
40
37
  """
41
- Check that lamp and solar gain frames exist. If they do, return a Thorn.
38
+ Check that the specific gain exists. If it does, return a Thorn.
42
39
 
43
40
  Parameters
44
41
  ----------
@@ -49,10 +46,28 @@ class CheckGainFramesPickyBud(Stem):
49
46
  -------
50
47
  Thorn
51
48
  """
52
- gain_task_types = list(self.key_to_petal_dict.values())
49
+ task_types = list(self.key_to_petal_dict.values())
53
50
 
54
- if TaskName.lamp_gain.value.casefold() not in gain_task_types:
55
- raise ValueError("Lamp gain frames not found.")
56
- if TaskName.solar_gain.value.casefold() not in gain_task_types:
57
- raise ValueError("Solar gain frames not found.")
51
+ if self.task_name not in task_types:
52
+ raise ValueError(f"{self.task_name} frames not found.")
58
53
  return Thorn
54
+
55
+
56
+ class CheckSolarGainFramesPickyBud(CheckGainFramesPickyBudBase):
57
+ """Pickybud to check for solar gain frames."""
58
+
59
+ def __init__(self):
60
+ super().__init__(
61
+ stem_name=CryonirspBudName.solar_gain_frame_type_list.value,
62
+ task_name=TaskName.solar_gain.value,
63
+ )
64
+
65
+
66
+ class CheckLampGainFramesPickyBud(CheckGainFramesPickyBudBase):
67
+ """Pickybud to check for lamp gain frames."""
68
+
69
+ def __init__(self):
70
+ super().__init__(
71
+ stem_name=CryonirspBudName.lamp_gain_frame_type_list.value,
72
+ task_name=TaskName.lamp_gain.value,
73
+ )
@@ -13,8 +13,6 @@ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
13
13
  from dkist_processing_cryonirsp.models.exposure_conditions import ExposureConditions
14
14
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
15
15
 
16
- _DARK_AND_POLCAL_TASK_TYPES = (TaskName.dark.value, TaskName.polcal.value)
17
-
18
16
 
19
17
  class CryonirspTaskExposureConditionsBud(Stem):
20
18
  """
@@ -53,14 +51,13 @@ class CryonirspTaskExposureConditionsBud(Stem):
53
51
  return exposure_conditions_tuple
54
52
 
55
53
 
56
- class CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(Stem):
57
- """For ip task types that are neither DARK nor POLCAL, produce a list of exposure conditions tuples."""
54
+ class CryonirspConditionalTaskExposureConditionsBudBase(Stem):
55
+ """For ip task types that are not in task_types_to_ignore, produce a list of exposure conditions tuples."""
58
56
 
59
- def __init__(self):
60
- super().__init__(
61
- stem_name=CryonirspBudName.non_dark_and_non_polcal_task_exposure_conditions_list.value
62
- )
57
+ def __init__(self, stem_name: str, task_types_to_ignore: list[str]):
58
+ super().__init__(stem_name=stem_name)
63
59
  self.metadata_key = "exposure_conditions"
60
+ self.task_types_to_ignore = task_types_to_ignore
64
61
 
65
62
  def setter(self, fits_obj: CryonirspL0FitsAccess) -> ExposureConditions | Type[SpilledDirt]:
66
63
  """
@@ -74,7 +71,7 @@ class CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(Stem):
74
71
  -------
75
72
  The exposure time associated with this fits object
76
73
  """
77
- if fits_obj.ip_task_type.upper() not in _DARK_AND_POLCAL_TASK_TYPES:
74
+ if fits_obj.ip_task_type.upper() not in self.task_types_to_ignore:
78
75
  return getattr(fits_obj, self.metadata_key)
79
76
  return SpilledDirt
80
77
 
@@ -95,16 +92,47 @@ class CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(Stem):
95
92
  return exposure_conditions_tuple
96
93
 
97
94
 
98
- class CryonirspPickyDarkExposureConditionsBud(Stem):
95
+ class CryonirspSPConditionalTaskExposureConditionsBud(
96
+ CryonirspConditionalTaskExposureConditionsBudBase
97
+ ):
98
+ """For ip task types that are neither DARK nor POLCAL, produce a list of exposure conditions tuples."""
99
+
100
+ def __init__(self):
101
+ super().__init__(
102
+ stem_name=CryonirspBudName.sp_non_dark_and_non_polcal_task_exposure_conditions_list.value,
103
+ task_types_to_ignore=[TaskName.dark.value, TaskName.polcal.value],
104
+ )
105
+ self.metadata_key = "exposure_conditions"
106
+
107
+
108
+ class CryonirspCIConditionalTaskExposureConditionsBud(
109
+ CryonirspConditionalTaskExposureConditionsBudBase
110
+ ):
111
+ """For ip task types that are neither DARK nor POLCAL nor LAMP GAIN, produce a list of exposure conditions tuples."""
112
+
113
+ def __init__(self):
114
+ super().__init__(
115
+ stem_name=CryonirspBudName.ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list.value,
116
+ task_types_to_ignore=[
117
+ TaskName.dark.value,
118
+ TaskName.polcal.value,
119
+ TaskName.lamp_gain.value,
120
+ ],
121
+ )
122
+ self.metadata_key = "exposure_conditions"
123
+
124
+
125
+ class CryonirspPickyDarkExposureConditionsBudBase(Stem):
99
126
  """Parse exposure conditions tuples to ensure existence of dark frames with the required exposure conditions."""
100
127
 
101
128
  DarkTaskTestAndExposureConditions = namedtuple(
102
129
  "DarkTaskTestAndExposureConditions", ["is_dark", "exposure_conditions"]
103
130
  )
104
131
 
105
- def __init__(self):
106
- super().__init__(stem_name=CryonirspBudName.picky_dark_exposure_conditions_list.value)
132
+ def __init__(self, stem_name: str, task_types_to_ignore: list[str]):
133
+ super().__init__(stem_name=stem_name)
107
134
  self.metadata_key = "exposure_conditions"
135
+ self.task_types_to_ignore = task_types_to_ignore
108
136
 
109
137
  def setter(self, fits_obj: CryonirspL0FitsAccess) -> tuple | Type[SpilledDirt]:
110
138
  """
@@ -122,11 +150,11 @@ class CryonirspPickyDarkExposureConditionsBud(Stem):
122
150
  return self.DarkTaskTestAndExposureConditions(
123
151
  is_dark=True, exposure_conditions=getattr(fits_obj, self.metadata_key)
124
152
  )
125
- if fits_obj.ip_task_type.upper() not in _DARK_AND_POLCAL_TASK_TYPES:
153
+ if fits_obj.ip_task_type.upper() not in self.task_types_to_ignore:
126
154
  return self.DarkTaskTestAndExposureConditions(
127
155
  is_dark=False, exposure_conditions=getattr(fits_obj, self.metadata_key)
128
156
  )
129
- # Polcal falls through
157
+ # Ignored task types fall through
130
158
  return SpilledDirt
131
159
 
132
160
  def getter(self, key: Hashable) -> Type[Thorn]:
@@ -161,3 +189,30 @@ class CryonirspPickyDarkExposureConditionsBud(Stem):
161
189
  f"Exposure conditions required in the set of dark frames not found. Missing conditions = {other_exposure_conditions_missing_from_dark_exposure_conditions}"
162
190
  )
163
191
  return Thorn
192
+
193
+
194
+ class CryonirspCIPickyDarkExposureConditionsBud(CryonirspPickyDarkExposureConditionsBudBase):
195
+ """Parse exposure conditions tuples to ensure existence of dark frames with the required exposure conditions, ignoring polcal frames and lamp gain frames."""
196
+
197
+ def __init__(self):
198
+ super().__init__(
199
+ stem_name=CryonirspBudName.ci_picky_dark_exposure_conditions_list.value,
200
+ task_types_to_ignore=[
201
+ TaskName.dark.value,
202
+ TaskName.polcal.value,
203
+ TaskName.lamp_gain.value,
204
+ ],
205
+ )
206
+
207
+
208
+ class CryonirspSPPickyDarkExposureConditionsBud(CryonirspPickyDarkExposureConditionsBudBase):
209
+ """Parse exposure conditions tuples to ensure existence of dark frames with the required exposure conditions, ignoring polcal frames."""
210
+
211
+ def __init__(self):
212
+ super().__init__(
213
+ stem_name=CryonirspBudName.sp_picky_dark_exposure_conditions_list.value,
214
+ task_types_to_ignore=[
215
+ TaskName.dark.value,
216
+ TaskName.polcal.value,
217
+ ],
218
+ )
@@ -39,9 +39,16 @@ class DarkCalibration(CryonirspTaskBase):
39
39
  None
40
40
 
41
41
  """
42
- target_exposure_conditions = (
43
- self.constants.non_dark_and_non_polcal_task_exposure_conditions_list
44
- )
42
+ arm = self.constants.arm_id
43
+
44
+ if arm == "CI":
45
+ target_exposure_conditions = (
46
+ self.constants.ci_non_dark_and_non_polcal_and_non_lamp_gain_task_exposure_conditions_list
47
+ )
48
+ if arm == "SP":
49
+ target_exposure_conditions = (
50
+ self.constants.sp_non_dark_and_non_polcal_task_exposure_conditions_list
51
+ )
45
52
 
46
53
  logger.info(f"{target_exposure_conditions = }")
47
54
  with self.apm_task_step(
@@ -25,14 +25,21 @@ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
25
25
  from dkist_processing_cryonirsp.models.parameters import CryonirspParsingParameters
26
26
  from dkist_processing_cryonirsp.models.tags import CryonirspStemName
27
27
  from dkist_processing_cryonirsp.models.tags import CryonirspTag
28
- from dkist_processing_cryonirsp.parsers.check_for_gains import CheckGainFramesPickyBud
28
+ from dkist_processing_cryonirsp.parsers.check_for_gains import CheckLampGainFramesPickyBud
29
+ from dkist_processing_cryonirsp.parsers.check_for_gains import CheckSolarGainFramesPickyBud
29
30
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
30
31
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspRampFitsAccess
31
32
  from dkist_processing_cryonirsp.parsers.exposure_conditions import (
32
- CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud,
33
+ CryonirspCIConditionalTaskExposureConditionsBud,
33
34
  )
34
35
  from dkist_processing_cryonirsp.parsers.exposure_conditions import (
35
- CryonirspPickyDarkExposureConditionsBud,
36
+ CryonirspCIPickyDarkExposureConditionsBud,
37
+ )
38
+ from dkist_processing_cryonirsp.parsers.exposure_conditions import (
39
+ CryonirspSPConditionalTaskExposureConditionsBud,
40
+ )
41
+ from dkist_processing_cryonirsp.parsers.exposure_conditions import (
42
+ CryonirspSPPickyDarkExposureConditionsBud,
36
43
  )
37
44
  from dkist_processing_cryonirsp.parsers.exposure_conditions import (
38
45
  CryonirspTaskExposureConditionsBud,
@@ -180,16 +187,12 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
180
187
  NumberOfScanStepsBud(),
181
188
  NumberOfMeasurementsBud(),
182
189
  CryonirspSolarGainStartTimeBud(),
183
- CheckGainFramesPickyBud(),
190
+ CheckSolarGainFramesPickyBud(),
184
191
  NumCSStepBud(self.parameters.max_cs_step_time_sec),
185
192
  CryonirspTaskExposureConditionsBud(
186
193
  stem_name=CryonirspBudName.dark_frame_exposure_conditions_list.value,
187
194
  ip_task_type=TaskName.dark.value,
188
195
  ),
189
- CryonirspTaskExposureConditionsBud(
190
- stem_name=CryonirspBudName.lamp_gain_exposure_conditions_list.value,
191
- ip_task_type=TaskName.lamp_gain.value,
192
- ),
193
196
  CryonirspTaskExposureConditionsBud(
194
197
  stem_name=CryonirspBudName.solar_gain_exposure_conditions_list.value,
195
198
  ip_task_type=TaskName.solar_gain.value,
@@ -202,8 +205,6 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
202
205
  stem_name=CryonirspBudName.polcal_exposure_conditions_list.value,
203
206
  ip_task_type=TaskName.polcal.value,
204
207
  ),
205
- CryonirspNonDarkAndNonPolcalTaskExposureConditionsBud(),
206
- CryonirspPickyDarkExposureConditionsBud(),
207
208
  UniqueBud(constant_name=CryonirspBudName.axis_1_type.value, metadata_key="axis_1_type"),
208
209
  UniqueBud(constant_name=CryonirspBudName.axis_2_type.value, metadata_key="axis_2_type"),
209
210
  UniqueBud(constant_name=CryonirspBudName.axis_3_type.value, metadata_key="axis_3_type"),
@@ -274,10 +275,23 @@ class ParseL0CryonirspSPLinearizedData(ParseL0CryonirspLinearizedData):
274
275
  ip_task_type=TaskName.solar_gain.value,
275
276
  task_type_parsing_function=parse_header_ip_task_with_gains,
276
277
  ),
278
+ CheckLampGainFramesPickyBud(),
279
+ CryonirspTaskExposureConditionsBud(
280
+ stem_name=CryonirspBudName.lamp_gain_exposure_conditions_list.value,
281
+ ip_task_type=TaskName.lamp_gain.value,
282
+ ),
283
+ CryonirspSPConditionalTaskExposureConditionsBud(),
284
+ CryonirspSPPickyDarkExposureConditionsBud(),
277
285
  ]
278
286
 
279
287
 
280
288
  class ParseL0CryonirspCILinearizedData(ParseL0CryonirspLinearizedData):
281
289
  """Parse linearity corrected CryoNIRSP-CI input data with CI arm specific constants."""
282
290
 
283
- pass
291
+ @property
292
+ def constant_buds(self) -> list[S]:
293
+ """Add CryoNIRSP-CI specific constants to common constants."""
294
+ return super().constant_buds + [
295
+ CryonirspCIConditionalTaskExposureConditionsBud(),
296
+ CryonirspCIPickyDarkExposureConditionsBud(),
297
+ ]
@@ -129,7 +129,14 @@ class CryonirspConstantsDb:
129
129
  ExposureConditions(0.01, AllowableOpticalDensityFilterNames.OPEN.value),
130
130
  )
131
131
  POLCAL_EXPOSURE_CONDITIONS_LIST: tuple[ExposureConditions] | tuple = ()
132
- NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST: tuple[ExposureConditions, ...] = (
132
+ SP_NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST: tuple[ExposureConditions, ...] = (
133
+ ExposureConditions(100.0, AllowableOpticalDensityFilterNames.OPEN.value),
134
+ ExposureConditions(1.0, AllowableOpticalDensityFilterNames.OPEN.value),
135
+ ExposureConditions(0.01, AllowableOpticalDensityFilterNames.OPEN.value),
136
+ )
137
+ CI_NON_DARK_AND_NON_POLCAL_AND_NON_LAMP_GAIN_TASK_EXPOSURE_CONDITIONS_LIST: tuple[
138
+ ExposureConditions, ...
139
+ ] = (
133
140
  ExposureConditions(100.0, AllowableOpticalDensityFilterNames.OPEN.value),
134
141
  ExposureConditions(1.0, AllowableOpticalDensityFilterNames.OPEN.value),
135
142
  ExposureConditions(0.01, AllowableOpticalDensityFilterNames.OPEN.value),
@@ -34,7 +34,7 @@ def sp_dark_calibration_task(
34
34
  200.0, AllowableOpticalDensityFilterNames.NONE.value
35
35
  )
36
36
  constants_db = CryonirspConstantsDb(
37
- NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
37
+ SP_NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
38
38
  ARM_ID="SP",
39
39
  )
40
40
  init_cryonirsp_constants_db(recipe_run_id, constants_db)
@@ -120,7 +120,7 @@ def ci_dark_calibration_task(
120
120
  )
121
121
 
122
122
  constants_db = CryonirspConstantsDb(
123
- NON_DARK_AND_NON_POLCAL_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
123
+ CI_NON_DARK_AND_NON_POLCAL_AND_NON_LAMP_GAIN_TASK_EXPOSURE_CONDITIONS_LIST=exposure_conditions,
124
124
  ARM_ID="CI",
125
125
  )
126
126
  init_cryonirsp_constants_db(recipe_run_id, constants_db)
@@ -664,8 +664,11 @@ def test_parse_cryonirsp_linearized_incomplete_final_map(
664
664
  num_modstates = 2
665
665
  num_sub_repeats = 2
666
666
 
667
- # Needed so the dark picky bud is happy
667
+ # Needed so the picky buds are happy
668
668
  write_dark_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
669
+ write_solar_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
670
+ if arm_id == "SP":
671
+ write_lamp_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
669
672
 
670
673
  # Needed so the pol checking buds are happy
671
674
  write_polcal_frames_to_task(
@@ -884,8 +887,11 @@ def test_parse_cryonirsp_linearized_incomplete_raster_scan(
884
887
  translated_header["CNNUMSCN"] = num_scan_steps
885
888
  return translated_header
886
889
 
887
- # Needed so the dark picky bud is happy
890
+ # Needed so the picky buds are happy
888
891
  write_dark_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
892
+ write_solar_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
893
+ if arm_id == "SP":
894
+ write_lamp_gain_frames_to_task(task, exposure_condition=exp_cond, tags=lin_tag)
889
895
 
890
896
  # Needed so the pol checking buds are happy
891
897
  write_polcal_frames_to_task(
@@ -1219,10 +1225,10 @@ def test_parse_cryonirsp_linearized_data_constants(
1219
1225
  assert sorted(task.constants._db_dict["DARK_FRAME_EXPOSURE_CONDITIONS_LIST"]) == sorted(
1220
1226
  [json.loads(json.dumps(condition)) for condition in dark_exp_conditions]
1221
1227
  )
1222
-
1223
- assert task.constants._db_dict["LAMP_GAIN_EXPOSURE_CONDITIONS_LIST"] == [
1224
- json.loads(json.dumps(lamp_exp_cond))
1225
- ]
1228
+ if arm_id == "SP":
1229
+ assert task.constants._db_dict["LAMP_GAIN_EXPOSURE_CONDITIONS_LIST"] == [
1230
+ json.loads(json.dumps(lamp_exp_cond))
1231
+ ]
1226
1232
  assert task.constants._db_dict["SOLAR_GAIN_EXPOSURE_CONDITIONS_LIST"] == [
1227
1233
  json.loads(json.dumps(solar_exp_cond))
1228
1234
  ]
@@ -1326,6 +1332,9 @@ def test_parse_cryonirsp_not_polarimetric_obs(parse_linearized_task, arm_id):
1326
1332
 
1327
1333
  for condition in dark_exp_conditions:
1328
1334
  write_dark_frames_to_task(task, exposure_condition=condition, tags=lin_tag)
1335
+ write_solar_gain_frames_to_task(task, exposure_condition=condition, tags=lin_tag)
1336
+ if arm_id == "SP":
1337
+ write_lamp_gain_frames_to_task(task, exposure_condition=condition, tags=lin_tag)
1329
1338
 
1330
1339
  write_polcal_frames_to_task(
1331
1340
  task,
@@ -1464,11 +1473,11 @@ def test_missing_solar_gain_frames(parse_linearized_task, arm_id):
1464
1473
  num_modstates=1,
1465
1474
  )
1466
1475
 
1467
- with pytest.raises(ValueError, match="Solar gain frames not found."):
1476
+ with pytest.raises(ValueError, match="solar_gain frames not found."):
1468
1477
  task()
1469
1478
 
1470
1479
 
1471
- @pytest.mark.parametrize("arm_id", ["CI", "SP"])
1480
+ @pytest.mark.parametrize("arm_id", ["SP"])
1472
1481
  def test_missing_lamp_gain_frames(parse_linearized_task, arm_id):
1473
1482
  """
1474
1483
  Given: A dataset missing lamp gain frames
@@ -1493,5 +1502,5 @@ def test_missing_lamp_gain_frames(parse_linearized_task, arm_id):
1493
1502
  num_modstates=1,
1494
1503
  )
1495
1504
 
1496
- with pytest.raises(ValueError, match="Lamp gain frames not found."):
1505
+ with pytest.raises(ValueError, match="lamp_gain frames not found."):
1497
1506
  task()
@@ -47,8 +47,7 @@ l0_pipeline.add_node(task=ParseL0CryonirspCILinearizedData, upstreams=LinearityC
47
47
  l0_pipeline.add_node(task=BadPixelMapCalibration, upstreams=ParseL0CryonirspCILinearizedData)
48
48
  l0_pipeline.add_node(task=CIBeamBoundariesCalibration, upstreams=BadPixelMapCalibration)
49
49
  l0_pipeline.add_node(task=DarkCalibration, upstreams=CIBeamBoundariesCalibration)
50
- l0_pipeline.add_node(task=LampGainCalibration, upstreams=DarkCalibration)
51
- l0_pipeline.add_node(task=CISolarGainCalibration, upstreams=LampGainCalibration)
50
+ l0_pipeline.add_node(task=CISolarGainCalibration, upstreams=DarkCalibration)
52
51
  l0_pipeline.add_node(task=CIInstrumentPolarizationCalibration, upstreams=CISolarGainCalibration)
53
52
  l0_pipeline.add_node(task=CIScienceCalibration, upstreams=CIInstrumentPolarizationCalibration)
54
53
  l0_pipeline.add_node(task=CIWriteL1Frame, upstreams=CIScienceCalibration)
@@ -63,8 +63,7 @@ full_trial_ci_pipeline.add_node(
63
63
  )
64
64
  full_trial_ci_pipeline.add_node(task=CIBeamBoundariesCalibration, upstreams=BadPixelMapCalibration)
65
65
  full_trial_ci_pipeline.add_node(task=DarkCalibration, upstreams=CIBeamBoundariesCalibration)
66
- full_trial_ci_pipeline.add_node(task=LampGainCalibration, upstreams=DarkCalibration)
67
- full_trial_ci_pipeline.add_node(task=CISolarGainCalibration, upstreams=LampGainCalibration)
66
+ full_trial_ci_pipeline.add_node(task=CISolarGainCalibration, upstreams=DarkCalibration)
68
67
  full_trial_ci_pipeline.add_node(
69
68
  task=CIInstrumentPolarizationCalibration, upstreams=CISolarGainCalibration
70
69
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dkist-processing-cryonirsp
3
- Version: 1.4.12
3
+ Version: 1.4.14
4
4
  Summary: Science processing code for the Cryo-NIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -17,7 +17,7 @@ Requires-Dist: Pillow==10.3.0
17
17
  Requires-Dist: astropy==6.1.0
18
18
  Requires-Dist: dkist-fits-specifications==4.10.0
19
19
  Requires-Dist: dkist-header-validator==5.1.1
20
- Requires-Dist: dkist-processing-common==10.5.8
20
+ Requires-Dist: dkist-processing-common==10.5.9
21
21
  Requires-Dist: dkist-processing-math==2.1.2
22
22
  Requires-Dist: dkist-processing-pac==3.1.1
23
23
  Requires-Dist: dkist-spectral-lines==3.0.0
@@ -48,7 +48,7 @@ Provides-Extra: asdf
48
48
  Requires-Dist: dkist-processing-common[asdf]; extra == "asdf"
49
49
  Requires-Dist: dkist-inventory[asdf]==1.5.0; extra == "asdf"
50
50
  Provides-Extra: quality
51
- Requires-Dist: dkist-quality==1.2.0; extra == "quality"
51
+ Requires-Dist: dkist-quality==1.2.1; extra == "quality"
52
52
  Provides-Extra: grogu
53
53
  Requires-Dist: dkist; extra == "grogu"
54
54
  Requires-Dist: pyparsing; extra == "grogu"
@@ -2,16 +2,16 @@ changelog/.gitempty,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  dkist_processing_cryonirsp/__init__.py,sha256=Z6-kB7fXXUI-F7Vz1HnEaja2h8qgH9IZExRl1lUxvZg,350
3
3
  dkist_processing_cryonirsp/config.py,sha256=xNkUNJ1BeBxJX881mTCIEbirZlD5_5txpV1QqkbfRM0,507
4
4
  dkist_processing_cryonirsp/models/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZpHRxF_ZAxuaKYL7o,12
5
- dkist_processing_cryonirsp/models/constants.py,sha256=qjXu7iaA-8cw5wZF-EaudWrDb8WDt3ALmRkX0lzBm7g,9629
5
+ dkist_processing_cryonirsp/models/constants.py,sha256=p0HTXr994UHUrDRf3o-S5lb2ic7K2TRrHWl-hTWJUlA,10650
6
6
  dkist_processing_cryonirsp/models/exposure_conditions.py,sha256=slFq5-Qz4fRpJKDBabbm4evPWLQVYmT-Uf9rk7nI734,813
7
7
  dkist_processing_cryonirsp/models/parameters.py,sha256=oAB_68AY2HdxK8IkvzisPKDI-c2agZeKiE5VIkHkkRI,13422
8
8
  dkist_processing_cryonirsp/models/tags.py,sha256=1Q2ag0ud9gx3su-XUqa--gwSnf5di7CGnlkyiEFreRs,4388
9
9
  dkist_processing_cryonirsp/models/task_name.py,sha256=xK4AKwgOx2uANbjhr0Q5Q3R9iPxLfkVKxWYY8wWjKhE,439
10
10
  dkist_processing_cryonirsp/parsers/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZpHRxF_ZAxuaKYL7o,12
11
- dkist_processing_cryonirsp/parsers/check_for_gains.py,sha256=z5DZ4b4gQILb2mv1SowVulpiVGBZPYZNFsM6i6PjM24,2021
11
+ dkist_processing_cryonirsp/parsers/check_for_gains.py,sha256=v-eD1LG0dlFoZXz5Y-2ZyPvRL2TZ8gWfr5cN6YNYqvo,2341
12
12
  dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py,sha256=iu5GJWVQ1PZfv5TR0u_IS2j2KZBU0yewa1ugxjDfVzk,4568
13
13
  dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py,sha256=sc8MzxYMc8E1eFrL5KguAGHViCMJhaDfiBtZPml4ELg,886
14
- dkist_processing_cryonirsp/parsers/exposure_conditions.py,sha256=Xj466IJyaMXUCudrdTOUFmjsOr_CYENI7BegwwmEjoA,6098
14
+ dkist_processing_cryonirsp/parsers/exposure_conditions.py,sha256=6bScBlUECw6WFNCfPFSXoBCmi1UI8vZvOfjdDUFm04E,8339
15
15
  dkist_processing_cryonirsp/parsers/map_repeats.py,sha256=PjZ986bqkCdii-EOzU045cWqadxQC_nyyqwWYIpYdls,1566
16
16
  dkist_processing_cryonirsp/parsers/measurements.py,sha256=6IqqrVbXVnUxYUXnQF-WlJSEP-eSffr2Gx6Kj0bjxhc,1872
17
17
  dkist_processing_cryonirsp/parsers/modstates.py,sha256=00a4kCiwgioTpMkYY9ouFuiEsoQHcD-sJOM95qI9Fhc,1093
@@ -27,13 +27,13 @@ dkist_processing_cryonirsp/tasks/beam_boundaries_base.py,sha256=N3zk08sRcczoNGIq
27
27
  dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py,sha256=N-LDXCzI0JJLvhTM69W0zW6moAPaVzl96h41RTn0wNE,1893
28
28
  dkist_processing_cryonirsp/tasks/ci_science.py,sha256=Qa-qSx_TxtXzGGjgN73TDbO1kqxBNlkt2zaBBB43erM,6693
29
29
  dkist_processing_cryonirsp/tasks/cryonirsp_base.py,sha256=rVy7vV4il0_B5KXenmCYEcYLNaIQ8_MDiKKn8X6v8yw,2168
30
- dkist_processing_cryonirsp/tasks/dark.py,sha256=tKzbQoVMe-NdETxY2VIwBxMXCuc1afCTpxpbKiKPf8I,3864
30
+ dkist_processing_cryonirsp/tasks/dark.py,sha256=RAIejLZFYwJcXjrpGlLRnW42xsD5EGjxyHdXvsBUztw,4127
31
31
  dkist_processing_cryonirsp/tasks/gain.py,sha256=adrYXgCg0gmDsiczFhyU8kBQsVXj15IEfGrRE2TqVdw,8537
32
32
  dkist_processing_cryonirsp/tasks/instrument_polarization.py,sha256=uaQWIcQkw61azIA8J1GaRHegFrpZmjWT4wER3iaRmWE,19526
33
33
  dkist_processing_cryonirsp/tasks/l1_output_data.py,sha256=FdL_Dv-YTLgT-xH_uOOUjk4GUYMjbaSDPIg1rIQu_iY,1621
34
34
  dkist_processing_cryonirsp/tasks/linearity_correction.py,sha256=-R0iBJDNF9o57GUd5C8YlOL6wyVUzKf5rSDFgu0kpgA,24310
35
35
  dkist_processing_cryonirsp/tasks/make_movie_frames.py,sha256=Ql_bg1r1W1m-tTOParAdkllFJEJFdNoE16GgHyhDgdw,13900
36
- dkist_processing_cryonirsp/tasks/parse.py,sha256=MeqdHk1pb5dBlYQBlJrH3qXm9vzJ7d6nV-eh2cMDJqs,12452
36
+ dkist_processing_cryonirsp/tasks/parse.py,sha256=tDOC2_r8xw0RYBxe3b3Te18Y5dBnRrPtikJmuhmwT88,13117
37
37
  dkist_processing_cryonirsp/tasks/quality_metrics.py,sha256=r4mS1Qp88tHlbNKsqed-MOsFT_6Zbhr5H8-4hrx9OGw,11424
38
38
  dkist_processing_cryonirsp/tasks/science_base.py,sha256=-BjPNPI5jjiBR7K8p_9fa4vYCEUEdOFx7c2AC5EmFoE,17619
39
39
  dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py,sha256=3bdj6W2H_UiOhmj2xHvADwOzojteLsTL9RkTwvzB6_M,10300
@@ -49,7 +49,7 @@ dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py,sha256=fFeIvuA4AtkQ
49
49
  dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py,sha256=oyiMA_rzBUYtlmh1ilfE5DkuIe4FFiyptaYjcU8-joA,10176
50
50
  dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py,sha256=7ToSy9uOJ_JrFfd-X225wqW_laq4xoRJkBiAPanfb_g,11225
51
51
  dkist_processing_cryonirsp/tests/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZpHRxF_ZAxuaKYL7o,12
52
- dkist_processing_cryonirsp/tests/conftest.py,sha256=QZSEWZvgmWsqv2310AInV4m6NqweNJYJt-HNWgec-B4,17104
52
+ dkist_processing_cryonirsp/tests/conftest.py,sha256=_yAXaaaiyw4iQOGETN2sgelJsf1_AwjicXv1e1oqdqw,17485
53
53
  dkist_processing_cryonirsp/tests/header_models.py,sha256=Ny4h5lS54bGRPDo4nOzvJgNWMzFY9DDs1IQorr_r3s8,20591
54
54
  dkist_processing_cryonirsp/tests/test_assemble_movie.py,sha256=YNZINIFXR9kZBlE1AIvjlVmwwhZJeVYOOPk7Q8IVkcI,6222
55
55
  dkist_processing_cryonirsp/tests/test_assemble_qualilty.py,sha256=upk-oUqVBHGK3F0eemshLpAPrnfh9mbeuZXow4E1Rmc,16859
@@ -59,13 +59,13 @@ dkist_processing_cryonirsp/tests/test_ci_science.py,sha256=GdzUR5csW2uoJBc_y5gYE
59
59
  dkist_processing_cryonirsp/tests/test_corrections.py,sha256=5nY8MccZcNDyQYV8IEokqtY_YrP08TZ-H7WQNioK-A0,4650
60
60
  dkist_processing_cryonirsp/tests/test_cryo_base.py,sha256=lF27S1aBmMc5wRWNPKjkXZTyGDPvLo59IubYAb1McsU,7172
61
61
  dkist_processing_cryonirsp/tests/test_cryo_constants.py,sha256=VbjM1vZYRa_057yK_aP2ta6JyT7Ob1ou4SbGEVIIKH0,2715
62
- dkist_processing_cryonirsp/tests/test_dark.py,sha256=n1DYuzM4iFOSHsC8GxAeQcQItj2mFH9WkUT0KZDyM2A,11953
62
+ dkist_processing_cryonirsp/tests/test_dark.py,sha256=wUeRG0Gw_oQ6HxKa7nozLJA_nwKZQB0nDKnpobf5Ksw,11977
63
63
  dkist_processing_cryonirsp/tests/test_gain.py,sha256=YUgcGFh325TZBT9BbkzlkbapVJL4skTE1FVhsFNhUc8,10854
64
64
  dkist_processing_cryonirsp/tests/test_instrument_polarization.py,sha256=GgZmPJVtsEploGFEZsddwXAh9QtnoOUdywEPdkT_l-s,19276
65
65
  dkist_processing_cryonirsp/tests/test_linearity_correction.py,sha256=y9gDWlHsOaTMP7K5-lIIVmboa6nd0ozaqEtl6Fvt5T0,9406
66
66
  dkist_processing_cryonirsp/tests/test_make_movie_frames.py,sha256=WznHp9dV2-jbJYzRniCAIbSHCGNc0SpSzyVDSrZkYd4,4904
67
67
  dkist_processing_cryonirsp/tests/test_parameters.py,sha256=CbaEnxx3HGZmqZJbNzQ2IJpIg6AKlK26BT3TXUMGYAE,11438
68
- dkist_processing_cryonirsp/tests/test_parse.py,sha256=PsTco2G1_APKEPeSpqpYfsIkNXSM_GtY_jbgkNtj8r8,53539
68
+ dkist_processing_cryonirsp/tests/test_parse.py,sha256=FErtlMvrf1MhZxIvcWnLKjRtZ5ihS56wTeMuPiqH7HA,54163
69
69
  dkist_processing_cryonirsp/tests/test_quality.py,sha256=DWuL7q8x2RtPz3LN9-KEw541sv6Law9WyVQKaamkOmE,8169
70
70
  dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py,sha256=4hONuVLQAqkQjNtpNzvmqEWLg3LI1XJLWaekkeS3SJo,4815
71
71
  dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py,sha256=lhwT_I0HQuH66I0TRvARfuNnWWjxeAvQ4fEEVmbhp_E,6098
@@ -82,9 +82,9 @@ dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py,sha256=f00YZl
82
82
  dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py,sha256=kl9yrE1EbgxNn__x4q0WYoZIvS8zefcOPbQQdxB4_ZE,3280
83
83
  dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py,sha256=14XonDUbMWh6n1AwtPaDLCeSvoHCzn-MNHCkHLB4VUc,19330
84
84
  dkist_processing_cryonirsp/workflows/__init__.py,sha256=iEbV3oiKmkfmdZjeNJxqw08IIZnYSroq-2b-ARpkLFQ,112
85
- dkist_processing_cryonirsp/workflows/ci_l0_processing.py,sha256=6yw_mn8mxZ551ubJSHUyWd8l_Nwx1uL6yW1y_qBL5a8,3866
85
+ dkist_processing_cryonirsp/workflows/ci_l0_processing.py,sha256=T-BOvDDWHzs5BDH5ctSBjzGgD6Xez52AnDXsH5_7Bms,3788
86
86
  dkist_processing_cryonirsp/workflows/sp_l0_processing.py,sha256=A74av8E8mL9WzI4vWI2GbhVrRFQ7JCMlGAioEjXkkCU,4219
87
- dkist_processing_cryonirsp/workflows/trial_workflows.py,sha256=x7odG41cz6a2Em0PQIDh3k1RaCl-pR0WC2-v6o2M9FE,8177
87
+ dkist_processing_cryonirsp/workflows/trial_workflows.py,sha256=UvSvsho6gYWliJ_sRN_uYbt5jBdA68hVyLiyr6X5QTo,8088
88
88
  docs/Makefile,sha256=qnlVz6PuBqE39NfHWuUnHhNEA-EFgT2-WJNNNy9ttfk,4598
89
89
  docs/bad_pixel_calibration.rst,sha256=bHRclUItBA1QbGlek36B1yN5WHN53WkfjKUvZaq_j2I,2452
90
90
  docs/beam_angle_calculation.rst,sha256=-yUPFRl6SbPBIj-wOwylEymQDMQnkay7kAIAiubpQT8,2941
@@ -105,7 +105,7 @@ docs/requirements_table.rst,sha256=FaqSag9kPi77gWPhzeo_tFEhRFjb3qUuNqqQe1K76NM,2
105
105
  docs/scientific_changelog.rst,sha256=01AWBSHg8zElnodCgAq-hMxhk9CkX5rtEENx4iz0sjI,300
106
106
  docs/sp_science_calibration.rst,sha256=fHBOZ2cqySxLjNi737KfynlmHZy9W4EwvuzxnyjDNvk,2597
107
107
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
108
- dkist_processing_cryonirsp-1.4.12.dist-info/METADATA,sha256=YmvnDGYliANbqB7v2tPOIQMiPlgcabXAcqZTHpgqMuU,8410
109
- dkist_processing_cryonirsp-1.4.12.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
110
- dkist_processing_cryonirsp-1.4.12.dist-info/top_level.txt,sha256=Sm9b1ddKnsF9Bh3mqDOct1Sm7k8I9aN7vGHgpmu-MlQ,51
111
- dkist_processing_cryonirsp-1.4.12.dist-info/RECORD,,
108
+ dkist_processing_cryonirsp-1.4.14.dist-info/METADATA,sha256=ZOIC7J8e7aV2UqLbhLD3cS4ieguXVPnsCn0G14e2T7s,8410
109
+ dkist_processing_cryonirsp-1.4.14.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
110
+ dkist_processing_cryonirsp-1.4.14.dist-info/top_level.txt,sha256=Sm9b1ddKnsF9Bh3mqDOct1Sm7k8I9aN7vGHgpmu-MlQ,51
111
+ dkist_processing_cryonirsp-1.4.14.dist-info/RECORD,,