Coverage for python / lsst / skymap / healpixSkyMap.py: 65%

46 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-22 08:59 +0000

1# 

2# LSST Data Management System 

3# Copyright 2008, 2009, 2010, 2012 LSST Corporation. 

4# 

5# This product includes software developed by the 

6# LSST Project (http://www.lsst.org/). 

7# 

8# This program is free software: you can redistribute it and/or modify 

9# it under the terms of the GNU General Public License as published by 

10# the Free Software Foundation, either version 3 of the License, or 

11# (at your option) any later version. 

12# 

13# This program is distributed in the hope that it will be useful, 

14# but WITHOUT ANY WARRANTY; without even the implied warranty of 

15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

16# GNU General Public License for more details. 

17# 

18# You should have received a copy of the LSST License Statement and 

19# the GNU General Public License along with this program. If not, 

20# see <http://www.lsstcorp.org/LegalNotices/>. 

21# 

22 

23__all__ = ['HealpixSkyMapConfig', 'HealpixSkyMap'] 

24 

25from deprecated.sphinx import deprecated 

26import struct 

27import numpy 

28 

29import hpgeom 

30 

31from lsst.pex.config import Field 

32import lsst.geom as geom 

33from .cachingSkyMap import CachingSkyMap 

34from .tractInfo import TractInfo 

35 

36 

37# TODO: Remove with DM-44799 

38@deprecated("angToCoord has been deprecated and will be removed after v28.", 

39 category=FutureWarning, version=28) 

40def angToCoord(thetaphi): 

41 """Convert hpgeom ang to an lsst.geom.SpherePoint 

42 

43 The angle is provided as a single object, thetaphi, so the output 

44 of hpgeom functions can be directed to this function without 

45 additional translation. 

46 """ 

47 return geom.SpherePoint(float(thetaphi[1]), float(thetaphi[0] - 0.5*numpy.pi), geom.radians) 

48 

49 

50# TODO: Remove with DM-44799 

51@deprecated("coordToAnge has been deprecated and will be removed after v28.", 

52 category=FutureWarning, version=28) 

53def coordToAng(coord): 

54 """Convert an lsst.geom.SpherePoint to a hpgeom ang (theta, phi) 

55 

56 The Healpix convention is that 0 <= theta <= pi, 0 <= phi < 2pi. 

57 """ 

58 return (coord.getLatitude().asRadians() + 0.5*numpy.pi, coord.getLongitude().asRadians()) 

59 

60 

61# TODO: Remove with DM-44799 

62@deprecated("HealpixTractInfo has been deprecated and will be removed after v28.", 

63 category=FutureWarning, version=28) 

64class HealpixTractInfo(TractInfo): 

65 """Tract for the HealpixSkyMap""" 

66 

67 def __init__(self, nSide, ident, nest, tractBuilder, ctrCoord, tractOverlap, wcs): 

68 """Set vertices from nside, ident, nest""" 

69 theta, phi = hpgeom.boundaries(nSide, ident, nest=nest, lonlat=False) 

70 vertexList = [angToCoord(thetaphi) for thetaphi in zip(theta, phi)] 

71 super(HealpixTractInfo, self).__init__(ident, tractBuilder, ctrCoord, 

72 vertexList, tractOverlap, wcs) 

73 

74 

75# TODO: Remove with DM-44799 

76@deprecated("HealpixSkyMapConfig has been deprecated and will be removed after v28.", 

77 category=FutureWarning, version=28) 

78class HealpixSkyMapConfig(CachingSkyMap.ConfigClass): 

79 """Configuration for the HealpixSkyMap""" 

80 log2NSide = Field(dtype=int, default=0, doc="Number of sides, expressed in powers of 2") 

81 nest = Field(dtype=bool, default=False, doc="Use NEST ordering instead of RING?") 

82 

83 def setDefaults(self): 

84 self.rotation = 45 # HEALPixels are oriented at 45 degrees 

85 

86 

87# TODO: Remove with DM-44799 

88@deprecated("HealpixSkyMap has been deprecated and will be removed after v28.", 

89 category=FutureWarning, version=28) 

90class HealpixSkyMap(CachingSkyMap): 

91 """HEALPix-based sky map pixelization. 

92 

93 We put a Tract at the position of each HEALPixel. 

94 

95 

96 Parameters 

97 ---------- 

98 config : `lsst.skymap.BaseSkyMapConfig` 

99 The configuration for this SkyMap. 

100 version : `int` or `tuple` of `int` (optional) 

101 Software version of this class, to retain compatibility with old 

102 instances. 

103 """ 

104 ConfigClass = HealpixSkyMapConfig 

105 _version = (1, 0) # for pickle 

106 numAngles = 4 # Number of angles for vertices 

107 

108 def __init__(self, config, version=0): 

109 self._nside = 1 << config.log2NSide 

110 numTracts = hpgeom.nside_to_npixel(self._nside) 

111 super(HealpixSkyMap, self).__init__(numTracts, config, version) 

112 

113 def findTract(self, coord): 

114 """Find the tract whose inner region includes the coord. 

115 

116 Parameters 

117 ---------- 

118 coord : `lsst.geom.SpherePoint` 

119 ICRS sky coordinate to search for. 

120 

121 Returns 

122 ------- 

123 tractInfo : `TractInfo` 

124 Info for tract whose inner region includes the coord. 

125 """ 

126 theta, phi = coordToAng(coord) 

127 index = hpgeom.angle_to_pixel(self._nside, theta, phi, nest=self.config.nest, lonlat=False) 

128 return self[index] 

129 

130 def generateTract(self, index): 

131 """Generate TractInfo for the specified tract index.""" 

132 center = angToCoord(hpgeom.pixel_to_angle(self._nside, index, nest=self.config.nest, lonlat=False)) 

133 wcs = self._wcsFactory.makeWcs(crPixPos=geom.Point2D(0, 0), crValCoord=center) 

134 return HealpixTractInfo(self._nside, index, self.config.nest, self._tractBuilder, 

135 center, self.config.tractOverlap*geom.degrees, 

136 wcs) 

137 

138 def updateSha1(self, sha1): 

139 """Add subclass-specific state or configuration options to the SHA1.""" 

140 sha1.update(struct.pack("<i?", self.config.log2NSide, self.config.nest))