Coverage for python/lsst/skymap/cachingSkyMap.py: 28%

26 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2024-03-20 00:55 -0700

1# 

2# LSST Data Management System 

3# Copyright 2008-2012 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# 

22 

23__all__ = ["CachingSkyMap"] 

24 

25from .baseSkyMap import BaseSkyMap 

26 

27 

28class CachingSkyMap(BaseSkyMap): 

29 """A SkyMap that generates its tracts on request and caches them. 

30 

31 Parameters 

32 ---------- 

33 numTracts : `int` 

34 Number of tracts to create. 

35 config : `lsst.skymap.BaseSkyMapConfig` (optional) 

36 The configuration for this SkyMap; if None use the default config. 

37 version : `int` or `tuple` of `int` (optional) 

38 Software version of this class, to retain compatibility with old 

39 instances. 

40 

41 Notes 

42 ----- 

43 A subclass should define 

44 * __init__ to calculate the required number of tracts (and pass it up) 

45 * generateTract to generate a tract 

46 

47 Subclassers should also check that the arguments to the constructor are 

48 consistent with the below __reduce__ method. 

49 """ 

50 

51 def __init__(self, numTracts, config=None, version=0): 

52 super(CachingSkyMap, self).__init__(config) 

53 self._numTracts = numTracts 

54 self._tractCache = [None] * self._numTracts 

55 self._tractInfo = None # We shouldn't need this; we will generate tracts on demand 

56 self._version = version 

57 

58 def __reduce__(self): 

59 """To support pickling. 

60 

61 Notes 

62 ----- 

63 **Warning:** This method assumes that the constructor is be defined: 

64 __init__(self, config, version=defaultVersion) 

65 The use of 'config' is effectively set by the registry mechanism. 

66 If additional optional arguments are added, this method should be 

67 overridden to correspond. 

68 """ 

69 return (self.__class__, (self.config, self._version)) 

70 

71 def __iter__(self): 

72 """Iterator over tracts.""" 

73 for i in range(self._numTracts): 

74 yield self[i] 

75 

76 def __len__(self): 

77 """Length is number of tracts.""" 

78 return self._numTracts 

79 

80 def __getitem__(self, index): 

81 """Get the TractInfo for a particular index. 

82 

83 The tract is returned from a cache, if available, otherwise generated 

84 on the fly. 

85 """ 

86 if index < 0 or index > self._numTracts: 

87 raise IndexError("Index out of range: %d vs %d" % (index, self._numTracts)) 

88 if self._tractCache[index] is not None: 

89 return self._tractCache[index] 

90 tract = self.generateTract(index) 

91 self._tractCache[index] = tract 

92 return tract 

93 

94 def generateTract(self, index): 

95 """Generate TractInfo for the specified tract index.""" 

96 raise NotImplementedError("Subclasses must define this method.")