LSST Applications  21.0.0+04719a4bac,21.0.0-1-ga51b5d4+f5e6047307,21.0.0-11-g2b59f77+a9c1acf22d,21.0.0-11-ga42c5b2+86977b0b17,21.0.0-12-gf4ce030+76814010d2,21.0.0-13-g1721dae+760e7a6536,21.0.0-13-g3a573fe+768d78a30a,21.0.0-15-g5a7caf0+f21cbc5713,21.0.0-16-g0fb55c1+b60e2d390c,21.0.0-19-g4cded4ca+71a93a33c0,21.0.0-2-g103fe59+bb20972958,21.0.0-2-g45278ab+04719a4bac,21.0.0-2-g5242d73+3ad5d60fb1,21.0.0-2-g7f82c8f+8babb168e8,21.0.0-2-g8f08a60+06509c8b61,21.0.0-2-g8faa9b5+616205b9df,21.0.0-2-ga326454+8babb168e8,21.0.0-2-gde069b7+5e4aea9c2f,21.0.0-2-gecfae73+1d3a86e577,21.0.0-2-gfc62afb+3ad5d60fb1,21.0.0-25-g1d57be3cd+e73869a214,21.0.0-3-g357aad2+ed88757d29,21.0.0-3-g4a4ce7f+3ad5d60fb1,21.0.0-3-g4be5c26+3ad5d60fb1,21.0.0-3-g65f322c+e0b24896a3,21.0.0-3-g7d9da8d+616205b9df,21.0.0-3-ge02ed75+a9c1acf22d,21.0.0-4-g591bb35+a9c1acf22d,21.0.0-4-g65b4814+b60e2d390c,21.0.0-4-gccdca77+0de219a2bc,21.0.0-4-ge8a399c+6c55c39e83,21.0.0-5-gd00fb1e+05fce91b99,21.0.0-6-gc675373+3ad5d60fb1,21.0.0-64-g1122c245+4fb2b8f86e,21.0.0-7-g04766d7+cd19d05db2,21.0.0-7-gdf92d54+04719a4bac,21.0.0-8-g5674e7b+d1bd76f71f,master-gac4afde19b+a9c1acf22d,w.2021.13
LSST Data Management Base Package
Classes | Functions
lsst.afw.geom.testUtils Namespace Reference

Classes

class  BoxGrid
 
class  FrameSetInfo
 
class  PermutedFrameSet
 
class  TransformTestBaseClass
 

Functions

def makeSipPolyMapCoeffs (metadata, name)
 
def makeSipIwcToPixel (metadata)
 
def makeSipPixelToIwc (metadata)
 

Function Documentation

◆ makeSipIwcToPixel()

def lsst.afw.geom.testUtils.makeSipIwcToPixel (   metadata)
Make an IWC to pixel transform with SIP distortion from FITS-WCS metadata

This function is primarily intended for unit tests.
IWC is intermediate world coordinates, as described in the FITS papers.

Parameters
----------
metadata : lsst.daf.base.PropertySet
    FITS metadata describing a WCS with inverse SIP coefficients

Returns
-------
lsst.afw.geom.TransformPoint2ToPoint2
    Transform from IWC position to pixel position (zero-based)
    in the forward direction. The inverse direction is not defined.

Notes
-----

The inverse SIP terms APn_m, BPn_m are polynomial coefficients x^n y^m
for computing transformed x, y respectively. If we call the resulting
polynomial inverseSipPolynomial, the returned transformation is:

    pixelPosition = pixel origin + uv + inverseSipPolynomial(uv)
    where uv = inverseCdMatrix * iwcPosition

Definition at line 196 of file testUtils.py.

196 def makeSipIwcToPixel(metadata):
197  """Make an IWC to pixel transform with SIP distortion from FITS-WCS metadata
198 
199  This function is primarily intended for unit tests.
200  IWC is intermediate world coordinates, as described in the FITS papers.
201 
202  Parameters
203  ----------
204  metadata : lsst.daf.base.PropertySet
205  FITS metadata describing a WCS with inverse SIP coefficients
206 
207  Returns
208  -------
209  lsst.afw.geom.TransformPoint2ToPoint2
210  Transform from IWC position to pixel position (zero-based)
211  in the forward direction. The inverse direction is not defined.
212 
213  Notes
214  -----
215 
216  The inverse SIP terms APn_m, BPn_m are polynomial coefficients x^n y^m
217  for computing transformed x, y respectively. If we call the resulting
218  polynomial inverseSipPolynomial, the returned transformation is:
219 
220  pixelPosition = pixel origin + uv + inverseSipPolynomial(uv)
221  where uv = inverseCdMatrix * iwcPosition
222  """
223  crpix = (metadata.getScalar("CRPIX1") - 1, metadata.getScalar("CRPIX2") - 1)
224  pixelRelativeToAbsoluteMap = ast.ShiftMap(crpix)
225  cdMatrix = getCdMatrixFromMetadata(metadata)
226  cdMatrixMap = ast.MatrixMap(cdMatrix.copy())
227  coeffList = makeSipPolyMapCoeffs(metadata, "AP") + makeSipPolyMapCoeffs(metadata, "BP")
228  coeffArr = np.array(coeffList, dtype=float)
229  sipPolyMap = ast.PolyMap(coeffArr, 2, "IterInverse=0")
230 
231  iwcToPixelMap = cdMatrixMap.inverted().then(sipPolyMap).then(pixelRelativeToAbsoluteMap)
232  return afwGeom.TransformPoint2ToPoint2(iwcToPixelMap)
233 
234 
MatrixMap is a form of Mapping which performs a general linear transformation.
Definition: MatrixMap.h:42
PolyMap is a Mapping which performs a general polynomial transformation.
Definition: PolyMap.h:49
ShiftMap is a linear Mapping which shifts each axis by a specified constant value.
Definition: ShiftMap.h:40
Transform LSST spatial data, such as lsst::geom::Point2D and lsst::geom::SpherePoint,...
Definition: Transform.h:68
def makeSipPolyMapCoeffs(metadata, name)
Definition: testUtils.py:141
def makeSipIwcToPixel(metadata)
Definition: testUtils.py:196
Eigen::Matrix2d getCdMatrixFromMetadata(daf::base::PropertySet &metadata)
Read a CD matrix from FITS WCS metadata.
Definition: wcsUtils.cc:78

◆ makeSipPixelToIwc()

def lsst.afw.geom.testUtils.makeSipPixelToIwc (   metadata)
Make a pixel to IWC transform with SIP distortion from FITS-WCS metadata

This function is primarily intended for unit tests.
IWC is intermediate world coordinates, as described in the FITS papers.

Parameters
----------
metadata : lsst.daf.base.PropertySet
    FITS metadata describing a WCS with forward SIP coefficients

Returns
-------
lsst.afw.geom.TransformPoint2ToPoint2
    Transform from pixel position (zero-based) to IWC position
    in the forward direction. The inverse direction is not defined.

Notes
-----

The forward SIP terms An_m, Bn_m are polynomial coefficients x^n y^m
for computing transformed x, y respectively. If we call the resulting
polynomial sipPolynomial, the returned transformation is:

    iwcPosition = cdMatrix * (dxy + sipPolynomial(dxy))
    where dxy = pixelPosition - pixelOrigin

Definition at line 235 of file testUtils.py.

235 def makeSipPixelToIwc(metadata):
236  """Make a pixel to IWC transform with SIP distortion from FITS-WCS metadata
237 
238  This function is primarily intended for unit tests.
239  IWC is intermediate world coordinates, as described in the FITS papers.
240 
241  Parameters
242  ----------
243  metadata : lsst.daf.base.PropertySet
244  FITS metadata describing a WCS with forward SIP coefficients
245 
246  Returns
247  -------
248  lsst.afw.geom.TransformPoint2ToPoint2
249  Transform from pixel position (zero-based) to IWC position
250  in the forward direction. The inverse direction is not defined.
251 
252  Notes
253  -----
254 
255  The forward SIP terms An_m, Bn_m are polynomial coefficients x^n y^m
256  for computing transformed x, y respectively. If we call the resulting
257  polynomial sipPolynomial, the returned transformation is:
258 
259  iwcPosition = cdMatrix * (dxy + sipPolynomial(dxy))
260  where dxy = pixelPosition - pixelOrigin
261  """
262  crpix = (metadata.getScalar("CRPIX1") - 1, metadata.getScalar("CRPIX2") - 1)
263  pixelAbsoluteToRelativeMap = ast.ShiftMap(crpix).inverted()
264  cdMatrix = getCdMatrixFromMetadata(metadata)
265  cdMatrixMap = ast.MatrixMap(cdMatrix.copy())
266  coeffList = makeSipPolyMapCoeffs(metadata, "A") + makeSipPolyMapCoeffs(metadata, "B")
267  coeffArr = np.array(coeffList, dtype=float)
268  sipPolyMap = ast.PolyMap(coeffArr, 2, "IterInverse=0")
269  pixelToIwcMap = pixelAbsoluteToRelativeMap.then(sipPolyMap).then(cdMatrixMap)
270  return afwGeom.TransformPoint2ToPoint2(pixelToIwcMap)
271 
272 
def makeSipPixelToIwc(metadata)
Definition: testUtils.py:235

◆ makeSipPolyMapCoeffs()

def lsst.afw.geom.testUtils.makeSipPolyMapCoeffs (   metadata,
  name 
)
Return a list of ast.PolyMap coefficients for the specified SIP matrix

The returned list of coefficients for an ast.PolyMap
that computes the following function:

    f(dxy) = dxy + sipPolynomial(dxy))
    where dxy = pixelPosition - pixelOrigin
    and sipPolynomial is a polynomial with terms `<name>n_m for x^n y^m`
        (e.g. A2_0 is the coefficient for x^2 y^0)

Parameters
----------
metadata : lsst.daf.base.PropertySet
    FITS metadata describing a WCS with the specified SIP coefficients
name : str
    The desired SIP terms: one of A, B, AP, BP

Returns
-------
list
    A list of coefficients for an ast.PolyMap that computes
    the specified SIP polynomial, including a term for out = in

Note
----
This is an internal function for use by makeSipIwcToPixel
and makeSipPixelToIwc

Definition at line 141 of file testUtils.py.

141 def makeSipPolyMapCoeffs(metadata, name):
142  """Return a list of ast.PolyMap coefficients for the specified SIP matrix
143 
144  The returned list of coefficients for an ast.PolyMap
145  that computes the following function:
146 
147  f(dxy) = dxy + sipPolynomial(dxy))
148  where dxy = pixelPosition - pixelOrigin
149  and sipPolynomial is a polynomial with terms `<name>n_m for x^n y^m`
150  (e.g. A2_0 is the coefficient for x^2 y^0)
151 
152  Parameters
153  ----------
154  metadata : lsst.daf.base.PropertySet
155  FITS metadata describing a WCS with the specified SIP coefficients
156  name : str
157  The desired SIP terms: one of A, B, AP, BP
158 
159  Returns
160  -------
161  list
162  A list of coefficients for an ast.PolyMap that computes
163  the specified SIP polynomial, including a term for out = in
164 
165  Note
166  ----
167  This is an internal function for use by makeSipIwcToPixel
168  and makeSipPixelToIwc
169  """
170  outAxisDict = dict(A=1, B=2, AP=1, BP=2)
171  outAxis = outAxisDict.get(name)
172  if outAxis is None:
173  raise RuntimeError(f"{name} not a supported SIP name")
174  width = metadata.getAsInt(f"{name}_ORDER") + 1
175  found = False
176  # start with a term for out = in
177  coeffs = []
178  if outAxis == 1:
179  coeffs.append([1.0, outAxis, 1, 0])
180  else:
181  coeffs.append([1.0, outAxis, 0, 1])
182  # add SIP distortion terms
183  for xPower in range(width):
184  for yPower in range(width):
185  coeffName = f"{name}_{xPower}_{yPower}"
186  if not metadata.exists(coeffName):
187  continue
188  found = True
189  coeff = metadata.getAsDouble(coeffName)
190  coeffs.append([coeff, outAxis, xPower, yPower])
191  if not found:
192  raise RuntimeError(f"No {name} coefficients found")
193  return coeffs
194 
195