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

17 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2023-12-01 11:27 +0000

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# 

23 

24__all__ = ["HtmIndexer"] 

25 

26import esutil 

27 

28 

29class HtmIndexer: 

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

31 shards. 

32 

33 Parameters 

34 ---------- 

35 depth : `int` 

36 Depth of the HTM hierarchy to construct. 

37 """ 

38 def __init__(self, depth=7): 

39 self.htm = esutil.htm.HTM(depth) 

40 

41 def getShardIds(self, ctrCoord, radius): 

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

43 

44 Parameters 

45 ---------- 

46 ctrCoord : `lsst.geom.SpherePoint` 

47 ICRS center of search region. 

48 radius : `lsst.geom.Angle` 

49 Radius of search region. 

50 

51 Returns 

52 ------- 

53 results : `tuple` 

54 A tuple containing: 

55 

56 - shardIdList : `list` of `int` 

57 List of shard IDs 

58 - isOnBoundary : `list` of `bool` 

59 For each shard in ``shardIdList`` is the shard on the 

60 boundary (not fully enclosed by the search region)? 

61 """ 

62 shardIdList = self.htm.intersect(ctrCoord.getLongitude().asDegrees(), 

63 ctrCoord.getLatitude().asDegrees(), 

64 radius.asDegrees(), inclusive=True) 

65 coveredShardIdList = self.htm.intersect(ctrCoord.getLongitude().asDegrees(), 

66 ctrCoord.getLatitude().asDegrees(), 

67 radius.asDegrees(), inclusive=False) 

68 isOnBoundary = (shardId not in coveredShardIdList for shardId in shardIdList) 

69 return shardIdList, isOnBoundary 

70 

71 def indexPoints(self, raList, decList): 

72 """Generate shard IDs for sky positions. 

73 

74 Parameters 

75 ---------- 

76 raList : `list` of `float` 

77 List of right ascensions, in degrees. 

78 decList : `list` of `float` 

79 List of declinations, in degrees. 

80 

81 Returns 

82 ------- 

83 shardIds : `list` of `int` 

84 List of shard IDs 

85 """ 

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

87 

88 @staticmethod 

89 def makeDataId(shardId, datasetName): 

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

91 

92 Parameters 

93 ---------- 

94 shardId : `int` 

95 ID of shard in question. 

96 datasetName : `str` 

97 Name of dataset to use. 

98 

99 Returns 

100 ------- 

101 dataId : `dict` 

102 Data ID for shard. 

103 """ 

104 if shardId is None: 

105 # NoneType doesn't format, so make dummy pixel 

106 shardId = 0 

107 return {'pixel_id': shardId, 'name': datasetName}