dkist-processing-cryonirsp 1.7.6__py3-none-any.whl → 1.7.7rc1__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.

Files changed (28) hide show
  1. changelog/190.misc.rst +1 -0
  2. dkist_processing_cryonirsp/models/parameters.py +6 -6
  3. dkist_processing_cryonirsp/tasks/cryonirsp_base.py +1 -3
  4. dkist_processing_cryonirsp/tasks/parse.py +2 -3
  5. dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py +1 -2
  6. dkist_processing_cryonirsp/tasks/write_l1.py +2 -3
  7. dkist_processing_cryonirsp/tests/conftest.py +69 -39
  8. dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py +44 -14
  9. dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py +1 -1
  10. dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py +1 -1
  11. dkist_processing_cryonirsp/tests/test_ci_science.py +1 -1
  12. dkist_processing_cryonirsp/tests/test_corrections.py +2 -3
  13. dkist_processing_cryonirsp/tests/test_cryo_base.py +1 -1
  14. dkist_processing_cryonirsp/tests/test_dark.py +2 -2
  15. dkist_processing_cryonirsp/tests/test_gain.py +2 -2
  16. dkist_processing_cryonirsp/tests/test_instrument_polarization.py +10 -4
  17. dkist_processing_cryonirsp/tests/test_linearity_correction.py +1 -1
  18. dkist_processing_cryonirsp/tests/test_parameters.py +16 -24
  19. dkist_processing_cryonirsp/tests/test_parse.py +1 -1
  20. dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py +1 -1
  21. dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py +1 -1
  22. dkist_processing_cryonirsp/tests/test_sp_geometric.py +2 -2
  23. dkist_processing_cryonirsp/tests/test_sp_science.py +1 -1
  24. dkist_processing_cryonirsp/tests/test_sp_solar.py +1 -1
  25. {dkist_processing_cryonirsp-1.7.6.dist-info → dkist_processing_cryonirsp-1.7.7rc1.dist-info}/METADATA +15 -14
  26. {dkist_processing_cryonirsp-1.7.6.dist-info → dkist_processing_cryonirsp-1.7.7rc1.dist-info}/RECORD +28 -27
  27. {dkist_processing_cryonirsp-1.7.6.dist-info → dkist_processing_cryonirsp-1.7.7rc1.dist-info}/WHEEL +0 -0
  28. {dkist_processing_cryonirsp-1.7.6.dist-info → dkist_processing_cryonirsp-1.7.7rc1.dist-info}/top_level.txt +0 -0
changelog/190.misc.rst ADDED
@@ -0,0 +1 @@
1
+ Remove use of input dataset mixin imported from dkist-processing-common.
@@ -136,8 +136,8 @@ class CryonirspParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmI
136
136
  @cached_property
137
137
  def linearization_thresholds(self) -> np.ndarray:
138
138
  """Name of parameter associated with the linearization thresholds."""
139
- param_dict = self._find_parameter_for_arm("cryonirsp_linearization_thresholds")
140
- value = self._load_param_value_from_numpy_save(param_dict)
139
+ param_obj = self._find_parameter_for_arm("cryonirsp_linearization_thresholds")
140
+ value = self._load_param_value_from_numpy_save(param_obj=param_obj)
141
141
  # float64 data can blow up the memory required for linearization - convert to float32
142
142
  if np.issubdtype(value.dtype, np.float64):
143
143
  value = value.astype(np.float32, casting="same_kind")
@@ -275,8 +275,8 @@ class CryonirspParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmI
275
275
  - wavelength in nanometers
276
276
  - transmission at given wavelength
277
277
  """
278
- param_dict = self._find_most_recent_past_value("cryonirsp_solar_atlas")
279
- return self._load_param_value_from_numpy_save(param_dict)
278
+ param_obj = self._find_most_recent_past_value("cryonirsp_solar_atlas")
279
+ return self._load_param_value_from_numpy_save(param_obj=param_obj)
280
280
 
281
281
  @cached_property
282
282
  def telluric_atlas(self) -> np.ndarray:
@@ -286,5 +286,5 @@ class CryonirspParameters(ParameterBase, ParameterWavelengthMixin, ParameterArmI
286
286
  - wavelength in nanometers
287
287
  - transmission at given wavelength
288
288
  """
289
- param_dict = self._find_most_recent_past_value("cryonirsp_telluric_atlas")
290
- return self._load_param_value_from_numpy_save(param_dict)
289
+ param_obj = self._find_most_recent_past_value("cryonirsp_telluric_atlas")
290
+ return self._load_param_value_from_numpy_save(param_obj=param_obj)
@@ -2,7 +2,6 @@
2
2
  from abc import ABC
3
3
 
4
4
  from dkist_processing_common.tasks import WorkflowTaskBase
5
- from dkist_processing_common.tasks.mixin.input_dataset import InputDatasetMixin
6
5
  from dkist_processing_common.tasks.mixin.quality import QualityMixin
7
6
 
8
7
  from dkist_processing_cryonirsp.models.constants import CryonirspConstants
@@ -12,7 +11,6 @@ from dkist_processing_cryonirsp.tasks.mixin.corrections import CorrectionsMixin
12
11
 
13
12
  class CryonirspTaskBase(
14
13
  WorkflowTaskBase,
15
- InputDatasetMixin,
16
14
  CorrectionsMixin,
17
15
  QualityMixin,
18
16
  ABC,
@@ -50,7 +48,7 @@ class CryonirspTaskBase(
50
48
  workflow_version=workflow_version,
51
49
  )
52
50
  self.parameters = CryonirspParameters(
53
- self.input_dataset_parameters,
51
+ scratch=self.scratch,
54
52
  obs_ip_start_time=self.constants.obs_ip_start_time,
55
53
  wavelength=self.constants.wavelength,
56
54
  arm_id=self.constants.arm_id,
@@ -20,7 +20,6 @@ from dkist_processing_common.parsers.unique_bud import UniqueBud
20
20
  from dkist_processing_common.tasks import default_constant_bud_factory
21
21
  from dkist_processing_common.tasks import default_tag_flower_factory
22
22
  from dkist_processing_common.tasks import ParseDataBase
23
- from dkist_processing_common.tasks.mixin.input_dataset import InputDatasetMixin
24
23
 
25
24
  from dkist_processing_cryonirsp.models.constants import CryonirspBudName
26
25
  from dkist_processing_cryonirsp.models.parameters import CryonirspParsingParameters
@@ -142,7 +141,7 @@ class ParseL0CryonirspRampData(ParseDataBase):
142
141
  return [Tag.input(), Tag.frame()]
143
142
 
144
143
 
145
- class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
144
+ class ParseL0CryonirspLinearizedData(ParseDataBase):
146
145
  """
147
146
  Parse linearity corrected CryoNIRSP input data to add common and Cryonirsp specific constants.
148
147
 
@@ -168,7 +167,7 @@ class ParseL0CryonirspLinearizedData(ParseDataBase, InputDatasetMixin):
168
167
  workflow_name=workflow_name,
169
168
  workflow_version=workflow_version,
170
169
  )
171
- self.parameters = CryonirspParsingParameters(self.input_dataset_parameters)
170
+ self.parameters = CryonirspParsingParameters(scratch=self.scratch)
172
171
 
173
172
  @property
174
173
  def fits_parsing_class(self):
@@ -10,7 +10,6 @@ from astropy.io import fits
10
10
  from astropy.time import Time
11
11
  from astropy.wcs import WCS
12
12
  from dkist_processing_common.codecs.asdf import asdf_encoder
13
- from dkist_processing_common.tasks.mixin.input_dataset import InputDatasetMixin
14
13
  from dkist_service_configuration.logging import logger
15
14
  from scipy.ndimage import gaussian_filter1d
16
15
  from scipy.optimize import differential_evolution
@@ -26,7 +25,7 @@ from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
26
25
  __all__ = ["SPDispersionAxisCorrection"]
27
26
 
28
27
 
29
- class SPDispersionAxisCorrection(CryonirspTaskBase, InputDatasetMixin):
28
+ class SPDispersionAxisCorrection(CryonirspTaskBase):
30
29
  """Task class for correcting the dispersion axis wavelength values.
31
30
 
32
31
  Parameters
@@ -14,7 +14,6 @@ from astropy.time.core import Time
14
14
  from dkist_processing_common.codecs.asdf import asdf_decoder
15
15
  from dkist_processing_common.models.wavelength import WavelengthRange
16
16
  from dkist_processing_common.tasks import WriteL1Frame
17
- from dkist_processing_common.tasks.mixin.input_dataset import InputDatasetMixin
18
17
  from sunpy.coordinates import GeocentricEarthEquatorial
19
18
  from sunpy.coordinates import Helioprojective
20
19
 
@@ -25,7 +24,7 @@ from dkist_processing_cryonirsp.models.tags import CryonirspTag
25
24
  __all__ = ["CIWriteL1Frame", "SPWriteL1Frame"]
26
25
 
27
26
 
28
- class CryonirspWriteL1Frame(WriteL1Frame, ABC, InputDatasetMixin):
27
+ class CryonirspWriteL1Frame(WriteL1Frame, ABC):
29
28
  """
30
29
  Task class for writing out calibrated l1 CryoNIRSP frames.
31
30
 
@@ -51,7 +50,7 @@ class CryonirspWriteL1Frame(WriteL1Frame, ABC, InputDatasetMixin):
51
50
  workflow_version=workflow_version,
52
51
  )
53
52
  self.parameters = CryonirspParameters(
54
- self.input_dataset_parameters,
53
+ scratch=self.scratch,
55
54
  obs_ip_start_time=self.constants.obs_ip_start_time,
56
55
  wavelength=self.constants.wavelength,
57
56
  arm_id=self.constants.arm_id,
@@ -1,11 +1,9 @@
1
1
  import json
2
- import os
3
2
  from collections.abc import Iterable
4
3
  from dataclasses import asdict
5
4
  from dataclasses import dataclass
6
5
  from dataclasses import field
7
6
  from dataclasses import is_dataclass
8
- from pathlib import Path
9
7
  from random import randint
10
8
  from typing import Any
11
9
  from typing import Callable
@@ -21,8 +19,15 @@ from dkist_data_simulator.spec122 import Spec122Dataset
21
19
  from dkist_header_validator import spec122_validator
22
20
  from dkist_header_validator.translator import sanitize_to_spec214_level1
23
21
  from dkist_header_validator.translator import translate_spec122_to_spec214_l0
22
+ from dkist_processing_common.codecs.array import array_encoder
23
+ from dkist_processing_common.codecs.basemodel import basemodel_encoder
24
24
  from dkist_processing_common.codecs.fits import fits_array_encoder
25
+ from dkist_processing_common.models.input_dataset import InputDatasetFilePointer
26
+ from dkist_processing_common.models.input_dataset import InputDatasetObject
27
+ from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
25
28
  from dkist_processing_common.tasks import WorkflowTaskBase
29
+ from pydantic import Field
30
+ from pydantic import model_validator
26
31
 
27
32
  from dkist_processing_cryonirsp.models.constants import CryonirspConstants
28
33
  from dkist_processing_cryonirsp.models.exposure_conditions import AllowableOpticalDensityFilterNames
@@ -250,58 +255,70 @@ class WavelengthParameter:
250
255
  return hash((self.values, self.wavelength))
251
256
 
252
257
 
253
- @dataclass
254
- class FileParameter:
255
- """For parameters that are files on disk."""
256
-
257
- param_path: str
258
- is_file: bool = True
259
- objectKey: str = "not_used_because_its_already_converted"
260
- bucket: str = "not_used_because_we_dont_transfer"
261
- # Note: we have these as already-parsed file parameter (i.e., no "__file__") mainly because it allows us to have
262
- # parameter files that are outside of the workflow basepath (where they would not be able to be tagged with
263
- # PARAMETER_FILE). This is a pattern that we see in grogu testing.
264
- # A downside of this approach is that we are slightly more fragile to changes in the underlying __file__ parsing
265
- # in `*-common`. Apologies to any future devs who run into this problem. To fix it you'll need to make
266
- # downstream fixtures aware of the actual files so they can be tagged prior to the instantiation of the
267
- # Parameter object on some Task.
258
+ class FileObject(InputDatasetObject):
259
+ """For files on disk, with attributes overridden to have defaults."""
260
+
261
+ bucket: str | None = None
262
+ object_key: str | None = None
263
+
264
+ def __hash__(self):
265
+ return hash((self.bucket, self.object_key, self.tag))
266
+
267
+
268
+ class FileParameter(InputDatasetFilePointer):
269
+ """For parameters that are files, with additional attributes to make FileObjects."""
270
+
271
+ object_key: str | None = Field(
272
+ default="dummy_default_value", exclude=True
273
+ ) # Not necessary, but useful for GROGU
274
+ file_pointer: FileObject = Field(default_factory=lambda: FileObject(), alias="__file__")
275
+
276
+ @model_validator(mode="after")
277
+ def _populate_file_object(self):
278
+ self.file_pointer = FileObject(
279
+ bucket="not_used_because_we_dont_transfer",
280
+ object_key=self.object_key,
281
+ tag=CryonirspTag.parameter((self.object_key)),
282
+ )
283
+ return self
268
284
 
269
285
 
270
286
  # These constants are used to prevent name errors in _create_parameter_files
271
- # and in CryonirspTestingParameters
287
+ # and in CryonirspTestingParameters.
272
288
  LINEARIZATION_THRESHOLDS_CI = "cryonirsp_linearization_thresholds_ci.npy"
273
289
  LINEARIZATION_THRESHOLDS_SP = "cryonirsp_linearization_thresholds_sp.npy"
274
290
  SOLAR_ATLAS = "cryonirsp_solar_atlas.npy"
275
291
  TELLURIC_ATLAS = "cryonirsp_telluric_atlas.npy"
276
292
 
277
293
 
278
- def _create_parameter_files(param_path: Path) -> None:
294
+ def _create_parameter_files(task: WorkflowTaskBase) -> None:
279
295
  # linearization thresholds
280
296
  thresh = np.ones((10, 10), dtype=np.float64) * 100.0
281
- np.save(os.path.join(param_path, LINEARIZATION_THRESHOLDS_CI), thresh)
282
- np.save(os.path.join(param_path, LINEARIZATION_THRESHOLDS_SP), thresh)
297
+ task.write(
298
+ data=thresh, tags=CryonirspTag.parameter(LINEARIZATION_THRESHOLDS_CI), encoder=array_encoder
299
+ )
300
+ task.write(
301
+ data=thresh, tags=CryonirspTag.parameter(LINEARIZATION_THRESHOLDS_SP), encoder=array_encoder
302
+ )
283
303
 
284
304
  # solar and telluric atlases
285
305
  atlas_wavelengths = range(300, 16600)
286
306
  atlas_transmission = np.random.rand(16300)
287
307
  atlas = [atlas_wavelengths, atlas_transmission]
288
- np.save(os.path.join(param_path, SOLAR_ATLAS), atlas)
289
- np.save(os.path.join(param_path, TELLURIC_ATLAS), atlas)
308
+ task.write(data=atlas, tags=CryonirspTag.parameter(SOLAR_ATLAS), encoder=array_encoder)
309
+ task.write(data=atlas, tags=CryonirspTag.parameter(TELLURIC_ATLAS), encoder=array_encoder)
290
310
 
291
311
 
292
312
  TestingParameters = TypeVar("TestingParameters", bound="CryonirspTestingParameters")
293
313
 
294
314
 
295
315
  def cryonirsp_testing_parameters_factory(
296
- param_path: Path | str = "", create_files: bool = True
316
+ task: WorkflowTaskBase, create_files: bool = True
297
317
  ) -> TestingParameters:
298
318
  """Create the InputDatasetParameterValue objects and write the parameter files."""
299
- if isinstance(param_path, str):
300
- param_path = Path(param_path)
301
- absolute_path = param_path.absolute()
302
319
 
303
320
  if create_files:
304
- _create_parameter_files(absolute_path)
321
+ _create_parameter_files(task=task)
305
322
 
306
323
  @dataclass
307
324
  class CryonirspTestingParameters:
@@ -339,7 +356,7 @@ def cryonirsp_testing_parameters_factory(
339
356
  cryonirsp_fringe_correction_lowpass_cutoff_period: float = 40.0
340
357
  cryonirsp_linearization_thresholds_ci: FileParameter = field(
341
358
  default_factory=lambda: FileParameter(
342
- param_path=str(absolute_path / LINEARIZATION_THRESHOLDS_CI)
359
+ object_key=LINEARIZATION_THRESHOLDS_CI,
343
360
  )
344
361
  )
345
362
  cryonirsp_linearization_polyfit_coeffs_ci: list[float] = field(
@@ -347,7 +364,7 @@ def cryonirsp_testing_parameters_factory(
347
364
  )
348
365
  cryonirsp_linearization_thresholds_sp: FileParameter = field(
349
366
  default_factory=lambda: FileParameter(
350
- param_path=str(absolute_path / LINEARIZATION_THRESHOLDS_SP)
367
+ object_key=LINEARIZATION_THRESHOLDS_SP,
351
368
  )
352
369
  )
353
370
  cryonirsp_linearization_polyfit_coeffs_sp: list[float] = field(
@@ -364,10 +381,14 @@ def cryonirsp_testing_parameters_factory(
364
381
  WavelengthParameter(values=(-4.26, -4.26, -4.26, -4.26))
365
382
  )
366
383
  cryonirsp_solar_atlas: FileParameter = field(
367
- default_factory=lambda: FileParameter(param_path=str(absolute_path / SOLAR_ATLAS))
384
+ default_factory=lambda: FileParameter(
385
+ object_key=SOLAR_ATLAS,
386
+ )
368
387
  )
369
388
  cryonirsp_telluric_atlas: FileParameter = field(
370
- default_factory=lambda: FileParameter(param_path=str(absolute_path / TELLURIC_ATLAS))
389
+ default_factory=lambda: FileParameter(
390
+ object_key=TELLURIC_ATLAS,
391
+ )
371
392
  )
372
393
  cryonirsp_camera_mirror_focal_length_mm: float = 932.0
373
394
  cryonirsp_pixel_pitch_micron: float = 18.0
@@ -387,11 +408,15 @@ def testing_obs_ip_start_time() -> str:
387
408
 
388
409
  @pytest.fixture(scope="session")
389
410
  def input_dataset_document_simple_parameters_part():
390
- def get_input_dataset_parameters_part(parameters):
411
+ """Convert a dataclass of parameterValues into an actual input dataset parameters part."""
412
+
413
+ def make_input_dataset_parameters_part(parameters):
391
414
  parameters_list = []
392
415
 
393
416
  value_id = randint(1000, 2000)
394
417
  for pn, pv in asdict(parameters).items():
418
+ if isinstance(pv, FileParameter):
419
+ pv = pv.model_dump()
395
420
  values = [
396
421
  {
397
422
  "parameterValueId": value_id,
@@ -403,7 +428,7 @@ def input_dataset_document_simple_parameters_part():
403
428
  parameters_list.append(parameter)
404
429
  return parameters_list
405
430
 
406
- return get_input_dataset_parameters_part
431
+ return make_input_dataset_parameters_part
407
432
 
408
433
 
409
434
  @pytest.fixture(scope="session")
@@ -412,6 +437,8 @@ def assign_input_dataset_doc_to_task(
412
437
  testing_wavelength,
413
438
  testing_obs_ip_start_time,
414
439
  ):
440
+ """Load the parameters the way that tasks load the parameters in task init."""
441
+
415
442
  def update_task(
416
443
  task,
417
444
  parameters,
@@ -419,12 +446,15 @@ def assign_input_dataset_doc_to_task(
419
446
  arm_id: str = "SP",
420
447
  obs_ip_start_time=testing_obs_ip_start_time,
421
448
  ):
422
- doc_path = task.scratch.workflow_base_path / "dataset_doc.json"
423
- with open(doc_path, "w") as f:
424
- f.write(json.dumps(input_dataset_document_simple_parameters_part(parameters)))
425
- task.tag(doc_path, CryonirspTag.input_dataset_parameters())
449
+ task.write(
450
+ data=InputDatasetPartDocumentList(
451
+ doc_list=input_dataset_document_simple_parameters_part(parameters)
452
+ ),
453
+ tags=CryonirspTag.input_dataset_parameters(),
454
+ encoder=basemodel_encoder,
455
+ )
426
456
  task.parameters = parameter_class(
427
- task.input_dataset_parameters,
457
+ scratch=task.scratch,
428
458
  wavelength=testing_wavelength,
429
459
  arm_id=arm_id,
430
460
  obs_ip_start_time=obs_ip_start_time,
@@ -8,6 +8,8 @@ from random import randint
8
8
  import asdf
9
9
  from astropy.io import fits
10
10
  from dkist_header_validator import spec122_validator
11
+ from dkist_processing_common.codecs.basemodel import basemodel_encoder
12
+ from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
11
13
  from dkist_processing_common.models.task_name import TaskName
12
14
  from dkist_processing_common.tasks import TransferTrialData
13
15
  from dkist_processing_common.tasks import WorkflowTaskBase
@@ -18,7 +20,7 @@ from dkist_processing_cryonirsp.models.tags import CryonirspTag
18
20
  from dkist_processing_cryonirsp.models.task_name import CryonirspTaskName
19
21
  from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
20
22
  from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
21
-
23
+ from dkist_processing_cryonirsp.tests.conftest import FileParameter
22
24
 
23
25
  # These are the workflow versions of the polyfit coefficient parameters
24
26
  WORKFLOW_LINEARIZATION_POLYFIT_COEFFS_CI = [
@@ -424,13 +426,13 @@ class LoadInstPolCal(LoadTaskTags):
424
426
  def translate_122_to_214_task(suffix: str):
425
427
  class Translate122To214L0(WorkflowTaskBase):
426
428
  def run(self) -> None:
427
- raw_dir = Path(self.scratch.scratch_base_path) / f"CRYO-NIRSP{self.recipe_run_id:03n}"
429
+ raw_dir = Path(self.scratch.scratch_base_path) / f"CRYONIRSP{self.recipe_run_id:03n}"
428
430
  if not os.path.exists(self.scratch.workflow_base_path):
429
431
  os.makedirs(self.scratch.workflow_base_path)
430
432
 
431
433
  if not raw_dir.exists():
432
434
  raise FileNotFoundError(
433
- f"Expected to find a raw CRYO-NIRSP{self.recipe_run_id:03n} folder in {self.scratch.scratch_base_path}"
435
+ f"Expected to find a raw CRYONIRSP{self.recipe_run_id:03n} folder in {self.scratch.scratch_base_path}"
434
436
  )
435
437
 
436
438
  for file in raw_dir.glob(f"*.{suffix}"):
@@ -465,26 +467,38 @@ def translate_122_to_214_task(suffix: str):
465
467
  def create_input_dataset_parameter_document(param_path: Path):
466
468
  class CreateInputDatasetParameterDocument(WorkflowTaskBase):
467
469
  def run(self) -> None:
468
- doc_path = self.scratch.workflow_base_path / "input_dataset_parameters.json"
469
- with open(doc_path, "w") as f:
470
- f.write(json.dumps(self.input_dataset_document_simple_parameters_part))
471
- self.tag(doc_path, CryonirspTag.input_dataset_parameters())
472
- logger.info(f"Wrote input dataset doc to {doc_path}")
470
+ relative_path = "input_dataset_parameters.json"
471
+ self.write(
472
+ data=InputDatasetPartDocumentList(
473
+ doc_list=self.input_dataset_document_simple_parameters_part
474
+ ),
475
+ relative_path=relative_path,
476
+ tags=CryonirspTag.input_dataset_parameters(),
477
+ encoder=basemodel_encoder,
478
+ )
479
+ logger.info(f"Wrote input dataset parameter doc to {relative_path}")
480
+ self.copy_and_tag_parameter_files(param_path=param_path)
481
+ logger.info(f"Copied input dataset parameter files from {param_path}")
473
482
 
474
483
  @property
475
- def input_dataset_document_simple_parameters_part(self):
476
- parameters_list = []
477
- value_id = randint(1000, 2000)
478
- param_class = cryonirsp_testing_parameters_factory(
479
- param_path=param_path, create_files=False
480
- )
484
+ def parameter_dict(self):
485
+ param_class = cryonirsp_testing_parameters_factory(task=self, create_files=False)
481
486
  params = asdict(
482
487
  param_class(
483
488
  cryonirsp_linearization_polyfit_coeffs_ci=WORKFLOW_LINEARIZATION_POLYFIT_COEFFS_CI,
484
489
  cryonirsp_linearization_polyfit_coeffs_sp=WORKFLOW_LINEARIZATION_POLYFIT_COEFFS_SP,
485
490
  )
486
491
  )
492
+ return params
493
+
494
+ @property
495
+ def input_dataset_document_simple_parameters_part(self):
496
+ parameters_list = []
497
+ value_id = randint(1000, 2000)
498
+ params = self.parameter_dict
487
499
  for pn, pv in params.items():
500
+ if isinstance(pv, FileParameter):
501
+ pv = pv.model_dump()
488
502
  values = [
489
503
  {
490
504
  "parameterValueId": value_id,
@@ -497,6 +511,22 @@ def create_input_dataset_parameter_document(param_path: Path):
497
511
 
498
512
  return parameters_list
499
513
 
514
+ def copy_and_tag_parameter_files(self, param_path=param_path):
515
+ # Copy parameter files from param_path to a place where they can be tagged
516
+ params = self.parameter_dict
517
+ destination_dir = Path(self.scratch.workflow_base_path) / "parameters"
518
+ destination_dir.mkdir(parents=True, exist_ok=True)
519
+ for pn, pv in params.items():
520
+ if isinstance(pv, FileParameter):
521
+ file_path = next(param_path.rglob(pv.file_pointer.object_key))
522
+ if file_path.parent != destination_dir:
523
+ shutil.copy(file_path, destination_dir)
524
+ logger.info(
525
+ f"Copied parameter file for '{pn}' to {destination_dir / file_path}"
526
+ )
527
+ file_path = next(destination_dir.rglob(pv.file_pointer.object_key))
528
+ self.tag(path=file_path, tags=pv.file_pointer.tag)
529
+
500
530
  return CreateInputDatasetParameterDocument
501
531
 
502
532
 
@@ -43,7 +43,7 @@ def compute_bad_pixel_map_task(
43
43
  task.scratch = WorkflowFileSystem(
44
44
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
45
45
  )
46
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
46
+ param_class = cryonirsp_testing_parameters_factory(task)
47
47
  assign_input_dataset_doc_to_task(task, param_class())
48
48
  start_time = datetime.now()
49
49
  ds = CryonirspHeadersValidCISolarGainFrames(
@@ -38,7 +38,7 @@ def compute_beam_boundaries_task(
38
38
  task.scratch = WorkflowFileSystem(
39
39
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
40
40
  )
41
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
41
+ param_class = cryonirsp_testing_parameters_factory(task)
42
42
  assign_input_dataset_doc_to_task(task, param_class())
43
43
  # Create fake bad pixel map
44
44
  task.write(
@@ -70,7 +70,7 @@ def ci_science_calibration_task(
70
70
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
71
71
  )
72
72
 
73
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
73
+ param_class = cryonirsp_testing_parameters_factory(task)
74
74
  assign_input_dataset_doc_to_task(task, param_class())
75
75
 
76
76
  # Need a beam boundary file
@@ -4,7 +4,6 @@ import numpy as np
4
4
  import pytest
5
5
  from dkist_processing_common._util.scratch import WorkflowFileSystem
6
6
  from dkist_processing_common.tasks import WorkflowTaskBase
7
- from dkist_processing_common.tasks.mixin.input_dataset import InputDatasetMixin
8
7
  from dkist_processing_common.tests.conftest import FakeGQLClient
9
8
 
10
9
  from dkist_processing_cryonirsp.models.constants import CryonirspConstants
@@ -21,7 +20,7 @@ column_error_bad_pixel_map = base_bad_pixel_map.copy()
21
20
  column_error_bad_pixel_map[:, 6] = 1
22
21
 
23
22
 
24
- class BadPixelMapTask(WorkflowTaskBase, CorrectionsMixin, InputDatasetMixin):
23
+ class BadPixelMapTask(WorkflowTaskBase, CorrectionsMixin):
25
24
  constants: CryonirspConstants
26
25
 
27
26
  @property
@@ -58,7 +57,7 @@ def bad_pixel_mask_task(
58
57
  task.scratch = WorkflowFileSystem(
59
58
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
60
59
  )
61
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
60
+ param_class = cryonirsp_testing_parameters_factory(task)
62
61
  assign_input_dataset_doc_to_task(task, param_class())
63
62
  yield task
64
63
  finally:
@@ -42,7 +42,7 @@ def cryo_science_task(
42
42
  task.scratch = WorkflowFileSystem(
43
43
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
44
44
  )
45
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
45
+ param_class = cryonirsp_testing_parameters_factory(task)
46
46
  assign_input_dataset_doc_to_task(task, param_class())
47
47
  yield task
48
48
  finally:
@@ -52,7 +52,7 @@ def sp_dark_calibration_task(
52
52
  task.scratch = WorkflowFileSystem(
53
53
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
54
54
  )
55
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
55
+ param_class = cryonirsp_testing_parameters_factory(task)
56
56
  assign_input_dataset_doc_to_task(task, param_class())
57
57
 
58
58
  # Create fake beam border intermediate arrays
@@ -137,7 +137,7 @@ def ci_dark_calibration_task(
137
137
  task.scratch = WorkflowFileSystem(
138
138
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
139
139
  )
140
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
140
+ param_class = cryonirsp_testing_parameters_factory(task)
141
141
  assign_input_dataset_doc_to_task(task, param_class())
142
142
 
143
143
  # Need a beam boundary file
@@ -43,7 +43,7 @@ def ci_solar_gain_calibration_task(
43
43
  task.scratch = WorkflowFileSystem(
44
44
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
45
45
  )
46
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
46
+ param_class = cryonirsp_testing_parameters_factory(task)
47
47
  assign_input_dataset_doc_to_task(task, param_class())
48
48
  # Need a beam boundary file
49
49
  task.write(
@@ -126,7 +126,7 @@ def lamp_calibration_task(
126
126
  task.scratch = WorkflowFileSystem(
127
127
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
128
128
  )
129
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
129
+ param_class = cryonirsp_testing_parameters_factory(task)
130
130
  assign_input_dataset_doc_to_task(task, param_class())
131
131
  # Need a beam boundary file
132
132
  task.write(
@@ -172,7 +172,7 @@ def ci_instrument_polarization_calibration_task(
172
172
  task.scratch = WorkflowFileSystem(
173
173
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
174
174
  )
175
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
175
+ param_class = cryonirsp_testing_parameters_factory(task)
176
176
  assign_input_dataset_doc_to_task(task, param_class())
177
177
  mocker.patch(
178
178
  "dkist_processing_cryonirsp.tasks.instrument_polarization.PolcalFitter",
@@ -247,7 +247,10 @@ def ci_instrument_polarization_calibration_task_with_no_data(
247
247
  workflow_version="VX.Y",
248
248
  ) as task:
249
249
  try: # This try... block is here to make sure the dbs get cleaned up if there's a failure in the fixture
250
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
250
+ task.scratch = WorkflowFileSystem(
251
+ scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
252
+ )
253
+ param_class = cryonirsp_testing_parameters_factory(task)
251
254
  assign_input_dataset_doc_to_task(task, param_class())
252
255
  yield task
253
256
  finally:
@@ -291,7 +294,7 @@ def sp_instrument_polarization_calibration_task(
291
294
  task.scratch = WorkflowFileSystem(
292
295
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
293
296
  )
294
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
297
+ param_class = cryonirsp_testing_parameters_factory(task)
295
298
  assign_input_dataset_doc_to_task(task, param_class())
296
299
  mocker.patch(
297
300
  "dkist_processing_cryonirsp.tasks.instrument_polarization.PolcalFitter",
@@ -370,7 +373,10 @@ def sp_instrument_polarization_calibration_task_with_no_data(
370
373
  workflow_version="VX.Y",
371
374
  ) as task:
372
375
  try: # This try... block is here to make sure the dbs get cleaned up if there's a failure in the fixture
373
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
376
+ task.scratch = WorkflowFileSystem(
377
+ scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
378
+ )
379
+ param_class = cryonirsp_testing_parameters_factory(task)
374
380
  assign_input_dataset_doc_to_task(task, param_class())
375
381
  yield task
376
382
  finally:
@@ -56,7 +56,7 @@ def linearity_correction(
56
56
  task.scratch = WorkflowFileSystem(
57
57
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
58
58
  )
59
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
59
+ param_class = cryonirsp_testing_parameters_factory(task)
60
60
  assign_input_dataset_doc_to_task(task, param_class())
61
61
  ds = CryonirspHeadersValidNonLinearizedFrames(
62
62
  arm_id=arm_id,
@@ -5,6 +5,8 @@ import numpy as np
5
5
  import pytest
6
6
  from astropy.units import Quantity
7
7
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
+ from dkist_processing_common.codecs.array import array_decoder
9
+ from dkist_processing_common.models.input_dataset import InputDatasetFilePointer
8
10
  from hypothesis import example
9
11
  from hypothesis import given
10
12
  from hypothesis import HealthCheck
@@ -19,7 +21,6 @@ from dkist_processing_cryonirsp.parsers.optical_density_filters import (
19
21
  from dkist_processing_cryonirsp.tasks.cryonirsp_base import CryonirspTaskBase
20
22
  from dkist_processing_cryonirsp.tests.conftest import cryonirsp_testing_parameters_factory
21
23
  from dkist_processing_cryonirsp.tests.conftest import CryonirspConstantsDb
22
- from dkist_processing_cryonirsp.tests.conftest import FileParameter
23
24
  from dkist_processing_cryonirsp.tests.conftest import TestingParameters
24
25
 
25
26
  # The property names of all parameters on `CryonirspParsingParameters`
@@ -46,16 +47,15 @@ def basic_science_task_with_parameter_mixin(
46
47
  ...
47
48
 
48
49
  init_cryonirsp_constants_db(recipe_run_id, CryonirspConstantsDb())
49
- task = Task(
50
+ with Task(
50
51
  recipe_run_id=recipe_run_id,
51
52
  workflow_name="parse_cryonirsp_input_data",
52
53
  workflow_version="VX.Y",
53
- )
54
- try: # This try... block is here to make sure the dbs get cleaned up if there's a failure in the fixture
54
+ ) as task:
55
55
  task.scratch = WorkflowFileSystem(
56
- scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
56
+ scratch_base_path=tmp_path, recipe_run_id=task.recipe_run_id
57
57
  )
58
- test_params = cryonirsp_testing_parameters_factory(param_path=tmp_path)
58
+ test_params = cryonirsp_testing_parameters_factory(task)
59
59
  param_dict = test_params()
60
60
  assign_input_dataset_doc_to_task(
61
61
  task,
@@ -65,7 +65,6 @@ def basic_science_task_with_parameter_mixin(
65
65
  obs_ip_start_time=obs_ip_start_time,
66
66
  )
67
67
  yield task, param_dict
68
- finally:
69
68
  task._purge()
70
69
 
71
70
  return make_task
@@ -94,10 +93,11 @@ def test_filter_parameters(basic_science_task_with_parameter_mixin, wave):
94
93
  }
95
94
  for param in expected:
96
95
  assert getattr(task_params, param) == expected[param]
96
+ task._purge()
97
97
 
98
98
 
99
99
  def _is_file_param(param_value: Any) -> bool:
100
- return isinstance(param_value, dict) and "is_file" in param_value and param_value["is_file"]
100
+ return isinstance(param_value, InputDatasetFilePointer)
101
101
 
102
102
 
103
103
  def test_file_parameters(basic_science_task_with_parameter_mixin):
@@ -115,18 +115,11 @@ def test_file_parameters(basic_science_task_with_parameter_mixin):
115
115
  for pn, pv in asdict(test_params).items():
116
116
  # We want to test only file parameters
117
117
  if _is_file_param(pv):
118
- pn_no_prefix = pn.removeprefix("cryonirsp_")
119
- # If the param name is an attribute in task_params, then load it directly
120
- if hasattr(task_params, pn_no_prefix):
121
- param_name = pn_no_prefix
122
- actual = getattr(task_params, param_name)
123
- # if the param name is not a task param attribute, then check that we can load the param
124
- # using the value defined in the input_dataset_parameters list of the task param object
125
- else:
126
- param_dict = task_params._find_most_recent_past_value(pn)
127
- actual = task_params._load_param_value_from_numpy_save(param_dict)
128
- # Now get the expected value using the param value dict from the testing params
129
- expected = np.load(pv["param_path"])
118
+ # Get the parameter value the way the tasks do
119
+ param_obj = task_params._find_most_recent_past_value(pn)
120
+ actual = task_params._load_param_value_from_numpy_save(param_obj=param_obj)
121
+ # Now get the expected value using the tag in the value from the testing params
122
+ expected = next(task.read(tags=pv.file_pointer.tag, decoder=array_decoder))
130
123
  # Compare the actual and expected values
131
124
  assert np.array_equal(actual, expected)
132
125
 
@@ -178,12 +171,11 @@ def test_arm_parameters(basic_science_task_with_parameter_mixin, arm_id):
178
171
  suffix = f"_{arm_id}".casefold()
179
172
  if _is_arm_param(pn, task_params, test_params, single_arm_only=arm_id):
180
173
  generic_param_name = pn.removeprefix("cryonirsp_").removesuffix(suffix)
181
-
182
174
  actual = getattr(task_params, generic_param_name)
183
175
  expected = getattr(test_params, pn)
184
- if isinstance(expected, FileParameter) and expected.is_file:
185
- expected = task_params._load_param_value_from_numpy_save(asdict(expected))
186
- assert np.array_equal(expected, actual)
176
+ if isinstance(expected, InputDatasetFilePointer):
177
+ expected_array = task_params._load_param_value_from_numpy_save(param_obj=expected)
178
+ assert np.array_equal(expected_array, actual)
187
179
  elif isinstance(actual, np.ndarray):
188
180
  assert expected == actual.tolist()
189
181
  else:
@@ -349,7 +349,7 @@ def parse_linearized_task(
349
349
  task.scratch = WorkflowFileSystem(
350
350
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
351
351
  )
352
- param_dataclass = cryonirsp_testing_parameters_factory(param_path=tmp_path)
352
+ param_dataclass = cryonirsp_testing_parameters_factory(task)
353
353
  assign_input_dataset_doc_to_task(
354
354
  task,
355
355
  param_dataclass(),
@@ -38,7 +38,7 @@ def compute_beam_boundaries_task(
38
38
  task.scratch = WorkflowFileSystem(
39
39
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
40
40
  )
41
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
41
+ param_class = cryonirsp_testing_parameters_factory(task)
42
42
  assign_input_dataset_doc_to_task(task, param_class())
43
43
  # Create fake bad pixel map
44
44
  task.write(
@@ -57,7 +57,7 @@ def sp_dispersion_axis_correction_task(
57
57
  task.scratch = WorkflowFileSystem(
58
58
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
59
59
  )
60
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
60
+ param_class = cryonirsp_testing_parameters_factory(task)
61
61
  assign_input_dataset_doc_to_task(task, param_class())
62
62
 
63
63
  # Create fake solar charcteristic spectra
@@ -52,7 +52,7 @@ def geometric_calibration_task_that_completes(
52
52
  task.scratch = WorkflowFileSystem(
53
53
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
54
54
  )
55
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
55
+ param_class = cryonirsp_testing_parameters_factory(task)
56
56
  assign_input_dataset_doc_to_task(task, param_class())
57
57
 
58
58
  task.angles = [0.0, 0.0]
@@ -188,7 +188,7 @@ def geometric_calibration_task_with_simple_raw_data(
188
188
  task.scratch = WorkflowFileSystem(
189
189
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
190
190
  )
191
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
191
+ param_class = cryonirsp_testing_parameters_factory(task)
192
192
  assign_input_dataset_doc_to_task(task, param_class())
193
193
 
194
194
  # Create the intermediate frames needed
@@ -67,7 +67,7 @@ def sp_science_calibration_task(
67
67
  task.scratch = WorkflowFileSystem(
68
68
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
69
69
  )
70
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
70
+ param_class = cryonirsp_testing_parameters_factory(task)
71
71
  assign_input_dataset_doc_to_task(task, param_class())
72
72
  # Create fake bad pixel map
73
73
  task.write(
@@ -51,7 +51,7 @@ def solar_gain_calibration_task_that_completes(
51
51
  task.scratch = WorkflowFileSystem(
52
52
  scratch_base_path=tmp_path, recipe_run_id=recipe_run_id
53
53
  )
54
- param_class = cryonirsp_testing_parameters_factory(param_path=tmp_path)
54
+ param_class = cryonirsp_testing_parameters_factory(task)
55
55
  assign_input_dataset_doc_to_task(
56
56
  task, param_class(cryonirsp_fringe_correction_on=fringe_correction)
57
57
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-cryonirsp
3
- Version: 1.7.6
3
+ Version: 1.7.7rc1
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.4.0
17
17
  Requires-Dist: astropy==7.0.2
18
18
  Requires-Dist: dkist-fits-specifications==4.17.0
19
19
  Requires-Dist: dkist-header-validator==5.2.1
20
- Requires-Dist: dkist-processing-common==10.8.3
20
+ Requires-Dist: dkist-processing-common==10.8.4rc1
21
21
  Requires-Dist: dkist-processing-math==2.2.0
22
22
  Requires-Dist: dkist-processing-pac==3.1.1
23
23
  Requires-Dist: dkist-spectral-lines==3.0.0
@@ -88,7 +88,7 @@ Requires-Dist: WTForms==3.2.1; extra == "frozen"
88
88
  Requires-Dist: Werkzeug==2.2.3; extra == "frozen"
89
89
  Requires-Dist: aioftp==0.25.1; extra == "frozen"
90
90
  Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
91
- Requires-Dist: aiohttp==3.12.4; extra == "frozen"
91
+ Requires-Dist: aiohttp==3.12.6; extra == "frozen"
92
92
  Requires-Dist: aiosignal==1.3.2; extra == "frozen"
93
93
  Requires-Dist: alembic==1.16.1; extra == "frozen"
94
94
  Requires-Dist: amqp==5.3.1; extra == "frozen"
@@ -114,16 +114,16 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
114
114
  Requires-Dist: asgiref==3.8.1; extra == "frozen"
115
115
  Requires-Dist: asteval==1.0.6; extra == "frozen"
116
116
  Requires-Dist: astropy==7.0.2; extra == "frozen"
117
- Requires-Dist: astropy-iers-data==0.2025.5.26.0.37.21; extra == "frozen"
117
+ Requires-Dist: astropy-iers-data==0.2025.6.2.0.38.23; extra == "frozen"
118
118
  Requires-Dist: asyncpg==0.30.0; extra == "frozen"
119
119
  Requires-Dist: attrs==25.3.0; extra == "frozen"
120
120
  Requires-Dist: babel==2.17.0; extra == "frozen"
121
121
  Requires-Dist: billiard==4.2.1; extra == "frozen"
122
122
  Requires-Dist: blinker==1.9.0; extra == "frozen"
123
- Requires-Dist: boto3==1.38.26; extra == "frozen"
124
- Requires-Dist: botocore==1.38.26; extra == "frozen"
123
+ Requires-Dist: boto3==1.38.27; extra == "frozen"
124
+ Requires-Dist: botocore==1.38.27; extra == "frozen"
125
125
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
126
- Requires-Dist: celery==5.5.2; extra == "frozen"
126
+ Requires-Dist: celery==5.5.3; extra == "frozen"
127
127
  Requires-Dist: certifi==2025.4.26; extra == "frozen"
128
128
  Requires-Dist: cffi==1.17.1; extra == "frozen"
129
129
  Requires-Dist: charset-normalizer==3.4.2; extra == "frozen"
@@ -144,9 +144,9 @@ Requires-Dist: dacite==1.9.2; extra == "frozen"
144
144
  Requires-Dist: decorator==5.2.1; extra == "frozen"
145
145
  Requires-Dist: dill==0.4.0; extra == "frozen"
146
146
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
147
- Requires-Dist: dkist-processing-common==10.8.3; extra == "frozen"
147
+ Requires-Dist: dkist-processing-common==10.8.4rc1; extra == "frozen"
148
148
  Requires-Dist: dkist-processing-core==5.1.1; extra == "frozen"
149
- Requires-Dist: dkist-processing-cryonirsp==1.7.6; extra == "frozen"
149
+ Requires-Dist: dkist-processing-cryonirsp==1.7.7rc1; extra == "frozen"
150
150
  Requires-Dist: dkist-processing-math==2.2.0; extra == "frozen"
151
151
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
152
152
  Requires-Dist: dkist-service-configuration==2.2; extra == "frozen"
@@ -165,7 +165,8 @@ Requires-Dist: globus-sdk==3.56.1; extra == "frozen"
165
165
  Requires-Dist: google-re2==1.1.20240702; extra == "frozen"
166
166
  Requires-Dist: googleapis-common-protos==1.70.0; extra == "frozen"
167
167
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
168
- Requires-Dist: grpcio==1.71.0; extra == "frozen"
168
+ Requires-Dist: greenlet==3.2.2; extra == "frozen"
169
+ Requires-Dist: grpcio==1.72.1; extra == "frozen"
169
170
  Requires-Dist: gunicorn==23.0.0; extra == "frozen"
170
171
  Requires-Dist: h11==0.16.0; extra == "frozen"
171
172
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
@@ -182,7 +183,7 @@ Requires-Dist: jsonschema==4.24.0; extra == "frozen"
182
183
  Requires-Dist: jsonschema-specifications==2025.4.1; extra == "frozen"
183
184
  Requires-Dist: jupyter_core==5.8.1; extra == "frozen"
184
185
  Requires-Dist: kiwisolver==1.4.8; extra == "frozen"
185
- Requires-Dist: kombu==5.5.3; extra == "frozen"
186
+ Requires-Dist: kombu==5.5.4; extra == "frozen"
186
187
  Requires-Dist: largestinteriorrectangle==0.2.1; extra == "frozen"
187
188
  Requires-Dist: lazy-object-proxy==1.11.0; extra == "frozen"
188
189
  Requires-Dist: lazy_loader==0.4; extra == "frozen"
@@ -229,7 +230,7 @@ Requires-Dist: platformdirs==4.3.8; extra == "frozen"
229
230
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
230
231
  Requires-Dist: prison==0.2.1; extra == "frozen"
231
232
  Requires-Dist: proglog==0.1.12; extra == "frozen"
232
- Requires-Dist: prometheus_client==0.22.0; extra == "frozen"
233
+ Requires-Dist: prometheus_client==0.22.1; extra == "frozen"
233
234
  Requires-Dist: prompt_toolkit==3.0.51; extra == "frozen"
234
235
  Requires-Dist: propcache==0.3.1; extra == "frozen"
235
236
  Requires-Dist: protobuf==5.29.5; extra == "frozen"
@@ -273,12 +274,12 @@ Requires-Dist: talus==1.1.0; extra == "frozen"
273
274
  Requires-Dist: tenacity==9.1.2; extra == "frozen"
274
275
  Requires-Dist: termcolor==3.1.0; extra == "frozen"
275
276
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
276
- Requires-Dist: tifffile==2025.5.26; extra == "frozen"
277
+ Requires-Dist: tifffile==2025.6.1; extra == "frozen"
277
278
  Requires-Dist: tornado==6.5.1; extra == "frozen"
278
279
  Requires-Dist: tqdm==4.67.1; extra == "frozen"
279
280
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
280
281
  Requires-Dist: typing-inspection==0.4.1; extra == "frozen"
281
- Requires-Dist: typing_extensions==4.13.2; extra == "frozen"
282
+ Requires-Dist: typing_extensions==4.14.0; extra == "frozen"
282
283
  Requires-Dist: tzdata==2025.2; extra == "frozen"
283
284
  Requires-Dist: uc-micro-py==1.0.3; extra == "frozen"
284
285
  Requires-Dist: uncertainties==3.2.3; extra == "frozen"
@@ -1,4 +1,5 @@
1
1
  changelog/.gitempty,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ changelog/190.misc.rst,sha256=Ui1HIOqxD8Sq5JvBIOZei90X9d2Wh7G3TyaVbLlhuR0,73
2
3
  dkist_processing_cryonirsp/__init__.py,sha256=Z6-kB7fXXUI-F7Vz1HnEaja2h8qgH9IZExRl1lUxvZg,350
3
4
  dkist_processing_cryonirsp/config.py,sha256=xNkUNJ1BeBxJX881mTCIEbirZlD5_5txpV1QqkbfRM0,507
4
5
  dkist_processing_cryonirsp/codecs/__init__.py,sha256=du1iitvsudSSOMENSywXmXSLOlvIocJsPbvfEcyqFNc,159
@@ -7,7 +8,7 @@ dkist_processing_cryonirsp/models/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZ
7
8
  dkist_processing_cryonirsp/models/beam_boundaries.py,sha256=FyiLd2iCWA6TUojeGaqQ_ULxvakDY13VxqUJVlmYvV0,1159
8
9
  dkist_processing_cryonirsp/models/constants.py,sha256=aKhSu4Hp0kKRgO6muMli2W4DC3zP0sEm4TzK--hyJXQ,11062
9
10
  dkist_processing_cryonirsp/models/exposure_conditions.py,sha256=slFq5-Qz4fRpJKDBabbm4evPWLQVYmT-Uf9rk7nI734,813
10
- dkist_processing_cryonirsp/models/parameters.py,sha256=yMb-r4hseQqiDwcSCeCpNERL9X-uoZEMPAa29J5c94o,13130
11
+ dkist_processing_cryonirsp/models/parameters.py,sha256=icAnYJvVCSJiNoT9SuYTZfDx6imwcq7QwfCY3_qQAIY,13154
11
12
  dkist_processing_cryonirsp/models/tags.py,sha256=ac0MnYlsn8-w7IioOvWeo7mBaDKE9o9TlRpxCH1OsRc,5743
12
13
  dkist_processing_cryonirsp/models/task_name.py,sha256=xK4AKwgOx2uANbjhr0Q5Q3R9iPxLfkVKxWYY8wWjKhE,439
13
14
  dkist_processing_cryonirsp/parsers/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZpHRxF_ZAxuaKYL7o,12
@@ -29,50 +30,50 @@ dkist_processing_cryonirsp/tasks/bad_pixel_map.py,sha256=z-ACCwHqiRANsR7gkkCIycP
29
30
  dkist_processing_cryonirsp/tasks/beam_boundaries_base.py,sha256=-sKmBDuNq22QZBe6Vdu5aaiOxeikM6bICpkZ4lBP--g,9688
30
31
  dkist_processing_cryonirsp/tasks/ci_beam_boundaries.py,sha256=pgpi6m0T1E1dkJ8btu45DMK--e7aCJ0wdEnZyD3g7MU,1889
31
32
  dkist_processing_cryonirsp/tasks/ci_science.py,sha256=VCt5E2gqL2j5fseSfsqCyCKK5hCGpXiR0XCBC74BiKQ,7366
32
- dkist_processing_cryonirsp/tasks/cryonirsp_base.py,sha256=7cMXOI7yQ8xTAtJg4ZkhBDej4AknHKBIvw8e9mCiRBw,1814
33
+ dkist_processing_cryonirsp/tasks/cryonirsp_base.py,sha256=8o-OzqKFvSOBu_VF1W8xHO1Pp4oapke1Zq-8VprU9pQ,1702
33
34
  dkist_processing_cryonirsp/tasks/dark.py,sha256=h_n1SU2bFiK7lp4vAKxv2ETKHYRODUp2KkH0YXjgFq8,4936
34
35
  dkist_processing_cryonirsp/tasks/gain.py,sha256=1aMeSOupmw-WQNb9O2Qx4uxGae0ilZDszo9xbf38Y_g,10438
35
36
  dkist_processing_cryonirsp/tasks/instrument_polarization.py,sha256=xS2jcngnibDCLlh7t1TmHM_TjYQT5wEeeEbRHBzr48M,23293
36
37
  dkist_processing_cryonirsp/tasks/l1_output_data.py,sha256=3RFt493MEJxdpF81gcp8FDlQ8vGZ0GXEDYQFWIufumI,1554
37
38
  dkist_processing_cryonirsp/tasks/linearity_correction.py,sha256=n9vK9cT7NWkpAM9J6wOYDj95Kh0va_ot-hdncd7ye0Y,24199
38
39
  dkist_processing_cryonirsp/tasks/make_movie_frames.py,sha256=I7s3Tml6AevHci0kTPF71mNjXNl3wlG57Jh7ghnndeg,13928
39
- dkist_processing_cryonirsp/tasks/parse.py,sha256=5TTlUcPEVZs67cOJ-Pwknfo-kk99HCltb8doSjFLlO4,13217
40
+ dkist_processing_cryonirsp/tasks/parse.py,sha256=PRpXQ0KdY-kSSTJ5Q4z6NWku9HiuEwZ1wqXutBoB1Fk,13109
40
41
  dkist_processing_cryonirsp/tasks/quality_metrics.py,sha256=jyx2YZzLb5sVxbJ_H6PaKQqZbyZy9QuuLqu18jsnncQ,11447
41
42
  dkist_processing_cryonirsp/tasks/science_base.py,sha256=YYUQUfLeuzDb6E5TecOH22orTN4-hWocoYaGOq6Zoro,18637
42
43
  dkist_processing_cryonirsp/tasks/sp_beam_boundaries.py,sha256=XI3iepNe04xaU4ilqxrlOgYDkv5I5rUc0RXEE1Rwt0o,10296
43
- dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py,sha256=ZfUpsija9T7ZCm111u-iCxbcx7WxHWd_OklVCfYbjXg,19465
44
+ dkist_processing_cryonirsp/tasks/sp_dispersion_axis_correction.py,sha256=EaUanXd_uvuTxGuWEfFMFRls7S0GPu_P35H3LKqfrj0,19366
44
45
  dkist_processing_cryonirsp/tasks/sp_geometric.py,sha256=_M_e_blz4mKDIUWSasonnOzbZ6EUbHp9pAZXQx4zY7U,24387
45
46
  dkist_processing_cryonirsp/tasks/sp_science.py,sha256=QWyAEkXYamAcWxi62-tVD6ptuQ6vt8yIzuCKzCIYW20,13643
46
47
  dkist_processing_cryonirsp/tasks/sp_solar_gain.py,sha256=d4UABsMxyzCMduVxptHY_TCGqS-l-W5iuhW7HJwVPkA,21024
47
- dkist_processing_cryonirsp/tasks/write_l1.py,sha256=t9mOTlbzcoHNJvU5MNLEfZhYeQulfvUbbJUzwXFDT7M,41543
48
+ dkist_processing_cryonirsp/tasks/write_l1.py,sha256=ebZCWr5i6LUXJ38oXSq22zRKNP7sdBuxbJAEV5oJM84,41435
48
49
  dkist_processing_cryonirsp/tasks/mixin/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZpHRxF_ZAxuaKYL7o,12
49
50
  dkist_processing_cryonirsp/tasks/mixin/corrections.py,sha256=rcKmckBJkoExcX0XW1i3OZzuMu1i7tX5Hgwy15chU50,6566
50
51
  dkist_processing_cryonirsp/tasks/mixin/shift_measurements.py,sha256=7ToSy9uOJ_JrFfd-X225wqW_laq4xoRJkBiAPanfb_g,11225
51
52
  dkist_processing_cryonirsp/tests/__init__.py,sha256=m6UekKftTahNJ3W5K3mZSz4Y4ZZpHRxF_ZAxuaKYL7o,12
52
- dkist_processing_cryonirsp/tests/conftest.py,sha256=YlfQY_0WeNpn7HUYRD4Ak0xw1ZTEubdq4l86KDEov-Q,17463
53
+ dkist_processing_cryonirsp/tests/conftest.py,sha256=oeZw5KXlvm_UasgFc3uzxD2Z2uTg5-rJu7Do9wIKJKU,18131
53
54
  dkist_processing_cryonirsp/tests/header_models.py,sha256=klif5-UzTzvAqpj5cJCdLtyodJZS_awhy53NUHyucTw,20601
54
55
  dkist_processing_cryonirsp/tests/test_assemble_movie.py,sha256=YNZINIFXR9kZBlE1AIvjlVmwwhZJeVYOOPk7Q8IVkcI,6222
55
56
  dkist_processing_cryonirsp/tests/test_assemble_qualilty.py,sha256=upk-oUqVBHGK3F0eemshLpAPrnfh9mbeuZXow4E1Rmc,16859
56
- dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py,sha256=4Lrcvbzzzczkz1mEXVDb_qc1cGPIWTrSZQFv4KiDhn4,4870
57
- dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py,sha256=lkFuFVZHDDbNkOZKeJC1inOkR0VByZVaATbdHDmr3Ew,4573
58
- dkist_processing_cryonirsp/tests/test_ci_science.py,sha256=dFFn49nxhv2iocZ5uGeXegJU8c-csDYaKjumvcOMxZI,14418
59
- dkist_processing_cryonirsp/tests/test_corrections.py,sha256=5nY8MccZcNDyQYV8IEokqtY_YrP08TZ-H7WQNioK-A0,4650
60
- dkist_processing_cryonirsp/tests/test_cryo_base.py,sha256=6uOUgJPehr6XwZUE0InVDKJllJsTvfuG-VM5PdKlf0Q,6662
57
+ dkist_processing_cryonirsp/tests/test_bad_pixel_maps.py,sha256=TsUIaCWQolOJCU2YOhxxmXWby6j3NhCkB2W2jDgb9OM,4855
58
+ dkist_processing_cryonirsp/tests/test_ci_beam_boundaries.py,sha256=h-v79qi4VohcXCHFX2h_ANbkAeikOT5G9Ef-hA1rJJc,4558
59
+ dkist_processing_cryonirsp/tests/test_ci_science.py,sha256=PryW50DZaKiTcLaSvhfaolrosXObj7-O1jweCJeLM_Y,14403
60
+ dkist_processing_cryonirsp/tests/test_corrections.py,sha256=Q_prvaXKdmpebEa5d05s86pcGB9VTjsGB0g5AfEB2Ks,4536
61
+ dkist_processing_cryonirsp/tests/test_cryo_base.py,sha256=9dSQ_3j_n04NX-nbdAFWhdHGwMe720Vyx0Jxof9eySo,6647
61
62
  dkist_processing_cryonirsp/tests/test_cryo_constants.py,sha256=OanX9nPCvhFe9mBV0SRCsClqiSaHi8YxgG2HoESrzTk,2827
62
- dkist_processing_cryonirsp/tests/test_dark.py,sha256=ZGbjFP2IOL1gyC3rjde43xMS-vWStHDL9md1bhXt8Lg,11699
63
- dkist_processing_cryonirsp/tests/test_gain.py,sha256=BSeum2N0vUIP12AiPB2Qhw-zgvd3EkGkK8UX9FEchuA,11290
64
- dkist_processing_cryonirsp/tests/test_instrument_polarization.py,sha256=AB97NvR4VIivSu7X-GBKDrOJNx_LNbCQ_7mk0T3Eezo,19505
65
- dkist_processing_cryonirsp/tests/test_linearity_correction.py,sha256=HRIi8fKfZvyaOOgEkO3JGz1j2ceoecrw70mmiszcGio,9365
63
+ dkist_processing_cryonirsp/tests/test_dark.py,sha256=9WQDoVw1qwaqK-iaVfjOKbIusr4SJrR1rGiPZAWhNIU,11669
64
+ dkist_processing_cryonirsp/tests/test_gain.py,sha256=KAkIXJnifVx7CHnKBY-7EhhUi5b8t5U8wBOL9F8M0gM,11260
65
+ dkist_processing_cryonirsp/tests/test_instrument_polarization.py,sha256=COiopx4ueVPeyQO12eVP125nqBrgsnCa0ddo8y6Qrxs,19711
66
+ dkist_processing_cryonirsp/tests/test_linearity_correction.py,sha256=r1EwZsW1yO0B0ERGn1kDciZKvjipN_LVHFXR-XIJmP0,9350
66
67
  dkist_processing_cryonirsp/tests/test_make_movie_frames.py,sha256=WznHp9dV2-jbJYzRniCAIbSHCGNc0SpSzyVDSrZkYd4,4904
67
- dkist_processing_cryonirsp/tests/test_parameters.py,sha256=CbaEnxx3HGZmqZJbNzQ2IJpIg6AKlK26BT3TXUMGYAE,11438
68
- dkist_processing_cryonirsp/tests/test_parse.py,sha256=7JqkxzMDPId6E8l5PD96_6IkdMWsnKKdzmZq49vC8W4,56021
68
+ dkist_processing_cryonirsp/tests/test_parameters.py,sha256=yVyUmLst26Ws-_21lS727HkP08DcQh9kycZb9ICsHGY,10948
69
+ dkist_processing_cryonirsp/tests/test_parse.py,sha256=qop-scwjeN70xdgFxDiHuPjDy4b4rnA11W8Q5BkcL9o,56006
69
70
  dkist_processing_cryonirsp/tests/test_quality.py,sha256=qrJBYjnZOhmQ4vjDcDV3FVSUAdktFgs-pRaHX4cf2G0,8129
70
- dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py,sha256=b_o5k94zQEgG7fdMkuDHs1iyq6NFxv_NLYS7FvtlZQI,4895
71
- dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py,sha256=Fha0q4yJGftQ0l815FO78K1SmXtA-qbhQ3-Jk5iiBDE,6156
72
- dkist_processing_cryonirsp/tests/test_sp_geometric.py,sha256=TQTR26SG6OQE00adx5lTdmb943HmXI3C6tLT-weZCM8,15721
71
+ dkist_processing_cryonirsp/tests/test_sp_beam_boundaries.py,sha256=tLQToWStb4Yu2jEHkzv2FyifO_QPwegzttyNKjX8JPk,4880
72
+ dkist_processing_cryonirsp/tests/test_sp_dispersion_axis_correction.py,sha256=Z0t_v85ATh9ntlngUa8v_hqs0ZCd4nkakpHNeCVRwiE,6141
73
+ dkist_processing_cryonirsp/tests/test_sp_geometric.py,sha256=ZnusZvxsJ8YX-rg0R1azg7-DPr4vz5q2NE030bsuWXo,15691
73
74
  dkist_processing_cryonirsp/tests/test_sp_make_movie_frames.py,sha256=Kn8U_HzaaHW2bHmBxsotdjmpBhd_Ft6pLWhVsMWIJE8,5322
74
- dkist_processing_cryonirsp/tests/test_sp_science.py,sha256=fffX8Fi-k7dYOax_5nvocbq8CXMYklmtSLfZRSe7Dsw,19850
75
- dkist_processing_cryonirsp/tests/test_sp_solar.py,sha256=xSIKs8yylB18dZA75jTb-yOvCE2CMbESXCFwyHK3J_c,10023
75
+ dkist_processing_cryonirsp/tests/test_sp_science.py,sha256=fCmyXh27nxKU_N90yW1WqPGq1mZ6ODrw0UvtMB1elHI,19835
76
+ dkist_processing_cryonirsp/tests/test_sp_solar.py,sha256=IdZZ2RvCwKk6_q_JKo93nFFk0HJ74yUxHxq9W1LppJE,10008
76
77
  dkist_processing_cryonirsp/tests/test_trial_create_quality_report.py,sha256=x8dRAMyawQVYZQGsuO36DMZxK4L13hZBUn86qbhJiNk,2805
77
78
  dkist_processing_cryonirsp/tests/test_workflows.py,sha256=2a-TUMbVEyNjHYNyzo2UQMLg5PSaEx6iV9hOsGp-Mck,291
78
79
  dkist_processing_cryonirsp/tests/test_write_l1.py,sha256=VDSRU7j4eylYlmYQYKn32Od751NmG7qzhpoaFYFWQDM,17729
@@ -80,7 +81,7 @@ dkist_processing_cryonirsp/tests/local_trial_workflows/__init__.py,sha256=47DEQp
80
81
  dkist_processing_cryonirsp/tests/local_trial_workflows/l0_cals_only.py,sha256=nWs3Qg3f4DHqN_6JBKDaR5q9TncgR_PeRWw3_bUBZWA,20110
81
82
  dkist_processing_cryonirsp/tests/local_trial_workflows/l0_to_l1.py,sha256=KaxxMeo_sOMWgekNVkPsTJt6XWU2Ov7rnMkBtG_sKcc,23938
82
83
  dkist_processing_cryonirsp/tests/local_trial_workflows/linearize_only.py,sha256=kl9yrE1EbgxNn__x4q0WYoZIvS8zefcOPbQQdxB4_ZE,3280
83
- dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py,sha256=LCvmP2KAiq0BVqMj-ThFWxAwo4oNs9hZRibQevRj4nU,19329
84
+ dkist_processing_cryonirsp/tests/local_trial_workflows/local_trial_helpers.py,sha256=Il68RtY4z8UIHsVfpSrNoeMN2GP8xHFIAxxsnCHd1Tc,20961
84
85
  dkist_processing_cryonirsp/workflows/__init__.py,sha256=iEbV3oiKmkfmdZjeNJxqw08IIZnYSroq-2b-ARpkLFQ,112
85
86
  dkist_processing_cryonirsp/workflows/ci_l0_processing.py,sha256=T-BOvDDWHzs5BDH5ctSBjzGgD6Xez52AnDXsH5_7Bms,3788
86
87
  dkist_processing_cryonirsp/workflows/sp_l0_processing.py,sha256=A74av8E8mL9WzI4vWI2GbhVrRFQ7JCMlGAioEjXkkCU,4219
@@ -105,7 +106,7 @@ docs/requirements_table.rst,sha256=FaqSag9kPi77gWPhzeo_tFEhRFjb3qUuNqqQe1K76NM,2
105
106
  docs/scientific_changelog.rst,sha256=01AWBSHg8zElnodCgAq-hMxhk9CkX5rtEENx4iz0sjI,300
106
107
  docs/sp_science_calibration.rst,sha256=XL-H_hyzqwPHYNW3j-muItX_hGqMi-gjFRQbHp60LlU,2997
107
108
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
108
- dkist_processing_cryonirsp-1.7.6.dist-info/METADATA,sha256=88X-HncpYnuPWwscYjJuW2dm2OQZ_xAc6mCmZJAiNGc,21937
109
- dkist_processing_cryonirsp-1.7.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
110
- dkist_processing_cryonirsp-1.7.6.dist-info/top_level.txt,sha256=Sm9b1ddKnsF9Bh3mqDOct1Sm7k8I9aN7vGHgpmu-MlQ,51
111
- dkist_processing_cryonirsp-1.7.6.dist-info/RECORD,,
109
+ dkist_processing_cryonirsp-1.7.7rc1.dist-info/METADATA,sha256=_o5dSZWDPtc-y9xqyLLQjcpunj8H8NX4P7PQ59G_R8E,21997
110
+ dkist_processing_cryonirsp-1.7.7rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
111
+ dkist_processing_cryonirsp-1.7.7rc1.dist-info/top_level.txt,sha256=Sm9b1ddKnsF9Bh3mqDOct1Sm7k8I9aN7vGHgpmu-MlQ,51
112
+ dkist_processing_cryonirsp-1.7.7rc1.dist-info/RECORD,,