Coverage for python/lsst/afw/geom/ellipses/__init__.py: 21%

48 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-01-10 02:46 -0800

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"""lsst.afw.geom.ellipses 

24""" 

25from ._ellipses import * 

26from ._ellipse import * 

27from ._axes import * 

28from ._quadrupole import * 

29 

30Separable = { 

31 (Distortion, DeterminantRadius): SeparableDistortionDeterminantRadius, 

32 (Distortion, TraceRadius): SeparableDistortionTraceRadius, 

33 (Distortion, LogDeterminantRadius): SeparableDistortionLogDeterminantRadius, 

34 (Distortion, LogTraceRadius): SeparableDistortionLogTraceRadius, 

35 (ConformalShear, DeterminantRadius): SeparableConformalShearDeterminantRadius, 

36 (ConformalShear, TraceRadius): SeparableConformalShearTraceRadius, 

37 (ConformalShear, LogDeterminantRadius): SeparableConformalShearLogDeterminantRadius, 

38 (ConformalShear, LogTraceRadius): SeparableConformalShearLogTraceRadius 

39} 

40 

41 

42class EllipseMatplotlibInterface: 

43 """An interface for drawing the ellipse using matplotlib. 

44 

45 This is typically initiated by calling Ellipse.plot(), which 

46 returns an instance of this class. 

47 """ 

48 

49 def __init__(self, ellipse, scale=1.0, **kwds): 

50 import matplotlib.patches 

51 import weakref 

52 import numpy as np 

53 self.__ellipse = weakref.proxy(ellipse) 

54 self.scale = float(scale) 

55 core = Axes(self.__ellipse.getCore()) 

56 core.scale(2.0 * scale) 

57 self.patch = matplotlib.patches.Ellipse( 

58 (self.__ellipse.getCenter().getX(), self.__ellipse.getCenter().getY()), 

59 core.getA(), core.getB(), core.getTheta() * 180.0 / np.pi, 

60 **kwds 

61 ) 

62 

63 def __getattr__(self, name): 

64 return getattr(self.patch, name) 

65 

66 def update(self, show=True, rescale=True): 

67 """Update the matplotlib representation to the current ellipse parameters. 

68 """ 

69 import matplotlib.patches 

70 import numpy as np 

71 core = _agl.Axes(self.__ellipse.getCore()) 

72 core.scale(2.0 * scale) 

73 new_patch = matplotlib.patches.Ellipse( 

74 (self.__ellipse.getCenter().getX(), self.__ellipse.getCenter().getY()), 

75 core.a, core.b, core.theta * 180.0 / np.pi 

76 ) 

77 new_patch.update_from(self.patch) 

78 axes = self.patch.get_axes() 

79 if axes is not None: 

80 self.patch.remove() 

81 axes.add_patch(new_patch) 

82 self.patch = new_patch 

83 if axes is not None: 

84 if rescale: 

85 axes.autoscale_view() 

86 if show: 

87 axes.figure.canvas.draw() 

88 

89 

90def Ellipse_plot(self, axes=None, scale=1.0, show=True, rescale=True, **kwds): 

91 """Plot the ellipse in matplotlib, adding a MatplotlibInterface 

92 object as the 'matplotlib' attribute of the ellipse. 

93 

94 Aside from those below, keyword arguments for the 

95 matplotlib.patches.Patch constructor are also accepted 

96 ('facecolor', 'linestyle', etc.) 

97 

98 Parameters 

99 ---------- 

100 axes : `matplotlib.axes.Axes`, optional 

101 Axes to plot on. Defaults to matplotlib.pyplot.gca(). 

102 scale : `float`, optional 

103 Scale the displayed ellipse by this factor. 

104 show : `bool`, optional 

105 If True, update the figure automatically. Set to False for batch 

106 processing. 

107 rescale : `bool`, optional 

108 If True, rescale the axes. 

109 

110 Returns 

111 ------- 

112 interface : `EllipseMatplotlibInterface` 

113 An object that allows the matplotlib patch to be updated when the 

114 ellipse modified. 

115 """ 

116 import matplotlib.pyplot 

117 interface = self.MatplotlibInterface(self, scale, **kwds) 

118 if axes is None: 

119 axes = matplotlib.pyplot.gca() 

120 axes.add_patch(interface.patch) 

121 if rescale: 

122 axes.autoscale_view() 

123 if show: 

124 axes.figure.canvas.draw() 

125 return interface 

126 

127 

128Ellipse.MatplotlibInterface = EllipseMatplotlibInterface 

129Ellipse.plot = Ellipse_plot