Coverage for python/lsst/skymap/detail/utils.py: 37%

22 statements  

« prev     ^ index     » next       coverage.py v7.3.0, created at 2023-08-16 10:40 +0000

1# 

2# LSST Data Management System 

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

24 

25from typing import NamedTuple 

26import numpy 

27 

28import lsst.sphgeom 

29import lsst.geom as geom 

30 

31_TinyFloat = numpy.finfo(float).tiny 

32 

33 

34def coordFromVec(vec, defRA=None): 

35 """Convert an ICRS cartesian vector to an ICRS `lsst.geom.SpherePoint`. 

36 

37 Parameters 

38 ---------- 

39 vec : `list` of `float` 

40 An ICRS catesian vector. 

41 defRA : `lsst.geom.Angle` or None 

42 The RA to use if the vector is too near a pole; 

43 ignored if not near a pole. 

44 

45 Raises 

46 ------ 

47 RuntimeError 

48 Raised if vec too near a pole and defRA is None. 

49 """ 

50 if abs(vec[0]) < _TinyFloat and abs(vec[1]) < _TinyFloat: 

51 if defRA is None: 

52 raise RuntimeError("At pole and defRA==None") 

53 if vec[2] > 0: 

54 decDeg = 90.0 

55 else: 

56 decDeg = -90.0 

57 return geom.SpherePoint(defRA, decDeg*geom.degrees) 

58 return geom.SpherePoint(lsst.sphgeom.Vector3d(*vec)) 

59 

60 

61def makeSkyPolygonFromBBox(bbox, wcs): 

62 """Make an on-sky polygon from a bbox and a SkyWcs. 

63 

64 Parameters 

65 ---------- 

66 bbox : `lsst.geom.Box2I` or `lsst.geom.Box2D` 

67 Bounding box of region, in pixel coordinates. 

68 wcs : `lsst.afw.geom.SkyWcs` 

69 Celestial WCS. 

70 

71 Returns 

72 ------- 

73 polygon : `lsst.sphgeom.ConvexPolygon` 

74 On-sky region 

75 """ 

76 pixelPoints = geom.Box2D(bbox).getCorners() 

77 skyPoints = wcs.pixelToSky(pixelPoints) 

78 return lsst.sphgeom.ConvexPolygon([sp.getVector() for sp in skyPoints]) 

79 

80 

81class Index2D(NamedTuple): 

82 """Two dimensional index for patches and cells. 

83 

84 This class contains the x and y values of the location of a patch 

85 within a tract, or a cell within a patch. 

86 

87 Parameters 

88 ---------- 

89 x : `int` 

90 y : `int` 

91 """ 

92 x: int 

93 y: int