dkist-processing-visp 5.3.0rc6__py3-none-any.whl → 5.3.2__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.
@@ -23,7 +23,7 @@ class VispBudName(Enum):
23
23
  observe_readout_exp_times = "OBSERVE_READOUT_EXP_TIMES"
24
24
  polcal_exposure_times = "POLCAL_EXPOSURE_TIMES"
25
25
  polcal_readout_exp_times = "POLCAL_READOUT_EXP_TIMES"
26
- non_dark_task_readout_exp_times = "NON_DARK_TASK_READOUT_EXP_TIMES"
26
+ non_dark_or_polcal_readout_exp_times = "NON_DARK_OR_POLCAL_READOUT_EXP_TIMES"
27
27
  num_map_scans = "NUM_MAP_SCANS"
28
28
  incident_light_angle_deg = "INCIDENT_LIGHT_ANGLE_DEG"
29
29
  reflected_light_angle_deg = "REFLECTED_LIGHT_ANGLE_DEG"
@@ -134,14 +134,17 @@ class VispConstants(ConstantsBase):
134
134
  return []
135
135
 
136
136
  @property
137
- def non_dark_task_readout_exp_times(self) -> list[float]:
137
+ def non_dark_or_polcal_readout_exp_times(self) -> list[float]:
138
138
  """
139
139
  Find all readout exposure times that *need* to exist in a dark IP.
140
140
 
141
141
  Every non-dark task needs to be corrected with an average dark frame of the same readout exp time, which means
142
142
  we need DARK IP task frames for all of these readout exposure times.
143
+
144
+ We don't care about the readout exposure time of the POLCAL frames because they do their own dark correction from
145
+ the polcal Calibration Sequence.
143
146
  """
144
- return self._db_dict[VispBudName.non_dark_task_readout_exp_times.value]
147
+ return self._db_dict[VispBudName.non_dark_or_polcal_readout_exp_times.value]
145
148
 
146
149
  @property
147
150
  def observe_readout_exp_times(self) -> list[float]:
@@ -1,9 +1,13 @@
1
1
  """ViSP modulator state parser."""
2
2
 
3
3
  from dkist_processing_common.models.constants import BudName
4
- from dkist_processing_common.models.flower_pot import Stem
5
4
  from dkist_processing_common.models.tags import StemName
5
+ from dkist_processing_common.parsers.single_value_single_key_flower import (
6
+ SingleValueSingleKeyFlower,
7
+ )
8
+ from dkist_processing_common.parsers.unique_bud import UniqueBud
6
9
 
10
+ from dkist_processing_visp.models.fits_access import VispMetadataKey
7
11
  from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
8
12
 
9
13
 
@@ -13,15 +17,17 @@ class ObserveFrameError(BaseException):
13
17
  pass
14
18
 
15
19
 
16
- class NumberModulatorStatesBud(Stem):
20
+ class NumberModulatorStatesBud(UniqueBud):
17
21
  """Bud to check the number of modulator states."""
18
22
 
19
23
  def __init__(self):
20
- super().__init__(stem_name=BudName.num_modstates.value)
21
- self.polarimeter_mode = "polarimeter_mode"
22
- self.number_of_modulator_states = "number_of_modulator_states"
24
+ super().__init__(
25
+ constant_name=BudName.num_modstates.value,
26
+ metadata_key=VispMetadataKey.number_of_modulator_states,
27
+ )
28
+ self.polarimeter_mode_set = set()
23
29
 
24
- def setter(self, fits_obj: VispL0FitsAccess):
30
+ def setter(self, fits_obj: VispL0FitsAccess) -> int:
25
31
  """
26
32
  Set the value of the bud.
27
33
 
@@ -30,41 +36,34 @@ class NumberModulatorStatesBud(Stem):
30
36
  fits_obj:
31
37
  A single FitsAccess object
32
38
  """
33
- return getattr(fits_obj, self.number_of_modulator_states), getattr(
34
- fits_obj, self.polarimeter_mode
35
- )
39
+ pol_mode = getattr(fits_obj, VispMetadataKey.polarimeter_mode.name)
40
+ self.polarimeter_mode_set.add(pol_mode)
41
+ return super().setter(fits_obj)
36
42
 
37
- def getter(self, key):
43
+ def getter(self):
38
44
  """Get the value of the bud, checking for restrictions on polarimetric observe data."""
39
- values = self.key_to_petal_dict.values()
40
- num_modstates_set = set([v[0] for v in values])
41
- polmode_list = list(set([v[1] for v in values]))
42
-
43
- if "observe_intensity" in polmode_list:
45
+ if "observe_intensity" in self.polarimeter_mode_set:
44
46
  return 1
45
47
 
46
48
  # Polarimetric data must have the same number of modulator states in all frames
47
- if "observe_polarimetric" in polmode_list:
48
- if len(num_modstates_set) > 1:
49
- raise ValueError(
50
- f"Polarimetric data must all have the same number of modulator states. Found frames with modstates: {num_modstates_set}"
51
- )
52
- return num_modstates_set.pop()
49
+ if "observe_polarimetric" in self.polarimeter_mode_set:
50
+ return super().getter()
53
51
 
54
52
  raise ObserveFrameError(
55
53
  "No valid observe frames types were found in the headers of the data. Check the input data."
56
54
  )
57
55
 
58
56
 
59
- class ModulatorStateFlower(Stem):
57
+ class ModulatorStateFlower(SingleValueSingleKeyFlower):
60
58
  """Flower to find the ip task type."""
61
59
 
62
60
  def __init__(self):
63
- super().__init__(stem_name=StemName.modstate.value)
64
- self.modulator_state_key = "modulator_state"
65
- self.polarimeter_mode_key = "polarimeter_mode"
61
+ super().__init__(
62
+ tag_stem_name=StemName.modstate.value, metadata_key=VispMetadataKey.modulator_state
63
+ )
64
+ self.polarimeter_mode_set = set()
66
65
 
67
- def setter(self, fits_obj: VispL0FitsAccess):
66
+ def setter(self, fits_obj: VispL0FitsAccess) -> int:
68
67
  """
69
68
  Set value of the flower.
70
69
 
@@ -73,14 +72,12 @@ class ModulatorStateFlower(Stem):
73
72
  fits_obj:
74
73
  A single FitsAccess object
75
74
  """
76
- return getattr(fits_obj, self.polarimeter_mode_key), getattr(
77
- fits_obj, self.modulator_state_key
78
- )
75
+ pol_mode = getattr(fits_obj, VispMetadataKey.polarimeter_mode.name)
76
+ self.polarimeter_mode_set.add(pol_mode)
77
+ return super().setter(fits_obj)
79
78
 
80
79
  def getter(self, key: str) -> int:
81
80
  """Return the modulator state given in the header of each file unless it is in intensity mode - then return modulator state = 1 for everything."""
82
- values = self.key_to_petal_dict.values()
83
- obs_mode_set = set([v[0] for v in values])
84
- if "observe_intensity" in obs_mode_set:
81
+ if "observe_intensity" in self.polarimeter_mode_set:
85
82
  return 1
86
- return self.key_to_petal_dict[key][1]
83
+ return super().getter(key)
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import Type
4
4
 
5
+ from dkist_processing_common.models.flower_pot import SetStem
5
6
  from dkist_processing_common.models.flower_pot import SpilledDirt
6
- from dkist_processing_common.models.flower_pot import Stem
7
7
  from dkist_processing_common.models.task_name import TaskName
8
8
  from dkist_processing_common.parsers.single_value_single_key_flower import (
9
9
  SingleValueSingleKeyFlower,
@@ -15,14 +15,12 @@ from dkist_processing_visp.models.tags import VispStemName
15
15
  from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
16
16
 
17
17
 
18
- class TotalRasterStepsBud(Stem):
18
+ class TotalRasterStepsBud(SetStem):
19
19
  """Bud for finding the total number of raster steps."""
20
20
 
21
21
  def __init__(self):
22
22
  super().__init__(stem_name=VispBudName.num_raster_steps.value)
23
-
24
- self.total_num_key = "total_raster_steps"
25
- self.single_step_key = "raster_scan_step"
23
+ self.num_steps_set = set()
26
24
 
27
25
  def setter(self, fits_obj: VispL0FitsAccess) -> Type[SpilledDirt] | tuple[int, int]:
28
26
  """
@@ -36,29 +34,26 @@ class TotalRasterStepsBud(Stem):
36
34
  if fits_obj.ip_task_type.casefold() != TaskName.observe.value.casefold():
37
35
  return SpilledDirt
38
36
 
39
- num_raster = getattr(fits_obj, self.total_num_key)
40
- single_step = getattr(fits_obj, self.single_step_key)
37
+ num_raster = getattr(fits_obj, VispMetadataKey.total_raster_steps.name)
38
+ self.num_steps_set.add(num_raster)
39
+ single_step = getattr(fits_obj, VispMetadataKey.raster_scan_step.name)
41
40
 
42
- return num_raster, single_step
41
+ return single_step
43
42
 
44
- def getter(self, key) -> str | float | int:
43
+ def getter(self) -> int:
45
44
  """
46
45
  Getter and check for bud.
47
46
 
48
47
  Return value if only a single value was found in dataset. Error if multiple values were found or if the actual
49
48
  raster steps found do not form a complete set based on the number-of-raster-steps header key.
50
49
  """
51
- values = self.key_to_petal_dict.values()
52
- num_steps_set = set([v[0] for v in values])
53
-
54
- # This is copied from UniqueBud because we still want to check this
55
- if len(num_steps_set) > 1:
50
+ if len(self.num_steps_set) > 1:
56
51
  raise ValueError(
57
- f"Multiple {self.stem_name} values found for key {key}. Values: {num_steps_set}"
52
+ f"Found multiple values for total number of raster steps. Values: {self.num_steps_set}"
58
53
  )
59
54
 
60
55
  # Now check that all the steps we expect are present
61
- all_steps = sorted(list(set([v[1] for v in values])))
56
+ all_steps = sorted(self.value_set)
62
57
  if all_steps != list(range(0, max(all_steps) + 1)):
63
58
  raise ValueError(f"Not all sequential steps could be found. Found {all_steps}")
64
59
 
@@ -1,7 +1,7 @@
1
1
  """Buds for parsing the incident and reflected light angles of the ViSP spectrograph."""
2
2
 
3
+ from dkist_processing_common.models.flower_pot import SetStem
3
4
  from dkist_processing_common.models.flower_pot import SpilledDirt
4
- from dkist_processing_common.models.flower_pot import Stem
5
5
  from dkist_processing_common.models.task_name import TaskName
6
6
  from dkist_processing_common.parsers.task import parse_header_ip_task_with_gains
7
7
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
@@ -37,11 +37,9 @@ class IncidentLightAngleBud(TaskUniqueBud):
37
37
  return convert_grating_angle_to_incident_light_angle(grating_angle)
38
38
 
39
39
 
40
- class ReflectedLightAngleBud(Stem):
40
+ class ReflectedLightAngleBud(SetStem):
41
41
  """Bud that combines the incident light angle and arm position header values to compute the reflected light angle."""
42
42
 
43
- key_to_petal_dict: dict[str, float]
44
-
45
43
  def __init__(self):
46
44
  super().__init__(stem_name=VispBudName.reflected_light_angle_deg.value)
47
45
  self.ip_task_types = [
@@ -65,11 +63,10 @@ class ReflectedLightAngleBud(Stem):
65
63
 
66
64
  return SpilledDirt
67
65
 
68
- def getter(self, key: str) -> float:
66
+ def getter(self) -> float:
69
67
  """Get the value for the reflected light angle and raise an error if it is not unique."""
70
- value_set = set(self.key_to_petal_dict.values())
71
- if len(value_set) > 1:
68
+ if len(self.value_set) > 1:
72
69
  raise ValueError(
73
- f"Multiple {self.stem_name} values found for key {key}. Values: {value_set}"
70
+ f"Multiple {self.stem_name} values found for key. Values: {self.value_set}"
74
71
  )
75
- return value_set.pop()
72
+ return self.value_set.pop()
@@ -1,11 +1,12 @@
1
1
  """Stems for parsing constants and tags related to time header keys."""
2
2
 
3
- from pathlib import Path
4
3
  from typing import NamedTuple
4
+ from typing import Type
5
5
 
6
6
  from dkist_processing_common.models.fits_access import MetadataKey
7
+ from dkist_processing_common.models.flower_pot import ListStem
8
+ from dkist_processing_common.models.flower_pot import SetStem
7
9
  from dkist_processing_common.models.flower_pot import SpilledDirt
8
- from dkist_processing_common.models.flower_pot import Stem
9
10
  from dkist_processing_common.models.flower_pot import Thorn
10
11
  from dkist_processing_common.models.tags import EXP_TIME_ROUND_DIGITS
11
12
  from dkist_processing_common.models.task_name import TaskName
@@ -14,14 +15,14 @@ from dkist_processing_visp.models.constants import VispBudName
14
15
  from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
15
16
 
16
17
 
17
- class NonDarkNonPolcalTaskReadoutExpTimesBud(Stem):
18
+ class NonDarkNonPolcalTaskReadoutExpTimesBud(SetStem):
18
19
  """Produce a tuple of all exposure times present in the dataset for ip task types that are not DARK or POLCAL."""
19
20
 
20
21
  def __init__(self):
21
- super().__init__(stem_name=VispBudName.non_dark_task_readout_exp_times.value)
22
+ super().__init__(stem_name=VispBudName.non_dark_or_polcal_readout_exp_times.value)
22
23
  self.metadata_key = MetadataKey.sensor_readout_exposure_time_ms.name
23
24
 
24
- def setter(self, fits_obj: VispL0FitsAccess) -> float | SpilledDirt:
25
+ def setter(self, fits_obj: VispL0FitsAccess) -> float | Type[SpilledDirt]:
25
26
  """
26
27
  Set the task exposure time for this fits object.
27
28
 
@@ -41,20 +42,15 @@ class NonDarkNonPolcalTaskReadoutExpTimesBud(Stem):
41
42
 
42
43
  return SpilledDirt
43
44
 
44
- def getter(self, key: str | Path) -> (float, ...):
45
+ def getter(self) -> tuple[float, ...]:
45
46
  """
46
47
  Get the list of exposure times.
47
48
 
48
- Parameters
49
- ----------
50
- key
51
- The input key
52
-
53
49
  Returns
54
50
  -------
55
51
  A tuple of exposure times
56
52
  """
57
- exposure_times = tuple(sorted(set(self.key_to_petal_dict.values())))
53
+ exposure_times = tuple(sorted(self.value_set))
58
54
  return exposure_times
59
55
 
60
56
 
@@ -66,11 +62,10 @@ class ReadoutExposureTimeContainer(NamedTuple):
66
62
  readout_exposure_time: float
67
63
 
68
64
 
69
- class DarkReadoutExpTimePickyBud(Stem):
65
+ class DarkReadoutExpTimePickyBud(ListStem):
70
66
  """Parse exposure times to ensure existence of the necessary DARK exposure times."""
71
67
 
72
68
  ReadoutExposureTime: ReadoutExposureTimeContainer = ReadoutExposureTimeContainer
73
- key_to_petal_dict: dict[str | Path, ReadoutExposureTimeContainer] # For type hinting
74
69
 
75
70
  def __init__(self):
76
71
  super().__init__(stem_name=VispBudName.dark_readout_exp_time_picky_bud.value)
@@ -97,7 +92,7 @@ class DarkReadoutExpTimePickyBud(Stem):
97
92
  is_dark=is_dark, is_polcal=is_polcal, readout_exposure_time=exposure_time
98
93
  )
99
94
 
100
- def getter(self, key: str | Path) -> Thorn:
95
+ def getter(self) -> Type[Thorn]:
101
96
  """
102
97
  Parse all exposure times and raise an error if any non-dark exposure time is missing from the set of dark exposure times.
103
98
 
@@ -110,7 +105,7 @@ class DarkReadoutExpTimePickyBud(Stem):
110
105
  -------
111
106
  Thorn
112
107
  """
113
- readout_exp_tuples = list(self.key_to_petal_dict.values())
108
+ readout_exp_tuples = self.value_list
114
109
 
115
110
  dark_readout_exp_times = {
116
111
  exp_time.readout_exposure_time for exp_time in readout_exp_tuples if exp_time.is_dark
@@ -47,7 +47,7 @@ class DarkCalibration(VispTaskBase, BeamAccessMixin, QualityMixin):
47
47
  None
48
48
 
49
49
  """
50
- required_readout_exp_times = list(self.constants.non_dark_task_readout_exp_times)
50
+ required_readout_exp_times = list(self.constants.non_dark_or_polcal_readout_exp_times)
51
51
  logger.info(f"{required_readout_exp_times = }")
52
52
 
53
53
  with self.telemetry_span(
@@ -254,7 +254,7 @@ Here is a set of example tests showing usage of all the patterns discussed above
254
254
  task = dark_calibration_task
255
255
 
256
256
  # This test needs some unique constants
257
- init_visp_constants_db(task.recipe_run_id, VispConstantsDb(NON_DARK_TASK_READOUT_EXP_TIMES=(10.,)))
257
+ init_visp_constants_db(task.recipe_run_id, VispConstantsDb(NON_DARK_OR_POLCAL_READOUT_EXP_TIMES=(10.,)))
258
258
 
259
259
  assert True
260
260
 
@@ -63,7 +63,7 @@ class VispConstantsDb:
63
63
  MAXIMUM_CADENCE: float = 10.0
64
64
  VARIANCE_CADENCE: float = 0.0
65
65
  WAVELENGTH: float = 588.0
66
- NON_DARK_TASK_READOUT_EXP_TIMES: tuple[float, ...] = (200.0, 2.0, 0.02)
66
+ NON_DARK_OR_POLCAL_READOUT_EXP_TIMES: tuple[float, ...] = (200.0, 2.0, 0.02)
67
67
  LAMP_EXPOSURE_TIMES: tuple[float] = (100.0,)
68
68
  SOLAR_EXPOSURE_TIMES: tuple[float] = (1.0,)
69
69
  OBSERVE_EXPOSURE_TIMES: tuple[float] = (0.01,)
@@ -70,7 +70,7 @@ def write_darks_to_task(
70
70
  def dark_calibration_task(tmp_path, init_visp_constants_db, recipe_run_id):
71
71
  readout_exp_times = [0.02, 2.0, 200.0]
72
72
  constants_db = VispConstantsDb(
73
- NON_DARK_TASK_READOUT_EXP_TIMES=tuple(readout_exp_times),
73
+ NON_DARK_OR_POLCAL_READOUT_EXP_TIMES=tuple(readout_exp_times),
74
74
  )
75
75
  init_visp_constants_db(recipe_run_id, constants_db)
76
76
  with DarkCalibration(
@@ -394,12 +394,13 @@ def test_parse_visp_input_data(
394
394
  )
395
395
  task = parse_task_with_no_data
396
396
  write_input_cal_frames_to_task(task)
397
+ num_steps = 3
397
398
  for obs_readout_exp_time, obs_exp_time in zip(observe_readout_exp_times, observe_exp_times):
398
399
  write_input_observe_frames_to_task(
399
400
  task,
400
401
  num_maps=1,
401
402
  num_modstates=num_modstates,
402
- num_steps=3,
403
+ num_steps=num_steps,
403
404
  readout_exp_time=obs_readout_exp_time,
404
405
  exp_time=obs_exp_time,
405
406
  arm_id=testing_arm_id,
@@ -421,10 +422,24 @@ def test_parse_visp_input_data(
421
422
  assert (
422
423
  len(list(task.read(tags=[Tag.input(), Tag.task_polcal()]))) == 6
423
424
  ) # 2 polcal observes, 2 darks, 2 gains
424
- assert list(task.read(tags=[Tag.input(), Tag.task_observe()]))
425
425
  assert len(list(task.read(tags=[Tag.input(), Tag.task_polcal_dark()]))) == 2 # 2 polcal darks
426
426
  assert len(list(task.read(tags=[Tag.input(), Tag.task_polcal_gain()]))) == 2 # 2 polcal gains
427
427
 
428
+ for m in range(1, num_modstates + 1):
429
+ for s in range(num_steps):
430
+ assert len(
431
+ list(
432
+ task.read(
433
+ tags=[
434
+ Tag.input(),
435
+ Tag.task_observe(),
436
+ VispTag.modstate(m),
437
+ VispTag.raster_step(s),
438
+ ]
439
+ )
440
+ )
441
+ ) == len(observe_exp_times)
442
+
428
443
 
429
444
  def test_parse_visp_input_data_constants(
430
445
  parse_task_with_no_data,
@@ -515,6 +530,13 @@ def test_parse_visp_input_data_constants(
515
530
  assert task.constants._db_dict["SOLAR_GAIN_GOS_LEVEL3_STATUS"] == "clear"
516
531
  assert task.constants._db_dict["SOLAR_GAIN_NUM_RAW_FRAMES_PER_FPA"] == 10
517
532
  assert task.constants._db_dict["POLCAL_NUM_RAW_FRAMES_PER_FPA"] == 10
533
+ expected_non_dark_polcal_readout_times = sorted(
534
+ [lamp_readout_exp_time, solar_readout_exp_time] + observe_readout_exp_times
535
+ )
536
+ assert (
537
+ task.constants._db_dict["NON_DARK_OR_POLCAL_READOUT_EXP_TIMES"]
538
+ == expected_non_dark_polcal_readout_times
539
+ )
518
540
 
519
541
 
520
542
  def test_parse_visp_values(
@@ -584,7 +606,7 @@ def test_multiple_num_raster_steps_raises_error(
584
606
  obs_dataset_class=VispHeadersMultiNumRasterSteps,
585
607
  )
586
608
 
587
- with pytest.raises(ValueError, match="Multiple NUM_RASTER_STEPS values found"):
609
+ with pytest.raises(ValueError, match="Found multiple values for total number of raster steps"):
588
610
  task()
589
611
 
590
612
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.3.0rc6
3
+ Version: 5.3.2
4
4
  Summary: Science processing code for the ViSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -13,10 +13,10 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==12.0.0rc7
16
+ Requires-Dist: dkist-processing-common==12.2.0
17
17
  Requires-Dist: dkist-processing-math==2.2.1
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
- Requires-Dist: dkist-header-validator==5.2.1
19
+ Requires-Dist: dkist-header-validator==5.3.0
20
20
  Requires-Dist: dkist-fits-specifications==4.20.0
21
21
  Requires-Dist: dkist-service-configuration==4.2.0
22
22
  Requires-Dist: dkist-spectral-lines==3.0.0
@@ -72,7 +72,7 @@ Requires-Dist: Jinja2==3.1.6; extra == "frozen"
72
72
  Requires-Dist: Mako==1.3.10; extra == "frozen"
73
73
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
74
74
  Requires-Dist: PeakUtils==1.3.5; extra == "frozen"
75
- Requires-Dist: PyJWT==2.10.1; extra == "frozen"
75
+ Requires-Dist: PyJWT==2.11.0; extra == "frozen"
76
76
  Requires-Dist: PyYAML==6.0.3; extra == "frozen"
77
77
  Requires-Dist: PyYAML-ft==8.0.0; extra == "frozen"
78
78
  Requires-Dist: Pygments==2.19.2; extra == "frozen"
@@ -84,9 +84,9 @@ Requires-Dist: aioftp==0.27.2; extra == "frozen"
84
84
  Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
85
85
  Requires-Dist: aiohttp==3.13.3; extra == "frozen"
86
86
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
87
- Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
87
+ Requires-Dist: aiosmtplib==5.1.0; extra == "frozen"
88
88
  Requires-Dist: aiosqlite==0.21.0; extra == "frozen"
89
- Requires-Dist: alembic==1.18.1; extra == "frozen"
89
+ Requires-Dist: alembic==1.18.3; extra == "frozen"
90
90
  Requires-Dist: amqp==5.3.1; extra == "frozen"
91
91
  Requires-Dist: annotated-types==0.7.0; extra == "frozen"
92
92
  Requires-Dist: anyio==4.12.1; extra == "frozen"
@@ -107,13 +107,13 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
107
107
  Requires-Dist: asgiref==3.11.0; extra == "frozen"
108
108
  Requires-Dist: asteval==1.0.8; extra == "frozen"
109
109
  Requires-Dist: astropy==7.0.2; extra == "frozen"
110
- Requires-Dist: astropy-iers-data==0.2026.1.19.0.42.31; extra == "frozen"
110
+ Requires-Dist: astropy-iers-data==0.2026.1.26.0.43.56; extra == "frozen"
111
111
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
112
112
  Requires-Dist: attrs==25.4.0; extra == "frozen"
113
113
  Requires-Dist: babel==2.17.0; extra == "frozen"
114
114
  Requires-Dist: billiard==4.2.4; extra == "frozen"
115
- Requires-Dist: boto3==1.42.32; extra == "frozen"
116
- Requires-Dist: botocore==1.42.32; extra == "frozen"
115
+ Requires-Dist: boto3==1.42.38; extra == "frozen"
116
+ Requires-Dist: botocore==1.42.38; extra == "frozen"
117
117
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
118
118
  Requires-Dist: celery==5.6.2; extra == "frozen"
119
119
  Requires-Dist: certifi==2026.1.4; extra == "frozen"
@@ -127,17 +127,17 @@ Requires-Dist: colorlog==6.10.1; extra == "frozen"
127
127
  Requires-Dist: contourpy==1.3.3; extra == "frozen"
128
128
  Requires-Dist: cron_descriptor==2.0.6; extra == "frozen"
129
129
  Requires-Dist: croniter==6.0.0; extra == "frozen"
130
- Requires-Dist: cryptography==46.0.3; extra == "frozen"
130
+ Requires-Dist: cryptography==46.0.4; extra == "frozen"
131
131
  Requires-Dist: cycler==0.12.1; extra == "frozen"
132
132
  Requires-Dist: dacite==1.9.2; extra == "frozen"
133
133
  Requires-Dist: decorator==5.2.1; extra == "frozen"
134
134
  Requires-Dist: dill==0.4.1; extra == "frozen"
135
- Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
136
- Requires-Dist: dkist-processing-common==12.0.0rc7; extra == "frozen"
137
- Requires-Dist: dkist-processing-core==7.0.0rc9; extra == "frozen"
135
+ Requires-Dist: dkist-header-validator==5.3.0; extra == "frozen"
136
+ Requires-Dist: dkist-processing-common==12.2.0; extra == "frozen"
137
+ Requires-Dist: dkist-processing-core==7.0.1; extra == "frozen"
138
138
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
139
139
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
140
- Requires-Dist: dkist-processing-visp==5.3.0rc6; extra == "frozen"
140
+ Requires-Dist: dkist-processing-visp==5.3.2; extra == "frozen"
141
141
  Requires-Dist: dkist-service-configuration==4.2.0; extra == "frozen"
142
142
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
143
143
  Requires-Dist: dkist_fits_specifications==4.20.0; extra == "frozen"
@@ -154,7 +154,7 @@ Requires-Dist: globus-sdk==4.3.1; extra == "frozen"
154
154
  Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
155
155
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
156
156
  Requires-Dist: greenback==1.3.0; extra == "frozen"
157
- Requires-Dist: greenlet==3.3.0; extra == "frozen"
157
+ Requires-Dist: greenlet==3.3.1; extra == "frozen"
158
158
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
159
159
  Requires-Dist: h11==0.16.0; extra == "frozen"
160
160
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
@@ -186,7 +186,7 @@ Requires-Dist: methodtools==0.4.7; extra == "frozen"
186
186
  Requires-Dist: more-itertools==10.8.0; extra == "frozen"
187
187
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
188
188
  Requires-Dist: msgspec==0.20.0; extra == "frozen"
189
- Requires-Dist: multidict==6.7.0; extra == "frozen"
189
+ Requires-Dist: multidict==6.7.1; extra == "frozen"
190
190
  Requires-Dist: natsort==8.4.0; extra == "frozen"
191
191
  Requires-Dist: nbformat==5.10.4; extra == "frozen"
192
192
  Requires-Dist: networkx==3.6.1; extra == "frozen"
@@ -219,21 +219,21 @@ Requires-Dist: opentelemetry-util-http==0.60b1; extra == "frozen"
219
219
  Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
220
220
  Requires-Dist: packaging==26.0; extra == "frozen"
221
221
  Requires-Dist: pandas==3.0.0; extra == "frozen"
222
- Requires-Dist: parfive==2.2.0; extra == "frozen"
223
- Requires-Dist: pathspec==1.0.3; extra == "frozen"
224
- Requires-Dist: pendulum==3.1.0; extra == "frozen"
222
+ Requires-Dist: parfive==2.3.1; extra == "frozen"
223
+ Requires-Dist: pathspec==1.0.4; extra == "frozen"
224
+ Requires-Dist: pendulum==3.2.0; extra == "frozen"
225
225
  Requires-Dist: pika==1.3.2; extra == "frozen"
226
226
  Requires-Dist: pillow==10.4.0; extra == "frozen"
227
227
  Requires-Dist: pip==25.3; extra == "frozen"
228
228
  Requires-Dist: platformdirs==4.5.1; extra == "frozen"
229
229
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
230
- Requires-Dist: pooch==1.8.2; extra == "frozen"
230
+ Requires-Dist: pooch==1.9.0; extra == "frozen"
231
231
  Requires-Dist: proglog==0.1.12; extra == "frozen"
232
232
  Requires-Dist: prometheus_client==0.24.1; extra == "frozen"
233
233
  Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
234
234
  Requires-Dist: propcache==0.4.1; extra == "frozen"
235
- Requires-Dist: protobuf==6.33.4; extra == "frozen"
236
- Requires-Dist: psutil==7.2.1; extra == "frozen"
235
+ Requires-Dist: protobuf==6.33.5; extra == "frozen"
236
+ Requires-Dist: psutil==7.2.2; extra == "frozen"
237
237
  Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
238
238
  Requires-Dist: pycparser==3.0; extra == "frozen"
239
239
  Requires-Dist: pydantic==2.12.5; extra == "frozen"
@@ -245,15 +245,15 @@ Requires-Dist: pyparsing==3.3.2; extra == "frozen"
245
245
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
246
246
  Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
247
247
  Requires-Dist: python-dotenv==1.2.1; extra == "frozen"
248
- Requires-Dist: python-multipart==0.0.21; extra == "frozen"
248
+ Requires-Dist: python-multipart==0.0.22; extra == "frozen"
249
249
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
250
250
  Requires-Dist: pytz==2025.2; extra == "frozen"
251
251
  Requires-Dist: redis==6.4.0; extra == "frozen"
252
252
  Requires-Dist: referencing==0.37.0; extra == "frozen"
253
253
  Requires-Dist: requests==2.32.5; extra == "frozen"
254
- Requires-Dist: rich==14.2.0; extra == "frozen"
254
+ Requires-Dist: rich==14.3.1; extra == "frozen"
255
255
  Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
256
- Requires-Dist: rich-toolkit==0.17.1; extra == "frozen"
256
+ Requires-Dist: rich-toolkit==0.17.2; extra == "frozen"
257
257
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
258
258
  Requires-Dist: s3transfer==0.16.0; extra == "frozen"
259
259
  Requires-Dist: scikit-image==0.25.2; extra == "frozen"
@@ -277,7 +277,7 @@ Requires-Dist: tenacity==8.5.0; extra == "frozen"
277
277
  Requires-Dist: termcolor==3.3.0; extra == "frozen"
278
278
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
279
279
  Requires-Dist: threadpoolctl==3.6.0; extra == "frozen"
280
- Requires-Dist: tifffile==2026.1.14; extra == "frozen"
280
+ Requires-Dist: tifffile==2026.1.28; extra == "frozen"
281
281
  Requires-Dist: tornado==6.5.4; extra == "frozen"
282
282
  Requires-Dist: tqdm==4.67.1; extra == "frozen"
283
283
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
@@ -296,7 +296,7 @@ Requires-Dist: uvloop==0.22.1; extra == "frozen"
296
296
  Requires-Dist: vine==5.1.0; extra == "frozen"
297
297
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
298
298
  Requires-Dist: watchfiles==1.1.1; extra == "frozen"
299
- Requires-Dist: wcwidth==0.3.0; extra == "frozen"
299
+ Requires-Dist: wcwidth==0.5.2; extra == "frozen"
300
300
  Requires-Dist: websockets==16.0; extra == "frozen"
301
301
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
302
302
  Requires-Dist: wrapt==1.17.3; extra == "frozen"
@@ -1,10 +1,9 @@
1
1
  changelog/.gitempty,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- changelog/261.misc.rst,sha256=qftQKbZtkNBq5aH3JiQo4Et_za0vq1YZnikiEbbIQYc,63
3
2
  dkist_processing_visp/__init__.py,sha256=LC8o31oTIro4F7IgwoWalX1W3KcPU27yJhlDUeGqcwA,351
4
3
  dkist_processing_visp/config.py,sha256=GMr0CreW4qavbueTtsH_Gx5P52v4yZd2PNKyPmxBKQE,478
5
4
  dkist_processing_visp/fonts/Lato-Regular.ttf,sha256=1jbkaDIx-THtoiLViOlE0IK_0726AvkovuRhwPGFslE,656568
6
5
  dkist_processing_visp/models/__init__.py,sha256=z2nFVvvIzirxklQ9i5-F1nR-WOgcDttYtog_jx4yN5I,12
7
- dkist_processing_visp/models/constants.py,sha256=TP9ZefMdJxu-JWePICMZ6riC4bH1Mz4NJY0hAcWAPQ0,6749
6
+ dkist_processing_visp/models/constants.py,sha256=zfwmBW-DjeizMSeruFBJCabWU6cepKOk38M_C8kvArM,6933
8
7
  dkist_processing_visp/models/fits_access.py,sha256=8uKaUgtapyED-WgJCeswrIqEGy4Ob6ekBmiyBqF6yIE,573
9
8
  dkist_processing_visp/models/metric_code.py,sha256=L_VJ-l5RXsYgcEIOO6hsez1a5oL5FqTnoVKZ0z7NKng,266
10
9
  dkist_processing_visp/models/parameters.py,sha256=kiYzvXjsQo1EFEGHJUdeYj170tq_CeVqrrtD01E1fmQ,16967
@@ -12,17 +11,17 @@ dkist_processing_visp/models/tags.py,sha256=Pdc-E2wNlaqRzAJgQF_KHUe_xzqDrUfp1IB0
12
11
  dkist_processing_visp/models/task_name.py,sha256=6iZ5j8_beOI8DMoEemxG3dra63a93q0vbjcypb_H9wE,281
13
12
  dkist_processing_visp/parsers/__init__.py,sha256=z2nFVvvIzirxklQ9i5-F1nR-WOgcDttYtog_jx4yN5I,12
14
13
  dkist_processing_visp/parsers/map_repeats.py,sha256=YuO1VROQLuE-Hn9hSzityjNhIDe-EgQ4kjZV6l9xF2Q,5468
15
- dkist_processing_visp/parsers/modulator_states.py,sha256=dHAZZaG3i_UUT5FjTg1oJdCBiOKCqkrx1jiQnzp2t2o,3006
14
+ dkist_processing_visp/parsers/modulator_states.py,sha256=b5GepRQZAAbk9-qo3nMYdiXoq8BwyO6jkGKI5b7nW5c,2843
16
15
  dkist_processing_visp/parsers/polarimeter_mode.py,sha256=vOE8IYlBrgAFGSrDbpUDfHnI3OTPBDpd3U_j5totZb8,625
17
- dkist_processing_visp/parsers/raster_step.py,sha256=tCmXPhG99z54YVX3X-kLOGDKJRTDJHnDbjNev4An7Pg,3142
18
- dkist_processing_visp/parsers/spectrograph_configuration.py,sha256=YpMX1NhE7xySx6XB3-0etfzfT_oSiGDphNnxhaW_C3c,3203
19
- dkist_processing_visp/parsers/time.py,sha256=uudQ5manYdL7SgxqABfFPDzW2iTNrTYF0klqCRsP0CI,4812
16
+ dkist_processing_visp/parsers/raster_step.py,sha256=pJEnv3M5FnUU5B7Coj7czQxWUVWE2iVXdfRKo9kZfsw,2947
17
+ dkist_processing_visp/parsers/spectrograph_configuration.py,sha256=zAk3N_AtyacGw2E4GSDCxb_j1i5HUJbtwOvJj_lAVC4,3110
18
+ dkist_processing_visp/parsers/time.py,sha256=XQrVxgWwCDyoXfzmihQz2gy2ibLEpD87YLAT_OGkniM,4661
20
19
  dkist_processing_visp/parsers/visp_l0_fits_access.py,sha256=WDAgMp_70AKmzxGqboKA3McSGgF_mvgsGiihYmK1Nus,1973
21
20
  dkist_processing_visp/parsers/visp_l1_fits_access.py,sha256=1MrFfsJjT_7fd1cj8tFr5rHX2JdRSrlwiMCzu-Q8ejY,860
22
21
  dkist_processing_visp/tasks/__init__.py,sha256=wleMYKy1OmAJdvxmPCwtktM0koSLS5Vnd2H8C2uLdjQ,798
23
22
  dkist_processing_visp/tasks/assemble_movie.py,sha256=8UujniXlV_sSGeuISud8wMHihLy6Gc5fKZpwkXLUQB8,3330
24
23
  dkist_processing_visp/tasks/background_light.py,sha256=qQ3r1LR5qaOz2qNHnO5_QK8l1zbVP0GaCS3aLqJfNYY,16201
25
- dkist_processing_visp/tasks/dark.py,sha256=VVitrat08U7e5L1-NVnNNJI_KIx791_DvKEJokvCqXE,4334
24
+ dkist_processing_visp/tasks/dark.py,sha256=x-XS23G5IIhiQ2jcELliTNRhhc5ZzSt5amnvwCJXoUA,4339
26
25
  dkist_processing_visp/tasks/geometric.py,sha256=n2Wiy7QovA8V0gkORnQ9LX8lgb-amqE-M_mKr1u4HNY,48934
27
26
  dkist_processing_visp/tasks/instrument_polarization.py,sha256=uj7iyzM3CiJcbQeF4eKpk_KCoheXaM4FpDI83GYDld4,25854
28
27
  dkist_processing_visp/tasks/l1_output_data.py,sha256=vl_c52noozeu4N-BbfpsIHFc5q6JATQ9r4iLa3MDtDI,8347
@@ -39,14 +38,14 @@ dkist_processing_visp/tasks/mixin/__init__.py,sha256=z2nFVvvIzirxklQ9i5-F1nR-WOg
39
38
  dkist_processing_visp/tasks/mixin/beam_access.py,sha256=1VSJkH6yMxCiZWdWOp_RJ37fX5ULMYmB_0_ulT7YJpI,870
40
39
  dkist_processing_visp/tasks/mixin/corrections.py,sha256=FhLFgD9ZYLZd3SaC3PFF-szrcs-zmdrUYNDUEK-h7JA,7145
41
40
  dkist_processing_visp/tasks/mixin/downsample.py,sha256=SvKzY6HJRn-FeyG7O6HPvyOS5dmMu6uPoWkfnpPXpVw,1344
42
- dkist_processing_visp/tests/README.rst,sha256=rnedwwg25c0lB9Me7cT7QNZA17FYlqCu9ZnjQxR5hi0,12502
41
+ dkist_processing_visp/tests/README.rst,sha256=RTFqJmeEQG-49eolwaQrrUrxzbBvLjIpX2mXrgr2hw8,12507
43
42
  dkist_processing_visp/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- dkist_processing_visp/tests/conftest.py,sha256=JJLg-x4Rfzrk3wp-vBN0EpnnBzQzXS4qdGmr7GXBNwM,19402
43
+ dkist_processing_visp/tests/conftest.py,sha256=-iErDGw_7pUda7iWNIigfNbvq5vOtbqAe18KAkIwRlQ,19407
45
44
  dkist_processing_visp/tests/header_models.py,sha256=gD1FUo5TtY_EMSnpWvkrJIOsckkgRAD-e1mthPCdiOw,21687
46
45
  dkist_processing_visp/tests/test_assemble_movie.py,sha256=T5EZzdB3sNY4HcSkN2W1ZBDaI4a68ZUNqPB-JpANSQ0,2247
47
46
  dkist_processing_visp/tests/test_assemble_quality.py,sha256=i2INzb73BM14A6VKD70eb5vaAv5_QjPy3VVVb4lonkc,4314
48
47
  dkist_processing_visp/tests/test_background_light.py,sha256=Zvm8s38qx_ybviEhnKqPI4s36VFBJKtsNrp31-o8lEQ,17553
49
- dkist_processing_visp/tests/test_dark.py,sha256=iKp12bHOOKPf7GAB8iKYpZu1AXFaESAW6C0ua1nVFXA,5552
48
+ dkist_processing_visp/tests/test_dark.py,sha256=tlT2u2E_esqFO-0FJxYZLqx4G5RHu-AecW-WbqiKo-o,5557
50
49
  dkist_processing_visp/tests/test_downsample.py,sha256=iSmb4PwpZtnVU06tmlko1wwepWueQ3KJ459XYgNIpws,2211
51
50
  dkist_processing_visp/tests/test_fits_access.py,sha256=jOaSHDydzPl48SSBxt3z3CtCzBgCmSCc3rZ92CpoAaY,1822
52
51
  dkist_processing_visp/tests/test_geometric.py,sha256=H3oqFPHSPfgJVRZUqD1DIs7DanIVei9-oTsJuiHA4SY,13850
@@ -55,7 +54,7 @@ dkist_processing_visp/tests/test_lamp.py,sha256=19mRN8drAg0tqQGwSbSUDlpryqYjMvmf
55
54
  dkist_processing_visp/tests/test_make_movie_frames.py,sha256=huQ5n0YneHByKumM_Ye9tekqKeh-F-e6MQoudOP3S-g,2628
56
55
  dkist_processing_visp/tests/test_map_repeats.py,sha256=9g3NnvSfn1OqxxYYxTFoOIi1UsCOa6mZjiuGkbxUvTg,7611
57
56
  dkist_processing_visp/tests/test_parameters.py,sha256=kIwOak4PURFc6yNT9R1rLxfb4x5FbqSlfi3FF-krrGo,8314
58
- dkist_processing_visp/tests/test_parse.py,sha256=XyH8oCk5C0CWl4ndNIyVjgXLoMg0679s4dj1MGlJs0c,23363
57
+ dkist_processing_visp/tests/test_parse.py,sha256=vRZnfIVNURHa220rEHts5vYHvXAcx_kF-A-v0EdFA60,24104
59
58
  dkist_processing_visp/tests/test_quality.py,sha256=YW24VjEHoILseFIXZBp4-o7egT26mfT1lafzajVjXu8,6905
60
59
  dkist_processing_visp/tests/test_science.py,sha256=B8bbtVTxJIXiPssIbJchPLbzVTPCAzpLAgn5DhpYCn0,26106
61
60
  dkist_processing_visp/tests/test_solar.py,sha256=f5tk8RGOoC7fcxqp3s01p6I55iIDJBioKSXC1S56KMQ,16632
@@ -92,7 +91,7 @@ docs/science_calibration.rst,sha256=VN_g7xSjN-nbXhlBaFnPCbNcsc_Qu0207jEUfRAjnBE,
92
91
  docs/scientific_changelog.rst,sha256=01AWBSHg8zElnodCgAq-hMxhk9CkX5rtEENx4iz0sjI,300
93
92
  docs/wavelength_calibration.rst,sha256=OSGYAeR8Acns2ZUectHzRj2xcAsuNEMLejcYfPYu-vw,3674
94
93
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
95
- dkist_processing_visp-5.3.0rc6.dist-info/METADATA,sha256=98EU7bVOUN9Tbh_gExMlFVUMiUG6sfEQliKf9O6lRWc,29513
96
- dkist_processing_visp-5.3.0rc6.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
97
- dkist_processing_visp-5.3.0rc6.dist-info/top_level.txt,sha256=9GHSn-ZMGQxaRNGrPP3HNc5ZkE7ftzluO74Jz5vUSTE,46
98
- dkist_processing_visp-5.3.0rc6.dist-info/RECORD,,
94
+ dkist_processing_visp-5.3.2.dist-info/METADATA,sha256=xhA6XNjOLD91EZuZyH-lQFXlNExY_ASpC8QISvGhUpk,29498
95
+ dkist_processing_visp-5.3.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
+ dkist_processing_visp-5.3.2.dist-info/top_level.txt,sha256=9GHSn-ZMGQxaRNGrPP3HNc5ZkE7ftzluO74Jz5vUSTE,46
97
+ dkist_processing_visp-5.3.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
changelog/261.misc.rst DELETED
@@ -1 +0,0 @@
1
- Upgrade to use Airflow 3 and a minimum python version of 3.13.