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

40 statements  

« prev     ^ index     » next       coverage.py v7.2.6, created at 2023-05-27 02:15 -0700

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 

25import struct 

26import numpy 

27 

28import hpgeom 

29 

30from lsst.pex.config import Field 

31import lsst.geom as geom 

32from .cachingSkyMap import CachingSkyMap 

33from .tractInfo import TractInfo 

34 

35 

36def angToCoord(thetaphi): 

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

38 

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

40 of hpgeom functions can be directed to this function without 

41 additional translation. 

42 """ 

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

44 

45 

46def coordToAng(coord): 

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

48 

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

50 """ 

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

52 

53 

54class HealpixTractInfo(TractInfo): 

55 """Tract for the HealpixSkyMap""" 

56 

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

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

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

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

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

62 vertexList, tractOverlap, wcs) 

63 

64 

65class HealpixSkyMapConfig(CachingSkyMap.ConfigClass): 

66 """Configuration for the HealpixSkyMap""" 

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

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

69 

70 def setDefaults(self): 

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

72 

73 

74class HealpixSkyMap(CachingSkyMap): 

75 """HEALPix-based sky map pixelization. 

76 

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

78 

79 

80 Parameters 

81 ---------- 

82 config : `lsst.skymap.BaseSkyMapConfig` 

83 The configuration for this SkyMap. 

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

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

86 instances. 

87 """ 

88 ConfigClass = HealpixSkyMapConfig 

89 _version = (1, 0) # for pickle 

90 numAngles = 4 # Number of angles for vertices 

91 

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

93 self._nside = 1 << config.log2NSide 

94 numTracts = hpgeom.nside_to_npixel(self._nside) 

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

96 

97 def findTract(self, coord): 

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

99 

100 Parameters 

101 ---------- 

102 coord : `lsst.geom.SpherePoint` 

103 ICRS sky coordinate to search for. 

104 

105 Returns 

106 ------- 

107 tractInfo : `TractInfo` 

108 Info for tract whose inner region includes the coord. 

109 """ 

110 theta, phi = coordToAng(coord) 

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

112 return self[index] 

113 

114 def generateTract(self, index): 

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

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

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

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

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

120 wcs) 

121 

122 def updateSha1(self, sha1): 

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

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