1 from builtins
import range
30 from .cachingSkyMap
import CachingSkyMap
31 from .tractInfo
import ExplicitTractInfo
33 __all__ = [
"RingsSkyMapConfig",
"RingsSkyMap"]
37 """Configuration for the RingsSkyMap""" 38 numRings = Field(dtype=int, doc=
"Number of rings", check=
lambda x: x > 0)
39 raStart = Field(dtype=float, default=0.0, doc=
"Starting center RA for each ring (degrees)",
40 check=
lambda x: x >= 0.0
and x < 360.0)
44 """Rings sky map pixelization. 46 We divide the sphere into N rings of Declination, plus the two polar 47 caps, which sets the size of the individual tracts. The rings are 48 divided in RA into an integral number of tracts of this size; this 49 division is made at the Declination closest to zero so as to ensure 52 ConfigClass = RingsSkyMapConfig
58 @param[in] config: an instance of self.ConfigClass; if None the default config is used 59 @param[in] version: software version of this class, to retain compatibility with old instances 63 self.
_ringSize = math.pi / (config.numRings + 1)
65 for i
in range(config.numRings):
66 startDec = self.
_ringSize*(i + 0.5) - 0.5*math.pi
68 dec = min(math.fabs(startDec), math.fabs(stopDec))
71 super(RingsSkyMap, self).
__init__(numTracts, config, version)
74 """Calculate ring indices given a numerical index of a tract 76 The ring indices are the ring number and the tract number within 79 The ring number is -1 for the south polar cap and increases to the 80 north. The north polar cap has ring number = numRings. The tract 81 number is zero for either of the polar caps. 86 return self.
config.numRings, 0
95 """Generate the TractInfo for this index""" 98 ra, dec = 0, -0.5*math.pi
99 elif ringNum == self.
config.numRings:
100 ra, dec = 0, 0.5*math.pi
102 dec = self.
_ringSize*(ringNum + 1) - 0.5*math.pi
103 ra = math.fmod(self.
config.raStart + 2*math.pi*tractNum/self.
_ringNums[ringNum], 2*math.pi)
105 center =
IcrsCoord(ra*afwGeom.radians, dec*afwGeom.radians)
106 wcs = self.
_wcsFactory.makeWcs(crPixPos=afwGeom.Point2D(0, 0), crValCoord=center)
108 0.5*self.
_ringSize*afwGeom.radians, self.
config.tractOverlap*afwGeom.degrees,
112 """Find the tract whose center is nearest the specified coord. 114 @param[in] coord: sky coordinate (afwCoord.Coord) 115 @return TractInfo of tract whose center is nearest the specified coord 118 - if tracts do not cover the whole sky then the returned tract may not include the coord 121 - This routine will be more efficient if coord is ICRS. 122 - If coord is equidistant between multiple sky tract centers then one is arbitrarily chosen. 123 - The default implementation is not very efficient; subclasses may wish to override. 125 icrsCoord = coord.toIcrs()
126 ra = icrsCoord.getLongitude().asRadians()
127 dec = icrsCoord.getLatitude().asRadians()
129 firstRingStart = self.
_ringSize*0.5 - 0.5*math.pi
130 if dec < firstRingStart:
133 elif dec > firstRingStart*-1:
137 ringNum = int((dec - firstRingStart)/self.
_ringSize)
138 tractNum = int(math.fmod(ra - self.
config.raStart, 2*math.pi) /
139 (2*math.pi/self.
_ringNums[ringNum]) + 0.5)
142 for i
in range(ringNum):
148 """Find all tracts which include the specified coord. 150 @param[in] coord: sky coordinate (afwCoord.Coord) 151 @return List of TractInfo of tracts which include the specified coord 154 - This routine will be more efficient if coord is ICRS. 156 icrsCoord = coord.toIcrs()
157 ra = icrsCoord.getLongitude().asRadians()
158 dec = icrsCoord.getLatitude().asRadians()
160 firstRingStart = self.
_ringSize*0.5 - 0.5*math.pi
162 ringNum = int((dec - firstRingStart)/self.
_ringSize)
167 for r
in [ringNum - 1, ringNum, ringNum + 1]:
168 if r < 0
or r > self.
config.numRings - 1:
170 tractNum = int(math.fmod(ra - self.
config.raStart, 2*math.pi) /
173 for t
in [tractNum - 1, tractNum, tractNum + 1]:
185 if tract.contains(icrsCoord):
186 tractList.append(tract)
190 for entry
in [0, len(self)-1]:
192 if tract.contains(icrsCoord):
193 tractList.append(tract)
198 """Find tracts and patches that overlap a region 200 @param[in] coordList: list of sky coordinates (afwCoord.Coord) 201 @return list of (TractInfo, list of PatchInfo) for tracts and patches that contain, 202 or may contain, the specified region. The list will be empty if there is no overlap. 204 @warning this uses a naive algorithm that may find some tracts and patches that do not overlap 205 the region (especially if the region is not a rectangle aligned along patch x,y). 208 for coord
in coordList:
210 patchList = tractInfo.findPatchList(coordList)
211 if patchList
and not (tractInfo, patchList)
in retList:
212 retList.append((tractInfo, patchList))
216 """Add subclass-specific state or configuration options to the SHA1.""" 217 sha1.update(struct.pack(
"<id", self.
config.numRings, self.
config.raStart))
def generateTract(self, index)
def findTractPatchList(self, coordList)
def updateSha1(self, sha1)
def findTract(self, coord)
def getRingIndices(self, index)
def findAllTracts(self, coord)
def __init__(self, config, version=0)