dkist-processing-cryonirsp 1.4.2__py3-none-any.whl → 1.4.4__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.

@@ -46,6 +46,7 @@ class CryonirspBudName(Enum):
46
46
  roi_1_size_y = "ROI_1_SIZE_Y"
47
47
  optical_density_filter_picky_bud = "OPTICAL_DENSITY_FILTER_PICKY_BUD"
48
48
  solar_gain_ip_start_time = "SOLAR_GAIN_IP_START_TIME"
49
+ gain_frame_type_list = "GAIN_FRAME_TYPE_LIST"
49
50
 
50
51
 
51
52
  class CryonirspConstants(ConstantsBase):
@@ -124,6 +125,11 @@ class CryonirspConstants(ConstantsBase):
124
125
  """Construct a sorted tuple of all the dateobs for this dataset."""
125
126
  return self._db_dict[CryonirspBudName.time_obs_list.value]
126
127
 
128
+ @property
129
+ def gain_frame_type_list(self) -> list[str]:
130
+ """Construct a list of all the types of gain frames for this dataset."""
131
+ return self._db_dict[CryonirspBudName.gain_frame_type_list.value]
132
+
127
133
  @property
128
134
  def exposure_conditions_list(self) -> [ExposureConditions]:
129
135
  """Construct a list of ExposureConditions tuples for the dataset."""
@@ -0,0 +1,58 @@
1
+ """Pickybud to check for lamp gain and solar gain frames."""
2
+ from typing import Hashable
3
+ from typing import Type
4
+
5
+ from dkist_processing_common.models.flower_pot import SpilledDirt
6
+ from dkist_processing_common.models.flower_pot import Stem
7
+ from dkist_processing_common.models.flower_pot import Thorn
8
+ from dkist_processing_common.models.task_name import TaskName
9
+ from dkist_processing_common.parsers.task import parse_header_ip_task_with_gains
10
+
11
+ from dkist_processing_cryonirsp.models.constants import CryonirspBudName
12
+ from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
13
+
14
+
15
+ class CheckGainFramesPickyBud(Stem):
16
+ """Pickybud to check for lamp gain and solar gain frames."""
17
+
18
+ def __init__(self):
19
+ super().__init__(stem_name=CryonirspBudName.gain_frame_type_list.value)
20
+
21
+ def setter(self, fits_obj: CryonirspL0FitsAccess) -> Type[SpilledDirt] | str:
22
+ """
23
+ Set the calibration frame type for this fits object.
24
+
25
+ Parameters
26
+ ----------
27
+ fits_obj
28
+ The input fits object
29
+ Returns
30
+ -------
31
+ The calibration frame object associated with this fits object
32
+ """
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
38
+
39
+ def getter(self, key: Hashable) -> Thorn:
40
+ """
41
+ Check that lamp and solar gain frames exist. If they do, return a Thorn.
42
+
43
+ Parameters
44
+ ----------
45
+ key
46
+ The input key
47
+
48
+ Returns
49
+ -------
50
+ Thorn
51
+ """
52
+ gain_task_types = list(self.key_to_petal_dict.values())
53
+
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.")
58
+ return Thorn
@@ -25,6 +25,7 @@ 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
29
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspL0FitsAccess
29
30
  from dkist_processing_cryonirsp.parsers.cryonirsp_l0_fits_access import CryonirspRampFitsAccess
30
31
  from dkist_processing_cryonirsp.parsers.exposure_conditions import (
@@ -179,6 +180,7 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
179
180
  NumberOfScanStepsBud(),
180
181
  NumberOfMeasurementsBud(),
181
182
  CryonirspSolarGainStartTimeBud(),
183
+ CheckGainFramesPickyBud(),
182
184
  NumCSStepBud(self.parameters.max_cs_step_time_sec),
183
185
  CryonirspTaskExposureConditionsBud(
184
186
  stem_name=CryonirspBudName.dark_frame_exposure_conditions_list.value,
@@ -72,7 +72,7 @@ def generate_214_l1_fits_frame(
72
72
  ) -> fits.HDUList:
73
73
  """Convert S122 header into 214 L1 only.
74
74
 
75
- This does NOT include populating all L1 headers, just removing 214 L0 only headers
75
+ This does NOT include populating all L1 headers, just removing 214 L0 only headers.
76
76
 
77
77
  NOTE: The stuff you care about will be in hdulist[1]
78
78
  """
@@ -1437,3 +1437,61 @@ def test_polarimetric_checking_unique_bud(dummy_fits_obj):
1437
1437
  Bud.update("key1", nonpol_obs_frame2)
1438
1438
  Bud.update("key2", pol_frame2)
1439
1439
  assert Bud.getter("key1") == "Bad"
1440
+
1441
+
1442
+ @pytest.mark.parametrize("arm_id", ["CI", "SP"])
1443
+ def test_missing_solar_gain_frames(parse_linearized_task, arm_id):
1444
+ """
1445
+ Given: A dataset missing solar gain frames
1446
+ When: Parsing
1447
+ Then: The 'CheckGainFramesPickyBud' raises an error
1448
+ """
1449
+ task = parse_linearized_task
1450
+
1451
+ lin_tag = [CryonirspTag.linearized()]
1452
+ gain_exposure_condition = ExposureConditions(
1453
+ 10.0, AllowableOpticalDensityFilterNames.OPEN.value
1454
+ )
1455
+ dark_exp_condition = ExposureConditions(10.0, AllowableOpticalDensityFilterNames.OPEN.value)
1456
+
1457
+ # Needed so the dark picky bud is happy
1458
+ write_dark_frames_to_task(task, exposure_condition=dark_exp_condition, tags=lin_tag)
1459
+
1460
+ write_lamp_gain_frames_to_task(
1461
+ task,
1462
+ tags=lin_tag,
1463
+ exposure_condition=gain_exposure_condition,
1464
+ num_modstates=1,
1465
+ )
1466
+
1467
+ with pytest.raises(ValueError, match="Solar gain frames not found."):
1468
+ task()
1469
+
1470
+
1471
+ @pytest.mark.parametrize("arm_id", ["CI", "SP"])
1472
+ def test_missing_lamp_gain_frames(parse_linearized_task, arm_id):
1473
+ """
1474
+ Given: A dataset missing lamp gain frames
1475
+ When: Parsing
1476
+ Then: The 'CheckGainFramesPickyBud' raises an error
1477
+ """
1478
+ task = parse_linearized_task
1479
+
1480
+ lin_tag = [CryonirspTag.linearized()]
1481
+ gain_exposure_condition = ExposureConditions(
1482
+ 10.0, AllowableOpticalDensityFilterNames.OPEN.value
1483
+ )
1484
+ dark_exp_condition = ExposureConditions(10.0, AllowableOpticalDensityFilterNames.OPEN.value)
1485
+
1486
+ # Needed so the dark picky bud is happy
1487
+ write_dark_frames_to_task(task, exposure_condition=dark_exp_condition, tags=lin_tag)
1488
+
1489
+ write_solar_gain_frames_to_task(
1490
+ task,
1491
+ tags=lin_tag,
1492
+ exposure_condition=gain_exposure_condition,
1493
+ num_modstates=1,
1494
+ )
1495
+
1496
+ with pytest.raises(ValueError, match="Lamp gain frames not found."):
1497
+ task()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dkist-processing-cryonirsp
3
- Version: 1.4.2
3
+ Version: 1.4.4
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.7.0
19
19
  Requires-Dist: dkist-header-validator==5.1.1
20
- Requires-Dist: dkist-processing-common==10.5.1
20
+ Requires-Dist: dkist-processing-common==10.5.2
21
21
  Requires-Dist: dkist-processing-math==2.1.1
22
22
  Requires-Dist: dkist-processing-pac==3.1.0
23
23
  Requires-Dist: dkist-spectral-lines==3.0.0
@@ -43,16 +43,16 @@ Requires-Dist: dkist-processing-cryonirsp[asdf]; extra == "test"
43
43
  Requires-Dist: dkist-processing-cryonirsp[quality]; extra == "test"
44
44
  Provides-Extra: inventory
45
45
  Requires-Dist: dkist-processing-common[inventory]; extra == "inventory"
46
- Requires-Dist: dkist-inventory==1.4.2; extra == "inventory"
46
+ Requires-Dist: dkist-inventory==1.4.3; extra == "inventory"
47
47
  Provides-Extra: asdf
48
48
  Requires-Dist: dkist-processing-common[asdf]; extra == "asdf"
49
- Requires-Dist: dkist-inventory[asdf]==1.4.2; extra == "asdf"
49
+ Requires-Dist: dkist-inventory[asdf]==1.4.3; extra == "asdf"
50
50
  Provides-Extra: quality
51
51
  Requires-Dist: dkist-quality==1.1.1; extra == "quality"
52
52
  Provides-Extra: grogu
53
53
  Requires-Dist: dkist; extra == "grogu"
54
54
  Requires-Dist: pyparsing; extra == "grogu"
55
- Requires-Dist: dkist-inventory>=1.4.2; extra == "grogu"
55
+ Requires-Dist: dkist-inventory>=1.4.3; extra == "grogu"
56
56
  Provides-Extra: docs
57
57
  Requires-Dist: sphinx; extra == "docs"
58
58
  Requires-Dist: sphinx-astropy; extra == "docs"
@@ -2,12 +2,13 @@ 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=1R3rWj__ay6lHZJpXBaSdfSozmi7K6ceU2U9PkdIJwc,9360
5
+ dkist_processing_cryonirsp/models/constants.py,sha256=qjXu7iaA-8cw5wZF-EaudWrDb8WDt3ALmRkX0lzBm7g,9629
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
12
  dkist_processing_cryonirsp/parsers/cryonirsp_l0_fits_access.py,sha256=e4vDjsG5ye6N8cSg6WCJDHmlGAgM_2w1DRpp_KSddJw,4453
12
13
  dkist_processing_cryonirsp/parsers/cryonirsp_l1_fits_access.py,sha256=sc8MzxYMc8E1eFrL5KguAGHViCMJhaDfiBtZPml4ELg,886
13
14
  dkist_processing_cryonirsp/parsers/exposure_conditions.py,sha256=Xj466IJyaMXUCudrdTOUFmjsOr_CYENI7BegwwmEjoA,6098
@@ -32,7 +33,7 @@ dkist_processing_cryonirsp/tasks/instrument_polarization.py,sha256=uaQWIcQkw61az
32
33
  dkist_processing_cryonirsp/tasks/l1_output_data.py,sha256=FdL_Dv-YTLgT-xH_uOOUjk4GUYMjbaSDPIg1rIQu_iY,1621
33
34
  dkist_processing_cryonirsp/tasks/linearity_correction.py,sha256=-R0iBJDNF9o57GUd5C8YlOL6wyVUzKf5rSDFgu0kpgA,24310
34
35
  dkist_processing_cryonirsp/tasks/make_movie_frames.py,sha256=Ql_bg1r1W1m-tTOParAdkllFJEJFdNoE16GgHyhDgdw,13900
35
- dkist_processing_cryonirsp/tasks/parse.py,sha256=4qHU_Zy0gfoRBDY94jZhkRqKXwz-QPM42eUY9Db7e5Y,12326
36
+ dkist_processing_cryonirsp/tasks/parse.py,sha256=MeqdHk1pb5dBlYQBlJrH3qXm9vzJ7d6nV-eh2cMDJqs,12452
36
37
  dkist_processing_cryonirsp/tasks/quality_metrics.py,sha256=r4mS1Qp88tHlbNKsqed-MOsFT_6Zbhr5H8-4hrx9OGw,11424
37
38
  dkist_processing_cryonirsp/tasks/science_base.py,sha256=-BjPNPI5jjiBR7K8p_9fa4vYCEUEdOFx7c2AC5EmFoE,17619
38
39
  dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py,sha256=3bdj6W2H_UiOhmj2xHvADwOzojteLsTL9RkTwvzB6_M,10300
@@ -48,7 +49,7 @@ dkist_processing_cryonirsp/tasks/mixin/intermediate_frame.py,sha256=fFeIvuA4AtkQ
48
49
  dkist_processing_cryonirsp/tasks/mixin/linearized_frame.py,sha256=oyiMA_rzBUYtlmh1ilfE5DkuIe4FFiyptaYjcU8-joA,10176
49
50
  dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py,sha256=7ToSy9uOJ_JrFfd-X225wqW_laq4xoRJkBiAPanfb_g,11225
50
51
  dkist_processing_cryonirsp/tests/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZpHRxF_ZAxuaKYL7o,12
51
- dkist_processing_cryonirsp/tests/conftest.py,sha256=SiE_QHRy5IQ5SNOjBYdm9OhZBFqCB7Lx_FrTELqYS4M,17103
52
+ dkist_processing_cryonirsp/tests/conftest.py,sha256=QZSEWZvgmWsqv2310AInV4m6NqweNJYJt-HNWgec-B4,17104
52
53
  dkist_processing_cryonirsp/tests/header_models.py,sha256=Ny4h5lS54bGRPDo4nOzvJgNWMzFY9DDs1IQorr_r3s8,20591
53
54
  dkist_processing_cryonirsp/tests/test_assemble_movie.py,sha256=YNZINIFXR9kZBlE1AIvjlVmwwhZJeVYOOPk7Q8IVkcI,6222
54
55
  dkist_processing_cryonirsp/tests/test_assemble_qualilty.py,sha256=upk-oUqVBHGK3F0eemshLpAPrnfh9mbeuZXow4E1Rmc,16859
@@ -64,7 +65,7 @@ dkist_processing_cryonirsp/tests/test_instrument_polarization.py,sha256=GgZmPJVt
64
65
  dkist_processing_cryonirsp/tests/test_linearity_correction.py,sha256=y9gDWlHsOaTMP7K5-lIIVmboa6nd0ozaqEtl6Fvt5T0,9406
65
66
  dkist_processing_cryonirsp/tests/test_make_movie_frames.py,sha256=WznHp9dV2-jbJYzRniCAIbSHCGNc0SpSzyVDSrZkYd4,4904
66
67
  dkist_processing_cryonirsp/tests/test_parameters.py,sha256=CbaEnxx3HGZmqZJbNzQ2IJpIg6AKlK26BT3TXUMGYAE,11438
67
- dkist_processing_cryonirsp/tests/test_parse.py,sha256=8SN3Dw3OE50nORZelRM7epznz6CGiNL0cPkziM4kVto,51693
68
+ dkist_processing_cryonirsp/tests/test_parse.py,sha256=PsTco2G1_APKEPeSpqpYfsIkNXSM_GtY_jbgkNtj8r8,53539
68
69
  dkist_processing_cryonirsp/tests/test_quality.py,sha256=DWuL7q8x2RtPz3LN9-KEw541sv6Law9WyVQKaamkOmE,8169
69
70
  dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py,sha256=4hONuVLQAqkQjNtpNzvmqEWLg3LI1XJLWaekkeS3SJo,4815
70
71
  dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py,sha256=lhwT_I0HQuH66I0TRvARfuNnWWjxeAvQ4fEEVmbhp_E,6098
@@ -103,7 +104,7 @@ docs/requirements_table.rst,sha256=FaqSag9kPi77gWPhzeo_tFEhRFjb3qUuNqqQe1K76NM,2
103
104
  docs/scientific_changelog.rst,sha256=01AWBSHg8zElnodCgAq-hMxhk9CkX5rtEENx4iz0sjI,300
104
105
  docs/sp_science_calibration.rst,sha256=fHBOZ2cqySxLjNi737KfynlmHZy9W4EwvuzxnyjDNvk,2597
105
106
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
106
- dkist_processing_cryonirsp-1.4.2.dist-info/METADATA,sha256=c1g9CAb5IDd2DsJKECGamb2hUtWT5OnI7ouoVbHaw6I,8403
107
- dkist_processing_cryonirsp-1.4.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
108
- dkist_processing_cryonirsp-1.4.2.dist-info/top_level.txt,sha256=Sm9b1ddKnsF9Bh3mqDOct1Sm7k8I9aN7vGHgpmu-MlQ,51
109
- dkist_processing_cryonirsp-1.4.2.dist-info/RECORD,,
107
+ dkist_processing_cryonirsp-1.4.4.dist-info/METADATA,sha256=p-j8AOqWDkXAdSPh4DWTIZD3--gI_heSvs6fgJetv8I,8403
108
+ dkist_processing_cryonirsp-1.4.4.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
109
+ dkist_processing_cryonirsp-1.4.4.dist-info/top_level.txt,sha256=Sm9b1ddKnsF9Bh3mqDOct1Sm7k8I9aN7vGHgpmu-MlQ,51
110
+ dkist_processing_cryonirsp-1.4.4.dist-info/RECORD,,