lsst.skymap  14.0-4-g3609236+3
cachingSkyMap.py
Go to the documentation of this file.
1 from builtins import range
2 #
3 # LSST Data Management System
4 # Copyright 2008-2012 LSST Corporation.
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 <http://www.lsstcorp.org/LegalNotices/>.
22 #
23 
24 from .baseSkyMap import BaseSkyMap
25 
26 __all__ = ["CachingSkyMap"]
27 
28 
30  """A SkyMap that generates its tracts on request and caches them
31 
32  A subclass should define
33  * __init__ to calculate the required number of tracts (and pass it up)
34  * generateTract to generate a tract
35 
36  Subclassers should also check that the arguments to the constructor are
37  consistent with the below __reduce__ method.
38  """
39 
40  def __init__(self, numTracts, config=None, version=0):
41  super(CachingSkyMap, self).__init__(config)
42  self._numTracts = numTracts
43  self._tractCache = [None] * self._numTracts
44  self._tractInfo = None # We shouldn't need this; we will generate tracts on demand
45  self._version = version
46 
47  def __reduce__(self):
48  """To support pickling
49 
50  Warning: This method assumes that the constructor should be defined:
51  __init__(self, config, version=defaultVersion)
52  The use of 'config' is effectively set by the registry mechanism.
53  If additional optional arguments are added, this method should be
54  overridden to correspond.
55  """
56  return (self.__class__, (self.config, self._version))
57 
58  def __iter__(self):
59  """Iterator over tracts"""
60  for i in range(self._numTracts):
61  yield self[i]
62 
63  def __len__(self):
64  """Length is number of tracts"""
65  return self._numTracts
66 
67  def __getitem__(self, index):
68  """Get the TractInfo for a particular index
69 
70  The tract is returned from a cache, if available, otherwise generated
71  on the fly.
72  """
73  if index < 0 or index > self._numTracts:
74  raise IndexError("Index out of range: %d vs %d" % (index, self._numTracts))
75  if self._tractCache[index] is not None:
76  return self._tractCache[index]
77  tract = self.generateTract(index)
78  self._tractCache[index] = tract
79  return tract
80 
81  def generateTract(self, index):
82  """Generate the TractInfo for the particular index"""
83  raise NotImplementedError("Subclasses must define this method.")
def __init__(self, numTracts, config=None, version=0)