dkist-processing-common 10.8.2__py3-none-any.whl → 10.8.3__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.
@@ -0,0 +1,41 @@
1
+ """Helper methods to handle fried parameter / r0 validity."""
2
+
3
+
4
+ def r0_valid(
5
+ r0: float | None = None,
6
+ ao_lock: bool | None = None,
7
+ num_out_of_bounds_ao_values: int | None = None,
8
+ ) -> bool:
9
+ """
10
+ Determine if the r0 value should be considered valid based on the following conditions.
11
+
12
+ * ATMOS_R0 does not exist in the header.
13
+ * the value of ATMOS_R0 is greater than 0.3m
14
+ * the AO is not locked
15
+ * the value of OOBSHIFT is greater than 100
16
+
17
+ When the adaptive optics system is not locked, the ATMOS_R0 keyword is still filled with the output of the
18
+ Fried parameter calculation. The inputs are not valid in this instance and the value should be removed.
19
+
20
+ Sometimes, due to timing differences between the calculation of the Fried parameter and the AO lock status being
21
+ updated, non-physical values can be recorded for ATMOS_R0 right on the edge of an AO_LOCK state change. To
22
+ combat this, any remaining R0 values greater than 30cm (which is beyond the realm of physical possibility for
23
+ solar observations) are also removed.
24
+
25
+ In addition, the number of AO out-of-bound values is given in the keyword OOBSHIFT and the AO team advises
26
+ that values under 100 are when the r0 value is considered reliable. If the OOBSHIFT key doesn't exist, this check
27
+ should be ignored.
28
+ """
29
+ if r0 is None:
30
+ return False
31
+
32
+ if r0 > 0.3:
33
+ return False
34
+
35
+ if ao_lock is not True:
36
+ return False
37
+
38
+ if num_out_of_bounds_ao_values is not None and num_out_of_bounds_ao_values > 100:
39
+ return False
40
+
41
+ return True
@@ -31,3 +31,4 @@ class L1QualityFitsAccess(L1FitsAccess):
31
31
  self.light_level: float = self.header["LIGHTLVL"]
32
32
  self.health_status: str = self.header["DSHEALTH"]
33
33
  self.ao_status: int = self.header.get("AO_LOCK", None)
34
+ self.num_out_of_bounds_ao_values: int = self.header.get("OOBSHIFT", None)
@@ -20,6 +20,7 @@ from dkist_processing_pac.fitter.fitting_core import compare_I
20
20
  from dkist_processing_pac.fitter.polcal_fitter import PolcalFitter
21
21
  from pandas import DataFrame
22
22
 
23
+ from dkist_processing_common.models.fried_parameter import r0_valid
23
24
  from dkist_processing_common.models.metric_code import MetricCode
24
25
  from dkist_processing_common.models.quality import EfficiencyHistograms
25
26
  from dkist_processing_common.models.quality import ModulationMatrixHistograms
@@ -203,7 +204,7 @@ class _SimplePlotQualityMixin:
203
204
  return warnings
204
205
 
205
206
  def quality_store_ao_status_and_fried_parameter(
206
- self, datetimes: list[str], values: list[list[bool, float]]
207
+ self, datetimes: list[str], values: list[list[bool | float]]
207
208
  ):
208
209
  """
209
210
  Collect and store datetime / value pairs for the boolean AO status and Fried parameter.
@@ -213,23 +214,27 @@ class _SimplePlotQualityMixin:
213
214
  Because of how L1Metric.has_metric works, empty lists will not be passed to this method.
214
215
  However, because of how L1Metric.store_metric works, one or both values can be None.
215
216
  """
216
- ao_values = [value[0] for value in values]
217
- ao_not_none = [ao for ao in ao_values if ao is not None]
217
+ ao_lock_values = [value[0] for value in values]
218
+ ao_not_none = [ao for ao in ao_lock_values if ao is not None]
218
219
  if len(ao_not_none) != 0:
219
220
  self._record_values(values=ao_not_none, tags=Tag.quality(MetricCode.ao_status))
220
221
  fried_values = [value[1] for value in values]
221
- fried_values_not_none_ao_locked = [
222
- r0 for ao, r0 in zip(ao_values, fried_values) if (ao is True) and (r0 is not None)
223
- ]
224
- datetimes_fried_not_none_ao_locked = [
225
- dt
226
- for dt, ao, r0 in zip(datetimes, ao_values, fried_values)
227
- if (ao is True) and (r0 is not None)
228
- ]
229
- if len(fried_values_not_none_ao_locked) != 0:
222
+ ao_oob_values = [value[2] for value in values]
223
+ fried_values_to_plot = []
224
+ datetimes_to_plot = []
225
+ # For each set of input data, check if the r0 is considered valid based on all data
226
+ for i in range(len(fried_values)):
227
+ if r0_valid(
228
+ r0=fried_values[i],
229
+ ao_lock=ao_lock_values[i],
230
+ num_out_of_bounds_ao_values=ao_oob_values[i],
231
+ ):
232
+ fried_values_to_plot.append(fried_values[i])
233
+ datetimes_to_plot.append(datetimes[i])
234
+ if len(fried_values_to_plot) != 0:
230
235
  self._record_2d_plot_values(
231
- x_values=datetimes_fried_not_none_ao_locked,
232
- y_values=fried_values_not_none_ao_locked,
236
+ x_values=datetimes_to_plot,
237
+ y_values=fried_values_to_plot,
233
238
  tags=Tag.quality(MetricCode.fried_parameter),
234
239
  )
235
240
 
@@ -296,7 +296,7 @@ class QualityL1Metrics(WorkflowTaskBase, QualityMixin):
296
296
  L1Metric(storage_method=self.quality_store_health_status, value_source="health_status"),
297
297
  L1Metric(
298
298
  storage_method=self.quality_store_ao_status_and_fried_parameter,
299
- value_source=["ao_status", "fried_parameter"],
299
+ value_source=["ao_status", "fried_parameter", "num_out_of_bounds_ao_values"],
300
300
  ),
301
301
  ]
302
302
 
@@ -29,6 +29,7 @@ from sunpy.coordinates import Helioprojective
29
29
 
30
30
  from dkist_processing_common.codecs.fits import fits_access_decoder
31
31
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
32
+ from dkist_processing_common.models.fried_parameter import r0_valid
32
33
  from dkist_processing_common.models.tags import Tag
33
34
  from dkist_processing_common.models.wavelength import WavelengthRange
34
35
  from dkist_processing_common.parsers.l0_fits_access import L0FitsAccess
@@ -373,8 +374,14 @@ class WriteL1Frame(WorkflowTaskBase, MetadataStoreMixin, ABC):
373
374
  """
374
375
  # Replace header values in place
375
376
  header = self.replace_header_values(header=header, data=data)
376
- # Remove r0 value if AO not locked
377
- header = self.remove_invalid_r0_values(header=header)
377
+ # Remove r0 value if r0 conditions are not met
378
+ r0_is_valid = r0_valid(
379
+ r0=header["ATMOS_R0"],
380
+ ao_lock=header.get("AO_LOCK", None),
381
+ num_out_of_bounds_ao_values=header.get("OOBSHIFT", None),
382
+ )
383
+ if not r0_is_valid:
384
+ header.pop("ATMOS_R0", None)
378
385
  # Add the stats table
379
386
  header = self.add_stats_headers(header=header, data=data)
380
387
  # Add the datacenter table
@@ -0,0 +1,27 @@
1
+ import pytest
2
+
3
+ from dkist_processing_common.models.fried_parameter import r0_valid
4
+
5
+
6
+ @pytest.mark.parametrize(
7
+ "r0, ao_lock, oob_shift, should_r0_exist",
8
+ [
9
+ pytest.param(0.2, True, 17, True, id="AO_LOCK_True_good_R0_good_oob"),
10
+ pytest.param(1, True, 17, False, id="AO_LOCK_True_bad_R0_good_oob"),
11
+ pytest.param(0.2, False, 17, False, id="AO_LOCK_False_good_R0_good_oob"),
12
+ pytest.param(1, False, 17, False, id="AO_LOCK_False_bad_R0_good_oob"),
13
+ pytest.param(0.2, True, 150, False, id="AO_LOCK_True_good_R0_bad_oob"),
14
+ pytest.param(1, True, 150, False, id="AO_LOCK_True_bad_R0_bad_oob"),
15
+ pytest.param(0.2, False, 150, False, id="AO_LOCK_False_good_R0_bad_oob"),
16
+ pytest.param(1, False, 150, False, id="AO_LOCK_False_bad_R0_bad_oob"),
17
+ pytest.param(0.2, None, 17, False, id="AO_LOCK_missing"),
18
+ pytest.param(0.2, True, None, True, id="OOBSHIFT_missing"),
19
+ ],
20
+ )
21
+ def test_check_r0_valid(r0, ao_lock, oob_shift, should_r0_exist):
22
+ """
23
+ :Given: values for r0, the ao_lock status, and the ao out of bound shift value
24
+ :When: checking for a valid state to use r0
25
+ :Then: valid conditions are marked True, invalid conditions marked False
26
+ """
27
+ assert r0_valid(r0, ao_lock, oob_shift) == should_r0_exist
@@ -39,9 +39,9 @@ def quality_task(tmp_path, recipe_run_id):
39
39
  @pytest.fixture
40
40
  def plot_data():
41
41
  datetimes_a = ["2021-01-01T01:01:01", "2021-01-01T02:01:01"]
42
- values_a = [3, 4]
42
+ values_a = [0.1, 0.2]
43
43
  datetimes_b = ["2020-01-01T01:01:01", "2020-01-01T02:01:01"]
44
- values_b = [1, 2]
44
+ values_b = [0.15, 0.25]
45
45
  return datetimes_a, values_a, datetimes_b, values_b
46
46
 
47
47
 
@@ -198,8 +198,9 @@ def test_store_ao_status_and_fried_parameter(quality_task, ao_values):
198
198
  """
199
199
  task = quality_task
200
200
  datetimes = ["2020-01-01T01:01:01", "2020-01-01T02:01:01"]
201
- fried_values = [3.0, 4.0]
202
- combined_values = [[ao, r0] for ao, r0 in zip(ao_values, fried_values)]
201
+ fried_values = [0.1, 0.2]
202
+ oob_values = [25, 50]
203
+ combined_values = [[ao, r0, oob] for ao, r0, oob in zip(ao_values, fried_values, oob_values)]
203
204
  task.quality_store_ao_status_and_fried_parameter(datetimes=datetimes, values=combined_values)
204
205
  path = list(task.read(tags=Tag.quality("AO_STATUS")))
205
206
  assert len(path) == 1
@@ -220,10 +221,11 @@ def test_store_ao_status_and_fried_parameter(quality_task, ao_values):
220
221
  @pytest.mark.parametrize(
221
222
  "combined_values",
222
223
  [
223
- pytest.param([[True, 1], [None, 2]], id="AO_some_none"),
224
- pytest.param([[True, 1], [True, None]], id="Fried_some_none"),
225
- pytest.param([[None, 1], [None, 2]], id="AO_all_none"),
226
- pytest.param([[True, None], [True, None]], id="Fried_all_none"),
224
+ pytest.param([[True, 0.1, 25], [None, 0.2, 25]], id="AO_some_none"),
225
+ pytest.param([[True, 0.1, 25], [True, None, 25]], id="Fried_some_none"),
226
+ pytest.param([[None, 0.1, 25], [None, 0.2, 25]], id="AO_all_none"),
227
+ pytest.param([[True, None, 25], [True, None, 25]], id="Fried_all_none"),
228
+ pytest.param([[True, 0.1, None], [True, 0.2, None]], id="Out_of_bounds_all_none"),
227
229
  ],
228
230
  )
229
231
  def test_store_ao_status_and_fried_parameter_with_nones(quality_task, combined_values):
@@ -231,13 +233,14 @@ def test_store_ao_status_and_fried_parameter_with_nones(quality_task, combined_v
231
233
  datetimes = ["2020-01-01T01:01:01", "2020-01-01T02:01:01"]
232
234
  task.quality_store_ao_status_and_fried_parameter(datetimes=datetimes, values=combined_values)
233
235
  path = list(task.read(tags=Tag.quality("AO_STATUS")))
234
- ao_values = [ao for ao, r0 in combined_values]
235
- fried_values = [r0 for ao, r0 in combined_values]
236
+ ao_values = [ao for ao, r0, oob in combined_values]
237
+ fried_values = [r0 for ao, r0, oob in combined_values]
238
+ ao_out_of_bounds = [oob for ao, r0, oob in combined_values]
236
239
  if not all(ao is None for ao in ao_values):
237
240
  assert len(path) == 1
238
241
  with path[0].open() as f:
239
242
  data = json.load(f)
240
- assert len(data) == sum(1 for ao, r0 in combined_values if ao is not None)
243
+ assert len(data) == sum(1 for ao, r0, oob in combined_values if ao is not None)
241
244
  else:
242
245
  assert len(path) == 0
243
246
  path = list(task.read(tags=Tag.quality("FRIED_PARAMETER")))
@@ -246,7 +249,7 @@ def test_store_ao_status_and_fried_parameter_with_nones(quality_task, combined_v
246
249
  with path[0].open() as f:
247
250
  data = json.load(f)
248
251
  assert len(data["y_values"]) == sum(
249
- 1 for ao, r0 in combined_values if ao is True and r0 is not None
252
+ 1 for ao, r0, oob in combined_values if ao is True and r0 is not None
250
253
  )
251
254
  else:
252
255
  assert len(path) == 0
@@ -263,7 +266,8 @@ def test_build_ao_status(quality_task, plot_data):
263
266
  datetimes = datetimes_a + datetimes_b
264
267
  fried_values = values_a + values_b
265
268
  ao_values = [False, True, True, True]
266
- combined_values = [[ao, r0] for ao, r0 in zip(ao_values, fried_values)]
269
+ oob_values = [25, 50, None, 50]
270
+ combined_values = [[ao, r0, oob] for ao, r0, oob in zip(ao_values, fried_values, oob_values)]
267
271
  task.quality_store_ao_status_and_fried_parameter(datetimes=datetimes, values=combined_values)
268
272
  metric = task.quality_build_ao_status()
269
273
  assert metric["name"] == "Adaptive Optics Status"
@@ -284,9 +288,15 @@ def test_build_fried_parameter(quality_task, plot_data):
284
288
  task = quality_task
285
289
  datetimes_a, fried_values_a, datetimes_b, fried_values_b = plot_data
286
290
  ao_values_a = [True, True]
287
- combined_values_a = [[ao, r0] for ao, r0 in zip(ao_values_a, fried_values_a)]
291
+ oob_values_a = [25, 50]
292
+ combined_values_a = [
293
+ [ao, r0, oob] for ao, r0, oob in zip(ao_values_a, fried_values_a, oob_values_a)
294
+ ]
288
295
  ao_values_b = [True, True]
289
- combined_values_b = [[ao, r0] for ao, r0 in zip(ao_values_b, fried_values_b)]
296
+ oob_values_b = [25, 50]
297
+ combined_values_b = [
298
+ [ao, r0, oob] for ao, r0, oob in zip(ao_values_b, fried_values_b, oob_values_b)
299
+ ]
290
300
  task.quality_store_ao_status_and_fried_parameter(
291
301
  datetimes=datetimes_a, values=combined_values_a
292
302
  )
@@ -307,14 +317,14 @@ def test_build_fried_parameter(quality_task, plot_data):
307
317
  "2021-01-01T02:01:01",
308
318
  ]
309
319
  ]
310
- assert metric["plot_data"]["series_data"][""][1] == [1, 2, 3, 4]
320
+ assert metric["plot_data"]["series_data"][""][1] == [0.15, 0.25, 0.1, 0.2]
311
321
  assert metric["name"] == "Fried Parameter"
312
322
  assert metric["metric_code"] == "FRIED_PARAMETER"
313
323
  assert metric["facet"] is None
314
324
  assert metric["warnings"] is None
315
325
  assert (
316
326
  metric["statement"]
317
- == "Average valid Fried Parameter measurements for L1 dataset: 2.5 ± 1.12 m"
327
+ == "Average valid Fried Parameter measurements for L1 dataset: 0.18 ± 0.06 m"
318
328
  )
319
329
 
320
330
 
@@ -340,12 +350,12 @@ def test_build_light_level(quality_task, plot_data):
340
350
  "2021-01-01T02:01:01",
341
351
  ]
342
352
  ]
343
- assert metric["plot_data"]["series_data"][""][1] == [1, 2, 3, 4]
353
+ assert metric["plot_data"]["series_data"][""][1] == [0.15, 0.25, 0.1, 0.2]
344
354
  assert metric["name"] == "Light Level"
345
355
  assert metric["metric_code"] == "LIGHT_LEVEL"
346
356
  assert metric["facet"] is None
347
357
  assert metric["warnings"] is None
348
- assert metric["statement"] == f"Average Light Level for L1 dataset: 2.5 ± 1.12 adu"
358
+ assert metric["statement"] == f"Average Light Level for L1 dataset: 0.18 ± 0.06 adu"
349
359
 
350
360
 
351
361
  def test_build_frame_average(quality_task, plot_data):
@@ -461,7 +471,7 @@ def test_build_noise(quality_task, plot_data):
461
471
  "2021-01-01T02:01:01",
462
472
  ]
463
473
  ]
464
- assert metric["plot_data"]["series_data"]["I"][1] == [1, 2, 3, 4]
474
+ assert metric["plot_data"]["series_data"]["I"][1] == [0.15, 0.25, 0.1, 0.2]
465
475
  assert metric["name"] == "Noise Estimation"
466
476
  assert metric["metric_code"] == "NOISE"
467
477
  assert metric["facet"] is None
@@ -493,7 +503,7 @@ def test_build_sensitivity(quality_task, plot_data):
493
503
  "2021-01-01T02:01:01",
494
504
  ]
495
505
  ]
496
- assert metric["plot_data"]["series_data"]["I"][1] == [1, 2, 3, 4]
506
+ assert metric["plot_data"]["series_data"]["I"][1] == [0.15, 0.25, 0.1, 0.2]
497
507
  assert metric["name"] == f"Sensitivity"
498
508
  assert metric["metric_code"] == "SENSITIVITY"
499
509
  assert metric["facet"] is None
@@ -692,7 +702,7 @@ def test_build_report(quality_task, plot_data):
692
702
  task.quality_store_task_type_counts(task_type="dark", total_frames=100, frames_not_used=7)
693
703
  task.quality_store_task_type_counts(task_type="gain", total_frames=100, frames_not_used=0)
694
704
  task.quality_store_ao_status_and_fried_parameter(
695
- datetimes=datetimes, values=[[True, values[0]], [True, values[1]]]
705
+ datetimes=datetimes, values=[[True, values[0], values[0]], [True, values[1], values[1]]]
696
706
  )
697
707
  task.quality_store_light_level(datetimes=datetimes, values=values)
698
708
  task.quality_store_frame_average(
@@ -201,9 +201,32 @@ def write_l1_task_with_empty_waveband(recipe_run_id, tmp_path, request):
201
201
  @pytest.fixture(
202
202
  scope="function",
203
203
  params=[
204
- pytest.param({"AO_LOCK": True}, id="AO_LOCK_True"),
205
- pytest.param({"AO_LOCK": False}, id="AO_LOCK_False"),
206
- pytest.param({}, id="AO_LOCK_missing"),
204
+ pytest.param(
205
+ {"AO_LOCK": True, "ATMOS_R0": 0.2, "OOBSHIFT": 17}, id="AO_LOCK_True_good_R0_good_oob"
206
+ ),
207
+ pytest.param(
208
+ {"AO_LOCK": True, "ATMOS_R0": 1, "OOBSHIFT": 17}, id="AO_LOCK_True_bad_R0_good_oob"
209
+ ),
210
+ pytest.param(
211
+ {"AO_LOCK": False, "ATMOS_R0": 0.2, "OOBSHIFT": 17}, id="AO_LOCK_False_good_R0_good_oob"
212
+ ),
213
+ pytest.param(
214
+ {"AO_LOCK": False, "ATMOS_R0": 1, "OOBSHIFT": 17}, id="AO_LOCK_False_bad_R0_good_oob"
215
+ ),
216
+ pytest.param(
217
+ {"AO_LOCK": True, "ATMOS_R0": 0.2, "OOBSHIFT": 150}, id="AO_LOCK_True_good_R0_bad_oob"
218
+ ),
219
+ pytest.param(
220
+ {"AO_LOCK": True, "ATMOS_R0": 1, "OOBSHIFT": 150}, id="AO_LOCK_True_bad_R0_bad_oob"
221
+ ),
222
+ pytest.param(
223
+ {"AO_LOCK": False, "ATMOS_R0": 0.2, "OOBSHIFT": 150}, id="AO_LOCK_False_good_R0_bad_oob"
224
+ ),
225
+ pytest.param(
226
+ {"AO_LOCK": False, "ATMOS_R0": 1, "OOBSHIFT": 150}, id="AO_LOCK_False_bad_R0_bad_oob"
227
+ ),
228
+ pytest.param({"ATMOS_R0": 0.2, "OOBSHIFT": 17}, id="AO_LOCK_missing"),
229
+ pytest.param({"ATMOS_R0": 0.2, "AO_LOCK": True}, id="OOBSHIFT_missing"),
207
230
  ],
208
231
  )
209
232
  def write_l1_task_no_data(request, recipe_run_id, tmp_path, complete_common_header):
@@ -216,10 +239,10 @@ def write_l1_task_no_data(request, recipe_run_id, tmp_path, complete_common_head
216
239
  ):
217
240
  task.scratch = WorkflowFileSystem(recipe_run_id=recipe_run_id, scratch_base_path=tmp_path)
218
241
  header = complete_common_header
219
- header.pop("AO_LOCK", None) # If it's not required, shouldn't be here in the first place??
242
+ header.pop("AO_LOCK", None)
243
+ header.pop("ATMOS_R0", None)
244
+ header.pop("OOBSHIFT", None)
220
245
  header.update(request.param)
221
- fried_parameter = 0.2
222
- header["ATMOS_R0"] = fried_parameter
223
246
  hdu = fits.PrimaryHDU(data=np.random.random(size=(1, 1, 1)) * 1, header=header)
224
247
  hdul = fits.HDUList([hdu])
225
248
  task.write(
@@ -231,7 +254,9 @@ def write_l1_task_no_data(request, recipe_run_id, tmp_path, complete_common_head
231
254
  encoder=fits_hdulist_encoder,
232
255
  )
233
256
  task.constants._update(asdict(FakeConstantDb()))
234
- yield task, header, fried_parameter
257
+ fried_parameter = request.param["ATMOS_R0"]
258
+ oob_shift = request.param.get("OOBSHIFT")
259
+ yield task, header, fried_parameter, oob_shift
235
260
  task._purge()
236
261
 
237
262
 
@@ -650,7 +675,7 @@ def test_check_r0_ao_lock(write_l1_task_no_data):
650
675
  :When: writing, check if the AO lock is on
651
676
  :Then: write the r0 value if AO lock on, don't write if AO lock off
652
677
  """
653
- task, header, r0 = write_l1_task_no_data
678
+ task, header, r0, _ = write_l1_task_no_data
654
679
  header_after_check = task.remove_invalid_r0_values(header=header)
655
680
  if header.get("AO_LOCK"):
656
681
  assert header_after_check["ATMOS_R0"] == header["ATMOS_R0"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 10.8.2
3
+ Version: 10.8.3
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -22,6 +22,7 @@ dkist_processing_common/models/__init__.py,sha256=6LMqemdzVZ87fRrpAsbEnTtWZ02_Gu
22
22
  dkist_processing_common/models/constants.py,sha256=1Eb8RDeuCr6brl237iGKxYLWCH49I6bOUEj_Tv-zFbQ,5441
23
23
  dkist_processing_common/models/fits_access.py,sha256=Au9JROwhVla9zb_u0dN8mIWiSJd_Pca0oOr4N1hN0HY,4113
24
24
  dkist_processing_common/models/flower_pot.py,sha256=59C5uGYKyMyncqQYxhzDZWl8k1DRZFB6s9RF-HFp9mY,5128
25
+ dkist_processing_common/models/fried_parameter.py,sha256=ro_H2Eo3I88lRf1wJjZfTc_XOjhgLt4whIQR_sjAFbM,1609
25
26
  dkist_processing_common/models/graphql.py,sha256=t2PYEjEwSq08zq0HcVH2RG5FX4PVXgs4BdM2gunJ8fs,4747
26
27
  dkist_processing_common/models/message.py,sha256=DRW7Qhl01dF5KagcqLta5U-uzdOMewrsHvMatDT6jnk,1684
27
28
  dkist_processing_common/models/message_queue_binding.py,sha256=ROQ2ZQE3TCr4gVbz4WggvUSExAiWP8SD_GjjQl482M8,1012
@@ -40,7 +41,7 @@ dkist_processing_common/parsers/l0_fits_access.py,sha256=mhgezAA0X5zvgEmZFPIgKYp
40
41
  dkist_processing_common/parsers/l1_fits_access.py,sha256=o0_7XfcCcuKpuN8K0E_dfEnPvB1a9VxqKBaxpRGDOL0,2595
41
42
  dkist_processing_common/parsers/near_bud.py,sha256=gLTr7EILVCREAhmE0VaU7-KKc7aosoMmZmQtJEXxs2I,3733
42
43
  dkist_processing_common/parsers/proposal_id_bud.py,sha256=61uRxT538UDiEg3_By_asSzQ96xkAuCEEZZTrk0UF0E,677
43
- dkist_processing_common/parsers/quality.py,sha256=5f6Go-xf3kcmQyZ4NCcwRNG7OwQFATCp1YvYJtJBOh0,1058
44
+ dkist_processing_common/parsers/quality.py,sha256=Lg5z53kAvJuw-lPrX9HSkkFi0Bk0D5oDv8TAIgbLOMo,1140
44
45
  dkist_processing_common/parsers/retarder.py,sha256=OzhdC8VoV2zdcvq8Nn5Ghc-Q3BFfMRITLx5jMHrWNqI,1440
45
46
  dkist_processing_common/parsers/single_value_single_key_flower.py,sha256=cQX_C_Ms6EIOCW5TTDo6PnLoJ6In6MQTShKdMvt57OU,1230
46
47
  dkist_processing_common/parsers/task.py,sha256=RTNGSg3BUpEYLOcolN79Wc16s86FqRcDP-H7Hj9ovGg,3938
@@ -53,12 +54,12 @@ dkist_processing_common/tasks/base.py,sha256=k_IJR5sVV6ennX0sbeb0C6dciqshdY7CKjt
53
54
  dkist_processing_common/tasks/l1_output_data.py,sha256=IM-nvGaTM5r-z-9vHr2wovPVUpuNCah-cWIFMO2fcII,10576
54
55
  dkist_processing_common/tasks/output_data_base.py,sha256=CC1TnCrChi8_iuMymr425CJqpY4jCggnVUMfqzFkpnw,3682
55
56
  dkist_processing_common/tasks/parse_l0_input_data.py,sha256=iRMGdvhxBobNsTDQ0IEl0myDfB4P_xpxA00guuBWDj8,7986
56
- dkist_processing_common/tasks/quality_metrics.py,sha256=g6MUq8s8jELDinkn6o45rfONyODw92JyVMrzb7Dd7OI,12458
57
+ dkist_processing_common/tasks/quality_metrics.py,sha256=dWuPKBD5elRCZEs4ZC91tyXxkuPUwMuvy9OoGU9Zs04,12489
57
58
  dkist_processing_common/tasks/teardown.py,sha256=e4LKnphJDYDVDAez2tH7MxpZgCmxYsKrq9Zk0qAkzzM,2355
58
59
  dkist_processing_common/tasks/transfer_input_data.py,sha256=afEW0glpCFMZRj90nFtQo_4XOQ4CuoOh86jahP6a-a0,5548
59
60
  dkist_processing_common/tasks/trial_catalog.py,sha256=Y3DKstRfMS8nWWtJFMB0MUVPlZ1jWS_2jhJGMWwxy50,8748
60
61
  dkist_processing_common/tasks/trial_output_data.py,sha256=aI_aRuu0qVO8zFGrr_9baxx9i3jUEHZSmsmbO6ytlkE,6960
61
- dkist_processing_common/tasks/write_l1.py,sha256=vwNJs8gSzc0RPIfcpZ267L6pIJWdbPQ8ZmKR6hX1BIs,23498
62
+ dkist_processing_common/tasks/write_l1.py,sha256=EBQEViaLG2MzWsXOvNi8tsVsgzVJXBrLSGmYtsVgSlo,23781
62
63
  dkist_processing_common/tasks/mixin/__init__.py,sha256=-g-DQbU7m1bclJYuFe3Yh757V-35GIDTbstardKQ7nU,68
63
64
  dkist_processing_common/tasks/mixin/globus.py,sha256=QAV8VElxMAqxJ2KSB_bJaraceovYfjHXjOdocrTCkIA,6592
64
65
  dkist_processing_common/tasks/mixin/input_dataset.py,sha256=dkW5vf_QPgWedHO_Lf9GjBxr1QrUCKs6gIXufUTi7GE,6813
@@ -67,7 +68,7 @@ dkist_processing_common/tasks/mixin/metadata_store.py,sha256=dMwjlhBI89xX0Pagub2
67
68
  dkist_processing_common/tasks/mixin/object_store.py,sha256=Vn4l2XuCimii9Fc3gM-pQGIkTKMv_ldqljlxkLesZLU,3236
68
69
  dkist_processing_common/tasks/mixin/quality/__init__.py,sha256=Bgu-DHW7yXLiehglldOCWluEkAP5qh0Hp1F30rh5NFw,383
69
70
  dkist_processing_common/tasks/mixin/quality/_base.py,sha256=nZ9IC-O-hsLXa5-tk29B13CZyQIdhJCv0eO9cdkAhWc,8303
70
- dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=WenTfa12guIUfm0GzkrK2gduKaOHs03e6RhE6j37Les,54304
71
+ dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=lkHU6SeWeMfzf0QPM28_K9znllKx6rK91v1TiQ7vYfw,54556
71
72
  dkist_processing_common/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
73
  dkist_processing_common/tests/conftest.py,sha256=h_ObhpXb1S0-db0Je8XoHNLkrXxXW_0B0TMhbnbDjMo,30160
73
74
  dkist_processing_common/tests/test_assemble_movie.py,sha256=XY_ruXSYP5k6s2gUAwlFdnhJ81eyWLSd2O9IkX4RXeo,4165
@@ -78,6 +79,7 @@ dkist_processing_common/tests/test_constants.py,sha256=Kc9k5TdYy5QkRRlGav6kfI2dy
78
79
  dkist_processing_common/tests/test_cs_step.py,sha256=RA0QD3D8eaL3YSOL_gIJ9wkngy14RQ2jbD-05KAziW4,2408
79
80
  dkist_processing_common/tests/test_fits_access.py,sha256=tyUPNbUqoTPhQgzua_doWP9l9ee4ir_LLV-I9rHktcs,11393
80
81
  dkist_processing_common/tests/test_flower_pot.py,sha256=X9_UI3maa3ZQncV3jYHgovWnawDsdEkEB5vw6EAB96o,3151
82
+ dkist_processing_common/tests/test_fried_parameter.py,sha256=iXtlQIifZ6cDOkEi-YDgP3oAlss2loq08Uohgvy1byQ,1295
81
83
  dkist_processing_common/tests/test_input_dataset.py,sha256=AI5uqaDea4kOwpwAU5qQdzUbxMpBwD20YCAvB7nzD5o,18766
82
84
  dkist_processing_common/tests/test_interservice_bus.py,sha256=M_iv2CLmx5TnCB1VUN4YjkQ2LEUjfCKk7-ZlkV62XEQ,3000
83
85
  dkist_processing_common/tests/test_interservice_bus_mixin.py,sha256=8TTl0aypkq5gBPeyqSaQHbz_jmt5RmSD2oI8kT4Q1ZA,4195
@@ -87,7 +89,7 @@ dkist_processing_common/tests/test_parameters.py,sha256=Tr0Wu8-_rj9Lp7CkUVmJjSou
87
89
  dkist_processing_common/tests/test_parse_l0_input_data.py,sha256=SMNV1qyQTvnMx94MCNsiA-RyS9uxaxIABEDDxsuVzqY,10629
88
90
  dkist_processing_common/tests/test_publish_catalog_messages.py,sha256=wB2lcAnT77yVnqO0cFWOPxGf-tZ8U62kvvpiB5roBwQ,3268
89
91
  dkist_processing_common/tests/test_quality.py,sha256=vomy2YSPadKqJj2tG8sCs-UkQVvfKus7Cum7_Hpee4I,10257
90
- dkist_processing_common/tests/test_quality_mixin.py,sha256=dLMJFK8V-KQyitdwnbNON7GEyghp6Wq2EszOsIM-uZ4,46538
92
+ dkist_processing_common/tests/test_quality_mixin.py,sha256=hliXew6Sq7R166B2WZf022LyMKDio5G8jvkebHTm4ok,47067
91
93
  dkist_processing_common/tests/test_scratch.py,sha256=7f28FMiSskSNX-bkRSrpJf2u1HQIbSvYajbjkeGMF9s,16481
92
94
  dkist_processing_common/tests/test_stems.py,sha256=DRTfSVC1bVJ8mD9E9eR1W5lUHXBR2uBNkYBcWnVlA5E,28471
93
95
  dkist_processing_common/tests/test_submit_dataset_metadata.py,sha256=F1IKBFWhjjMhONxEgs5p-cpjbQwxh7BLhDFw9b6j874,3806
@@ -100,7 +102,7 @@ dkist_processing_common/tests/test_transfer_l1_output_data.py,sha256=27PifkyH3RZ
100
102
  dkist_processing_common/tests/test_trial_catalog.py,sha256=SZ-nyn0MXU9Lkg_94FbKER_cwiGoi06GYlzF_3AmvKg,6802
101
103
  dkist_processing_common/tests/test_trial_output_data.py,sha256=cBCj0kXyF5NEMzKh6zPVksdoXyE8ju1opJgWgjdcJWA,12790
102
104
  dkist_processing_common/tests/test_workflow_task_base.py,sha256=Z5aPW5LQtS0UWJiYho4X0r-2gPLfzpkmMwfmaoFLjMg,10517
103
- dkist_processing_common/tests/test_write_l1.py,sha256=ahAdMg3QhE-gnV_UMhL_xne-H5nHHDVMOWrP1vonIQ0,25962
105
+ dkist_processing_common/tests/test_write_l1.py,sha256=FHQMH1_JHXCEOpzLx97iRpj9pEIW5xQ8RlqvRspkSFY,27055
104
106
  docs/Makefile,sha256=qnlVz6PuBqE39NfHWuUnHhNEA-EFgT2-WJNNNy9ttfk,4598
105
107
  docs/changelog.rst,sha256=S2jPASsWlQxSlAPqdvNrYvhk9k3FcFWNXFNDYXBSjl4,120
106
108
  docs/conf.py,sha256=FkX575cqTqZGCcLAjg2MlvE8Buj1Vt3CpHNgZxG256E,1890
@@ -109,7 +111,7 @@ docs/landing_page.rst,sha256=aPAuXFhBx73lEZ59B6E6JXxkK0LlxzD0n-HXqHrfumQ,746
109
111
  docs/make.bat,sha256=mBAhtURwhQ7yc95pqwJzlhqBSvRknr1aqZ5s8NKvdKs,4513
110
112
  docs/requirements.txt,sha256=Kbl_X4c7RQZw035YTeNB63We6I7pvXFU4T0Uflp2yDY,29
111
113
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
112
- dkist_processing_common-10.8.2.dist-info/METADATA,sha256=8bbHCAylpH-0Ux_TMjUDNRySAFXKZHStbLWMYaQSKF8,7147
113
- dkist_processing_common-10.8.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
114
- dkist_processing_common-10.8.2.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
115
- dkist_processing_common-10.8.2.dist-info/RECORD,,
114
+ dkist_processing_common-10.8.3.dist-info/METADATA,sha256=pE3CBPNa-RjcRqsAt7RjadTRF7su-d8BGuzS4wklOnk,7147
115
+ dkist_processing_common-10.8.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ dkist_processing_common-10.8.3.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
117
+ dkist_processing_common-10.8.3.dist-info/RECORD,,