Coverage for python/lsst/pipe/tasks/associationUtils.py : 18%

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
1import healpy as hp
2import numpy as np
4"""Utilities for interfacing with healpy. Originally implemented in
5http://github.com/LSSTDESC/dia_pipe
6"""
8# Will update docs and the like in DM-30673
11def toIndex(nside, ra, dec):
12 """Return healpix index given ra,dec in degrees"""
13 return hp.pixelfunc.ang2pix(nside, np.radians(-dec+90.), np.radians(ra))
16def toRaDec(nside, index):
17 """Convert from healpix index to ra,dec in degrees"""
18 vec = hp.pix2ang(nside, index)
19 dec = np.rad2deg(-vec[0])+90
20 ra = np.rad2deg(vec[1])
21 return np.dstack((ra, dec))[0]
24def eq2xyz(ra, dec):
25 """Convert from equatorial ra,dec in degrees to x,y,z on unit sphere"""
26 phi = np.deg2rad(ra)
27 theta = np.pi/2 - np.deg2rad(dec)
28 sintheta = np.sin(theta)
29 x = sintheta * np.cos(phi)
30 y = sintheta * np.sin(phi)
31 z = np.cos(theta)
32 return np.array([x, y, z])
35def eq2vec(ra, dec):
36 """Convert equatorial ra,dec in degrees to x,y,z on the unit sphere parameters"""
37 ra = np.array(ra, dtype='f8', ndmin=1, copy=False)
38 dec = np.array(dec, dtype='f8', ndmin=1, copy=False)
39 if ra.size != dec.size:
40 raise ValueError("ra,dec not same size: %s,%s" % (ra.size, dec.size))
42 vec = eq2xyz(ra, dec)
44 return vec
47def convert_spherical(ra, dec):
48 """Convert from ra,dec to spherical"""
50 return np.dstack([np.cos(dec*np.pi/180.)*np.cos(ra*np.pi/180.),
51 np.cos(dec*np.pi/180.)*np.sin(ra*np.pi/180.),
52 np.sin(dec*np.pi/180.)])[0]
55def convert_spherical_array(array):
56 """Convert from ra,dec to spherical from array"""
57 ra = array[:, 0]
58 dec = array[:, 1]
59 return convert_spherical(ra, dec)
62def query_disc(nside, ra, dec, max_rad, min_rad=0):
63 """
64 Get the list of healpix indices within max_rad,min_rad given in radians
65 around ra,dec given in degrees
66 """
67 if np.isscalar(ra):
68 ra = np.array([ra])
69 dec = np.array([dec])
71 pixels = np.unique([hp.query_disc(nside, eq2vec(a, b), max_rad) for (a, b) in zip(ra, dec)])
73 if min_rad > 0 and len(pixels) > 0:
74 vec0 = convert_spherical(ra, dec)
75 min_rad2 = min_rad**2
76 vecs = convert_spherical_array(toRaDec(nside, pixels))
77 dsq = np.sum((vecs-vec0)**2, axis=1)
78 match = dsq > min_rad2
79 pixels = pixels[match]
81 return pixels