Coverage for python/lsst/afw/image/_exposureSummaryStats.py: 61%
Shortcuts on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
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')
78 def __post_init__(self):
79 Storable.__init__(self)
81 def isPersistable(self):
82 return True
84 def _getPersistenceName(self):
85 return self._persistence_name
87 def _getPythonModule(self):
88 return __name__
90 def _write(self):
91 return yaml.dump(asdict(self), encoding='utf-8')
93 @staticmethod
94 def _read(bytes):
95 yamlDict = yaml.load(bytes, Loader=yaml.SafeLoader)
96 # For forwards compatibility, filter out any fields that are
97 # not defined in the dataclass.
98 droppedFields = []
99 for _field in list(yamlDict.keys()):
100 if _field not in ExposureSummaryStats.__dataclass_fields__:
101 droppedFields.append(_field)
102 yamlDict.pop(_field)
103 if len(droppedFields) > 0:
104 droppedFieldString = ', '.join([str(f) for f in droppedFields])
105 warnings.warn((f"Could not read summary fields [{droppedFieldString}]. "
106 "Please use a newer stack."), FutureWarning)
107 return ExposureSummaryStats(**yamlDict)