Coverage for python/lsst/skymap/equatSkyMap.py: 39%

40 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-12-08 14:39 -0800

1# 

2# LSST Data Management System 

3# Copyright 2008, 2009, 2010 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__ = ['EquatSkyMapConfig', 'EquatSkyMap'] 

24 

25import struct 

26 

27import lsst.pex.config as pexConfig 

28import lsst.geom as geom 

29from .baseSkyMap import BaseSkyMap 

30from .tractInfo import TractInfo 

31 

32 

33class EquatSkyMapConfig(BaseSkyMap.ConfigClass): 

34 numTracts = pexConfig.Field( 

35 doc="number of tracts; warning: TAN projection requires at least 3", 

36 dtype=int, 

37 default=4, 

38 ) 

39 decRange = pexConfig.ListField( 

40 doc="range of declination (deg)", 

41 dtype=float, 

42 length=2, 

43 default=(-1.25, 1.25), 

44 ) 

45 

46 def setDefaults(self): 

47 self.projection = "CEA" 

48 

49 

50class EquatSkyMap(BaseSkyMap): 

51 """Equatorial sky map pixelization, e.g. for SDSS stripe 82 image data. 

52 

53 EquatSkyMap represents an equatorial band of sky divided along declination 

54 into overlapping tracts. 

55 

56 Parameters 

57 ---------- 

58 config : `lsst.skymap.BaseSkyMapConfig` (optional) 

59 The configuration for this SkyMap; if None use the default config. 

60 """ 

61 ConfigClass = EquatSkyMapConfig 

62 _version = (1, 0) # for pickle 

63 

64 def __init__(self, config=None): 

65 BaseSkyMap.__init__(self, config) 

66 

67 decRange = tuple(geom.Angle(dr, geom.degrees) for dr in self.config.decRange) 

68 midDec = (decRange[0] + decRange[1]) / 2.0 

69 tractWidthRA = geom.Angle(360.0 / self.config.numTracts, geom.degrees) 

70 tractOverlap = geom.Angle(self.config.tractOverlap, geom.degrees) 

71 

72 for id in range(self.config.numTracts): 

73 begRA = tractWidthRA * id 

74 endRA = begRA + tractWidthRA 

75 vertexCoordList = ( 

76 geom.SpherePoint(begRA, decRange[0]), 

77 geom.SpherePoint(endRA, decRange[0]), 

78 geom.SpherePoint(endRA, decRange[1]), 

79 geom.SpherePoint(begRA, decRange[1]), 

80 ) 

81 

82 midRA = begRA + tractWidthRA / 2.0 

83 ctrCoord = geom.SpherePoint(midRA, midDec) 

84 

85 # CRVal must have Dec=0 for symmetry about the equator 

86 crValCoord = geom.SpherePoint(midRA, geom.Angle(0.0)) 

87 

88 # make initial WCS; don't worry about crPixPos because TractInfo will shift it as required 

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

90 

91 self._tractInfoList.append(TractInfo( 

92 id=id, 

93 tractBuilder=self._tractBuilder, 

94 ctrCoord=ctrCoord, 

95 vertexCoordList=vertexCoordList, 

96 tractOverlap=tractOverlap, 

97 wcs=wcs, 

98 )) 

99 

100 def __getstate__(self): 

101 """Support pickle. 

102 

103 Returns 

104 ------- 

105 stateDict : `dict` 

106 a dict containing: 

107 - version: a pair of ints 

108 - config: the config 

109 """ 

110 return dict( 

111 version=self._version, 

112 config=self.config, 

113 ) 

114 

115 def __setstate__(self, stateDict): 

116 """Support unpickle 

117 

118 Parameters 

119 ---------- 

120 stateDict : `dict` 

121 a dict containing: 

122 - version: a pair of ints 

123 - config: the config 

124 """ 

125 version = stateDict["version"] 

126 if version >= (2, 0): 

127 raise RuntimeError("Version = %s >= (2,0); cannot unpickle" % (version,)) 

128 self.__init__(stateDict["config"]) 

129 

130 def getVersion(self): 

131 """Return version (e.g. for pickle). 

132 

133 Returns 

134 ------- 

135 result : `tuple` of `int` 

136 Version as a pair of integers. 

137 """ 

138 return self._version 

139 

140 def updateSha1(self, sha1): 

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

142 sha1.update(struct.pack("<i2d", self.config.numTracts, *self.config.decRange))