Coverage for python/lsst/afw/geom/_python/_transform.py: 57%

24 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2022-11-06 12:52 -0800

1# This file is part of afw. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (https://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

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 GNU General Public License 

20# along with this program. If not, see <https://www.gnu.org/licenses/>. 

21 

22"""Python helpers for pybind11 wrapping of Transform classes and subclasses 

23 

24.. _pybind11_transform_classes: 

25 

26Transform Classes and Subclasses 

27-------------------------------- 

28 

29Transforms are instances of 

30lsst::afw::geom::Transform<FromEndpoint, ToEndpoint> 

31and subclasses, such as lsst::afw::geom::SkyWcs. 

32 

33In Python the templated Transform classes have names such as 

34`lsst.afw.geom.TransformSpherePointToPoint2` for 

35`lsst::afw::geom::Transform<SpherePointEndpoint, Point2Endpoint>` 

36""" 

37 

38 

39__all__ = ["addTransformMethods", "reduceTransform", "transformRegistry"] 

40 

41import lsst.pex.exceptions 

42 

43# registry of transform classes; a dict of class name: transform class 

44transformRegistry = {} 

45 

46 

47def getJacobian(self, x): 

48 # Force 2D matrix over numpy's protests 

49 matrix = self._getJacobian(x) 

50 matrix.shape = (self.toEndpoint.nAxes, 

51 self.fromEndpoint.nAxes) 

52 return matrix 

53 

54 

55def then(self, next, simplify=True): 

56 """Concatenate two transforms 

57 

58 The result of A.then(B) is is C(x) = B(A(x)) 

59 """ 

60 if self.toEndpoint == next.fromEndpoint: 

61 return self._then(next, simplify=simplify) 

62 else: 

63 raise lsst.pex.exceptions.InvalidParameterError( 

64 "Cannot concatenate %r and %r: endpoints do not match." 

65 % (self, next)) 

66 

67 

68def unpickleTransform(cls, state): 

69 """Unpickle a Transform object 

70 

71 Parameters 

72 ---------- 

73 cls : `type` 

74 A `Transform` class. 

75 state : `str` 

76 Pickled state. 

77 

78 Returns 

79 ------- 

80 transform : `cls` 

81 The unpickled Transform. 

82 """ 

83 return cls.readString(state) 

84 

85 

86def reduceTransform(transform): 

87 """Pickle a Transform object 

88 

89 This provides the `__reduce__` implementation for a Transform. 

90 """ 

91 return unpickleTransform, (type(transform), transform.writeString()) 

92 

93 

94def addTransformMethods(cls): 

95 """Add pure python methods to the specified Transform class, and register 

96 the class in `transformRegistry` 

97 

98 All :ref:`_pybind11_transform_classes` must call this function. 

99 

100 Parameters 

101 ---------- 

102 cls : :ref:`_pybind11_transform_classes` 

103 A Transform class or subclass, e.g. 

104 `lsst.afw.geom.TransformPoint2ToSpherePoint` 

105 """ 

106 global transformRegistry 

107 className = cls.__name__ 

108 if className in transformRegistry: 108 ↛ 109line 108 didn't jump to line 109, because the condition on line 108 was never true

109 raise RuntimeError(f"Class {className!r}={transformRegistry[className]} already registered; " 

110 f"cannot register class {cls}") 

111 transformRegistry[cls.__name__] = cls 

112 cls.getJacobian = getJacobian 

113 cls.then = then 

114 cls.__reduce__ = reduceTransform