Coverage for python/lsst/skymap/equatSkyMap.py: 44%
40 statements
« prev ^ index » next coverage.py v6.4.4, created at 2022-09-27 09:05 +0000
« prev ^ index » next coverage.py v6.4.4, created at 2022-09-27 09:05 +0000
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#
23__all__ = ['EquatSkyMapConfig', 'EquatSkyMap']
25import struct
27import lsst.pex.config as pexConfig
28import lsst.geom as geom
29from .baseSkyMap import BaseSkyMap
30from .tractInfo import TractInfo
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 )
46 def setDefaults(self):
47 self.projection = "CEA"
50class EquatSkyMap(BaseSkyMap):
51 """Equatorial sky map pixelization, e.g. for SDSS stripe 82 image data.
53 EquatSkyMap represents an equatorial band of sky divided along declination
54 into overlapping tracts.
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
64 def __init__(self, config=None):
65 BaseSkyMap.__init__(self, config)
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)
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 )
82 midRA = begRA + tractWidthRA / 2.0
83 ctrCoord = geom.SpherePoint(midRA, midDec)
85 # CRVal must have Dec=0 for symmetry about the equator
86 crValCoord = geom.SpherePoint(midRA, geom.Angle(0.0))
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)
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 ))
100 def __getstate__(self):
101 """Support pickle.
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 )
115 def __setstate__(self, stateDict):
116 """Support unpickle
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"])
130 def getVersion(self):
131 """Return version (e.g. for pickle).
133 Returns
134 -------
135 result : `tuple` of `int`
136 Version as a pair of integers.
137 """
138 return self._version
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))