Coverage for python/lsst/afw/image/exposure/_exposureContinued.py: 66%

59 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-11-18 02:24 -0800

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 .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 convertF(self): 

68 return ExposureF(self, deep=True) 

69 

70 def convertD(self): 

71 return ExposureD(self, deep=True) 

72 

73 def getImage(self): 

74 return self.maskedImage.image 

75 

76 def setImage(self, image): 

77 self.maskedImage.image = image 

78 

79 image = property(getImage, setImage) 

80 

81 def getMask(self): 

82 return self.maskedImage.mask 

83 

84 def setMask(self, mask): 

85 self.maskedImage.mask = mask 

86 

87 mask = property(getMask, setMask) 

88 

89 def getVariance(self): 

90 return self.maskedImage.variance 

91 

92 def setVariance(self, variance): 

93 self.maskedImage.variance = variance 

94 

95 variance = property(getVariance, setVariance) 

96 

97 def getConvexPolygon(self, padding=10): 

98 """Get the convex polygon associated with the bounding box corners. 

99 

100 The returned polygon has additional padding to ensure that the 

101 bounding box is entirely contained within it. To ensure a set 

102 of coordinates are entirely contained within an exposure, run 

103 ``exposure.containsSkyCoords()``. The default padding 

104 size was chosen to be sufficient for the most warped detectors at 

105 the edges of the HyperSuprimeCam focal plane. 

106 

107 Parameters 

108 ---------- 

109 padding : `int` 

110 Pixel padding to ensure that bounding box is entirely contained 

111 within the resulting polygon. 

112 

113 Returns 

114 ------- 

115 convexPolygon : `lsst.sphgeom.ConvexPolygon` 

116 Returns `None` if exposure does not have a valid WCS. 

117 """ 

118 if self.wcs is None: 

119 return None 

120 

121 return bbox_to_convex_polygon(self.getBBox(), self.wcs, padding=padding) 

122 

123 convex_polygon = property(getConvexPolygon) 

124 

125 def containsSkyCoords(self, ra, dec, padding=10): 

126 """Check if a set of sky positions is in the pixel bounding box. 

127 

128 The default padding size was chosen to be sufficient for the 

129 most warped detectors at the edges of the HyperSuprimeCam focal plane. 

130 

131 Parameters 

132 ---------- 

133 ra : `astropy.Quantity`, (N,) 

134 Array of Right Ascension, angular units. 

135 dec : `astropy.Quantity`, (N,) 

136 Array of Declination, angular units. 

137 padding : `int`, optional 

138 Pixel padding to ensure that bounding box is entirely contained 

139 within the sky polygon (see ``getConvexPolygon()``). 

140 

141 Returns 

142 ------- 

143 contained : `np.ndarray`, (N,) 

144 Boolean array indicating which points are contained in the 

145 bounding box. 

146 

147 Raises 

148 ------ 

149 ValueError if exposure does not have a valid wcs. 

150 """ 

151 if self.wcs is None: 

152 raise ValueError("Exposure does not have a valid WCS.") 

153 

154 return bbox_contains_sky_coords( 

155 self.getBBox(), 

156 self.wcs, 

157 ra, 

158 dec, 

159 padding=padding) 

160 

161 readFitsWithOptions = classmethod(imageReadFitsWithOptions) 

162 

163 writeFitsWithOptions = exposureWriteFitsWithOptions 

164 

165 

166Exposure.register(np.int32, ExposureI) 

167Exposure.register(np.float32, ExposureF) 

168Exposure.register(np.float64, ExposureD) 

169Exposure.register(np.uint16, ExposureU) 

170Exposure.register(np.uint64, ExposureL) 

171Exposure.alias("I", ExposureI) 

172Exposure.alias("F", ExposureF) 

173Exposure.alias("D", ExposureD) 

174Exposure.alias("U", ExposureU) 

175Exposure.alias("L", ExposureL) 

176 

177for cls in set(Exposure.values()): 

178 supportSlicing(cls) 

179 disableImageArithmetic(cls)