dkist-processing-common 11.1.0rc1__py3-none-any.whl → 11.2.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.
@@ -1,6 +1,7 @@
1
1
  """GraphQL Data models for the metadata store api."""
2
2
  from pydantic import BaseModel
3
3
  from pydantic import ConfigDict
4
+ from pydantic import field_serializer
4
5
  from pydantic import field_validator
5
6
  from pydantic import Json
6
7
 
@@ -129,6 +130,10 @@ class RecipeRunResponse(GraphqlBaseModel):
129
130
  return RecipeRunConfiguration()
130
131
  return RecipeRunConfiguration.model_validate(value)
131
132
 
133
+ @field_serializer("configuration")
134
+ def _serialize_as_basemodel(self, config: RecipeRunConfiguration):
135
+ return config.model_dump()
136
+
132
137
 
133
138
  class RecipeRunMutationResponse(GraphqlBaseModel):
134
139
  """Recipe run mutation response."""
@@ -2,10 +2,10 @@
2
2
  import logging
3
3
  from abc import ABC
4
4
  from abc import abstractmethod
5
+ from importlib.resources import files
5
6
  from typing import Literal
6
7
 
7
8
  import numpy as np
8
- import pkg_resources
9
9
  from matplotlib import colormaps
10
10
  from moviepy import VideoClip
11
11
  from PIL import Image
@@ -66,7 +66,7 @@ class AssembleMovie(WorkflowTaskBase, ABC):
66
66
  MINIMUM_DURATION = 10 # seconds
67
67
  MAXIMUM_DURATION = 60 # seconds
68
68
  FPS = 15
69
- FONT_FILE = pkg_resources.resource_filename("dkist_processing_common", "fonts/Lato-Regular.ttf")
69
+ FONT_FILE = files("dkist_processing_common").joinpath("fonts/Lato-Regular.ttf")
70
70
  TEXT_MARGIN_PX = 5
71
71
  MPL_COLOR_MAP = "viridis"
72
72
 
@@ -1365,13 +1365,22 @@ class _WavecalQualityMixin:
1365
1365
  wcs = WCS(best_fit_header)
1366
1366
  best_fit_wavelength = wcs.spectral.pixel_to_world(np.arange(input_spectrum.size))
1367
1367
 
1368
+ finite_idx = (
1369
+ np.isfinite(input_wavelength)
1370
+ * np.isfinite(input_spectrum)
1371
+ * np.isfinite(best_fit_wavelength)
1372
+ * np.isfinite(best_fit_atlas)
1373
+ * np.isfinite(normalized_residuals)
1374
+ * np.isfinite(weight_data)
1375
+ )
1376
+
1368
1377
  data = {
1369
- "input_wavelength_nm": input_wavelength.to_value(u.nm).tolist(),
1370
- "input_spectrum": input_spectrum.tolist(),
1371
- "best_fit_wavelength_nm": best_fit_wavelength.to_value(u.nm).tolist(),
1372
- "best_fit_atlas": best_fit_atlas.tolist(),
1373
- "normalized_residuals": normalized_residuals.tolist(),
1374
- "weights": None if weights is None else weight_data.tolist(),
1378
+ "input_wavelength_nm": input_wavelength.to_value(u.nm)[finite_idx].tolist(),
1379
+ "input_spectrum": input_spectrum[finite_idx].tolist(),
1380
+ "best_fit_wavelength_nm": best_fit_wavelength.to_value(u.nm)[finite_idx].tolist(),
1381
+ "best_fit_atlas": best_fit_atlas[finite_idx].tolist(),
1382
+ "normalized_residuals": normalized_residuals[finite_idx].tolist(),
1383
+ "weights": None if weights is None else weight_data[finite_idx].tolist(),
1375
1384
  }
1376
1385
 
1377
1386
  self._record_values(values=data, tags=[Tag.quality(MetricCode.wavecal_fit)])
@@ -230,7 +230,13 @@ class WriteL1Frame(WorkflowTaskBase, MetadataStoreMixin, ABC):
230
230
  header = self.add_contributing_id_headers(header=header)
231
231
  header["MANPROCD"] = self.workflow_had_manual_intervention
232
232
  header["PRODUCT"] = self.compute_product_id(header["IDSOBSID"], header["PROCTYPE"])
233
- # Spectral line keywords
233
+ return header
234
+
235
+ def add_spectral_line_headers(
236
+ self,
237
+ header: fits.Header,
238
+ ) -> fits.Header:
239
+ """Add datacenter table keys relating to spectral lines."""
234
240
  wavelength_range = self.get_wavelength_range(header=header)
235
241
  spectral_lines = get_spectral_lines(
236
242
  wavelength_min=wavelength_range.min,
@@ -364,6 +370,8 @@ class WriteL1Frame(WorkflowTaskBase, MetadataStoreMixin, ABC):
364
370
  header = self.add_doc_headers(header=header)
365
371
  # Add the dataset headers (abstract - implement in instrument task)
366
372
  header = self.add_dataset_headers(header=header, stokes=stokes_param)
373
+ # Add the spectral line headers
374
+ header = self.add_spectral_line_headers(header=header)
367
375
  # Remove any headers not contained in spec 214
368
376
  header = remove_spec_122_keys_and_spec_214_l0_keys(input_headers=header)
369
377
  # Remove any keys referring to axes that don't exist
@@ -1201,12 +1201,16 @@ def wavecal_input_wavelength() -> u.Quantity:
1201
1201
 
1202
1202
  @pytest.fixture(scope="session")
1203
1203
  def wavecal_input_spectrum(wavecal_input_wavelength) -> np.ndarray:
1204
- return (wavecal_input_wavelength.value - wavecal_input_wavelength.size // 2) ** 2 + 10.0
1204
+ spec = (wavecal_input_wavelength.value - wavecal_input_wavelength.size // 2) ** 2 + 10.0
1205
+ spec[spec.size // 2] = np.nan
1206
+ return spec
1205
1207
 
1206
1208
 
1207
1209
  @pytest.fixture(scope="session")
1208
1210
  def wavecal_weights(wavecal_input_wavelength) -> np.ndarray:
1209
- return np.arange(wavecal_input_wavelength.size)
1211
+ weights = np.arange(wavecal_input_wavelength.size, dtype=float)
1212
+ weights[0] = np.inf
1213
+ return weights
1210
1214
 
1211
1215
 
1212
1216
  @pytest.fixture(scope="session")
@@ -2,12 +2,11 @@ import json
2
2
  import logging
3
3
  import re
4
4
  import tomllib
5
- from dataclasses import asdict
5
+ from importlib.metadata import version
6
6
  from pathlib import Path
7
7
  from string import ascii_uppercase
8
8
 
9
9
  import pytest
10
- from pkg_resources import get_distribution
11
10
  from sqids import Sqids
12
11
 
13
12
  import dkist_processing_common
@@ -272,7 +271,7 @@ def test_library_versions(provenance_task, package_dependencies):
272
271
  # installed packages.
273
272
  for package in package_dependencies:
274
273
  assert package in libraries
275
- assert libraries[package] == get_distribution(package).version
274
+ assert libraries[package] == version(package)
276
275
 
277
276
 
278
277
  def test_record_provenance(provenance_task):
@@ -677,7 +677,7 @@ def test_spectral_line_keys(write_l1_task, mocker, fake_gql_client):
677
677
  new=fake_gql_client,
678
678
  )
679
679
  task, _, header = write_l1_task
680
- header = task.add_datacenter_headers(header=header, hdu_size=1024, stokes="I")
680
+ header = task.add_spectral_line_headers(header=header)
681
681
  assert header["SPECLN01"] == "Fe XIII (1079.8 nm)"
682
682
  assert header["SPECLN02"] == "He I (1083.0 nm)"
683
683
  assert header["NSPECLNS"] == 2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 11.1.0rc1
3
+ Version: 11.2.0
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
@@ -1,5 +1,4 @@
1
1
  changelog/.gitempty,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- changelog/255.misc.rst,sha256=Y0CIOQbdAK8Emlz6wQaX59hg1Hr9QDhDMv7-Z-OpbAU,255
3
2
  dkist_processing_common/__init__.py,sha256=490Fwm_GgqpwriQlsYfKcLUZNhZ6GkINtJqcYSIEKoU,319
4
3
  dkist_processing_common/config.py,sha256=IcpaD_NvHZU-aLlUNOTdRC4V7ADIvVQwrZ2dHhIr4NY,4247
5
4
  dkist_processing_common/manual.py,sha256=mrW__HupEZMYOxUxfKsdsTI3TfOrOrWHS9yXC_835W4,7023
@@ -27,7 +26,7 @@ dkist_processing_common/models/dkist_location.py,sha256=3cbN6As60tJa0uoOSNFNnz2s
27
26
  dkist_processing_common/models/fits_access.py,sha256=Au9JROwhVla9zb_u0dN8mIWiSJd_Pca0oOr4N1hN0HY,4113
28
27
  dkist_processing_common/models/flower_pot.py,sha256=59C5uGYKyMyncqQYxhzDZWl8k1DRZFB6s9RF-HFp9mY,5128
29
28
  dkist_processing_common/models/fried_parameter.py,sha256=ro_H2Eo3I88lRf1wJjZfTc_XOjhgLt4whIQR_sjAFbM,1609
30
- dkist_processing_common/models/graphql.py,sha256=RcFlSDTtV6TwHExb9Y89NhTfLMx2ysdqecY7kHuRwg0,5690
29
+ dkist_processing_common/models/graphql.py,sha256=ahCGiDZlbx31_SFfOLyS-qzVzxYvd18zUEAGZWYGjCM,5874
31
30
  dkist_processing_common/models/input_dataset.py,sha256=stQa_lbFPr2tmOUpQgpDuwM0-DiIDV3zYwyawh01cKc,4172
32
31
  dkist_processing_common/models/message.py,sha256=DRW7Qhl01dF5KagcqLta5U-uzdOMewrsHvMatDT6jnk,1684
33
32
  dkist_processing_common/models/message_queue_binding.py,sha256=ROQ2ZQE3TCr4gVbz4WggvUSExAiWP8SD_GjjQl482M8,1012
@@ -54,7 +53,7 @@ dkist_processing_common/parsers/time.py,sha256=jcyhID_6ldkLZMBO9gqzYJ-oAD1kmFOTh
54
53
  dkist_processing_common/parsers/unique_bud.py,sha256=ht_1Oi1OL7otZOMXcoVilmDSYVCC7KZ7Fj-TfKDFcqw,3173
55
54
  dkist_processing_common/parsers/wavelength.py,sha256=Cb0opJmFRLQVPIMC5YRSDeygWjvQGS9avYrFhLsBekY,546
56
55
  dkist_processing_common/tasks/__init__.py,sha256=uH8DTiQP-cx4vMK53S4LYGZGmbip5s0kWORvZBrSNj8,624
57
- dkist_processing_common/tasks/assemble_movie.py,sha256=9K4sgXyRKaX7UsFBIs138pG3AtClwLLopYw3ZQY3ok4,12771
56
+ dkist_processing_common/tasks/assemble_movie.py,sha256=6tb_vOwXZuQEhGBK8LoBaGnYQnpv_FiE9DVa_cLjreE,12771
58
57
  dkist_processing_common/tasks/base.py,sha256=k_IJR5sVV6ennX0sbeb0C6dciqshdY7CKjtWHy_adm8,13143
59
58
  dkist_processing_common/tasks/l1_output_data.py,sha256=IM-nvGaTM5r-z-9vHr2wovPVUpuNCah-cWIFMO2fcII,10576
60
59
  dkist_processing_common/tasks/output_data_base.py,sha256=CC1TnCrChi8_iuMymr425CJqpY4jCggnVUMfqzFkpnw,3682
@@ -64,7 +63,7 @@ dkist_processing_common/tasks/teardown.py,sha256=e4LKnphJDYDVDAez2tH7MxpZgCmxYsK
64
63
  dkist_processing_common/tasks/transfer_input_data.py,sha256=8dDOfnT46qavGW-6fy-FT9LVb0TXANSpk1WpACpWK70,5787
65
64
  dkist_processing_common/tasks/trial_catalog.py,sha256=Y3DKstRfMS8nWWtJFMB0MUVPlZ1jWS_2jhJGMWwxy50,8748
66
65
  dkist_processing_common/tasks/trial_output_data.py,sha256=ehuts_L_GrnTRsVNeoh1N2kgQhId6_FnrMEiJ_2X_Jc,6834
67
- dkist_processing_common/tasks/write_l1.py,sha256=EtCy7vltkZsZgoCAQybKgI35nmQncm0XrhIKxGJGSyc,22615
66
+ dkist_processing_common/tasks/write_l1.py,sha256=KSb62iTYP21XBqIYVQVx6X8vhpcLn403EgGG4DJ2wag,22876
68
67
  dkist_processing_common/tasks/mixin/__init__.py,sha256=-g-DQbU7m1bclJYuFe3Yh757V-35GIDTbstardKQ7nU,68
69
68
  dkist_processing_common/tasks/mixin/globus.py,sha256=QAV8VElxMAqxJ2KSB_bJaraceovYfjHXjOdocrTCkIA,6592
70
69
  dkist_processing_common/tasks/mixin/interservice_bus.py,sha256=I7BUh0o8AEX-FZv7gxCts6is0uq9lycWjtTB2KqwBrU,1080
@@ -72,7 +71,7 @@ dkist_processing_common/tasks/mixin/metadata_store.py,sha256=yTKijpQ-tNx_H2V_9Hs
72
71
  dkist_processing_common/tasks/mixin/object_store.py,sha256=Vn4l2XuCimii9Fc3gM-pQGIkTKMv_ldqljlxkLesZLU,3236
73
72
  dkist_processing_common/tasks/mixin/quality/__init__.py,sha256=Bgu-DHW7yXLiehglldOCWluEkAP5qh0Hp1F30rh5NFw,383
74
73
  dkist_processing_common/tasks/mixin/quality/_base.py,sha256=U1AEhj6OtF4YEdTkKWcgmoH6zrz6tYNjNXnmVU24L70,8491
75
- dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=sQspAXoeSA2dQSX6wQuJKGON2XFilB5t29kNXhSLMmY,59844
74
+ dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=kBZqvYvCKx0ar1tYw-f1AYNMORekqMERo73fsZS3QQU,60210
76
75
  dkist_processing_common/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
76
  dkist_processing_common/tests/conftest.py,sha256=xTmu87MZSPIcucg9UCH88OimdqgjE5VSc-n-fSFbtjI,22319
78
77
  dkist_processing_common/tests/mock_metadata_store.py,sha256=ZVxAtVoW8ayEceafeR8yJbGdFZsw13Eyf1Z2-rwGZDM,8260
@@ -95,7 +94,7 @@ dkist_processing_common/tests/test_parameters.py,sha256=kNzX89vfrNRJ8d9rusMVv4DM
95
94
  dkist_processing_common/tests/test_parse_l0_input_data.py,sha256=SMNV1qyQTvnMx94MCNsiA-RyS9uxaxIABEDDxsuVzqY,10629
96
95
  dkist_processing_common/tests/test_publish_catalog_messages.py,sha256=l6Wga1s2wNBIf4wGZ78ZIO_rtqjdidmtvlN9nMnQUAs,3222
97
96
  dkist_processing_common/tests/test_quality.py,sha256=vomy2YSPadKqJj2tG8sCs-UkQVvfKus7Cum7_Hpee4I,10257
98
- dkist_processing_common/tests/test_quality_mixin.py,sha256=NVpHCHVAO_kbM1hfgOCYYzq88zZP2jOEEjkOfaS8jcY,55120
97
+ dkist_processing_common/tests/test_quality_mixin.py,sha256=Kaj4gFglRiWrYaL_USnsyK8-5-wrMQuG36nU8YSXus0,55229
99
98
  dkist_processing_common/tests/test_scratch.py,sha256=7f28FMiSskSNX-bkRSrpJf2u1HQIbSvYajbjkeGMF9s,16481
100
99
  dkist_processing_common/tests/test_stems.py,sha256=ini5dylLT5ioWKKWd1uu6kwx8Tf3aEnKKaGjf46a_GI,32649
101
100
  dkist_processing_common/tests/test_submit_dataset_metadata.py,sha256=LHEyjoIxJHXXssqKkr8Qn1NzzHD1FLJiD3lP8yaLiXU,3764
@@ -107,8 +106,8 @@ dkist_processing_common/tests/test_transfer_input_data.py,sha256=bLBQs7qiYKJz3MN
107
106
  dkist_processing_common/tests/test_transfer_l1_output_data.py,sha256=PVGDJBEUk4kAeu8ivrhlCE7yd29R18t9kZLFx-mpBwY,2063
108
107
  dkist_processing_common/tests/test_trial_catalog.py,sha256=y5SDjns8CoAY_Wr3pgkYwvRB-ieRXavbF5_2AZ4NFNM,6777
109
108
  dkist_processing_common/tests/test_trial_output_data.py,sha256=TUPycx_hDgyQj_k6xqDQXgS25yrz78vh78SArZHHm0g,12008
110
- dkist_processing_common/tests/test_workflow_task_base.py,sha256=Z5aPW5LQtS0UWJiYho4X0r-2gPLfzpkmMwfmaoFLjMg,10517
111
- dkist_processing_common/tests/test_write_l1.py,sha256=Uj6eOCcmfrTTfRY7pgkS2tqaWH_9RFDg8KAFRJCLSQw,28020
109
+ dkist_processing_common/tests/test_workflow_task_base.py,sha256=pxdR_qBWINty82rRhSt_nhaC0g-wBMWMoF4R3RUWSXM,10465
110
+ dkist_processing_common/tests/test_write_l1.py,sha256=LORwt8Eb2myfcFqNWTLNWERvZ1fAD9FgonzJEF76ABI,27996
112
111
  docs/Makefile,sha256=qnlVz6PuBqE39NfHWuUnHhNEA-EFgT2-WJNNNy9ttfk,4598
113
112
  docs/changelog.rst,sha256=S2jPASsWlQxSlAPqdvNrYvhk9k3FcFWNXFNDYXBSjl4,120
114
113
  docs/conf.py,sha256=FkX575cqTqZGCcLAjg2MlvE8Buj1Vt3CpHNgZxG256E,1890
@@ -117,7 +116,7 @@ docs/landing_page.rst,sha256=aPAuXFhBx73lEZ59B6E6JXxkK0LlxzD0n-HXqHrfumQ,746
117
116
  docs/make.bat,sha256=mBAhtURwhQ7yc95pqwJzlhqBSvRknr1aqZ5s8NKvdKs,4513
118
117
  docs/requirements.txt,sha256=Kbl_X4c7RQZw035YTeNB63We6I7pvXFU4T0Uflp2yDY,29
119
118
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
120
- dkist_processing_common-11.1.0rc1.dist-info/METADATA,sha256=dRRRLyGbSfnb7REoyDKxbfdrs8x9-iJelOzGHv9fcOg,7204
121
- dkist_processing_common-11.1.0rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
- dkist_processing_common-11.1.0rc1.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
123
- dkist_processing_common-11.1.0rc1.dist-info/RECORD,,
119
+ dkist_processing_common-11.2.0.dist-info/METADATA,sha256=B6nAxP9DTElEykVWOBFt9SEAsq_CJS2NIxneZXBaj6c,7201
120
+ dkist_processing_common-11.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
121
+ dkist_processing_common-11.2.0.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
122
+ dkist_processing_common-11.2.0.dist-info/RECORD,,
changelog/255.misc.rst DELETED
@@ -1,3 +0,0 @@
1
- Create a factory for custom `FakeGQLClient` used in tests. The factory and associated default returns live in a
2
- new `mock_metadata_store.py` module in the tests directory. `FakeGQLClient` is now a test fixture and does not need to
3
- be imported in tests.