Coverage for python/lsst/meas/algorithms/htmIndexer.py : 35%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#
2# LSST Data Management System
3#
4# Copyright 2008-2017 AURA/LSST.
5#
6# This product includes software developed by the
7# LSST Project (http://www.lsst.org/).
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the LSST License Statement and
20# the GNU General Public License along with this program. If not,
21# see <https://www.lsstcorp.org/LegalNotices/>.
22#
23import esutil
26class HtmIndexer:
27 """Manage a spatial index of hierarchical triangular mesh (HTM)
28 shards.
30 Parameters
31 ----------
32 depth : `int`
33 Depth of the HTM hierarchy to construct.
34 """
35 def __init__(self, depth=8):
36 self.htm = esutil.htm.HTM(depth)
38 def getShardIds(self, ctrCoord, radius):
39 """Get the IDs of all shards that touch a circular aperture.
41 Parameters
42 ----------
43 ctrCoord : `lsst.geom.SpherePoint`
44 ICRS center of search region.
45 radius : `lsst.geom.Angle`
46 Radius of search region.
48 Returns
49 -------
50 results : `tuple`
51 A tuple containing:
53 - shardIdList : `list` of `int`
54 List of shard IDs
55 - isOnBoundary : `list` of `bool`
56 For each shard in ``shardIdList`` is the shard on the
57 boundary (not fully enclosed by the search region)?
58 """
59 shardIdList = self.htm.intersect(ctrCoord.getLongitude().asDegrees(),
60 ctrCoord.getLatitude().asDegrees(),
61 radius.asDegrees(), inclusive=True)
62 coveredShardIdList = self.htm.intersect(ctrCoord.getLongitude().asDegrees(),
63 ctrCoord.getLatitude().asDegrees(),
64 radius.asDegrees(), inclusive=False)
65 isOnBoundary = (shardId not in coveredShardIdList for shardId in shardIdList)
66 return shardIdList, isOnBoundary
68 def indexPoints(self, raList, decList):
69 """Generate shard IDs for sky positions.
71 Parameters
72 ----------
73 raList : `list` of `float`
74 List of right ascensions, in degrees.
75 decList : `list` of `float`
76 List of declinations, in degrees.
78 Returns
79 -------
80 shardIds : `list` of `int`
81 List of shard IDs
82 """
83 return self.htm.lookup_id(raList, decList)
85 @staticmethod
86 def makeDataId(shardId, datasetName):
87 """Make a data id from a shard ID.
89 Parameters
90 ----------
91 shardId : `int`
92 ID of shard in question.
93 datasetName : `str`
94 Name of dataset to use.
96 Returns
97 -------
98 dataId : `dict`
99 Data ID for shard.
100 """
101 if shardId is None:
102 # NoneType doesn't format, so make dummy pixel
103 shardId = 0
104 return {'pixel_id': shardId, 'name': datasetName}