Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# 

2# LSST Data Management System 

3# Copyright 2017 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__ = ["getSipMatrixFromMetadata", "computePixelToDistortedPixel"] 

24 

25import lsst.geom 

26from ..transformFactory import linearizeTransform, makeTransform 

27from .wcsUtils import _getSipMatrixFromMetadata 

28 

29 

30def getSipMatrixFromMetadata(metadata, name): 

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

32 

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

34 

35 Parameters 

36 ---------- 

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

38 FITS metadata. 

39 name : `str` 

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

41 

42 Returns 

43 ------- 

44 `numpy.array` 

45 The SIP matrix. 

46 

47 Raises 

48 ------ 

49 TypeError 

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

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

52 the value of the order keyword is negative, 

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

54 """ 

55 arr = _getSipMatrixFromMetadata(metadata, name) 

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

57 arr.shape = (1, 1) 

58 return arr 

59 

60 

61def computePixelToDistortedPixel(pixelToFocalPlane, focalPlaneToFieldAngle): 

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

63 distortion specified by ``focalPlaneToFieldAngle``. 

64 

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

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

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

68 

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

70 

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

72 

73 pixelToDistortedPixel -> pixelToIwc 

74 

75 Parameters 

76 ---------- 

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

78 Transform parent pixel coordinates to focal plane coordinates 

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

80 Transform focal plane coordinates to field angle coordinates 

81 

82 Returns 

83 ------- 

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

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

86 """ 

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

88 focalPlaneToTanFieldAngle = makeTransform(linearizeTransform(focalPlaneToFieldAngle, 

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

90 return pixelToFocalPlane.then(focalPlaneToFieldAngle) \ 

91 .then(focalPlaneToTanFieldAngle.inverted()) \ 

92 .then(pixelToFocalPlane.inverted())