Hide keyboard shortcuts

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 

24 

25 

26class HtmIndexer: 

27 """Manage a spatial index of hierarchical triangular mesh (HTM) 

28 shards. 

29 

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) 

37 

38 def getShardIds(self, ctrCoord, radius): 

39 """Get the IDs of all shards that touch a circular aperture. 

40 

41 Parameters 

42 ---------- 

43 ctrCoord : `lsst.geom.SpherePoint` 

44 ICRS center of search region. 

45 radius : `lsst.geom.Angle` 

46 Radius of search region. 

47 

48 Returns 

49 ------- 

50 results : `tuple` 

51 A tuple containing: 

52 

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) 65 ↛ exitline 65 didn't finish the generator expression on line 65

66 return shardIdList, isOnBoundary 

67 

68 def indexPoints(self, raList, decList): 

69 """Generate shard IDs for sky positions. 

70 

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. 

77 

78 Returns 

79 ------- 

80 shardIds : `list` of `int` 

81 List of shard IDs 

82 """ 

83 return self.htm.lookup_id(raList, decList) 

84 

85 @staticmethod 

86 def makeDataId(shardId, datasetName): 

87 """Make a data id from a shard ID. 

88 

89 Parameters 

90 ---------- 

91 shardId : `int` 

92 ID of shard in question. 

93 datasetName : `str` 

94 Name of dataset to use. 

95 

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}