Coverage for python/lsst/afw/geom/wcsUtils.py: 38%

11 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-04-15 02:24 -0700

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__all__ = ["getSipMatrixFromMetadata", "computePixelToDistortedPixel", 

23 "createTrivialWcsMetadata", "deleteBasicWcsMetadata", "getCdMatrixFromMetadata", 

24 "getImageXY0FromMetadata", "hasSipMatrix", "makeSipMatrixMetadata", 

25 "makeTanSipMetadata"] 

26 

27import lsst.geom 

28from ._geom import (_getSipMatrixFromMetadata, makeTransform, linearizeTransform, 

29 createTrivialWcsMetadata, deleteBasicWcsMetadata, getCdMatrixFromMetadata, 

30 getImageXY0FromMetadata, hasSipMatrix, makeSipMatrixMetadata, 

31 makeTanSipMetadata) 

32 

33 

34def getSipMatrixFromMetadata(metadata, name): 

35 """Extract a SIP matrix from FITS TAN-SIP WCS metadata. 

36 

37 Omitted coefficients are set to 0 and all coefficients may be omitted. 

38 

39 Parameters 

40 ---------- 

41 metadata : `lsst.daf.base.PropertySet` 

42 FITS metadata. 

43 name : `str` 

44 Name of TAN-SIP matrix (``"A"``, ``"B"``, ``"Ap"``, or ``"Bp"``). 

45 

46 Returns 

47 ------- 

48 `numpy.array` 

49 The SIP matrix. 

50 

51 Raises 

52 ------ 

53 TypeError 

54 If the order keyword ``<name>_ORDER`` (e.g. ``AP_ORDER``) is not found, 

55 the value of the order keyword cannot be read as an integer, 

56 the value of the order keyword is negative, 

57 or if a matrix parameter (e.g. ``AP_5_0``) cannot be read as a float. 

58 """ 

59 arr = _getSipMatrixFromMetadata(metadata, name) 

60 if arr.shape == (): # order=0 

61 arr.shape = (1, 1) 

62 return arr 

63 

64 

65def computePixelToDistortedPixel(pixelToFocalPlane, focalPlaneToFieldAngle): 

66 """Compute the transform ``pixelToDistortedPixel``, which applies optical 

67 distortion specified by ``focalPlaneToFieldAngle``. 

68 

69 The resulting transform is designed to be used to convert a pure TAN WCS 

70 to a WCS that includes a model for optical distortion. In detail, 

71 the initial WCS will contain these frames and transforms:: 

72 

73 PIXELS frame -> pixelToIwc -> IWC frame -> gridToIwc -> SkyFrame 

74 

75 To produce the WCS with distortion, replace ``pixelToIwc`` with:: 

76 

77 pixelToDistortedPixel -> pixelToIwc 

78 

79 Parameters 

80 ---------- 

81 pixelToFocalPlane : `lsst.afw.geom.TransformPoint2ToPoint2` 

82 Transform parent pixel coordinates to focal plane coordinates 

83 focalPlaneToFieldAngle : `lsst.afw.geom.TransformPoint2ToPoint2` 

84 Transform focal plane coordinates to field angle coordinates 

85 

86 Returns 

87 ------- 

88 pixelToDistortedPixel : `lsst.afw.geom.TransformPoint2ToPoint2` 

89 A transform that applies the effect of the optical distortion model. 

90 """ 

91 # return pixelToFocalPlane -> focalPlaneToFieldAngle -> tanFieldAngleToocalPlane -> focalPlaneToPixel 

92 focalPlaneToTanFieldAngle = makeTransform(linearizeTransform(focalPlaneToFieldAngle, 

93 lsst.geom.Point2D(0, 0))) 

94 return pixelToFocalPlane.then(focalPlaneToFieldAngle) \ 

95 .then(focalPlaneToTanFieldAngle.inverted()) \ 

96 .then(pixelToFocalPlane.inverted())