LSST Applications g0f08755f38+9c285cab97,g1635faa6d4+13f3999e92,g1653933729+a8ce1bb630,g1a0ca8cf93+bf6eb00ceb,g28da252d5a+0829b12dee,g29321ee8c0+5700dc9eac,g2bbee38e9b+9634bc57db,g2bc492864f+9634bc57db,g2cdde0e794+c2c89b37c4,g3156d2b45e+41e33cbcdc,g347aa1857d+9634bc57db,g35bb328faa+a8ce1bb630,g3a166c0a6a+9634bc57db,g3e281a1b8c+9f2c4e2fc3,g414038480c+077ccc18e7,g41af890bb2+fde0dd39b6,g5fbc88fb19+17cd334064,g781aacb6e4+a8ce1bb630,g80478fca09+55a9465950,g82479be7b0+d730eedb7d,g858d7b2824+9c285cab97,g9125e01d80+a8ce1bb630,g9726552aa6+10f999ec6a,ga5288a1d22+2a84bb7594,gacf8899fa4+c69c5206e8,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+9634bc57db,gcf0d15dbbd+4b7d09cae4,gda3e153d99+9c285cab97,gda6a2b7d83+4b7d09cae4,gdaeeff99f8+1711a396fd,ge2409df99d+5e831397f4,ge79ae78c31+9634bc57db,gf0baf85859+147a0692ba,gf3967379c6+41c94011de,gf3fb38a9a8+8f07a9901b,gfb92a5be7c+9c285cab97,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
Classes | Functions
lsst.afw.geom._hpxUtils Namespace Reference

Classes

class  _ZOrderCurve2DInt
 

Functions

 makeHpxWcs (hips_order, pixel, shift_order=9)
 
 _hpx_projected_center (hips_order, pixel)
 

Function Documentation

◆ _hpx_projected_center()

lsst.afw.geom._hpxUtils._hpx_projected_center ( hips_order,
pixel )
protected
Compute the projected center for use in HPX WCS headers.

The values of cent_ra_proj, cent_dec_proj computed by this function are
typically outside of the cell pixel itself, and are not the same as
the values computed from HEALPix `pix2ang()'.

Code is adapted from AladinSrc.jar version 11.024, Tile2HPX.java.
AladinSrc.jar is licensed with GPLv3, see
http://aladin.u-strasbg.fr/COPYING

Parameters
----------
hips_order : `int`
    HiPS order, such that HEALPix nside=2**hips_order.
pixel : `int`
    Pixel number in the nest ordering scheme.

Returns
-------
cent_ra_proj, cent_dec_proj : `float`
    Projected center ra/dec in degrees.

Raises
------
`ValueError`: Raised if hips_order is <=0, or if pixel number is out of
    range for the given order (0 < 12*nside*nside).

Definition at line 151 of file _hpxUtils.py.

151def _hpx_projected_center(hips_order, pixel):
152 """
153 Compute the projected center for use in HPX WCS headers.
154
155 The values of cent_ra_proj, cent_dec_proj computed by this function are
156 typically outside of the cell pixel itself, and are not the same as
157 the values computed from HEALPix `pix2ang()'.
158
159 Code is adapted from AladinSrc.jar version 11.024, Tile2HPX.java.
160 AladinSrc.jar is licensed with GPLv3, see
161 http://aladin.u-strasbg.fr/COPYING
162
163 Parameters
164 ----------
165 hips_order : `int`
166 HiPS order, such that HEALPix nside=2**hips_order.
167 pixel : `int`
168 Pixel number in the nest ordering scheme.
169
170 Returns
171 -------
172 cent_ra_proj, cent_dec_proj : `float`
173 Projected center ra/dec in degrees.
174
175 Raises
176 ------
177 `ValueError`: Raised if hips_order is <=0, or if pixel number is out of
178 range for the given order (0 < 12*nside*nside).
179 """
180 if hips_order <= 0:
181 raise ValueError(f"hips_order {hips_order} must be positive.")
182 nside_cell = 2**hips_order
183
184 if pixel < 0 or pixel >= 12*nside_cell*nside_cell:
185 raise ValueError(f"pixel value {pixel} out of range.")
186
187 twice_depth = np.left_shift(hips_order, 1)
188 xy_mask = np.left_shift(1, twice_depth) - 1
189 fc = _ZOrderCurve2DInt()
190
191 d0h = np.int32(np.right_shift(pixel, twice_depth))
192 _hash = fc.hash2ij(pixel & xy_mask)
193 i_in_d0h = fc.ij2i(_hash)
194 j_in_d0h = fc.ij2j(_hash)
195 # Compute coordinates from the center of the base pixel
196 # with x-axis = W-->E, y-axis = S-->N
197 l_in_d0h = i_in_d0h - j_in_d0h
198 h_in_d0h = i_in_d0h + j_in_d0h - (nside_cell - 1)
199 # Compute coordinates of the base pixel in the projection plane
200 d0h_by_4_quotient = np.right_shift(d0h, 2)
201 d0h_mod_4 = d0h - np.left_shift(d0h_by_4_quotient, 2)
202 h_d0h = 1 - d0h_by_4_quotient
203 l_d0h = np.left_shift(d0h_mod_4, 1)
204 if ((h_d0h == 0) and ((l_d0h == 6) or ((l_d0h == 4) and (l_in_d0h > 0)))):
205 # Equatorial region
206 l_d0h -= 8
207 elif (h_d0h != 0):
208 # Polar caps regions
209 l_d0h += 1
210 if (l_d0h > 3):
211 l_d0h -= 8
212 # Finalize
213 return (np.rad2deg((np.pi/4.)*(l_d0h + l_in_d0h/float(nside_cell))),
214 np.rad2deg((np.pi/4.)*(h_d0h + h_in_d0h/float(nside_cell))))
215
216

◆ makeHpxWcs()

lsst.afw.geom._hpxUtils.makeHpxWcs ( hips_order,
pixel,
shift_order = 9 )
Make a SkyWcs object with HEALPix grid projection (HPX).

The SkyWcs generated by this function is suitable to be used with a
Hierarchical Progressive Survey (HiPS) FITS image as described in
https://www.ivoa.net/documents/HiPS/20170519/REC-HIPS-1.0-20170519.pdf

A HiPS image covers one HEALPix cell, with the HEALPix nside equal to
2**hips_order. Each cell is 'shift_order' orders deeper than the HEALPix
cell, with 2**shift_order x 2**shift_order sub-pixels on a side, which
defines the target resolution of the HiPS image. The IVOA recommends
shift_order=9, for 2**9=512 pixels on a side.  See Notes below to
convert from hips_order to image resolution.

Parameters
----------
hips_order : `int`
    HiPS order, such that HEALPix nside=2**hips_order.
    Must be a positive integer.
pixel : `int`
    Pixel number in the nest ordering scheme.
shift_order : `int`, optional
    Shift order for subpixels, such that there are 2**shift_order
    sub-pixels on a side of the HiPS cell.
    Must be a positive integer.

Returns
-------
wcs : `lsst.geom.SkyWcs`

Raises
------
`ValueError`: Raise if hips_order is <=0, or if shift_order is <=0, or
    if pixel number is out of range for the given hips_order
    (0 <= pixel < 12*nside*nside).

Notes
-----
Table 5 from
https://www.ivoa.net/documents/HiPS/20170519/REC-HIPS-1.0-20170519.pdf
shows the relationship between hips_order, number of tiles (full
sky coverage), cell size, and sub-pixel size/image resolution (with
the default shift_order=9):

+------------+-----------------+--------------+------------------+
| hips_order | Number of Tiles | Cell Size    | Image Resolution |
+============+=================+==============+==================+
| 0          | 12              | 58.63 deg    | 6.871 arcmin     |
| 1          | 48              | 29.32 deg    | 3.435 arcmin     |
| 2          | 192             | 14.66 deg    | 1.718 arcmin     |
| 3          | 768             | 7.329 deg    | 51.53 arcsec     |
| 4          | 3072            | 3.665 deg    | 25.77 arcsec     |
| 5          | 12288           | 1.832 deg    | 12.88 arcsec     |
| 6          | 49152           | 54.97 arcmin | 6.442 arcsec     |
| 7          | 196608          | 27.48 arcmin | 3.221 arcsec     |
| 8          | 786432          | 13.74 arcmin | 1.61 arcsec      |
| 9          | 3145728         | 6.871 arcmin | 805.2mas         |
| 10         | 12582912        | 3.435 arcmin | 402.6mas         |
| 11         | 50331648        | 1.718 arcmin | 201.3mas         |
| 12         | 201326592       | 51.53 arcsec | 100.6mas         |
| 13         | 805306368       | 25.77 arcsec | 50.32mas         |
+------------+-----------------+--------------+------------------+

Definition at line 31 of file _hpxUtils.py.

31def makeHpxWcs(hips_order, pixel, shift_order=9):
32 """
33 Make a SkyWcs object with HEALPix grid projection (HPX).
34
35 The SkyWcs generated by this function is suitable to be used with a
36 Hierarchical Progressive Survey (HiPS) FITS image as described in
37 https://www.ivoa.net/documents/HiPS/20170519/REC-HIPS-1.0-20170519.pdf
38
39 A HiPS image covers one HEALPix cell, with the HEALPix nside equal to
40 2**hips_order. Each cell is 'shift_order' orders deeper than the HEALPix
41 cell, with 2**shift_order x 2**shift_order sub-pixels on a side, which
42 defines the target resolution of the HiPS image. The IVOA recommends
43 shift_order=9, for 2**9=512 pixels on a side. See Notes below to
44 convert from hips_order to image resolution.
45
46 Parameters
47 ----------
48 hips_order : `int`
49 HiPS order, such that HEALPix nside=2**hips_order.
50 Must be a positive integer.
51 pixel : `int`
52 Pixel number in the nest ordering scheme.
53 shift_order : `int`, optional
54 Shift order for subpixels, such that there are 2**shift_order
55 sub-pixels on a side of the HiPS cell.
56 Must be a positive integer.
57
58 Returns
59 -------
60 wcs : `lsst.geom.SkyWcs`
61
62 Raises
63 ------
64 `ValueError`: Raise if hips_order is <=0, or if shift_order is <=0, or
65 if pixel number is out of range for the given hips_order
66 (0 <= pixel < 12*nside*nside).
67
68 Notes
69 -----
70 Table 5 from
71 https://www.ivoa.net/documents/HiPS/20170519/REC-HIPS-1.0-20170519.pdf
72 shows the relationship between hips_order, number of tiles (full
73 sky coverage), cell size, and sub-pixel size/image resolution (with
74 the default shift_order=9):
75
76 +------------+-----------------+--------------+------------------+
77 | hips_order | Number of Tiles | Cell Size | Image Resolution |
78 +============+=================+==============+==================+
79 | 0 | 12 | 58.63 deg | 6.871 arcmin |
80 | 1 | 48 | 29.32 deg | 3.435 arcmin |
81 | 2 | 192 | 14.66 deg | 1.718 arcmin |
82 | 3 | 768 | 7.329 deg | 51.53 arcsec |
83 | 4 | 3072 | 3.665 deg | 25.77 arcsec |
84 | 5 | 12288 | 1.832 deg | 12.88 arcsec |
85 | 6 | 49152 | 54.97 arcmin | 6.442 arcsec |
86 | 7 | 196608 | 27.48 arcmin | 3.221 arcsec |
87 | 8 | 786432 | 13.74 arcmin | 1.61 arcsec |
88 | 9 | 3145728 | 6.871 arcmin | 805.2mas |
89 | 10 | 12582912 | 3.435 arcmin | 402.6mas |
90 | 11 | 50331648 | 1.718 arcmin | 201.3mas |
91 | 12 | 201326592 | 51.53 arcsec | 100.6mas |
92 | 13 | 805306368 | 25.77 arcsec | 50.32mas |
93 +------------+-----------------+--------------+------------------+
94 """
95 if shift_order <= 0:
96 raise ValueError(f"shift_order {shift_order} must be positive.")
97 hips_tilepix = 2**shift_order
98
99 if hips_order <= 0:
100 raise ValueError(f"order {hips_order} must be positive.")
101 nside_cell = 2**hips_order
102
103 if pixel < 0 or pixel >= 12*nside_cell*nside_cell:
104 raise ValueError(f"pixel value {pixel} out of range.")
105
106 # The HEALPix grid projection (HPX) is defined in the FITS standard
107 # https://fits.gsfc.nasa.gov/standard40/fits_standard40aa-le.pdf
108 # from Calabretta & Roukema (2007)
109 # https://ui.adsabs.harvard.edu/abs/2007MNRAS.381..865C/abstract
110 # which defines the standard H = 4, K = 3 pixelization parameters
111 # encoded in PV2_1 = H, PV2_2 = K.
112 # The CRVAL1, CRVAL2 values should always be 0, 0 according to
113 # the FITS standard.
114 # The CD matrix is defined in wcslib HPXcvt.c.
115 # The Calabretta & Roukema (2007) paper and wcslib HPXcvt.c only
116 # define full-sky HPX projections. For single pixels we
117 # use the code from AladinSrc.jar Tile2HPX.java to compute
118 # CRPIX1, CRPIX2.
119
120 # The nside of the sub-pixels is the product of the tile nside
121 # and the number of sub-pixels on a side.
122 nside_pix = nside_cell*hips_tilepix
123 # All tiles are rotated 45 degrees.
124 cos45 = np.sqrt(2.0)/2.0
125 # This defines the pixel scale.
126 scale = 90.0/nside_pix/np.sqrt(2.0)
127 cos45_scale = cos45*scale
128 # The projected center of the pixel used for the HPX header is
129 # a non-trivial computation, and typically is outside of the
130 # tile pixel itself. Therefore, these values are not the same
131 # as the values computed from HEALPix `pix2ang()`.
132 cent_ra_proj, cent_dec_proj = _hpx_projected_center(hips_order, pixel)
133
134 md = PropertySet()
135 md['CD1_1'] = -cos45_scale
136 md['CD1_2'] = -cos45_scale
137 md['CD2_1'] = cos45_scale
138 md['CD2_2'] = -cos45_scale
139 md['CTYPE1'] = 'RA---HPX'
140 md['CTYPE2'] = 'DEC--HPX'
141 md['CRVAL1'] = 0.0
142 md['CRVAL2'] = 0.0
143 md['PV2_1'] = 4
144 md['PV2_2'] = 3
145 md['CRPIX1'] = ((hips_tilepix + 1)/2.0) - 0.5*(-cent_ra_proj/cos45_scale + cent_dec_proj/cos45_scale)
146 md['CRPIX2'] = ((hips_tilepix + 1)/2.0) - 0.5*(-cent_ra_proj/cos45_scale - cent_dec_proj/cos45_scale)
147
148 return makeSkyWcs(md)
149
150