From 33fa2fd95a345bb9c2a09d01a1ef5b39ad0359c9 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 15:49:24 -0400 Subject: [PATCH 01/13] Update return annotations to u.Quantity[u.K] --- sunkit_dem/base_model.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index 153c51c..444a635 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -73,11 +73,13 @@ def _keys(self): @property @u.quantity_input def temperature_bin_centers(self) -> u.K: + def temperature_bin_centers(self) -> u.Quantity[u.K]: return (self.temperature_bin_edges[1:] + self.temperature_bin_edges[:-1])/2 @property @u.quantity_input def temperature_bin_widths(self) -> u.K: + def temperature_bin_widths(self) -> u.Quantity[u.K]: return np.diff(self.temperature_bin_edges) @property From cc00eedd1a2d499b0019f6698d09473029825642 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 15:49:37 -0400 Subject: [PATCH 02/13] Update return annotations to u.Quantity[u.K] --- sunkit_dem/base_model.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index 444a635..a466b3f 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -72,13 +72,11 @@ def _keys(self): @property @u.quantity_input - def temperature_bin_centers(self) -> u.K: def temperature_bin_centers(self) -> u.Quantity[u.K]: return (self.temperature_bin_edges[1:] + self.temperature_bin_edges[:-1])/2 @property @u.quantity_input - def temperature_bin_widths(self) -> u.K: def temperature_bin_widths(self) -> u.Quantity[u.K]: return np.diff(self.temperature_bin_edges) From 2bb4c9455b4e65f3f0f915a7c3947c7eb6978187 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 15:55:35 -0400 Subject: [PATCH 03/13] Add some docstrings related to temperature bins --- sunkit_dem/base_model.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index a466b3f..8840c32 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -73,11 +73,26 @@ def _keys(self): @property @u.quantity_input def temperature_bin_centers(self) -> u.Quantity[u.K]: + """ + The temperature at the midpoint of each temperature bin. + + Notes + ----- + The center of each temperature bin is calculated in physical + space, not in log space. + """ return (self.temperature_bin_edges[1:] + self.temperature_bin_edges[:-1])/2 @property @u.quantity_input def temperature_bin_widths(self) -> u.Quantity[u.K]: + """ + The width of each temperature bin. + + Notes + ----- + The widths of each bin are calculated in physical space, not in log space. + """ return np.diff(self.temperature_bin_edges) @property From 97ad37afdb01851ddf56706a36496a7d513d117e Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 15:56:34 -0400 Subject: [PATCH 04/13] Add type annotations within GenericModel --- sunkit_dem/base_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index 8840c32..fd694fc 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -100,7 +100,7 @@ def data(self) -> ndcube.NDCollection: return self._data @data.setter - def data(self, data): + def data(self, data: ndcube.NDCollection): """ Check that input data is correctly formatted as an `ndcube.NDCollection` @@ -152,7 +152,7 @@ def uncertainty_matrix(self): def kernel_matrix(self): return np.stack([self.kernel[k].value for k in self._keys]) - def fit(self, *args, **kwargs): + def fit(self, *args, **kwargs) -> ndcube.NDCube: r""" Apply inversion procedure to data. From b5f63a8a5519bd25e411d135ec9c6754d1f8b223 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:01:46 -0400 Subject: [PATCH 05/13] Update GenericModel docstring --- sunkit_dem/base_model.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index fd694fc..c5487f5 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -1,5 +1,5 @@ """ -Base model class for DEM models +Base model class for differential emission measure models. """ from abc import ABC, abstractmethod @@ -25,8 +25,8 @@ def defines_model_for(self): class GenericModel(BaseModel): - """ - Base class for implementing a differential emission measure model + r""" + Base class for implementing a differential emission measure (DEM) model. Parameters ---------- @@ -37,7 +37,7 @@ class GenericModel(BaseModel): temperature_bin_edges : `~astropy.units.Quantity` Edges of the temperature bins in which the DEM is computed. The rightmost edge is included. The kernel is evaluated at the bin centers. - The bin widths must be equal in log10. + The bin widths must be equal in :math:`\log_{10}` space. """ _registry = dict() From af7e7bd3fb44ab6af16a80494a3ad16743db36a9 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:11:31 -0400 Subject: [PATCH 06/13] Add type annotations for GenericModel.__init__ --- sunkit_dem/base_model.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index c5487f5..48649a6 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -56,7 +56,14 @@ def __init_subclass__(cls, **kwargs): cls._registry[cls] = cls.defines_model_for @u.quantity_input - def __init__(self, data, kernel, temperature_bin_edges: u.K, kernel_temperatures=None, **kwargs): + def __init__( + self, + data: ndcube.NDCollection, + kernel: dict[str, u.Quantity], + temperature_bin_edges: u.Quantity[u.K], + kernel_temperatures=None, + **kwargs, + ): self.temperature_bin_edges = temperature_bin_edges self.data = data self.kernel_temperatures = kernel_temperatures From 9afab1a2eef234b80b42beaf2ae9d5a5877d4f80 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:12:52 -0400 Subject: [PATCH 07/13] Add return annotations --- sunkit_dem/base_model.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index 48649a6..0e27a43 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -133,11 +133,11 @@ def combined_mask(self): return np.any(combined_mask, axis=0) @property - def kernel(self): + def kernel(self) -> dict[str, u.Quantity]: return self._kernel @kernel.setter - def kernel(self, kernel): + def kernel(self, kernel: dict[str, u.Quantity]): if len(kernel) != len(self.data): raise ValueError('Number of kernels must be equal to length of wavelength dimension.') if not all([v.shape == self.kernel_temperatures.shape for _, v in kernel.items()]): @@ -145,18 +145,18 @@ def kernel(self, kernel): self._kernel = kernel @property - def data_matrix(self): + def data_matrix(self) -> u.Quantity: return np.stack([self.data[k].data for k in self._keys]) @property - def uncertainty_matrix(self): + def uncertainty_matrix(self) -> u.Quantity: uncertainties = [self.data[k].uncertainty for k in self._keys] if any([_u is None for _u in uncertainties]): return None return np.stack([_u.array for _u in uncertainties]) @property - def kernel_matrix(self): + def kernel_matrix(self) -> u.Quantity: return np.stack([self.kernel[k].value for k in self._keys]) def fit(self, *args, **kwargs) -> ndcube.NDCube: @@ -200,6 +200,6 @@ def _make_dem_wcs(self): compound_wcs = CompoundLowLevelWCS(data_wcs, temp_table_coord.wcs, mapping=mapping) return compound_wcs - def _make_dem_meta(self): + def _make_dem_meta(self) -> dict: # Individual classes should override this if they want specific metadata return {} From 7ae12d762f5689c4bad60e13d108532f68ff5f42 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:13:06 -0400 Subject: [PATCH 08/13] Update combined_mask docstring --- sunkit_dem/base_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index 0e27a43..12357af 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -121,8 +121,8 @@ def data(self, data: ndcube.NDCollection): @property def combined_mask(self): """ - Combined mask of all members of ``data``. Will be True if any member is masked. - This is propagated to the final DEM result + Combined mask of all members of ``data``. Will be `True` if any member is masked. + This mask is propagated to the final DEM result. """ combined_mask = [] for k in self._keys: From 65e2e1f2ab129685c02441c078a15ade259aaddf Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:13:21 -0400 Subject: [PATCH 09/13] Fix verb tense --- sunkit_dem/base_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index 12357af..5577046 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -168,7 +168,7 @@ def fit(self, *args, **kwargs) -> ndcube.NDCube: dem : `~ndcube.NDCube` Differential emission measure as a function of temperature. The temperature axis is evenly spaced in :math:`\log{T}`. The number - of dimensions depend on the input data. + of dimensions depends on the input data. """ dem_dict = self._model(*args, **kwargs) wcs = self._make_dem_wcs() From 08ee5f9750b1a71f17256683a69707aaddccf352 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:15:09 -0400 Subject: [PATCH 10/13] Add type annotation --- sunkit_dem/base_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index 5577046..aaeba63 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -72,7 +72,7 @@ def __init__( self.kernel = kernel @property - def _keys(self): + def _keys(self) -> list[str]: # Internal reference for entries in kernel and data # This ensures consistent ordering in kernel and data matrices return sorted(list(self.kernel.keys())) From 3ef68751f3528e6f6c171cf22b566154b5fbe6d6 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:15:23 -0400 Subject: [PATCH 11/13] Update docstrings --- sunkit_dem/base_model.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index aaeba63..c70734c 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -80,25 +80,26 @@ def _keys(self) -> list[str]: @property @u.quantity_input def temperature_bin_centers(self) -> u.Quantity[u.K]: - """ + r""" The temperature at the midpoint of each temperature bin. Notes ----- The center of each temperature bin is calculated in physical - space, not in log space. + space, not in :math:`log` space. """ return (self.temperature_bin_edges[1:] + self.temperature_bin_edges[:-1])/2 @property @u.quantity_input def temperature_bin_widths(self) -> u.Quantity[u.K]: - """ + r""" The width of each temperature bin. Notes ----- - The widths of each bin are calculated in physical space, not in log space. + The widths of each bin are calculated in physical space, not in + :math:`\log` space. """ return np.diff(self.temperature_bin_edges) From 090fb94c585ec319c8f327c464dfb7e48fa103a4 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:15:31 -0400 Subject: [PATCH 12/13] Add type annotation --- sunkit_dem/base_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sunkit_dem/base_model.py b/sunkit_dem/base_model.py index c70734c..a7da48e 100644 --- a/sunkit_dem/base_model.py +++ b/sunkit_dem/base_model.py @@ -201,6 +201,6 @@ def _make_dem_wcs(self): compound_wcs = CompoundLowLevelWCS(data_wcs, temp_table_coord.wcs, mapping=mapping) return compound_wcs - def _make_dem_meta(self) -> dict: + def _make_dem_meta(self) -> dict[str, object]: # Individual classes should override this if they want specific metadata return {} From 4548e851108df529bccb0dad4f9c8146c1accba3 Mon Sep 17 00:00:00 2001 From: Nick Murphy Date: Wed, 8 Jul 2026 16:26:15 -0400 Subject: [PATCH 13/13] Edit changelog: 76.doc.rst --- changelog/76.doc.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/76.doc.rst diff --git a/changelog/76.doc.rst b/changelog/76.doc.rst new file mode 100644 index 0000000..0861242 --- /dev/null +++ b/changelog/76.doc.rst @@ -0,0 +1 @@ +Updated docstrings and type annotations in `sunkit_dem.GenericModel`.