Coverage for python/lsst/afw/image/_exposureSummaryStats.py: 66%
60 statements
« prev ^ index » next coverage.py v6.4, created at 2022-06-02 03:42 -0700
« prev ^ index » next coverage.py v6.4, created at 2022-06-02 03:42 -0700
1# This file is part of afw.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
21from __future__ import annotations
23from dataclasses import dataclass, asdict, field
24from typing import List
25import yaml
26import warnings
28from ..typehandling import Storable, StorableHelperFactory
31__all__ = ("ExposureSummaryStats", )
34def _default_corners():
35 return [float('nan')]*4
38@dataclass
39class ExposureSummaryStats(Storable):
40 _persistence_name = 'ExposureSummaryStats'
42 _factory = StorableHelperFactory(__name__, _persistence_name)
44 version: int = 0
45 # PSF determinant radius (pixels)
46 psfSigma: float = float('nan')
47 # PSF effective area (pixels**2)
48 psfArea: float = float('nan')
49 # PSF shape Ixx (pixels**2)
50 psfIxx: float = float('nan')
51 # PSF shape Iyy (pixels**2)
52 psfIyy: float = float('nan')
53 # PSF shape Ixy (pixels**2)
54 psfIxy: float = float('nan')
55 # Bounding box center Right Ascension (degrees)
56 ra: float = float('nan')
57 # Bounding box center Declination (degrees)
58 decl: float = float('nan')
59 # Bounding box center zenith distance (degrees)
60 zenithDistance: float = float('nan')
61 # Mean zeropoint in detector (mag)
62 zeroPoint: float = float('nan')
63 # Average sky background (ADU)
64 skyBg: float = float('nan')
65 # Average sky noise (ADU)
66 skyNoise: float = float('nan')
67 # Mean variance of the weight plane (ADU**2)
68 meanVar: float = float('nan')
69 # Right Ascension of bounding box corners (degrees)
70 raCorners: List[float] = field(default_factory=_default_corners)
71 # Declination of bounding box corners (degrees)
72 decCorners: List[float] = field(default_factory=_default_corners)
73 # Astrometry match offset mean
74 astromOffsetMean: float = float('nan')
75 # Astrometry match offset stddev
76 astromOffsetStd: float = float('nan')
77 # Number of stars used for psf model
78 nPsfStar: int = 0
79 # Psf stars median E1 residual (starE1 - psfE1)
80 psfStarDeltaE1Median: float = float('nan')
81 # Psf stars median E2 residual (starE2 - psfE2)
82 psfStarDeltaE2Median: float = float('nan')
83 # Psf stars MAD E1 scatter (starE1 - psfE1)
84 psfStarDeltaE1Scatter: float = float('nan')
85 # Psf stars MAD E2 scatter (starE2 - psfE2)
86 psfStarDeltaE2Scatter: float = float('nan')
87 # Psf stars median size residual (starSize - psfSize)
88 psfStarDeltaSizeMedian: float = float('nan')
89 # Psf stars MAD size scatter (starSize - psfSize)
90 psfStarDeltaSizeScatter: float = float('nan')
91 # Psf stars MAD size scatter scaled by psfSize**2
92 psfStarScaledDeltaSizeScatter: float = float('nan')
94 def __post_init__(self):
95 Storable.__init__(self)
97 def isPersistable(self):
98 return True
100 def _getPersistenceName(self):
101 return self._persistence_name
103 def _getPythonModule(self):
104 return __name__
106 def _write(self):
107 return yaml.dump(asdict(self), encoding='utf-8')
109 @staticmethod
110 def _read(bytes):
111 yamlDict = yaml.load(bytes, Loader=yaml.SafeLoader)
112 # For forwards compatibility, filter out any fields that are
113 # not defined in the dataclass.
114 droppedFields = []
115 for _field in list(yamlDict.keys()):
116 if _field not in ExposureSummaryStats.__dataclass_fields__:
117 droppedFields.append(_field)
118 yamlDict.pop(_field)
119 if len(droppedFields) > 0:
120 droppedFieldString = ', '.join([str(f) for f in droppedFields])
121 warnings.warn((f"Could not read summary fields [{droppedFieldString}]. "
122 "Please use a newer stack."), FutureWarning)
123 return ExposureSummaryStats(**yamlDict)