dkist-processing-dlnirsp 0.32.3__py3-none-any.whl → 0.32.5__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.
@@ -2,8 +2,6 @@
2
2
 
3
3
  from enum import StrEnum
4
4
 
5
- from dkist_processing_common.models.fits_access import MetadataKey
6
-
7
5
 
8
6
  class DlnirspMetadataKey(StrEnum):
9
7
  """Controlled list of names for FITS metadata header keys."""
@@ -28,14 +28,32 @@ class LinearityCorrection(DlnirspTaskBase):
28
28
 
29
29
  record_provenance = True
30
30
 
31
- camera_sequence_regex: re.Pattern = re.compile(r"(\d*)line,(\d*)read")
31
+ valid_camera_sequence_regex: re.Pattern = re.compile(
32
+ r"^(\d*subframe)?(?(1)|(?:\d*line,\d*read,?)+)(?:,\d*line)?$"
33
+ )
32
34
  """
33
- regex pattern used to parse line-read-line values for a single coadd.
35
+ regex pattern that defines all valid camera-sample sequences.
36
+
37
+ It must start with either "Xline,Yread", which can repeat any number of times, or "Xsubframe" which must be by itself.
38
+ Either of these sequences may be padded with ",Zline" reset frames.
39
+ """
40
+
41
+ uptheramp_coadd_regex: re.Pattern = re.compile(r"(\d*)line,(\d*)read")
42
+ """
43
+ regex pattern used to parse line-read-line values for a single UpTheRamp coadd.
34
44
 
35
45
  This is where we decide that camera sequences are one or more coadd sequences, where each coadd sequence is
36
46
  "Xline,Yread". The total sequence may be padded with ",Zline" reset frames, which are not captured by this regex.
37
47
  """
38
48
 
49
+ subframe_sequence_regex: re.Pattern = re.compile(r"(\d*)subframe")
50
+ """
51
+ regex pattern used to parse coadds in SubFrame mode
52
+
53
+ Simply looks for "Xsubframe" and captures the "X". The sequence may be padded with ",Zline" reset frames, which are
54
+ not captured by this regex.
55
+ """
56
+
39
57
  def run(self):
40
58
  """
41
59
  Linearize IR camera frames or tag VIS camera frames as LINEARIZED.
@@ -110,17 +128,16 @@ class LinearityCorrection(DlnirspTaskBase):
110
128
  )
111
129
  num_coadds = len(coadd_sequence_nums_list)
112
130
 
113
- line_read_line_indices = coadd_sequence_nums_list[0]
114
- num_bias, num_read = line_read_line_indices[:2]
115
-
116
- ndr_per_coadd = num_bias + num_read
117
-
118
131
  # In `is_ramp_valid` we already confirmed that all NDRs have the same values and that they are one of the
119
132
  # expected values
120
133
  camera_readout_mode = ramp_obj_list[0].camera_readout_mode
121
134
  modulator_spin_mode = ramp_obj_list[0].modulator_spin_mode
122
135
  match camera_readout_mode:
123
136
  case "UpTheRamp":
137
+ line_read_line_indices = coadd_sequence_nums_list[0]
138
+ num_bias, num_read = line_read_line_indices[:2]
139
+ ndr_per_coadd = num_bias + num_read
140
+
124
141
  match modulator_spin_mode:
125
142
  case "Continuous":
126
143
  linearization_func = partial(
@@ -136,6 +153,11 @@ class LinearityCorrection(DlnirspTaskBase):
136
153
  )
137
154
 
138
155
  case "SubFrame":
156
+ # `self.valid_camera_sequence_regex`, along with `parse_camera_sample_sequence`, provides assurance that
157
+ # by the time we get here these assumptions are valid
158
+ num_bias = 0
159
+ num_read = 1
160
+ ndr_per_coadd = 1
139
161
  linearization_func = self.linearize_subframe_coadd
140
162
 
141
163
  coadd_stack = np.zeros((num_coadds, *ramp_obj_list[0].data.shape))
@@ -160,13 +182,15 @@ class LinearityCorrection(DlnirspTaskBase):
160
182
  r"""
161
183
  Linearize a single coadd taken in "SubFrame" camera readout mode. This method applies to all modulator spin modes.
162
184
 
185
+ In "SubFrame" mode a single coadd contains a single read of the detector with no bias frames.
186
+
163
187
  The final, linearized coadd, :math:`\mathrm{ADU}_{lin}` is
164
188
 
165
189
  .. math::
166
- \mathrm{ADU}_{lin} = f(\mathrm{ADU}_{raw,last\_read})
190
+ \mathrm{ADU}_{lin} = f(\mathrm{ADU}_{raw})
167
191
 
168
192
  where :math:`f(x)` is the `correction polynomial <apply_correction_polynomial>` and
169
- :math:`\mathrm{ADU}_{raw,last\_read}` is the last read frame in the coadd.
193
+ :math:`\mathrm{ADU}_{raw}` is the single read frame in the coadd.
170
194
  """
171
195
  # Need to cast as float because raw are uint16 and will thus explode for values below 0
172
196
  last_read = coadd_obj_list[-1].data.astype(float)
@@ -291,16 +315,25 @@ class LinearityCorrection(DlnirspTaskBase):
291
315
  "3line,45read,3line,45read,2line"
292
316
  `[[3, 45], [3, 45]]`
293
317
 
318
+ "4subframe,89line"
319
+ `[[1], [1], [1], [1]]`
320
+
294
321
  Returns
295
322
  -------
296
- A list of lists. Top-level list contains an item for each coadd. These items are themselves lists of
297
- length 2. The numbers in these inner lists correspond to the number of bias and read frames in that coadd,
298
- respectively.
323
+ A list of lists. Top-level list contains an item for each coadd. In UpTheRamp mode these items are themselves
324
+ lists of length 2. The numbers in these inner lists correspond to the number of bias and read frames in that coadd,
325
+ respectively. In SubFrame mode the inner lists will always be length 1 and should be equal to `[1]`.
299
326
  """
300
- coadd_matches = self.camera_sequence_regex.findall(camera_sample_sequence)
301
- coadd_sequence_numbers = [
302
- [int(num) for num in coadd_match] for coadd_match in coadd_matches
303
- ]
327
+ if "subframe" in camera_sample_sequence:
328
+ coadd_matches = self.subframe_sequence_regex.findall(camera_sample_sequence)
329
+ # `is_ramp_valid` ensures we only have a single match here
330
+ num_coadd = int(coadd_matches[0])
331
+ coadd_sequence_numbers = [[1]] * num_coadd
332
+ else:
333
+ coadd_matches = self.uptheramp_coadd_regex.findall(camera_sample_sequence)
334
+ coadd_sequence_numbers = [
335
+ [int(num) for num in coadd_match] for coadd_match in coadd_matches
336
+ ]
304
337
 
305
338
  return coadd_sequence_numbers
306
339
 
@@ -310,15 +343,15 @@ class LinearityCorrection(DlnirspTaskBase):
310
343
 
311
344
  Current validity checks are:
312
345
 
313
- 1. All frames in the ramp have the same value for NUM_FRAMES_IN_RAMP
314
- 2. All frames in the ramp have the same value for CAMERA_READOUT_MODE
315
- 3. All frames in the ramp have the same value for MODULATOR_SPIN_MODE
316
- 4. The CAMERA_READOUT and MODULATOR_SPIN modes have expected values
317
- 5. The value of NUM_FRAMES_IN_RAMP equals the length of actual frames found
318
- 6. All frames in the ramp have the same value for CAMERA_SAMPLE_SEQUENCE
319
- 7. The camera sample sequence has the expected form ('(,?\d*line,\d*read)*(,\d*line)?')
320
- 8. All coadds in the ramp have the same camera sample sequence
321
- 9. The ramp length is equal to the expected length from the camera sample sequence
346
+ #. All frames in the ramp have the same value for NUM_FRAMES_IN_RAMP
347
+ #. All frames in the ramp have the same value for CAMERA_READOUT_MODE
348
+ #. All frames in the ramp have the same value for MODULATOR_SPIN_MODE
349
+ #. The CAMERA_READOUT and MODULATOR_SPIN modes have expected values
350
+ #. The value of NUM_FRAMES_IN_RAMP equals the length of actual frames found
351
+ #. All frames in the ramp have the same value for CAMERA_SAMPLE_SEQUENCE
352
+ #. The camera sample sequence has the expected form (`valid_camera_sequence_regex`)
353
+ #. All coadds in the ramp have the same camera sample sequence
354
+ #. The ramp length is equal to the expected length from the camera sample sequence
322
355
 
323
356
  If a ramp is not valid then the reason is logged and `False` is returned.
324
357
  """
@@ -382,7 +415,7 @@ class LinearityCorrection(DlnirspTaskBase):
382
415
  return False
383
416
 
384
417
  camera_sample_sequence = camera_sample_sequence_set.pop()
385
- if re.search(r"\d*line,\d*line", camera_sample_sequence):
418
+ if not self.valid_camera_sequence_regex.search(camera_sample_sequence):
386
419
  logger.info(
387
420
  f"Malformed camera sample sequence: '{camera_sample_sequence}'. "
388
421
  f"{common_status_str}"
@@ -4,12 +4,10 @@ import astropy.units as u
4
4
  import numpy as np
5
5
  from astropy.convolution import convolve_fft
6
6
  from astropy.convolution import interpolate_replace_nans
7
- from astropy.coordinates import EarthLocation
8
7
  from astropy.time import Time
9
8
  from astropy.units import Quantity
10
9
  from astropy.wcs import WCS
11
10
  from dkist_processing_common.codecs.asdf import asdf_decoder
12
- from dkist_processing_common.codecs.asdf import asdf_encoder
13
11
  from dkist_processing_common.codecs.fits import fits_array_decoder
14
12
  from dkist_processing_common.codecs.json import json_decoder
15
13
  from dkist_processing_common.codecs.json import json_encoder
@@ -178,7 +176,6 @@ class WavelengthCalibration(DlnirspTaskBase, CorrectionsMixin, QualityMixin):
178
176
 
179
177
  with self.telemetry_span("Run wavelength solution fit"):
180
178
  fit_result = fitter(
181
- input_wavelength_vector=input_wavelength_vector,
182
179
  input_spectrum=input_spectrum,
183
180
  method="leastsq",
184
181
  )
@@ -436,7 +436,19 @@ class RawRampHeaders(DlnirspHeaders):
436
436
  raise ValueError(f"{array_shape = } is weird")
437
437
  array_shape = array_shape[1:]
438
438
 
439
- self.num_frames_per_coadd = num_line + num_read
439
+ match camera_readout_mode:
440
+ case "UpTheRamp":
441
+ self.num_frames_per_coadd = num_line + num_read
442
+ coadd_read_sequence = f"{num_line}line,{num_read}read"
443
+ cam_read_sequence = ",".join([coadd_read_sequence] * num_coadd)
444
+ case "SubFrame":
445
+ self.num_frames_per_coadd = 1
446
+ cam_read_sequence = f"{num_coadd}subframe"
447
+ num_line = 0
448
+ num_read = 1
449
+ case _:
450
+ raise ValueError(f"Don't know how to make data for {camera_readout_mode = }")
451
+
440
452
  num_NDR_per_ramp = self.num_frames_per_coadd * num_coadd + num_reset
441
453
  num_frames = num_ramps * num_NDR_per_ramp
442
454
  dataset_shape = (num_frames, *array_shape)
@@ -446,12 +458,8 @@ class RawRampHeaders(DlnirspHeaders):
446
458
  self.ramp_length_sec = TimeDelta(ramp_length_sec, format="sec")
447
459
  self.num_coadd = num_coadd
448
460
  self.num_line = num_line
449
- self.num_read = num_read
450
461
  self.num_reset = num_reset
451
462
 
452
- coadd_read_sequence = f"{num_line}line,{num_read}read"
453
- cam_read_sequence = ",".join([coadd_read_sequence] * num_coadd)
454
-
455
463
  if num_reset > 0:
456
464
  cam_read_sequence += f",{num_reset}line"
457
465
 
@@ -84,21 +84,31 @@ def write_ramps_to_task(
84
84
  poly_coeffs = task.parameters.linearization_poly_coeffs
85
85
  correction_poly = np.poly1d(poly_coeffs)
86
86
 
87
- match modulator_spin_mode:
88
- case "Continuous":
89
- ramp_data_func = partial(
90
- make_continuous_ramp_data, bias=bias_value, correction_poly=correction_poly
91
- )
92
- case "Discrete":
93
- ramp_data_func = partial(
94
- make_discrete_ramp_data,
95
- slopes=slopes,
96
- intercepts=intercepts,
97
- bias=bias_value,
98
- correction_poly=correction_poly,
99
- )
87
+ match camera_readout_mode:
88
+ case "UpTheRamp":
89
+ match modulator_spin_mode:
90
+ case "Continuous":
91
+ ramp_data_func = partial(
92
+ make_continuous_ramp_data, bias=bias_value, correction_poly=correction_poly
93
+ )
94
+ case "Discrete":
95
+ ramp_data_func = partial(
96
+ make_discrete_ramp_data,
97
+ slopes=slopes,
98
+ intercepts=intercepts,
99
+ bias=bias_value,
100
+ correction_poly=correction_poly,
101
+ )
102
+ case _:
103
+ raise ValueError(
104
+ f"Don't know how to make data for {camera_readout_mode = } and {modulator_spin_mode = }"
105
+ )
106
+ case "SubFrame":
107
+ ramp_data_func = partial(make_subframe_data, correction_poly=correction_poly)
108
+ num_line = 0
109
+ num_read = 1
100
110
  case _:
101
- raise ValueError(f"Don't know how to make data for {modulator_spin_mode = }")
111
+ raise ValueError(f"Don't know how to make data for {camera_readout_mode = }")
102
112
 
103
113
  dataset = RawRampHeaders(
104
114
  array_shape=array_shape,
@@ -239,6 +249,27 @@ def make_discrete_ramp_data(
239
249
  return array
240
250
 
241
251
 
252
+ def make_subframe_data(
253
+ frame: RawRampHeaders, correction_poly: np.poly1d = np.poly1d([1])
254
+ ) -> np.ndarray:
255
+ shape = frame.array_shape
256
+ if frame.frame_in_ramp("") <= frame.num_coadd:
257
+ # One of the subframes. These are the values we use
258
+ true_value = (frame.current_coadd_in_ramp + 1) * 1000
259
+
260
+ else:
261
+ # A reset frame. Who cares
262
+ true_value = np.nan
263
+
264
+ # We want the polynomial corrected frame value to equal `true_value`, but the value of the polynomial will change
265
+ # depending on the "raw" value (`value`). So here we solve for the raw value numerically.
266
+ # Basically, solve for x such that `x / poly(x) == true_value`
267
+ fit_func = lambda x: x / correction_poly(x) - true_value
268
+ value = fsolve(fit_func, true_value)
269
+
270
+ return np.ones(shape) * value
271
+
272
+
242
273
  def write_vis_inputs_to_task(task, num_frames):
243
274
  dataset = SimpleModulatedHeaders(
244
275
  num_modstates=num_frames,
@@ -283,10 +314,9 @@ def up_the_ramp_continuous_expected_value(
283
314
  def subframe_expected_value(
284
315
  *, ramp_num: int, num_line: int, num_read: int, expected_avg_coadd_value: float, **unused_args
285
316
  ) -> float:
286
- # See `make_discrete_ramp_data` for where this comes from
287
- # Unlike the continuous data methods, the discrete data already includes the bias, so we don't need
288
- # to subtract it here
289
- return ramp_num * 100 + (num_line + num_read) * 10 + expected_avg_coadd_value
317
+ # See `make_subframe_ramp_data` for where this comes from; each coadd has the value of it's coadd number (1-indexed)
318
+ # times 1000
319
+ return expected_avg_coadd_value * 1000
290
320
 
291
321
 
292
322
  def discrete_expected_value(
@@ -472,6 +502,8 @@ def test_VIS_linearity_correction(
472
502
  [[3, 2], [3, 2], [3, 2]],
473
503
  id="3line,2read,3line,2read,3line,2read,1line",
474
504
  ),
505
+ pytest.param("3subframe", [[1], [1], [1]], id="3subframe"),
506
+ pytest.param("5subframe,37line", [[1], [1], [1], [1], [1]], id="5subframe,37line"),
475
507
  ],
476
508
  )
477
509
  def test_parse_camera_sample_sequence(linearity_correction_task, camera_sequence, expected_results):
@@ -573,6 +605,19 @@ def test_linearity_correction_with_invalid_ramps(
573
605
  "Missing some ramp frames. Expected 10 from sample sequence",
574
606
  id="wrong_number_from_seq",
575
607
  ),
608
+ pytest.param(
609
+ [
610
+ DummyRampFitsAccess(
611
+ num_frames_in_ramp=2, camera_sample_sequence="5subframe,23line"
612
+ ),
613
+ DummyRampFitsAccess(
614
+ num_frames_in_ramp=2, camera_sample_sequence="5subframe,23line"
615
+ ),
616
+ ],
617
+ False,
618
+ "Missing some ramp frames. Expected 28 from sample sequence",
619
+ id="wrong_number_from_seq_subframe",
620
+ ),
576
621
  pytest.param(
577
622
  [
578
623
  DummyRampFitsAccess(
@@ -584,6 +629,39 @@ def test_linearity_correction_with_invalid_ramps(
584
629
  "Malformed camera sample sequence",
585
630
  id="bad_cam_seq",
586
631
  ),
632
+ pytest.param(
633
+ [
634
+ DummyRampFitsAccess(
635
+ num_frames_in_ramp=1,
636
+ camera_sample_sequence="3subframe,2read",
637
+ ),
638
+ ],
639
+ False,
640
+ "Malformed camera sample sequence",
641
+ id="bad_cam_seq_subframe_mix",
642
+ ),
643
+ pytest.param(
644
+ [
645
+ DummyRampFitsAccess(
646
+ num_frames_in_ramp=1,
647
+ camera_sample_sequence="10line,3subframe",
648
+ ),
649
+ ],
650
+ False,
651
+ "Malformed camera sample sequence",
652
+ id="bad_cam_seq_line_subframe",
653
+ ),
654
+ pytest.param(
655
+ [
656
+ DummyRampFitsAccess(
657
+ num_frames_in_ramp=1,
658
+ camera_sample_sequence="3subframe,3subframe",
659
+ ),
660
+ ],
661
+ False,
662
+ "Malformed camera sample sequence",
663
+ id="bad_cam_seq_multiple_subframe",
664
+ ),
587
665
  pytest.param(
588
666
  [
589
667
  DummyRampFitsAccess(camera_readout_mode="UpTheRamp"),
@@ -623,6 +701,26 @@ def test_linearity_correction_with_invalid_ramps(
623
701
  "",
624
702
  id="valid",
625
703
  ),
704
+ pytest.param(
705
+ [
706
+ DummyRampFitsAccess(num_frames_in_ramp=2, camera_sample_sequence="2subframe"),
707
+ DummyRampFitsAccess(num_frames_in_ramp=2, camera_sample_sequence="2subframe"),
708
+ ],
709
+ True,
710
+ "",
711
+ id="valid_subframe",
712
+ ),
713
+ pytest.param(
714
+ [
715
+ DummyRampFitsAccess(num_frames_in_ramp=4, camera_sample_sequence="3subframe,1line"),
716
+ DummyRampFitsAccess(num_frames_in_ramp=4, camera_sample_sequence="3subframe,1line"),
717
+ DummyRampFitsAccess(num_frames_in_ramp=4, camera_sample_sequence="3subframe,1line"),
718
+ DummyRampFitsAccess(num_frames_in_ramp=4, camera_sample_sequence="3subframe,1line"),
719
+ ],
720
+ True,
721
+ "",
722
+ id="valid_subframe_reset",
723
+ ),
626
724
  ],
627
725
  )
628
726
  def test_is_ramp_valid(linearity_correction_task, ramp_list, valid, message, caplog):
@@ -634,7 +732,7 @@ def test_is_ramp_valid(linearity_correction_task, ramp_list, valid, message, cap
634
732
  logger.add(caplog.handler)
635
733
  assert linearity_correction_task.is_ramp_valid(ramp_list) is valid
636
734
  if not valid:
637
- assert re.search(message, caplog.text)
735
+ assert re.search(message, caplog.text), f"Did not find {message} in {caplog.text}"
638
736
 
639
737
 
640
738
  def test_correction_polynomial(linearity_correction_task, assign_input_dataset_doc_to_task):
@@ -46,7 +46,7 @@ def raw_ramp_parse_task(tmp_path, recipe_run_id, arm_id):
46
46
  ramp_length_sec = 1.0
47
47
  array_shape = (3, 3)
48
48
  modulator_spin_mode = "Really fast"
49
- camera_readout_mode = "Super cool"
49
+ camera_readout_mode = "UpTheRamp"
50
50
  with ParseL0DlnirspRampData(
51
51
  recipe_run_id=recipe_run_id,
52
52
  workflow_name="workflow_name",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 0.32.3
3
+ Version: 0.32.5
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.8.0
16
+ Requires-Dist: dkist-processing-common==11.8.1
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
@@ -28,7 +28,7 @@ Requires-Dist: peakutils==1.3.5
28
28
  Requires-Dist: sunpy==6.1.1
29
29
  Requires-Dist: moviepy==2.1.2
30
30
  Requires-Dist: asdf==3.5.0
31
- Requires-Dist: solar-wavelength-calibration==1.0.1
31
+ Requires-Dist: solar-wavelength-calibration==2.0.0
32
32
  Provides-Extra: test
33
33
  Requires-Dist: pytest; extra == "test"
34
34
  Requires-Dist: pytest-cov; extra == "test"
@@ -94,44 +94,44 @@ Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
94
94
  Requires-Dist: aiohttp==3.13.2; extra == "frozen"
95
95
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
96
96
  Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
97
- Requires-Dist: alembic==1.17.1; extra == "frozen"
97
+ Requires-Dist: alembic==1.17.2; extra == "frozen"
98
98
  Requires-Dist: amqp==5.3.1; extra == "frozen"
99
99
  Requires-Dist: annotated-types==0.7.0; extra == "frozen"
100
- Requires-Dist: anyio==4.11.0; extra == "frozen"
100
+ Requires-Dist: anyio==4.12.0; extra == "frozen"
101
101
  Requires-Dist: apache-airflow==2.11.0; extra == "frozen"
102
- Requires-Dist: apache-airflow-providers-celery==3.10.0; extra == "frozen"
103
- Requires-Dist: apache-airflow-providers-common-compat==1.8.0; extra == "frozen"
104
- Requires-Dist: apache-airflow-providers-common-io==1.6.4; extra == "frozen"
105
- Requires-Dist: apache-airflow-providers-common-sql==1.28.2; extra == "frozen"
102
+ Requires-Dist: apache-airflow-providers-celery==3.13.1; extra == "frozen"
103
+ Requires-Dist: apache-airflow-providers-common-compat==1.10.0; extra == "frozen"
104
+ Requires-Dist: apache-airflow-providers-common-io==1.7.0; extra == "frozen"
105
+ Requires-Dist: apache-airflow-providers-common-sql==1.29.0; extra == "frozen"
106
106
  Requires-Dist: apache-airflow-providers-fab==1.5.3; extra == "frozen"
107
- Requires-Dist: apache-airflow-providers-ftp==3.13.2; extra == "frozen"
108
- Requires-Dist: apache-airflow-providers-http==5.4.0; extra == "frozen"
109
- Requires-Dist: apache-airflow-providers-imap==3.9.3; extra == "frozen"
110
- Requires-Dist: apache-airflow-providers-postgres==6.4.0; extra == "frozen"
111
- Requires-Dist: apache-airflow-providers-smtp==2.3.1; extra == "frozen"
112
- Requires-Dist: apache-airflow-providers-sqlite==4.1.2; extra == "frozen"
113
- Requires-Dist: apispec==6.8.4; extra == "frozen"
107
+ Requires-Dist: apache-airflow-providers-ftp==3.14.0; extra == "frozen"
108
+ Requires-Dist: apache-airflow-providers-http==5.6.0; extra == "frozen"
109
+ Requires-Dist: apache-airflow-providers-imap==3.10.0; extra == "frozen"
110
+ Requires-Dist: apache-airflow-providers-postgres==6.5.0; extra == "frozen"
111
+ Requires-Dist: apache-airflow-providers-smtp==2.4.0; extra == "frozen"
112
+ Requires-Dist: apache-airflow-providers-sqlite==4.2.0; extra == "frozen"
113
+ Requires-Dist: apispec==6.9.0; extra == "frozen"
114
114
  Requires-Dist: argcomplete==3.6.3; extra == "frozen"
115
115
  Requires-Dist: asdf==3.5.0; extra == "frozen"
116
116
  Requires-Dist: asdf_standard==1.4.0; extra == "frozen"
117
117
  Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
118
- Requires-Dist: asgiref==3.10.0; extra == "frozen"
119
- Requires-Dist: asteval==1.0.6; extra == "frozen"
118
+ Requires-Dist: asgiref==3.11.0; extra == "frozen"
119
+ Requires-Dist: asteval==1.0.7; extra == "frozen"
120
120
  Requires-Dist: astropy==7.0.2; extra == "frozen"
121
- Requires-Dist: astropy-iers-data==0.2025.11.3.0.38.37; extra == "frozen"
122
- Requires-Dist: asyncpg==0.30.0; extra == "frozen"
121
+ Requires-Dist: astropy-iers-data==0.2025.12.1.0.45.12; extra == "frozen"
122
+ Requires-Dist: asyncpg==0.31.0; extra == "frozen"
123
123
  Requires-Dist: attrs==25.4.0; extra == "frozen"
124
124
  Requires-Dist: babel==2.17.0; extra == "frozen"
125
- Requires-Dist: billiard==4.2.2; extra == "frozen"
125
+ Requires-Dist: billiard==4.2.4; extra == "frozen"
126
126
  Requires-Dist: blinker==1.9.0; extra == "frozen"
127
- Requires-Dist: boto3==1.40.65; extra == "frozen"
128
- Requires-Dist: botocore==1.40.65; extra == "frozen"
127
+ Requires-Dist: boto3==1.42.1; extra == "frozen"
128
+ Requires-Dist: botocore==1.42.1; extra == "frozen"
129
129
  Requires-Dist: cachelib==0.13.0; extra == "frozen"
130
- Requires-Dist: celery==5.3.1; extra == "frozen"
131
- Requires-Dist: certifi==2025.10.5; extra == "frozen"
130
+ Requires-Dist: celery==5.6.0; extra == "frozen"
131
+ Requires-Dist: certifi==2025.11.12; extra == "frozen"
132
132
  Requires-Dist: cffi==2.0.0; extra == "frozen"
133
133
  Requires-Dist: charset-normalizer==3.4.4; extra == "frozen"
134
- Requires-Dist: click==8.3.0; extra == "frozen"
134
+ Requires-Dist: click==8.3.1; extra == "frozen"
135
135
  Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
136
136
  Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
137
137
  Requires-Dist: click-repl==0.3.0; extra == "frozen"
@@ -148,9 +148,9 @@ Requires-Dist: dacite==1.9.2; extra == "frozen"
148
148
  Requires-Dist: decorator==5.2.1; extra == "frozen"
149
149
  Requires-Dist: dill==0.4.0; extra == "frozen"
150
150
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
151
- Requires-Dist: dkist-processing-common==11.8.0; extra == "frozen"
151
+ Requires-Dist: dkist-processing-common==11.8.1; extra == "frozen"
152
152
  Requires-Dist: dkist-processing-core==6.0.0; extra == "frozen"
153
- Requires-Dist: dkist-processing-dlnirsp==0.32.3; extra == "frozen"
153
+ Requires-Dist: dkist-processing-dlnirsp==0.32.5; extra == "frozen"
154
154
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
155
155
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
156
156
  Requires-Dist: dkist-service-configuration==4.1.7; extra == "frozen"
@@ -158,14 +158,15 @@ Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
158
158
  Requires-Dist: dkist_fits_specifications==4.17.0; extra == "frozen"
159
159
  Requires-Dist: dnspython==2.8.0; extra == "frozen"
160
160
  Requires-Dist: email-validator==2.3.0; extra == "frozen"
161
+ Requires-Dist: exceptiongroup==1.3.1; extra == "frozen"
161
162
  Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
162
163
  Requires-Dist: flower==2.0.1; extra == "frozen"
163
- Requires-Dist: fonttools==4.60.1; extra == "frozen"
164
+ Requires-Dist: fonttools==4.61.0; extra == "frozen"
164
165
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
165
166
  Requires-Dist: fsspec==2025.10.0; extra == "frozen"
166
167
  Requires-Dist: globus-sdk==3.65.0; extra == "frozen"
167
- Requires-Dist: google-re2==1.1.20250805; extra == "frozen"
168
- Requires-Dist: googleapis-common-protos==1.71.0; extra == "frozen"
168
+ Requires-Dist: google-re2==1.1.20251105; extra == "frozen"
169
+ Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
169
170
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
170
171
  Requires-Dist: greenlet==3.2.4; extra == "frozen"
171
172
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
@@ -184,7 +185,7 @@ Requires-Dist: jsonschema==4.25.1; extra == "frozen"
184
185
  Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
185
186
  Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
186
187
  Requires-Dist: kiwisolver==1.4.9; extra == "frozen"
187
- Requires-Dist: kombu==5.6.0; extra == "frozen"
188
+ Requires-Dist: kombu==5.6.1; extra == "frozen"
188
189
  Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
189
190
  Requires-Dist: lazy_loader==0.4; extra == "frozen"
190
191
  Requires-Dist: limits==5.6.0; extra == "frozen"
@@ -205,7 +206,7 @@ Requires-Dist: more-itertools==10.8.0; extra == "frozen"
205
206
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
206
207
  Requires-Dist: multidict==6.7.0; extra == "frozen"
207
208
  Requires-Dist: nbformat==5.10.4; extra == "frozen"
208
- Requires-Dist: networkx==3.5; extra == "frozen"
209
+ Requires-Dist: networkx==3.6; extra == "frozen"
209
210
  Requires-Dist: numba==0.61.2; extra == "frozen"
210
211
  Requires-Dist: numpy==2.2.5; extra == "frozen"
211
212
  Requires-Dist: object-clerk==1.0.0; extra == "frozen"
@@ -251,13 +252,13 @@ Requires-Dist: proglog==0.1.12; extra == "frozen"
251
252
  Requires-Dist: prometheus_client==0.23.1; extra == "frozen"
252
253
  Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
253
254
  Requires-Dist: propcache==0.4.1; extra == "frozen"
254
- Requires-Dist: protobuf==6.33.0; extra == "frozen"
255
+ Requires-Dist: protobuf==6.33.1; extra == "frozen"
255
256
  Requires-Dist: psutil==7.1.3; extra == "frozen"
256
257
  Requires-Dist: psycopg2-binary==2.9.11; extra == "frozen"
257
258
  Requires-Dist: pycparser==2.23; extra == "frozen"
258
- Requires-Dist: pydantic==2.12.3; extra == "frozen"
259
- Requires-Dist: pydantic-settings==2.11.0; extra == "frozen"
260
- Requires-Dist: pydantic_core==2.41.4; extra == "frozen"
259
+ Requires-Dist: pydantic==2.12.5; extra == "frozen"
260
+ Requires-Dist: pydantic-settings==2.12.0; extra == "frozen"
261
+ Requires-Dist: pydantic_core==2.41.5; extra == "frozen"
261
262
  Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
262
263
  Requires-Dist: pyparsing==3.2.5; extra == "frozen"
263
264
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
@@ -273,17 +274,16 @@ Requires-Dist: requests-toolbelt==1.0.0; extra == "frozen"
273
274
  Requires-Dist: rfc3339-validator==0.1.4; extra == "frozen"
274
275
  Requires-Dist: rich==13.9.4; extra == "frozen"
275
276
  Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
276
- Requires-Dist: rpds-py==0.28.0; extra == "frozen"
277
- Requires-Dist: s3transfer==0.14.0; extra == "frozen"
277
+ Requires-Dist: rpds-py==0.30.0; extra == "frozen"
278
+ Requires-Dist: s3transfer==0.16.0; extra == "frozen"
278
279
  Requires-Dist: scikit-image==0.25.2; extra == "frozen"
279
280
  Requires-Dist: scipy==1.15.3; extra == "frozen"
280
281
  Requires-Dist: semantic-version==2.10.0; extra == "frozen"
281
282
  Requires-Dist: setproctitle==1.3.7; extra == "frozen"
282
283
  Requires-Dist: six==1.17.0; extra == "frozen"
283
- Requires-Dist: sniffio==1.3.1; extra == "frozen"
284
- Requires-Dist: solar-wavelength-calibration==1.0.1; extra == "frozen"
284
+ Requires-Dist: solar-wavelength-calibration==2.0.0; extra == "frozen"
285
285
  Requires-Dist: sqids==0.5.1; extra == "frozen"
286
- Requires-Dist: sqlparse==0.5.3; extra == "frozen"
286
+ Requires-Dist: sqlparse==0.5.4; extra == "frozen"
287
287
  Requires-Dist: sunpy==6.1.1; extra == "frozen"
288
288
  Requires-Dist: tabulate==0.9.0; extra == "frozen"
289
289
  Requires-Dist: talus==1.3.4; extra == "frozen"
@@ -297,16 +297,17 @@ Requires-Dist: traitlets==5.14.3; extra == "frozen"
297
297
  Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
298
298
  Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
299
299
  Requires-Dist: tzdata==2025.2; extra == "frozen"
300
+ Requires-Dist: tzlocal==5.3.1; extra == "frozen"
300
301
  Requires-Dist: uc-micro-py==1.0.3; extra == "frozen"
301
302
  Requires-Dist: uncertainties==3.2.3; extra == "frozen"
302
- Requires-Dist: universal_pathlib==0.3.4; extra == "frozen"
303
+ Requires-Dist: universal_pathlib==0.3.6; extra == "frozen"
303
304
  Requires-Dist: urllib3==2.5.0; extra == "frozen"
304
305
  Requires-Dist: vine==5.1.0; extra == "frozen"
305
306
  Requires-Dist: voluptuous==0.15.2; extra == "frozen"
306
307
  Requires-Dist: wcwidth==0.2.14; extra == "frozen"
307
308
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
308
309
  Requires-Dist: wrapt==1.17.3; extra == "frozen"
309
- Requires-Dist: yamale==6.0.0; extra == "frozen"
310
+ Requires-Dist: yamale==6.1.0; extra == "frozen"
310
311
  Requires-Dist: yarl==1.22.0; extra == "frozen"
311
312
  Requires-Dist: zipp==3.23.0; extra == "frozen"
312
313
 
@@ -5,7 +5,7 @@ dkist_processing_dlnirsp/dev_scripts/__init__.py,sha256=tITkbcFg1a-24sdFaWK8OyLr
5
5
  dkist_processing_dlnirsp/dev_scripts/test_slitbeam_group_assignment.py,sha256=ac-8G-P2L_xW6m3tOooFlHs1N5_C6F_7k2VAU2a9_1A,4171
6
6
  dkist_processing_dlnirsp/models/__init__.py,sha256=ItaZgbjndT5uwEv2YDQZCVAHGbiB_sjzkX8MMbIgcSo,45
7
7
  dkist_processing_dlnirsp/models/constants.py,sha256=0TV_K6WbvUlDQdNRxx_qblQ_dwN7RGU7ng2iDOBQedo,6386
8
- dkist_processing_dlnirsp/models/fits_access.py,sha256=iXaAxey-apXzj68b33-YLk7O7o0GtKAiJ_0JLoc6VOc,963
8
+ dkist_processing_dlnirsp/models/fits_access.py,sha256=5HH8NM2tAh63Aauy6oCXKJGJ2AbQPBP5L1DitVfFEs0,895
9
9
  dkist_processing_dlnirsp/models/parameters.py,sha256=PsaZSNE4Uyov1xGMqRqh6kb5F8NnDDm3QRHkoiDAsYY,15812
10
10
  dkist_processing_dlnirsp/models/tags.py,sha256=xD_XaCjMXmd70P0FoHy92XSdlabIk07RGVEyFpXpGfM,5791
11
11
  dkist_processing_dlnirsp/models/task_name.py,sha256=LmEoI_h4UecvIMGcO5U8mGTqfToPjABuFbsYkC_rZyw,506
@@ -27,19 +27,19 @@ dkist_processing_dlnirsp/tasks/ifu_drift.py,sha256=JeFgl6uk6lYU4jJ-gBYtRESyUa9mb
27
27
  dkist_processing_dlnirsp/tasks/instrument_polarization.py,sha256=G79qXg1080zsd8ZwwYSSupUGWPRNBevyag49H32gh60,28201
28
28
  dkist_processing_dlnirsp/tasks/l1_output_data.py,sha256=Psta0476jih-cfmpdnzmquys030sW4f4VX6ksAb-g1o,465
29
29
  dkist_processing_dlnirsp/tasks/lamp.py,sha256=twoMHMnE2jm2OYxkeHFcjqcyQYVtEjSU2_z2mmn3Ybs,5390
30
- dkist_processing_dlnirsp/tasks/linearity_correction.py,sha256=fz16nK5q7isKz9l7_AFeDkMTaX08omlusKoIDS8wj5k,21107
30
+ dkist_processing_dlnirsp/tasks/linearity_correction.py,sha256=z3MpWHp0lZYB2zrfHfH7HlcKoro6TPxwEN8rpqVv08c,22716
31
31
  dkist_processing_dlnirsp/tasks/make_movie_frames.py,sha256=zxyAWNnPFbG7jpUEe3ekRyJGjk706T9a-yiA3eoWi5M,6290
32
32
  dkist_processing_dlnirsp/tasks/parse.py,sha256=ZtqM6dyxxnnbVTAun040EuxfQZEQcnkXzZffXSBTYkk,10919
33
33
  dkist_processing_dlnirsp/tasks/quality_metrics.py,sha256=1ScLAinv3WG-0M7u_26gnogbJ_D84K9CP7eRvEuwb9E,7346
34
34
  dkist_processing_dlnirsp/tasks/science.py,sha256=sNI4AYO10qe3JL62KWXR87MnfX9m85Jo4_PkQ0qd5TQ,35737
35
35
  dkist_processing_dlnirsp/tasks/solar.py,sha256=NyLYkRophfXaVtvnGuNEvkcE8JNcmCJVuobNYAZ7KjQ,11135
36
- dkist_processing_dlnirsp/tasks/wavelength_calibration.py,sha256=6jidRwMbGoZcuVbnFv3IizEFFkGxHMTI249Q8pyVIUA,17023
36
+ dkist_processing_dlnirsp/tasks/wavelength_calibration.py,sha256=QhFlbX8h9UqkK2vx779nK6LBksp2P2yPqhAxrwcuJ4o,16851
37
37
  dkist_processing_dlnirsp/tasks/write_l1.py,sha256=Smd9Fzp3Kx4F3nHYJJRAXqNy9n71TsYovuvFjLcUYs4,9732
38
38
  dkist_processing_dlnirsp/tasks/mixin/__init__.py,sha256=5PMbkD6K0zTfhCxv8vg2lvJCNP81qItJ_R_7Yy3Mpwc,26
39
39
  dkist_processing_dlnirsp/tasks/mixin/corrections.py,sha256=MRZXCEc0KBE-9cQUpRP-K3ioDYRH8_ORFlJcH2SsmWA,6803
40
40
  dkist_processing_dlnirsp/tasks/mixin/group_id.py,sha256=u28XLVtvZ_lmzzaSX2SuA2MOiY69GC8AJsic2Vi2OSQ,11137
41
41
  dkist_processing_dlnirsp/tests/__init__.py,sha256=UHIAs0SglAXeB7UeDgVwo1EE9QPRq3rG3BZkiCpBq7M,42
42
- dkist_processing_dlnirsp/tests/conftest.py,sha256=o_a-tRAfgLKgD7YOLOSJ-B3nM3dagT-UV7v30XWOI8w,68406
42
+ dkist_processing_dlnirsp/tests/conftest.py,sha256=Xp02ZyHi6X3FzyY_IQOjLsH3gOA9zK7KGo9gpeeO6jw,68768
43
43
  dkist_processing_dlnirsp/tests/test_assemble_movie.py,sha256=hKAIHCRQu8fZwCuWsX_4WHFrDpC0bDQ9CCI9A5bRkqg,5665
44
44
  dkist_processing_dlnirsp/tests/test_assemble_quality.py,sha256=djZsVSuRGl3akH3LmYjWvYuNSUFFQfS5y0S3Op7lQIE,1327
45
45
  dkist_processing_dlnirsp/tests/test_bad_pixel_map.py,sha256=g5jWhVGSHMOtkcdiZ27G51ciud4ySjoDAjvMGLlgTIM,6093
@@ -53,10 +53,10 @@ dkist_processing_dlnirsp/tests/test_group_id.py,sha256=TpNllN6OZuYF8almsayk7pRTc
53
53
  dkist_processing_dlnirsp/tests/test_ifu_drift.py,sha256=K6ushbVQVE6AATjiP3hEgF6oyZp41SbGkI_Sa_kyrNs,9066
54
54
  dkist_processing_dlnirsp/tests/test_instrument_polarization_calibration.py,sha256=pPXjfzi3EcaawNqvXsz3OcCF1XITEJeCzQ8-iOjlm7U,23430
55
55
  dkist_processing_dlnirsp/tests/test_lamp.py,sha256=umy4ydYR5M3dqXTQP14qbamOleutyD1jSj3325aitl0,3940
56
- dkist_processing_dlnirsp/tests/test_linearity_correction.py,sha256=-XiA6uBxoESEFyyS538gFlAShD_NMkhshFVfpDg2xbY,28002
56
+ dkist_processing_dlnirsp/tests/test_linearity_correction.py,sha256=JkPNtsRad2JQQ2QiJjQar9tJuCi9-ksOdEYHW_-kl58,31793
57
57
  dkist_processing_dlnirsp/tests/test_make_movie_frames.py,sha256=fR1xJEFJMK0xUu8-EyOS_6mIX_ZO2J_nM0k3ud8xtYM,3648
58
58
  dkist_processing_dlnirsp/tests/test_parameters.py,sha256=KpBeisM4BIF5Kl6ZxZqk3yCozndmLMlzNgo0ij0hmYw,10328
59
- dkist_processing_dlnirsp/tests/test_parse.py,sha256=Zp-LWUaiIfCJi2S3GX9DrrKg7hrRU1wnNgiFlJ-CJC8,38006
59
+ dkist_processing_dlnirsp/tests/test_parse.py,sha256=UIII4R6JruUEFIlYDRwTwiBqyf4ldYxAhCWHM-jcd6E,38005
60
60
  dkist_processing_dlnirsp/tests/test_quality.py,sha256=OBWva_E6T5RfDuo73LiTdTr7uh2FO04VpBAsSOLfjVQ,6122
61
61
  dkist_processing_dlnirsp/tests/test_science.py,sha256=1DKqKNAEZEsVCffYz_TiEc2REG7cBIfGeig1kJK4ZtE,20902
62
62
  dkist_processing_dlnirsp/tests/test_solar.py,sha256=jTNnxs5fE8R_hLvmdAU9x4RXJaSpJWGQajL7kzXTxPQ,12111
@@ -86,16 +86,16 @@ docs/index.rst,sha256=c2KAA_icOw7Ao3rWVv7lRBTEZ-9JWidL615Xrt6fSq4,378
86
86
  docs/l0_to_l1_dlnirsp.rst,sha256=94gxaVBIIR9ljJBDAhZyViwbNUuHTaIwTuxBgSnsh60,630
87
87
  docs/l0_to_l1_dlnirsp_full-trial.rst,sha256=ZUs2RCqlklRKq6B64H-RymiY_JH9xjHp4msl-9bIOpM,561
88
88
  docs/landing_page.rst,sha256=py2OrDVuT_gZtTOzrt-8HI-PG6hO3jhM4BRxMLoMHQo,1058
89
- docs/linearization.rst,sha256=fYxaLr4756HZ4L_PpB4oKV4uBKDF6N9qTgNDcgIFjUU,4073
89
+ docs/linearization.rst,sha256=NFdOoeoUtmWjvcX6IL_NsJ-bbbGNkCKLew8nag-pC_I,4131
90
90
  docs/make.bat,sha256=mBAhtURwhQ7yc95pqwJzlhqBSvRknr1aqZ5s8NKvdKs,4513
91
91
  docs/polarization_calibration.rst,sha256=vJuRGfJlTEzFxUwabyuWXchXswKoqgg23_ch31Y-eb4,5174
92
92
  docs/requirements_table.rst,sha256=6HeQU9qSmYf_gL04YVGlcP7M6P8RGPw481n9eYWB32s,295
93
93
  docs/science_calibration.rst,sha256=JUMeS7KyIsL9cUuy-IdV2tQ-wQ2lBx6j8u_51ThJzVg,3661
94
94
  docs/scientific_changelog.rst,sha256=01AWBSHg8zElnodCgAq-hMxhk9CkX5rtEENx4iz0sjI,300
95
- docs/wavelength_calibration.rst,sha256=VP45e0g4r-dReQmypQVqduvezQiKwq47STlAJn0w8iQ,4095
95
+ docs/wavelength_calibration.rst,sha256=QGUd5Xmv5f7WQ1EKvw2CcgiMJQULjzdCW1hSQ8h8jj0,4123
96
96
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
97
- dkist_processing_dlnirsp-0.32.3.dist-info/METADATA,sha256=zWE2u7yocvTgqksWAwv_PMO1IfDwc3kca3TKQ79Vavo,29311
98
- dkist_processing_dlnirsp-0.32.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
- dkist_processing_dlnirsp-0.32.3.dist-info/entry_points.txt,sha256=p4-7cpIfxmQGFUDIP5n5noE5KADHN2-JvV03e0gOx9s,140
100
- dkist_processing_dlnirsp-0.32.3.dist-info/top_level.txt,sha256=4WmLV9LQM78KTFnkHmtaOJvVHAPpz0m9ruzDS-B_cUo,49
101
- dkist_processing_dlnirsp-0.32.3.dist-info/RECORD,,
97
+ dkist_processing_dlnirsp-0.32.5.dist-info/METADATA,sha256=R76N0MRQdWzBQkqlxfJyJu7xaXB-gbvPKi-bUri5uuM,29368
98
+ dkist_processing_dlnirsp-0.32.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
+ dkist_processing_dlnirsp-0.32.5.dist-info/entry_points.txt,sha256=p4-7cpIfxmQGFUDIP5n5noE5KADHN2-JvV03e0gOx9s,140
100
+ dkist_processing_dlnirsp-0.32.5.dist-info/top_level.txt,sha256=4WmLV9LQM78KTFnkHmtaOJvVHAPpz0m9ruzDS-B_cUo,49
101
+ dkist_processing_dlnirsp-0.32.5.dist-info/RECORD,,
docs/linearization.rst CHANGED
@@ -59,5 +59,6 @@ SubFrame
59
59
 
60
60
  See `~dkist_processing_dlnirsp.tasks.linearity_correction.LinearityCorrection.linearize_subframe_coadd` for a more detailed description.
61
61
 
62
- In this mode no bias subtraction is performed. The linearized value is simply the value of the last read NDR.
62
+ In this mode each coadd is a single read of the detector and there are no bias frames.
63
+ Thus, the linearized value of each coadd is simply the value of the single read.
63
64
  If a ramp contains multiple coadds then they are averaged together to produce the linearized frame.
@@ -13,9 +13,9 @@ are:
13
13
 
14
14
  #. Compute a representative spectrum by taking a spatial average near the center of the FOV of an average of all solar gain images.
15
15
 
16
- #. Use the L0 headers to construct a decent first-guess for the wavelength solution.
16
+ #. Use information in the L0 headers to describe the spectrograph setup used during data acquisition.
17
17
 
18
- #. Feed both the representative spectrum and initial guess into the `solar-wavelength-calibration <https://docs.dkist.nso.edu/projects/solar-wavelength-calibration/en/latest/>`_ library.
18
+ #. Feed both the representative spectrum and spectrograph information into the `solar-wavelength-calibration <https://docs.dkist.nso.edu/projects/solar-wavelength-calibration/en/latest/>`_ library.
19
19
 
20
20
  #. Save the fit result as a set of header values that parameterize the solution (see below).
21
21