LSST Applications g0f08755f38+82efc23009,g12f32b3c4e+e7bdf1200e,g1653933729+a8ce1bb630,g1a0ca8cf93+50eff2b06f,g28da252d5a+52db39f6a5,g2bbee38e9b+37c5a29d61,g2bc492864f+37c5a29d61,g2cdde0e794+c05ff076ad,g3156d2b45e+41e33cbcdc,g347aa1857d+37c5a29d61,g35bb328faa+a8ce1bb630,g3a166c0a6a+37c5a29d61,g3e281a1b8c+fb992f5633,g414038480c+7f03dfc1b0,g41af890bb2+11b950c980,g5fbc88fb19+17cd334064,g6b1c1869cb+12dd639c9a,g781aacb6e4+a8ce1bb630,g80478fca09+72e9651da0,g82479be7b0+04c31367b4,g858d7b2824+82efc23009,g9125e01d80+a8ce1bb630,g9726552aa6+8047e3811d,ga5288a1d22+e532dc0a0b,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+37c5a29d61,gcf0d15dbbd+2acd6d4d48,gd7358e8bfb+778a810b6e,gda3e153d99+82efc23009,gda6a2b7d83+2acd6d4d48,gdaeeff99f8+1711a396fd,ge2409df99d+6b12de1076,ge79ae78c31+37c5a29d61,gf0baf85859+d0a5978c5a,gf3967379c6+4954f8c433,gfb92a5be7c+82efc23009,gfec2e1e490+2aaed99252,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
_exposureContinued.py
Go to the documentation of this file.
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/>.
21
22__all__ = ["Exposure"]
23
24import numpy as np
25
26from lsst.utils import TemplateMeta
27
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
33
34
35class Exposure(metaclass=TemplateMeta):
36
37 def _set(self, index, value, origin):
38 """Set the pixel at the given index to a triple (value, mask, variance).
39
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)
50
51 def _get(self, index, origin):
52 """Return a triple (value, mask, variance) at the given index.
53
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)
62
63 def __reduce__(self):
64 from lsst.afw.fits import reduceToFits
65 return reduceToFits(self)
66
67 def __deepcopy__(self, memo=None):
68 return self.clone()
69
70 def convertF(self):
71 return ExposureF(self, deep=True)
72
73 def convertD(self):
74 return ExposureD(self, deep=True)
75
76 def getImage(self):
77 return self.maskedImage.image
78
79 def setImage(self, image):
80 self.maskedImage.image = image
81
82 image = property(getImage, setImage)
83
84 def getMask(self):
85 return self.maskedImage.mask
86
87 def setMask(self, mask):
88 self.maskedImage.mask = mask
89
90 mask = property(getMask, setMask)
91
92 def getVariance(self):
93 return self.maskedImage.variance
94
95 def setVariance(self, variance):
96 self.maskedImage.variance = variance
97
98 variance = property(getVariance, setVariance)
99
100 def getConvexPolygon(self, padding=10):
101 """Get the convex polygon associated with the bounding box corners.
102
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.
109
110 Parameters
111 ----------
112 padding : `int`
113 Pixel padding to ensure that bounding box is entirely contained
114 within the resulting polygon.
115
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
123
124 return bbox_to_convex_polygon(self.getBBox(), self.wcs, padding=padding)
125
126 convex_polygon = property(getConvexPolygon)
127
128 def containsSkyCoords(self, ra, dec, padding=10):
129 """Check if a set of sky positions is in the pixel bounding box.
130
131 The default padding size was chosen to be sufficient for the
132 most warped detectors at the edges of the HyperSuprimeCam focal plane.
133
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()``).
143
144 Returns
145 -------
146 contained : `np.ndarray`, (N,)
147 Boolean array indicating which points are contained in the
148 bounding box.
149
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.")
156
157 return bbox_contains_sky_coords(
158 self.getBBox(),
159 self.wcs,
160 ra,
161 dec,
162 padding=padding)
163
164 readFitsWithOptions = classmethod(imageReadFitsWithOptions)
165
166 writeFitsWithOptions = exposureWriteFitsWithOptions
167
168
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)
179
180for cls in set(Exposure.values()):
181 supportSlicing(cls)
182 disableImageArithmetic(cls)