Coverage for python/lsst/afw/image/_exposure/_exposureContinued.py: 66%
61 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-08 03:13 -0700
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-08 03:13 -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/>.
22__all__ = ["Exposure"]
24import numpy as np
26from lsst.utils import TemplateMeta
28from .._image._slicing import supportSlicing
29from .._image._disableArithmetic import disableImageArithmetic
30from .._image._fitsIoWithOptions import imageReadFitsWithOptions, exposureWriteFitsWithOptions
31from ._exposure import ExposureI, ExposureF, ExposureD, ExposureU, ExposureL
32from ..exposure.exposureUtils import bbox_to_convex_polygon, bbox_contains_sky_coords
35class Exposure(metaclass=TemplateMeta):
37 def _set(self, index, value, origin):
38 """Set the pixel at the given index to a triple (value, mask, variance).
40 Parameters
41 ----------
42 index : `geom.Point2I`
43 Position of the pixel to assign to.
44 value : `tuple`
45 A tuple of (value, mask, variance) scalars.
46 origin : `ImageOrigin`
47 Coordinate system of ``index`` (`PARENT` or `LOCAL`).
48 """
49 self.maskedImage._set(index, value=value, origin=origin)
51 def _get(self, index, origin):
52 """Return a triple (value, mask, variance) at the given index.
54 Parameters
55 ----------
56 index : `geom.Point2I`
57 Position of the pixel to assign to.
58 origin : `ImageOrigin`
59 Coordinate system of ``index`` (`PARENT` or `LOCAL`).
60 """
61 return self.maskedImage._get(index, origin=origin)
63 def __reduce__(self):
64 from lsst.afw.fits import reduceToFits
65 return reduceToFits(self)
67 def __deepcopy__(self, memo=None):
68 return self.clone()
70 def convertF(self):
71 return ExposureF(self, deep=True)
73 def convertD(self):
74 return ExposureD(self, deep=True)
76 def getImage(self):
77 return self.maskedImage.image
79 def setImage(self, image):
80 self.maskedImage.image = image
82 image = property(getImage, setImage)
84 def getMask(self):
85 return self.maskedImage.mask
87 def setMask(self, mask):
88 self.maskedImage.mask = mask
90 mask = property(getMask, setMask)
92 def getVariance(self):
93 return self.maskedImage.variance
95 def setVariance(self, variance):
96 self.maskedImage.variance = variance
98 variance = property(getVariance, setVariance)
100 def getConvexPolygon(self, padding=10):
101 """Get the convex polygon associated with the bounding box corners.
103 The returned polygon has additional padding to ensure that the
104 bounding box is entirely contained within it. To ensure a set
105 of coordinates are entirely contained within an exposure, run
106 ``exposure.containsSkyCoords()``. The default padding
107 size was chosen to be sufficient for the most warped detectors at
108 the edges of the HyperSuprimeCam focal plane.
110 Parameters
111 ----------
112 padding : `int`
113 Pixel padding to ensure that bounding box is entirely contained
114 within the resulting polygon.
116 Returns
117 -------
118 convexPolygon : `lsst.sphgeom.ConvexPolygon`
119 Returns `None` if exposure does not have a valid WCS.
120 """
121 if self.wcs is None:
122 return None
124 return bbox_to_convex_polygon(self.getBBox(), self.wcs, padding=padding)
126 convex_polygon = property(getConvexPolygon)
128 def containsSkyCoords(self, ra, dec, padding=10):
129 """Check if a set of sky positions is in the pixel bounding box.
131 The default padding size was chosen to be sufficient for the
132 most warped detectors at the edges of the HyperSuprimeCam focal plane.
134 Parameters
135 ----------
136 ra : `astropy.Quantity`, (N,)
137 Array of Right Ascension, angular units.
138 dec : `astropy.Quantity`, (N,)
139 Array of Declination, angular units.
140 padding : `int`, optional
141 Pixel padding to ensure that bounding box is entirely contained
142 within the sky polygon (see ``getConvexPolygon()``).
144 Returns
145 -------
146 contained : `np.ndarray`, (N,)
147 Boolean array indicating which points are contained in the
148 bounding box.
150 Raises
151 ------
152 ValueError if exposure does not have a valid wcs.
153 """
154 if self.wcs is None:
155 raise ValueError("Exposure does not have a valid WCS.")
157 return bbox_contains_sky_coords(
158 self.getBBox(),
159 self.wcs,
160 ra,
161 dec,
162 padding=padding)
164 readFitsWithOptions = classmethod(imageReadFitsWithOptions)
166 writeFitsWithOptions = exposureWriteFitsWithOptions
169Exposure.register(np.int32, ExposureI)
170Exposure.register(np.float32, ExposureF)
171Exposure.register(np.float64, ExposureD)
172Exposure.register(np.uint16, ExposureU)
173Exposure.register(np.uint64, ExposureL)
174Exposure.alias("I", ExposureI)
175Exposure.alias("F", ExposureF)
176Exposure.alias("D", ExposureD)
177Exposure.alias("U", ExposureU)
178Exposure.alias("L", ExposureL)
180for cls in set(Exposure.values()):
181 supportSlicing(cls)
182 disableImageArithmetic(cls)