LSST Applications g0265f82a02+c6dfa2ddaf,g1162b98a3f+ffe7eabc7e,g2079a07aa2+1b2e822518,g2bbee38e9b+c6dfa2ddaf,g337abbeb29+c6dfa2ddaf,g36da64cc00+ea84795170,g3ddfee87b4+955a963fd8,g50ff169b8f+2eb0e556e8,g52b1c1532d+90ebb246c7,g555ede804d+955a963fd8,g591dd9f2cf+bac198a2cb,g5ec818987f+420292cfeb,g858d7b2824+d6c9a0a3b8,g876c692160+aabc49a3c3,g8a8a8dda67+90ebb246c7,g8cdfe0ae6a+4fd9e222a8,g99cad8db69+e6cd765486,g9ddcbc5298+a1346535a5,ga1e77700b3+df8f93165b,ga8c6da7877+acd47f83f4,gae46bcf261+c6dfa2ddaf,gb0e22166c9+8634eb87fb,gb3f2274832+12c8382528,gba4ed39666+1ac82b564f,gbb8dafda3b+0574160a1f,gbeb006f7da+dea2fbb49f,gc28159a63d+c6dfa2ddaf,gc86a011abf+d6c9a0a3b8,gcf0d15dbbd+955a963fd8,gdaeeff99f8+1cafcb7cd4,gdc0c513512+d6c9a0a3b8,ge79ae78c31+c6dfa2ddaf,geb67518f79+ba1859f325,gee10cc3b42+90ebb246c7,gf1cff7945b+d6c9a0a3b8,w.2024.13
LSST Data Management Base Package
Loading...
Searching...
No Matches
Functions
lsst.afw.geom.utils Namespace Reference

Functions

 _compareWcsOverBBox (wcs0, wcs1, bbox, maxDiffSky=0.01 *lsst.geom.arcseconds, maxDiffPix=0.01, nx=5, ny=5, doShortCircuit=True)
 
 wcsAlmostEqualOverBBox (wcs0, wcs1, bbox, maxDiffSky=0.01 *lsst.geom.arcseconds, maxDiffPix=0.01, nx=5, ny=5)
 
 assertWcsAlmostEqualOverBBox (testCase, wcs0, wcs1, bbox, maxDiffSky=0.01 *lsst.geom.arcseconds, maxDiffPix=0.01, nx=5, ny=5, msg="WCSs differ")
 
 makeEndpoints (testCase)
 

Detailed Description

Utilities that should be imported into the lsst.afw.geom namespace when lsst.afw.geom is used

In the case of the assert functions, importing them makes them available in lsst.utils.tests.TestCase

Function Documentation

◆ _compareWcsOverBBox()

lsst.afw.geom.utils._compareWcsOverBBox ( wcs0,
wcs1,
bbox,
maxDiffSky = 0.01*lsst.geom.arcseconds,
maxDiffPix = 0.01,
nx = 5,
ny = 5,
doShortCircuit = True )
protected
Compare two :py:class:`WCS <lsst.afw.geom.SkyWcs>` over a rectangular grid of pixel positions

Parameters
----------
wcs0 : `lsst.afw.geom.SkyWcs`
    WCS 0
wcs1 : `lsst.afw.geom.SkyWcs`
    WCS 1
bbox : `lsst.geom.Box2I` or `lsst.geom.Box2D`
    boundaries of pixel grid over which to compare the WCSs
maxDiffSky : `lsst.geom.Angle`
    maximum separation between sky positions computed using Wcs.pixelToSky
maxDiffPix : `float`
    maximum separation between pixel positions computed using Wcs.skyToPixel
nx : `int`
    number of points in x for the grid of pixel positions
ny : `int`
    number of points in y for the grid of pixel positions
doShortCircuit : `bool`
    if True then stop at the first error, else test all values in the grid
    and return information about the worst violations found

Returns
-------
msg : `str`
    an empty string if the WCS are sufficiently close; else return a string describing
    the largest error measured in pixel coordinates (if sky to pixel error was excessive)
    and sky coordinates (if pixel to sky error was excessive). If doShortCircuit is true
    then the reported error is likely to be much less than the maximum error across the
    whole pixel grid.

Definition at line 38 of file utils.py.

39 maxDiffPix=0.01, nx=5, ny=5, doShortCircuit=True):
40 """Compare two :py:class:`WCS <lsst.afw.geom.SkyWcs>` over a rectangular grid of pixel positions
41
42 Parameters
43 ----------
44 wcs0 : `lsst.afw.geom.SkyWcs`
45 WCS 0
46 wcs1 : `lsst.afw.geom.SkyWcs`
47 WCS 1
48 bbox : `lsst.geom.Box2I` or `lsst.geom.Box2D`
49 boundaries of pixel grid over which to compare the WCSs
50 maxDiffSky : `lsst.geom.Angle`
51 maximum separation between sky positions computed using Wcs.pixelToSky
52 maxDiffPix : `float`
53 maximum separation between pixel positions computed using Wcs.skyToPixel
54 nx : `int`
55 number of points in x for the grid of pixel positions
56 ny : `int`
57 number of points in y for the grid of pixel positions
58 doShortCircuit : `bool`
59 if True then stop at the first error, else test all values in the grid
60 and return information about the worst violations found
61
62 Returns
63 -------
64 msg : `str`
65 an empty string if the WCS are sufficiently close; else return a string describing
66 the largest error measured in pixel coordinates (if sky to pixel error was excessive)
67 and sky coordinates (if pixel to sky error was excessive). If doShortCircuit is true
68 then the reported error is likely to be much less than the maximum error across the
69 whole pixel grid.
70 """
71 if nx < 1 or ny < 1:
72 raise RuntimeError(f"nx = {nx} and ny = {ny} must both be positive")
73 if maxDiffSky < 0*lsst.geom.arcseconds:
74 raise RuntimeError(f"maxDiffSky = {maxDiffSky} must not be negative")
75 if maxDiffPix < 0:
76 raise RuntimeError(f"maxDiffPix = {maxDiffPix} must not be negative")
77
78 bboxd = lsst.geom.Box2D(bbox)
79 xList = np.linspace(bboxd.getMinX(), bboxd.getMaxX(), nx)
80 yList = np.linspace(bboxd.getMinY(), bboxd.getMaxY(), ny)
81 # we don't care about measured error unless it is too large, so initialize
82 # to max allowed
83 measDiffSky = (maxDiffSky, "?") # (sky diff, pix pos)
84 measDiffPix = (maxDiffPix, "?") # (pix diff, sky pos)
85 for x, y in itertools.product(xList, yList):
86 fromPixPos = lsst.geom.Point2D(x, y)
87 sky0 = wcs0.pixelToSky(fromPixPos)
88 sky1 = wcs1.pixelToSky(fromPixPos)
89 diffSky = sky0.separation(sky1)
90 if diffSky > measDiffSky[0]:
91 measDiffSky = (diffSky, fromPixPos)
92 if doShortCircuit:
93 break
94
95 toPixPos0 = wcs0.skyToPixel(sky0)
96 toPixPos1 = wcs1.skyToPixel(sky0)
97 diffPix = math.hypot(*(toPixPos0 - toPixPos1))
98 if diffPix > measDiffPix[0]:
99 measDiffPix = (diffPix, sky0)
100 if doShortCircuit:
101 break
102
103 msgList = []
104 if measDiffSky[0] > maxDiffSky:
105 msgList.append(f"{measDiffSky[0].asArcseconds()} arcsec max measured sky error "
106 f"> {maxDiffSky.asArcseconds()} arcsec max allowed sky error "
107 f"at pix pos=measDiffSky[1]")
108 if measDiffPix[0] > maxDiffPix:
109 msgList.append(f"{measDiffPix[0]} max measured pix error "
110 f"> {maxDiffPix} max allowed pix error "
111 f"at sky pos={measDiffPix[1]}")
112
113 return "; ".join(msgList)
114
115
A floating-point coordinate rectangle geometry.
Definition Box.h:413

◆ assertWcsAlmostEqualOverBBox()

lsst.afw.geom.utils.assertWcsAlmostEqualOverBBox ( testCase,
wcs0,
wcs1,
bbox,
maxDiffSky = 0.01*lsst.geom.arcseconds,
maxDiffPix = 0.01,
nx = 5,
ny = 5,
msg = "WCSs differ" )
Assert that two :py:class:`WCS <lsst.afw.geom.SkyWcs>` are almost equal over a grid of pixel positions

Compare pixelToSky and skyToPixel for two WCS over a rectangular grid of pixel positions.
If the WCS are too divergent at any point, call testCase.fail; the message describes
the largest error measured in pixel coordinates (if sky to pixel error was excessive)
and sky coordinates (if pixel to sky error was excessive) across the entire pixel grid.

Parameters
----------
testCase : `unittest.TestCase`
    test case the test is part of; an object supporting one method: fail(self, msgStr)
wcs0 : `lsst.afw.geom.SkyWcs`
    WCS 0
wcs1 : `lsst.afw.geom.SkyWcs`
    WCS 1
bbox : `lsst.geom.Box2I` or `lsst.geom.Box2D`
    boundaries of pixel grid over which to compare the WCSs
maxDiffSky : `lsst.geom.Angle`
    maximum separation between sky positions computed using Wcs.pixelToSky
maxDiffPix : `float`
    maximum separation between pixel positions computed using Wcs.skyToPixel
nx : `int`
    number of points in x for the grid of pixel positions
ny : `int`
    number of points in y for the grid of pixel positions
msg : `str`
    exception message prefix; details of the error are appended after ": "

Definition at line 155 of file utils.py.

156 maxDiffPix=0.01, nx=5, ny=5, msg="WCSs differ"):
157 """Assert that two :py:class:`WCS <lsst.afw.geom.SkyWcs>` are almost equal over a grid of pixel positions
158
159 Compare pixelToSky and skyToPixel for two WCS over a rectangular grid of pixel positions.
160 If the WCS are too divergent at any point, call testCase.fail; the message describes
161 the largest error measured in pixel coordinates (if sky to pixel error was excessive)
162 and sky coordinates (if pixel to sky error was excessive) across the entire pixel grid.
163
164 Parameters
165 ----------
166 testCase : `unittest.TestCase`
167 test case the test is part of; an object supporting one method: fail(self, msgStr)
168 wcs0 : `lsst.afw.geom.SkyWcs`
169 WCS 0
170 wcs1 : `lsst.afw.geom.SkyWcs`
171 WCS 1
172 bbox : `lsst.geom.Box2I` or `lsst.geom.Box2D`
173 boundaries of pixel grid over which to compare the WCSs
174 maxDiffSky : `lsst.geom.Angle`
175 maximum separation between sky positions computed using Wcs.pixelToSky
176 maxDiffPix : `float`
177 maximum separation between pixel positions computed using Wcs.skyToPixel
178 nx : `int`
179 number of points in x for the grid of pixel positions
180 ny : `int`
181 number of points in y for the grid of pixel positions
182 msg : `str`
183 exception message prefix; details of the error are appended after ": "
184 """
185 errMsg = _compareWcsOverBBox(
186 wcs0=wcs0,
187 wcs1=wcs1,
188 bbox=bbox,
189 maxDiffSky=maxDiffSky,
190 maxDiffPix=maxDiffPix,
191 nx=nx,
192 ny=ny,
193 doShortCircuit=False,
194 )
195 if errMsg:
196 testCase.fail(f"{msg}: {errMsg}")
197
198
199@lsst.utils.tests.inTestCase

◆ makeEndpoints()

lsst.afw.geom.utils.makeEndpoints ( testCase)
Generate a representative sample of ``Endpoints``.

Parameters
----------
testCase : `unittest.TestCase`
    test case the test is part of; an object supporting one method: fail(self, msgStr)

Returns
-------
endpoints : `list`
    List of endpoints with enough diversity to exercise ``Endpoint``-related
    code. Each invocation of this method shall return independent objects.

Definition at line 200 of file utils.py.

200def makeEndpoints(testCase):
201 """Generate a representative sample of ``Endpoints``.
202
203 Parameters
204 ----------
205 testCase : `unittest.TestCase`
206 test case the test is part of; an object supporting one method: fail(self, msgStr)
207
208 Returns
209 -------
210 endpoints : `list`
211 List of endpoints with enough diversity to exercise ``Endpoint``-related
212 code. Each invocation of this method shall return independent objects.
213 """
214 return [GenericEndpoint(n) for n in range(1, 6)] + \
215 [Point2Endpoint(), SpherePointEndpoint()]

◆ wcsAlmostEqualOverBBox()

lsst.afw.geom.utils.wcsAlmostEqualOverBBox ( wcs0,
wcs1,
bbox,
maxDiffSky = 0.01*lsst.geom.arcseconds,
maxDiffPix = 0.01,
nx = 5,
ny = 5 )
Test if two :py:class:`WCS <lsst.afw.geom.SkyWcs>` are almost equal over a grid of pixel positions.

Parameters
----------
wcs0 : `lsst.afw.geom.SkyWcs`
    WCS 0
wcs1 : `lsst.afw.geom.SkyWcs`
    WCS 1
bbox : `lsst.geom.Box2I` or `lsst.geom.Box2D`
    boundaries of pixel grid over which to compare the WCSs
maxDiffSky : `lsst.geom.Angle`
    maximum separation between sky positions computed using Wcs.pixelToSky
maxDiffPix : `float`
    maximum separation between pixel positions computed using Wcs.skyToPixel
nx : `int`
    number of points in x for the grid of pixel positions
ny : `int`
    number of points in y for the grid of pixel positions

Returns
-------
almostEqual: `bool`
    `True` if two WCS are almost equal over a grid of pixel positions, else `False`

Definition at line 116 of file utils.py.

117 maxDiffPix=0.01, nx=5, ny=5):
118 """Test if two :py:class:`WCS <lsst.afw.geom.SkyWcs>` are almost equal over a grid of pixel positions.
119
120 Parameters
121 ----------
122 wcs0 : `lsst.afw.geom.SkyWcs`
123 WCS 0
124 wcs1 : `lsst.afw.geom.SkyWcs`
125 WCS 1
126 bbox : `lsst.geom.Box2I` or `lsst.geom.Box2D`
127 boundaries of pixel grid over which to compare the WCSs
128 maxDiffSky : `lsst.geom.Angle`
129 maximum separation between sky positions computed using Wcs.pixelToSky
130 maxDiffPix : `float`
131 maximum separation between pixel positions computed using Wcs.skyToPixel
132 nx : `int`
133 number of points in x for the grid of pixel positions
134 ny : `int`
135 number of points in y for the grid of pixel positions
136
137 Returns
138 -------
139 almostEqual: `bool`
140 `True` if two WCS are almost equal over a grid of pixel positions, else `False`
141 """
142 return not bool(_compareWcsOverBBox(
143 wcs0=wcs0,
144 wcs1=wcs1,
145 bbox=bbox,
146 maxDiffSky=maxDiffSky,
147 maxDiffPix=maxDiffPix,
148 nx=nx,
149 ny=ny,
150 doShortCircuit=True,
151 ))
152
153
154@lsst.utils.tests.inTestCase