Coverage for python/lsst/skymap/discreteSkyMap.py: 47%

32 statements  

« prev     ^ index     » next       coverage.py v7.1.0, created at 2023-02-15 23:05 +0000

1# 

2# LSST Data Management System 

3# Copyright 2008, 2009, 2010, 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__ = ["DiscreteSkyMapConfig", "DiscreteSkyMap"] 

24 

25import struct 

26 

27from lsst.pex.config import ListField 

28import lsst.geom as geom 

29from .cachingSkyMap import CachingSkyMap 

30from .tractInfo import ExplicitTractInfo 

31 

32 

33class DiscreteSkyMapConfig(CachingSkyMap.ConfigClass): 

34 """Configuration for the DiscreteSkyMap""" 

35 

36 raList = ListField(dtype=float, default=[], doc="Right Ascensions of tracts (ICRS, degrees)") 

37 decList = ListField(dtype=float, default=[], doc="Declinations of tracts (ICRS, degrees)") 

38 radiusList = ListField(dtype=float, default=[], doc="Radii of tracts (degrees)") 

39 

40 def validate(self): 

41 super(DiscreteSkyMapConfig, self).validate() 

42 if len(self.radiusList) != len(self.raList): 

43 raise ValueError("Number of radii (%d) and RAs (%d) do not match" % 

44 (len(self.radiusList), len(self.raList))) 

45 if len(self.radiusList) != len(self.decList): 

46 raise ValueError("Number of radii (%d) and Decs (%d) do not match" % 

47 (len(self.radiusList), len(self.decList))) 

48 

49 

50class DiscreteSkyMap(CachingSkyMap): 

51 """Discrete sky map pixelization. 

52 

53 We put a square Tract at each of the nominated coordinates. 

54 

55 Parameters 

56 ---------- 

57 config : `lsst.skyMap.BaseSkyMapConfig` 

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

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

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

61 instances. 

62 """ 

63 ConfigClass = DiscreteSkyMapConfig 

64 _version = (1, 0) # for pickle 

65 

66 def __init__(self, config, version=0): 

67 numTracts = len(config.radiusList) 

68 super(DiscreteSkyMap, self).__init__(numTracts, config, version) 

69 

70 def generateTract(self, index): 

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

72 center = geom.SpherePoint(self.config.raList[index], self.config.decList[index], geom.degrees) 

73 radius = self.config.radiusList[index] 

74 wcs = self._wcsFactory.makeWcs(crPixPos=geom.Point2D(0, 0), crValCoord=center) 

75 return ExplicitTractInfo(index, self._tractBuilder, center, 

76 radius*geom.degrees, self.config.tractOverlap*geom.degrees, wcs) 

77 

78 def updateSha1(self, sha1): 

79 """Add subclass-specific state or configuration options to the SHA1.""" 

80 fmt = "<{}d".format(len(self.config.radiusList)) 

81 sha1.update(struct.pack(fmt, *self.config.raList)) 

82 sha1.update(struct.pack(fmt, *self.config.decList)) 

83 sha1.update(struct.pack(fmt, *self.config.radiusList))