dkist-processing-dlnirsp 0.32.8__py3-none-any.whl → 0.33.0__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.
Files changed (32) hide show
  1. dkist_processing_dlnirsp/models/constants.py +6 -0
  2. dkist_processing_dlnirsp/models/parameters.py +33 -3
  3. dkist_processing_dlnirsp/parsers/task.py +2 -25
  4. dkist_processing_dlnirsp/parsers/time.py +2 -2
  5. dkist_processing_dlnirsp/tasks/__init__.py +1 -2
  6. dkist_processing_dlnirsp/tasks/movie.py +1121 -0
  7. dkist_processing_dlnirsp/tasks/parse.py +13 -8
  8. dkist_processing_dlnirsp/tasks/solar.py +129 -30
  9. dkist_processing_dlnirsp/tests/conftest.py +46 -7
  10. dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py +21 -18
  11. dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py +21 -18
  12. dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py +21 -18
  13. dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py +1 -1
  14. dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py +2 -0
  15. dkist_processing_dlnirsp/tests/test_movie.py +141 -0
  16. dkist_processing_dlnirsp/tests/test_parameters.py +8 -0
  17. dkist_processing_dlnirsp/tests/test_parse.py +10 -0
  18. dkist_processing_dlnirsp/tests/test_science.py +0 -9
  19. dkist_processing_dlnirsp/tests/test_solar.py +114 -17
  20. dkist_processing_dlnirsp/tests/test_wavelength_calibration.py +4 -1
  21. dkist_processing_dlnirsp/workflows/l0_processing.py +6 -8
  22. dkist_processing_dlnirsp/workflows/trial_workflow.py +7 -7
  23. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/METADATA +52 -35
  24. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/RECORD +28 -30
  25. docs/gain.rst +7 -3
  26. dkist_processing_dlnirsp/tasks/assemble_movie.py +0 -150
  27. dkist_processing_dlnirsp/tasks/make_movie_frames.py +0 -156
  28. dkist_processing_dlnirsp/tests/test_assemble_movie.py +0 -169
  29. dkist_processing_dlnirsp/tests/test_make_movie_frames.py +0 -98
  30. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/WHEEL +0 -0
  31. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/entry_points.txt +0 -0
  32. {dkist_processing_dlnirsp-0.32.8.dist-info → dkist_processing_dlnirsp-0.33.0.dist-info}/top_level.txt +0 -0
@@ -12,9 +12,11 @@ from dkist_processing_dlnirsp.models.tags import DlnirspTag
12
12
  from dkist_processing_dlnirsp.tasks.solar import SolarCalibration
13
13
  from dkist_processing_dlnirsp.tests.conftest import DlnirspTestingConstants
14
14
  from dkist_processing_dlnirsp.tests.conftest import DlnirspTestingParameters
15
+ from dkist_processing_dlnirsp.tests.conftest import tag_on_modstate
15
16
  from dkist_processing_dlnirsp.tests.conftest import write_dark_frames_to_task
16
17
  from dkist_processing_dlnirsp.tests.conftest import write_geometric_calibration_to_task
17
18
  from dkist_processing_dlnirsp.tests.conftest import write_lamp_gain_frames_to_task
19
+ from dkist_processing_dlnirsp.tests.conftest import write_simple_frames_to_task
18
20
  from dkist_processing_dlnirsp.tests.conftest import write_solar_gain_frames_to_task
19
21
 
20
22
 
@@ -30,7 +32,7 @@ def lamp_signal() -> float:
30
32
 
31
33
  @pytest.fixture
32
34
  def solar_signal() -> float:
33
- return 2000.0
35
+ return 62831.85
34
36
 
35
37
 
36
38
  @pytest.fixture
@@ -52,11 +54,29 @@ def make_lamp_data(lamp_signal):
52
54
 
53
55
 
54
56
  @pytest.fixture
55
- def make_solar_data(solar_signal, dark_signal, lamp_signal):
57
+ def solar_stokes_stack(solar_signal) -> np.ndarray:
58
+ I = solar_signal
59
+ Q = np.random.random() - 0.5
60
+ U = np.random.random() - 0.5
61
+ V = np.random.random() - 0.5
62
+
63
+ return np.array([I, Q, U, V])
64
+
65
+
66
+ @pytest.fixture
67
+ def modulated_solar_signal(solar_stokes_stack, modulation_matrix) -> np.ndarray:
68
+ return modulation_matrix @ solar_stokes_stack
69
+
70
+
71
+ @pytest.fixture
72
+ def make_solar_data(
73
+ modulated_solar_signal, solar_signal, dark_signal, lamp_signal, is_polarimetric
74
+ ):
56
75
  def make_array(frame: Spec122Dataset):
57
76
  shape = frame.array_shape[1:]
58
77
  modstate = frame.header()["DLN__015"]
59
- return (np.ones(shape) * solar_signal + 100 * modstate) * lamp_signal + dark_signal
78
+ true_signal = modulated_solar_signal[modstate - 1] if is_polarimetric else solar_signal
79
+ return (np.ones(shape) * true_signal) * lamp_signal + dark_signal
60
80
 
61
81
  return make_array
62
82
 
@@ -121,13 +141,20 @@ def solar_task_for_basic_corrections(
121
141
  shifts_and_scales,
122
142
  constants_class_with_different_num_slits,
123
143
  reference_wave_axis,
144
+ modulation_matrix,
145
+ make_full_demodulation_matrix,
146
+ is_polarimetric,
124
147
  ):
125
148
  solar_exp_time = 1.0
126
- num_modstates = 4
149
+ num_modstates = modulation_matrix.shape[0] if is_polarimetric else 1
127
150
  array_shape = jband_group_id_array.shape
128
151
  link_constants_db(
129
152
  recipe_run_id=recipe_run_id,
130
- constants_obj=DlnirspTestingConstants(SOLAR_GAIN_EXPOSURE_TIMES=(solar_exp_time,)),
153
+ constants_obj=DlnirspTestingConstants(
154
+ SOLAR_GAIN_EXPOSURE_TIMES=(solar_exp_time,),
155
+ NUM_MODSTATES=num_modstates,
156
+ POLARIMETER_MODE="Full Stokes" if is_polarimetric else "Stokes I",
157
+ ),
131
158
  )
132
159
 
133
160
  with SolarCalibration(
@@ -172,6 +199,7 @@ def solar_task_for_basic_corrections(
172
199
  DlnirspTag.task_solar_gain(),
173
200
  DlnirspTag.exposure_time(solar_exp_time),
174
201
  ],
202
+ tag_func=tag_on_modstate,
175
203
  data_func=make_solar_data,
176
204
  )
177
205
  shift_dict, scale_dict = shifts_and_scales
@@ -179,6 +207,16 @@ def solar_task_for_basic_corrections(
179
207
  task, shift_dict=shift_dict, scale_dict=scale_dict, wave_axis=reference_wave_axis
180
208
  )
181
209
 
210
+ if is_polarimetric:
211
+ write_simple_frames_to_task(
212
+ task,
213
+ task_type=TaskName.polcal.value,
214
+ array_shape=array_shape,
215
+ num_modstates=1,
216
+ tags=[DlnirspTag.intermediate(), DlnirspTag.task_demodulation_matrices()],
217
+ data_func=make_full_demodulation_matrix,
218
+ )
219
+
182
220
  yield task, num_modstates, num_solar_frames
183
221
  task._purge()
184
222
 
@@ -272,8 +310,15 @@ def solar_task_with_no_data(
272
310
  task._purge()
273
311
 
274
312
 
313
+ @pytest.mark.parametrize(
314
+ "is_polarimetric", [pytest.param(True, id="polarimetric"), pytest.param(False, id="intensity")]
315
+ )
275
316
  def test_compute_average_gain(
276
- solar_task_for_basic_corrections, solar_signal, write_drifted_group_ids_to_task
317
+ solar_task_for_basic_corrections,
318
+ is_polarimetric,
319
+ solar_signal,
320
+ lamp_signal,
321
+ write_drifted_group_ids_to_task,
277
322
  ):
278
323
  """
279
324
  Given: A SolarCalibration task with associated solar gain, lamp, geometric, and dark frames
@@ -284,22 +329,36 @@ def test_compute_average_gain(
284
329
 
285
330
  write_drifted_group_ids_to_task(task)
286
331
 
287
- task.compute_average_corrected_gains()
332
+ pol_tag = []
333
+ if is_polarimetric:
334
+ task.compute_demodulated_I_gains()
335
+ pol_tag.append(DlnirspTag.stokes("I"))
336
+ else:
337
+ task.compute_intensity_only_avg_gains()
288
338
 
289
- tags = [DlnirspTag.intermediate_frame(), DlnirspTag.task("SC_FULL_CORR")]
339
+ tags = [DlnirspTag.intermediate_frame(), DlnirspTag.task("SC_FULL_CORR")] + pol_tag
290
340
  arrays = list(task.read(tags=tags, decoder=fits_array_decoder))
291
341
 
342
+ if not is_polarimetric:
343
+ assert task.count(tags=tags + [DlnirspTag.stokes("I")]) == 0
344
+
292
345
  assert len(arrays) == 1
293
346
  avg_array = arrays[0]
294
347
  assert avg_array.shape == task.rectified_array_shape
295
- expected_value = np.mean(solar_signal + 100 * np.arange(1, num_modstates + 1))
296
- np.testing.assert_equal(avg_array[~np.isnan(avg_array)], expected_value)
348
+ expected_value = solar_signal
349
+ np.testing.assert_array_almost_equal(avg_array[~np.isnan(avg_array)], expected_value)
297
350
 
298
351
  dark_only_list = list(
299
- task.read(tags=[DlnirspTag.intermediate_frame(), DlnirspTag.task("SC_DARK_ONLY")])
352
+ task.read(
353
+ tags=[DlnirspTag.intermediate_frame(), DlnirspTag.task("SC_DARK_ONLY")],
354
+ decoder=fits_array_decoder,
355
+ )
300
356
  )
301
357
  assert len(dark_only_list) == 1
302
- assert dark_only_list[0].exists()
358
+ expected_dark_only_value = solar_signal * lamp_signal
359
+ np.testing.assert_array_almost_equal(
360
+ dark_only_list[0][~np.isnan(dark_only_list[0])], expected_dark_only_value
361
+ )
303
362
 
304
363
 
305
364
  def test_compute_characteristic_spectra(solar_task_with_full_corr, groups_by_slitbeam):
@@ -326,8 +385,16 @@ def test_compute_characteristic_spectra(solar_task_with_full_corr, groups_by_sli
326
385
  np.testing.assert_equal(rectified_group[~np.isnan(rectified_group)], slitbeam_median)
327
386
 
328
387
 
388
+ @pytest.mark.parametrize(
389
+ "is_polarimetric", [pytest.param(True, id="polarimetric"), pytest.param(False, id="intensity")]
390
+ )
329
391
  def test_solar_task_completes(
330
- solar_task_for_basic_corrections, write_drifted_group_ids_to_task, mocker, fake_gql_client
392
+ solar_task_for_basic_corrections,
393
+ write_drifted_group_ids_to_task,
394
+ is_polarimetric,
395
+ modulation_matrix,
396
+ mocker,
397
+ fake_gql_client,
331
398
  ):
332
399
  """
333
400
  Given: A SolarCalibration task with necessary starting data
@@ -341,16 +408,46 @@ def test_solar_task_completes(
341
408
 
342
409
  write_drifted_group_ids_to_task(task)
343
410
 
411
+ # Just make sure we set up the test correctly
412
+ assert num_solar_frames == modulation_matrix.shape[0] if is_polarimetric else 1
413
+
344
414
  task()
345
415
 
346
- solar_cal_list = list(
347
- task.read(
348
- tags=[DlnirspTag.intermediate_frame(), DlnirspTag.task_solar_gain()],
416
+ # Make sure the correct code paths were taken; intensity-only data intermediates don't get the `stokes("I")` tag
417
+ assert task.count(tags=[DlnirspTag.intermediate_frame(), DlnirspTag.task("SC_DARK_ONLY")]) == 1
418
+ assert task.count(tags=[DlnirspTag.intermediate_frame(), DlnirspTag.task("SC_FULL_CORR")]) == 1
419
+ if not is_polarimetric:
420
+ assert (
421
+ task.count(
422
+ tags=[
423
+ DlnirspTag.intermediate_frame(),
424
+ DlnirspTag.task("SC_DARK_ONLY"),
425
+ DlnirspTag.stokes("I"),
426
+ ]
427
+ )
428
+ == 0
349
429
  )
350
- )
430
+ assert (
431
+ task.count(
432
+ tags=[
433
+ DlnirspTag.intermediate_frame(),
434
+ DlnirspTag.task("SC_FULL_CORR"),
435
+ DlnirspTag.stokes("I"),
436
+ ]
437
+ )
438
+ == 0
439
+ )
440
+
441
+ tags = [DlnirspTag.intermediate_frame(), DlnirspTag.task_solar_gain()]
442
+ if is_polarimetric:
443
+ tags.append(DlnirspTag.stokes("I"))
444
+ solar_cal_list = list(task.read(tags=tags))
351
445
  assert len(solar_cal_list) == 1
352
446
  assert solar_cal_list[0].exists()
353
447
 
448
+ if not is_polarimetric:
449
+ assert task.count(tags=tags + [DlnirspTag.stokes("I")]) == 0
450
+
354
451
  quality_files = list(task.read(tags=[DlnirspTag.quality("TASK_TYPES")]))
355
452
  assert len(quality_files) == 1
356
453
  file = quality_files[0]
@@ -16,6 +16,7 @@ from dkist_processing_common.codecs.json import json_encoder
16
16
  from dkist_processing_common.models.metric_code import MetricCode
17
17
  from scipy.ndimage import gaussian_filter1d
18
18
  from solar_wavelength_calibration import Atlas
19
+ from solar_wavelength_calibration import DownloadConfig
19
20
  from sunpy.coordinates import HeliocentricInertial
20
21
 
21
22
  from dkist_processing_dlnirsp.models.constants import DlnirspConstants
@@ -141,7 +142,9 @@ def resolving_power(arm_id: str) -> float:
141
142
 
142
143
  @pytest.fixture(scope="session")
143
144
  def solar_atlas() -> Atlas:
144
- return Atlas()
145
+ config = DlnirspTestingParameters().dlnirsp_wavecal_atlas_download_config
146
+ config = DownloadConfig.model_validate(config)
147
+ return Atlas(config=config)
145
148
 
146
149
 
147
150
  @pytest.fixture
@@ -9,7 +9,6 @@ from dkist_processing_common.tasks import TransferL1Data
9
9
  from dkist_processing_core import ResourceQueue
10
10
  from dkist_processing_core import Workflow
11
11
 
12
- from dkist_processing_dlnirsp.tasks import AssembleDlnirspMovie
13
12
  from dkist_processing_dlnirsp.tasks import BadPixelCalibration
14
13
  from dkist_processing_dlnirsp.tasks import DarkCalibration
15
14
  from dkist_processing_dlnirsp.tasks import DlnirspAssembleQualityData
@@ -21,7 +20,7 @@ from dkist_processing_dlnirsp.tasks import IfuDriftCalibration
21
20
  from dkist_processing_dlnirsp.tasks import InstrumentPolarizationCalibration
22
21
  from dkist_processing_dlnirsp.tasks import LampCalibration
23
22
  from dkist_processing_dlnirsp.tasks import LinearityCorrection
24
- from dkist_processing_dlnirsp.tasks import MakeDlnirspMovieFrames
23
+ from dkist_processing_dlnirsp.tasks import MakeDlnirspMovie
25
24
  from dkist_processing_dlnirsp.tasks import ParseL0DlnirspLinearizedData
26
25
  from dkist_processing_dlnirsp.tasks import ParseL0DlnirspRampData
27
26
  from dkist_processing_dlnirsp.tasks import ScienceCalibration
@@ -47,22 +46,21 @@ l0_pipeline.add_node(task=LampCalibration, upstreams=DarkCalibration)
47
46
  l0_pipeline.add_node(task=BadPixelCalibration, upstreams=[LampCalibration, IfuDriftCalibration])
48
47
  l0_pipeline.add_node(task=GeometricCalibration, upstreams=[IfuDriftCalibration, LampCalibration])
49
48
  l0_pipeline.add_node(task=WavelengthCalibration, upstreams=GeometricCalibration)
50
- l0_pipeline.add_node(task=SolarCalibration, upstreams=GeometricCalibration)
51
49
  l0_pipeline.add_node(
52
50
  task=InstrumentPolarizationCalibration,
53
51
  resource_queue=ResourceQueue.HIGH_MEMORY,
54
52
  upstreams=BadPixelCalibration,
55
53
  )
56
54
  l0_pipeline.add_node(
57
- task=ScienceCalibration, upstreams=[InstrumentPolarizationCalibration, SolarCalibration]
55
+ task=SolarCalibration, upstreams=[GeometricCalibration, InstrumentPolarizationCalibration]
58
56
  )
57
+ l0_pipeline.add_node(task=ScienceCalibration, upstreams=SolarCalibration)
59
58
  l0_pipeline.add_node(
60
59
  task=DlnirspWriteL1Frame, upstreams=[WavelengthCalibration, ScienceCalibration]
61
60
  )
62
61
 
63
62
  # Movie flow
64
- l0_pipeline.add_node(task=MakeDlnirspMovieFrames, upstreams=ScienceCalibration)
65
- l0_pipeline.add_node(task=AssembleDlnirspMovie, upstreams=MakeDlnirspMovieFrames)
63
+ l0_pipeline.add_node(task=MakeDlnirspMovie, upstreams=[ScienceCalibration, WavelengthCalibration])
66
64
 
67
65
  # Quality flow
68
66
  l0_pipeline.add_node(task=DlnirspL0QualityMetrics, upstreams=ParseL0DlnirspLinearizedData)
@@ -76,11 +74,11 @@ l0_pipeline.add_node(
76
74
  # Output flow
77
75
  l0_pipeline.add_node(
78
76
  task=TransferL1Data,
79
- upstreams=[DlnirspWriteL1Frame, AssembleDlnirspMovie, DlnirspAssembleQualityData],
77
+ upstreams=[DlnirspWriteL1Frame, MakeDlnirspMovie, DlnirspAssembleQualityData],
80
78
  )
81
79
  l0_pipeline.add_node(
82
80
  task=SubmitDatasetMetadata,
83
- upstreams=[DlnirspWriteL1Frame, AssembleDlnirspMovie],
81
+ upstreams=[DlnirspWriteL1Frame, MakeDlnirspMovie],
84
82
  )
85
83
  l0_pipeline.add_node(
86
84
  task=PublishCatalogAndQualityMessages, upstreams=[TransferL1Data, SubmitDatasetMetadata]
@@ -16,7 +16,6 @@ from dkist_processing_common.tasks import TrialTeardown
16
16
  from dkist_processing_core import ResourceQueue
17
17
  from dkist_processing_core import Workflow
18
18
 
19
- from dkist_processing_dlnirsp.tasks import AssembleDlnirspMovie
20
19
  from dkist_processing_dlnirsp.tasks import BadPixelCalibration
21
20
  from dkist_processing_dlnirsp.tasks import DarkCalibration
22
21
  from dkist_processing_dlnirsp.tasks import DlnirspAssembleQualityData
@@ -28,7 +27,7 @@ from dkist_processing_dlnirsp.tasks import IfuDriftCalibration
28
27
  from dkist_processing_dlnirsp.tasks import InstrumentPolarizationCalibration
29
28
  from dkist_processing_dlnirsp.tasks import LampCalibration
30
29
  from dkist_processing_dlnirsp.tasks import LinearityCorrection
31
- from dkist_processing_dlnirsp.tasks import MakeDlnirspMovieFrames
30
+ from dkist_processing_dlnirsp.tasks import MakeDlnirspMovie
32
31
  from dkist_processing_dlnirsp.tasks import ParseL0DlnirspLinearizedData
33
32
  from dkist_processing_dlnirsp.tasks import ParseL0DlnirspRampData
34
33
  from dkist_processing_dlnirsp.tasks import ScienceCalibration
@@ -55,22 +54,23 @@ trial_pipeline.add_node(task=LampCalibration, upstreams=DarkCalibration)
55
54
  trial_pipeline.add_node(task=BadPixelCalibration, upstreams=[LampCalibration, IfuDriftCalibration])
56
55
  trial_pipeline.add_node(task=GeometricCalibration, upstreams=[IfuDriftCalibration, LampCalibration])
57
56
  trial_pipeline.add_node(task=WavelengthCalibration, upstreams=GeometricCalibration)
58
- trial_pipeline.add_node(task=SolarCalibration, upstreams=GeometricCalibration)
59
57
  trial_pipeline.add_node(
60
58
  task=InstrumentPolarizationCalibration,
61
59
  resource_queue=ResourceQueue.HIGH_MEMORY,
62
60
  upstreams=BadPixelCalibration,
63
61
  )
64
62
  trial_pipeline.add_node(
65
- task=ScienceCalibration, upstreams=[InstrumentPolarizationCalibration, SolarCalibration]
63
+ task=SolarCalibration, upstreams=[GeometricCalibration, InstrumentPolarizationCalibration]
66
64
  )
65
+ trial_pipeline.add_node(task=ScienceCalibration, upstreams=SolarCalibration)
67
66
  trial_pipeline.add_node(
68
67
  task=DlnirspWriteL1Frame, upstreams=[WavelengthCalibration, ScienceCalibration]
69
68
  )
70
69
 
71
70
  # Movie flow
72
- trial_pipeline.add_node(task=MakeDlnirspMovieFrames, upstreams=ScienceCalibration)
73
- trial_pipeline.add_node(task=AssembleDlnirspMovie, upstreams=MakeDlnirspMovieFrames)
71
+ trial_pipeline.add_node(
72
+ task=MakeDlnirspMovie, upstreams=[ScienceCalibration, WavelengthCalibration]
73
+ )
74
74
 
75
75
  # Quality flow
76
76
  trial_pipeline.add_node(task=DlnirspL0QualityMetrics, upstreams=ParseL0DlnirspLinearizedData)
@@ -96,7 +96,7 @@ trial_pipeline.add_node(
96
96
  trial_pipeline.add_node(
97
97
  task=TransferTrialData,
98
98
  upstreams=[
99
- AssembleDlnirspMovie,
99
+ MakeDlnirspMovie,
100
100
  CreateTrialDatasetInventory,
101
101
  CreateTrialAsdf,
102
102
  CreateTrialQualityReport,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 0.32.8
3
+ Version: 0.33.0
4
4
  Summary: Science processing code for the DLNIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Requires-Python: >=3.12
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==11.9.1
16
+ Requires-Dist: dkist-processing-common==11.9.2
17
17
  Requires-Dist: dkist-processing-math==2.2.1
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.2.1
@@ -26,7 +26,8 @@ Requires-Dist: numba==0.61.2
26
26
  Requires-Dist: scipy==1.15.3
27
27
  Requires-Dist: peakutils==1.3.5
28
28
  Requires-Dist: sunpy==6.1.1
29
- Requires-Dist: moviepy==2.1.2
29
+ Requires-Dist: reproject==0.19.0
30
+ Requires-Dist: imageio-ffmpeg==0.6.0
30
31
  Requires-Dist: asdf==3.5.0
31
32
  Requires-Dist: solar-wavelength-calibration==2.0.0
32
33
  Provides-Extra: test
@@ -80,7 +81,9 @@ Requires-Dist: ImageIO==2.37.2; extra == "frozen"
80
81
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
81
82
  Requires-Dist: Mako==1.3.10; extra == "frozen"
82
83
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
84
+ Requires-Dist: PIMS==0.7; extra == "frozen"
83
85
  Requires-Dist: PeakUtils==1.3.5; extra == "frozen"
86
+ Requires-Dist: PyAVM==0.9.8; extra == "frozen"
84
87
  Requires-Dist: PyJWT==2.10.1; extra == "frozen"
85
88
  Requires-Dist: PyYAML==6.0.3; extra == "frozen"
86
89
  Requires-Dist: Pygments==2.19.2; extra == "frozen"
@@ -91,22 +94,22 @@ Requires-Dist: WTForms==3.2.1; extra == "frozen"
91
94
  Requires-Dist: Werkzeug==2.2.3; extra == "frozen"
92
95
  Requires-Dist: aioftp==0.27.2; extra == "frozen"
93
96
  Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
94
- Requires-Dist: aiohttp==3.13.2; extra == "frozen"
97
+ Requires-Dist: aiohttp==3.13.3; extra == "frozen"
95
98
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
96
99
  Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
97
100
  Requires-Dist: alembic==1.17.2; extra == "frozen"
98
101
  Requires-Dist: amqp==5.3.1; extra == "frozen"
99
102
  Requires-Dist: annotated-types==0.7.0; extra == "frozen"
100
- Requires-Dist: anyio==4.12.0; extra == "frozen"
103
+ Requires-Dist: anyio==4.12.1; extra == "frozen"
101
104
  Requires-Dist: apache-airflow==2.11.0; extra == "frozen"
102
- Requires-Dist: apache-airflow-providers-celery==3.14.1; extra == "frozen"
103
- Requires-Dist: apache-airflow-providers-common-compat==1.10.1; extra == "frozen"
105
+ Requires-Dist: apache-airflow-providers-celery==3.15.0; extra == "frozen"
106
+ Requires-Dist: apache-airflow-providers-common-compat==1.11.0; extra == "frozen"
104
107
  Requires-Dist: apache-airflow-providers-common-io==1.7.0; extra == "frozen"
105
- Requires-Dist: apache-airflow-providers-common-sql==1.30.1; extra == "frozen"
108
+ Requires-Dist: apache-airflow-providers-common-sql==1.30.2; extra == "frozen"
106
109
  Requires-Dist: apache-airflow-providers-fab==1.5.3; extra == "frozen"
107
110
  Requires-Dist: apache-airflow-providers-ftp==3.14.0; extra == "frozen"
108
- Requires-Dist: apache-airflow-providers-http==5.6.1; extra == "frozen"
109
- Requires-Dist: apache-airflow-providers-imap==3.10.1; extra == "frozen"
111
+ Requires-Dist: apache-airflow-providers-http==5.6.2; extra == "frozen"
112
+ Requires-Dist: apache-airflow-providers-imap==3.10.2; extra == "frozen"
110
113
  Requires-Dist: apache-airflow-providers-postgres==6.5.1; extra == "frozen"
111
114
  Requires-Dist: apache-airflow-providers-smtp==2.4.1; extra == "frozen"
112
115
  Requires-Dist: apache-airflow-providers-sqlite==4.2.0; extra == "frozen"
@@ -116,19 +119,20 @@ Requires-Dist: asdf==3.5.0; extra == "frozen"
116
119
  Requires-Dist: asdf_standard==1.4.0; extra == "frozen"
117
120
  Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
118
121
  Requires-Dist: asgiref==3.11.0; extra == "frozen"
119
- Requires-Dist: asteval==1.0.7; extra == "frozen"
122
+ Requires-Dist: asteval==1.0.8; extra == "frozen"
120
123
  Requires-Dist: astropy==7.0.2; extra == "frozen"
121
- Requires-Dist: astropy-iers-data==0.2025.12.15.0.40.51; extra == "frozen"
124
+ Requires-Dist: astropy-iers-data==0.2026.1.5.0.43.43; extra == "frozen"
125
+ Requires-Dist: astropy_healpix==1.1.2; extra == "frozen"
122
126
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
123
127
  Requires-Dist: attrs==25.4.0; extra == "frozen"
124
128
  Requires-Dist: babel==2.17.0; extra == "frozen"
125
129
  Requires-Dist: billiard==4.2.4; extra == "frozen"
126
130
  Requires-Dist: blinker==1.9.0; extra == "frozen"
127
- Requires-Dist: boto3==1.42.10; extra == "frozen"
128
- Requires-Dist: botocore==1.42.10; extra == "frozen"
131
+ Requires-Dist: boto3==1.42.23; extra == "frozen"
132
+ Requires-Dist: botocore==1.42.23; extra == "frozen"
129
133
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
130
- Requires-Dist: celery==5.6.0; extra == "frozen"
131
- Requires-Dist: certifi==2025.11.12; extra == "frozen"
134
+ Requires-Dist: celery==5.6.2; extra == "frozen"
135
+ Requires-Dist: certifi==2026.1.4; extra == "frozen"
132
136
  Requires-Dist: cffi==2.0.0; extra == "frozen"
133
137
  Requires-Dist: charset-normalizer==3.4.4; extra == "frozen"
134
138
  Requires-Dist: click==8.3.1; extra == "frozen"
@@ -136,6 +140,7 @@ Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
136
140
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
137
141
  Requires-Dist: click-repl==0.3.0; extra == "frozen"
138
142
  Requires-Dist: clickclick==20.10.2; extra == "frozen"
143
+ Requires-Dist: cloudpickle==3.1.2; extra == "frozen"
139
144
  Requires-Dist: colorama==0.4.6; extra == "frozen"
140
145
  Requires-Dist: colorlog==6.10.1; extra == "frozen"
141
146
  Requires-Dist: connexion==2.14.2; extra == "frozen"
@@ -145,56 +150,61 @@ Requires-Dist: croniter==6.0.0; extra == "frozen"
145
150
  Requires-Dist: cryptography==46.0.3; extra == "frozen"
146
151
  Requires-Dist: cycler==0.12.1; extra == "frozen"
147
152
  Requires-Dist: dacite==1.9.2; extra == "frozen"
153
+ Requires-Dist: dask==2025.12.0; extra == "frozen"
154
+ Requires-Dist: dask-image==2025.11.0; extra == "frozen"
148
155
  Requires-Dist: decorator==5.2.1; extra == "frozen"
149
156
  Requires-Dist: dill==0.4.0; extra == "frozen"
150
157
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
151
- Requires-Dist: dkist-processing-common==11.9.1; extra == "frozen"
158
+ Requires-Dist: dkist-processing-common==11.9.2; extra == "frozen"
152
159
  Requires-Dist: dkist-processing-core==6.0.1; extra == "frozen"
153
- Requires-Dist: dkist-processing-dlnirsp==0.32.8; extra == "frozen"
160
+ Requires-Dist: dkist-processing-dlnirsp==0.33.0; extra == "frozen"
154
161
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
155
162
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
156
163
  Requires-Dist: dkist-service-configuration==4.1.13; extra == "frozen"
157
164
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
158
165
  Requires-Dist: dkist_fits_specifications==4.19.0; extra == "frozen"
159
166
  Requires-Dist: dnspython==2.8.0; extra == "frozen"
167
+ Requires-Dist: donfig==0.8.1.post1; extra == "frozen"
160
168
  Requires-Dist: email-validator==2.3.0; extra == "frozen"
161
- Requires-Dist: exceptiongroup==1.3.1; extra == "frozen"
162
169
  Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
163
170
  Requires-Dist: flower==2.0.1; extra == "frozen"
164
171
  Requires-Dist: fonttools==4.61.1; extra == "frozen"
165
172
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
166
173
  Requires-Dist: fsspec==2025.12.0; extra == "frozen"
167
- Requires-Dist: globus-sdk==4.2.0; extra == "frozen"
174
+ Requires-Dist: globus-sdk==4.3.0; extra == "frozen"
175
+ Requires-Dist: google-crc32c==1.8.0; extra == "frozen"
168
176
  Requires-Dist: google-re2==1.1.20251105; extra == "frozen"
169
177
  Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
170
178
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
179
+ Requires-Dist: greenlet==3.3.0; extra == "frozen"
171
180
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
172
181
  Requires-Dist: gunicorn==23.0.0; extra == "frozen"
173
182
  Requires-Dist: h11==0.16.0; extra == "frozen"
174
183
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
175
184
  Requires-Dist: httpx==0.28.1; extra == "frozen"
176
- Requires-Dist: humanize==4.14.0; extra == "frozen"
185
+ Requires-Dist: humanize==4.15.0; extra == "frozen"
177
186
  Requires-Dist: idna==3.11; extra == "frozen"
178
187
  Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
179
- Requires-Dist: importlib_metadata==8.7.0; extra == "frozen"
188
+ Requires-Dist: importlib_metadata==8.7.1; extra == "frozen"
180
189
  Requires-Dist: inflection==0.5.1; extra == "frozen"
181
190
  Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
182
191
  Requires-Dist: jmespath==1.0.1; extra == "frozen"
183
- Requires-Dist: jsonschema==4.25.1; extra == "frozen"
192
+ Requires-Dist: jsonschema==4.26.0; extra == "frozen"
184
193
  Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
185
194
  Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
186
195
  Requires-Dist: kiwisolver==1.4.9; extra == "frozen"
187
- Requires-Dist: kombu==5.6.1; extra == "frozen"
196
+ Requires-Dist: kombu==5.6.2; extra == "frozen"
188
197
  Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
189
198
  Requires-Dist: lazy_loader==0.4; extra == "frozen"
190
199
  Requires-Dist: limits==5.6.0; extra == "frozen"
191
200
  Requires-Dist: linkify-it-py==2.0.3; extra == "frozen"
192
201
  Requires-Dist: llvmlite==0.44.0; extra == "frozen"
193
202
  Requires-Dist: lmfit==1.3.4; extra == "frozen"
203
+ Requires-Dist: locket==1.0.0; extra == "frozen"
194
204
  Requires-Dist: lockfile==0.12.2; extra == "frozen"
195
205
  Requires-Dist: loguru==0.7.3; extra == "frozen"
196
206
  Requires-Dist: markdown-it-py==4.0.0; extra == "frozen"
197
- Requires-Dist: marshmallow==3.26.1; extra == "frozen"
207
+ Requires-Dist: marshmallow==3.26.2; extra == "frozen"
198
208
  Requires-Dist: marshmallow-oneofschema==3.2.0; extra == "frozen"
199
209
  Requires-Dist: marshmallow-sqlalchemy==0.28.2; extra == "frozen"
200
210
  Requires-Dist: matplotlib==3.10.8; extra == "frozen"
@@ -202,11 +212,12 @@ Requires-Dist: mdit-py-plugins==0.5.0; extra == "frozen"
202
212
  Requires-Dist: mdurl==0.1.2; extra == "frozen"
203
213
  Requires-Dist: methodtools==0.4.7; extra == "frozen"
204
214
  Requires-Dist: more-itertools==10.8.0; extra == "frozen"
205
- Requires-Dist: moviepy==2.1.2; extra == "frozen"
215
+ Requires-Dist: moviepy==2.2.1; extra == "frozen"
206
216
  Requires-Dist: multidict==6.7.0; extra == "frozen"
207
217
  Requires-Dist: nbformat==5.10.4; extra == "frozen"
208
218
  Requires-Dist: networkx==3.6.1; extra == "frozen"
209
219
  Requires-Dist: numba==0.61.2; extra == "frozen"
220
+ Requires-Dist: numcodecs==0.16.5; extra == "frozen"
210
221
  Requires-Dist: numpy==2.2.5; extra == "frozen"
211
222
  Requires-Dist: object-clerk==1.0.0; extra == "frozen"
212
223
  Requires-Dist: opentelemetry-api==1.39.1; extra == "frozen"
@@ -237,11 +248,12 @@ Requires-Dist: ordered-set==4.1.0; extra == "frozen"
237
248
  Requires-Dist: packaging==25.0; extra == "frozen"
238
249
  Requires-Dist: pandas==2.3.3; extra == "frozen"
239
250
  Requires-Dist: parfive==2.2.0; extra == "frozen"
251
+ Requires-Dist: partd==1.4.2; extra == "frozen"
240
252
  Requires-Dist: pathlib_abc==0.5.2; extra == "frozen"
241
- Requires-Dist: pathspec==0.12.1; extra == "frozen"
253
+ Requires-Dist: pathspec==1.0.1; extra == "frozen"
242
254
  Requires-Dist: pendulum==3.1.0; extra == "frozen"
243
255
  Requires-Dist: pika==1.3.2; extra == "frozen"
244
- Requires-Dist: pillow==10.4.0; extra == "frozen"
256
+ Requires-Dist: pillow==11.3.0; extra == "frozen"
245
257
  Requires-Dist: pip==25.3; extra == "frozen"
246
258
  Requires-Dist: platformdirs==4.5.1; extra == "frozen"
247
259
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
@@ -252,14 +264,15 @@ Requires-Dist: prometheus_client==0.23.1; extra == "frozen"
252
264
  Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
253
265
  Requires-Dist: propcache==0.4.1; extra == "frozen"
254
266
  Requires-Dist: protobuf==6.33.2; extra == "frozen"
255
- Requires-Dist: psutil==7.1.3; extra == "frozen"
267
+ Requires-Dist: psutil==7.2.1; extra == "frozen"
256
268
  Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
269
+ Requires-Dist: pyarrow==22.0.0; extra == "frozen"
257
270
  Requires-Dist: pycparser==2.23; extra == "frozen"
258
271
  Requires-Dist: pydantic==2.12.5; extra == "frozen"
259
272
  Requires-Dist: pydantic-settings==2.12.0; extra == "frozen"
260
273
  Requires-Dist: pydantic_core==2.41.5; extra == "frozen"
261
274
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
262
- Requires-Dist: pyparsing==3.2.5; extra == "frozen"
275
+ Requires-Dist: pyparsing==3.3.1; extra == "frozen"
263
276
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
264
277
  Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
265
278
  Requires-Dist: python-dotenv==1.2.1; extra == "frozen"
@@ -268,6 +281,7 @@ Requires-Dist: python-slugify==8.0.4; extra == "frozen"
268
281
  Requires-Dist: pytz==2025.2; extra == "frozen"
269
282
  Requires-Dist: redis==6.4.0; extra == "frozen"
270
283
  Requires-Dist: referencing==0.37.0; extra == "frozen"
284
+ Requires-Dist: reproject==0.19.0; extra == "frozen"
271
285
  Requires-Dist: requests==2.32.5; extra == "frozen"
272
286
  Requires-Dist: requests-toolbelt==1.0.0; extra == "frozen"
273
287
  Requires-Dist: rfc3339-validator==0.1.4; extra == "frozen"
@@ -275,21 +289,23 @@ Requires-Dist: rich==13.9.4; extra == "frozen"
275
289
  Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
276
290
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
277
291
  Requires-Dist: s3transfer==0.16.0; extra == "frozen"
278
- Requires-Dist: scikit-image==0.25.2; extra == "frozen"
292
+ Requires-Dist: scikit-image==0.26.0; extra == "frozen"
279
293
  Requires-Dist: scipy==1.15.3; extra == "frozen"
280
294
  Requires-Dist: semantic-version==2.10.0; extra == "frozen"
281
295
  Requires-Dist: setproctitle==1.3.7; extra == "frozen"
282
296
  Requires-Dist: six==1.17.0; extra == "frozen"
297
+ Requires-Dist: slicerator==1.1.0; extra == "frozen"
283
298
  Requires-Dist: solar-wavelength-calibration==2.0.0; extra == "frozen"
284
299
  Requires-Dist: sqids==0.5.1; extra == "frozen"
285
- Requires-Dist: sqlparse==0.5.4; extra == "frozen"
300
+ Requires-Dist: sqlparse==0.5.5; extra == "frozen"
286
301
  Requires-Dist: sunpy==6.1.1; extra == "frozen"
287
302
  Requires-Dist: tabulate==0.9.0; extra == "frozen"
288
303
  Requires-Dist: talus==1.3.4; extra == "frozen"
289
304
  Requires-Dist: tenacity==8.5.0; extra == "frozen"
290
- Requires-Dist: termcolor==3.2.0; extra == "frozen"
305
+ Requires-Dist: termcolor==3.3.0; extra == "frozen"
291
306
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
292
- Requires-Dist: tifffile==2025.12.12; extra == "frozen"
307
+ Requires-Dist: tifffile==2025.12.20; extra == "frozen"
308
+ Requires-Dist: toolz==1.1.0; extra == "frozen"
293
309
  Requires-Dist: tornado==6.5.4; extra == "frozen"
294
310
  Requires-Dist: tqdm==4.67.1; extra == "frozen"
295
311
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
@@ -302,12 +318,13 @@ Requires-Dist: uncertainties==3.2.3; extra == "frozen"
302
318
  Requires-Dist: universal_pathlib==0.3.7; extra == "frozen"
303
319
  Requires-Dist: urllib3==2.6.2; extra == "frozen"
304
320
  Requires-Dist: vine==5.1.0; extra == "frozen"
305
- Requires-Dist: voluptuous==0.15.2; extra == "frozen"
321
+ Requires-Dist: voluptuous==0.16.0; extra == "frozen"
306
322
  Requires-Dist: wcwidth==0.2.14; extra == "frozen"
307
323
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
308
324
  Requires-Dist: wrapt==1.17.3; extra == "frozen"
309
325
  Requires-Dist: yamale==6.1.0; extra == "frozen"
310
326
  Requires-Dist: yarl==1.22.0; extra == "frozen"
327
+ Requires-Dist: zarr==3.1.5; extra == "frozen"
311
328
  Requires-Dist: zipp==3.23.0; extra == "frozen"
312
329
 
313
330
  dkist-processing-dlnirsp