-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
108 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
# Licensed under a 3-clause BSD style license - see LICENSE.rst | ||
# -*- coding: utf-8 -*- | ||
""" | ||
============ | ||
desiutil.names | ||
============ | ||
This package contains functions for naming 'things' in DESI | ||
or decoding those names | ||
""" | ||
import numpy as np | ||
|
||
|
||
def radec_to_desiname(target_ra, target_dec): | ||
"""Convert the right ascension and declination of a DESI target | ||
into the corresponding "DESI name" for reference in publications. | ||
Length of target_ra and target_dec must be the same if providing an | ||
array or list. | ||
Parameters | ||
---------- | ||
target_ra: array of :class:`float64` | ||
Right ascension in degrees of target object(s). Can be float, double, | ||
or array/list of floats or doubles | ||
target_dec: array of :class:`float64` | ||
Declination in degrees of target object(s). Can be float, double, | ||
or array/list of floats or doubles | ||
Returns | ||
------- | ||
array of :class:`str` | ||
The DESI names referring to the input target RA and DEC's. Array is | ||
the same length as the input arrays. | ||
""" | ||
# Convert to numpy array in case inputs are scalars or lists | ||
target_ra, target_dec = np.atleast_1d(target_ra), np.atleast_1d(target_dec) | ||
|
||
# Number of decimal places in final naming convention | ||
precision = 4 | ||
|
||
# Truncate decimals to the given precision | ||
ratrunc = np.trunc((10 ** precision) * target_ra).astype(int).astype(str) | ||
dectrunc = np.trunc((10 ** precision) * target_dec).astype(int).astype(str) | ||
|
||
# Loop over input values and create DESINAME as: DESI JXXX.XXXX+/-YY.YYYY | ||
# Here J refers to J2000, which isn't strictly correct but is the closest | ||
# IAU compliant term | ||
desinames = [] | ||
for ra, dec in zip(ratrunc, dectrunc): | ||
desiname = 'DESI J' + ra[:-precision].zfill(3) + '.' + ra[-precision:] | ||
# Positive numbers need an explicit "+" while negative numbers | ||
# already have a "-". | ||
# zfill works properly with '-' but counts it in number of characters | ||
# so need one more | ||
if dec.startswith('-'): | ||
desiname += dec[:-precision].zfill(3) + '.' + dec[-precision:] | ||
else: | ||
desiname += '+' + dec[:-precision].zfill(2) + '.' + dec[-precision:] | ||
desinames.append(desiname) | ||
|
||
return np.array(desinames) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
# Licensed under a 3-clause BSD style license - see LICENSE.rst | ||
# -*- coding: utf-8 -*- | ||
"""Test desiutil.names. | ||
""" | ||
import unittest | ||
import numpy as np | ||
|
||
|
||
class TestNames(unittest.TestCase): | ||
"""Test desiutil.names | ||
""" | ||
|
||
@classmethod | ||
def setUpClass(cls): | ||
pass | ||
|
||
@classmethod | ||
def tearDownClass(cls): | ||
pass | ||
|
||
def test_radec_to_desiname(self): | ||
"""Test MaskedArrayWithLimits | ||
""" | ||
from ..names import radec_to_desiname | ||
ras = [6.2457354547234, 23.914121939862518, 36.23454570972834, | ||
235.25235223446, 99.9999999999999] | ||
decs = [29.974787585945496, -42.945872347904356, -0.9968423456, | ||
8.45677345352345, 89.234958294953] | ||
correct_names = np.array(['DESI J006.2457+29.9747', | ||
'DESI J023.9141-42.9458', | ||
'DESI J036.2345-00.9968', | ||
'DESI J235.2523+08.4567', | ||
'DESI J099.9999+89.2349']) | ||
# Test scalar conversion | ||
for ra, dec, correct_name in zip(ras, decs, correct_names): | ||
outname = radec_to_desiname(ra, dec) | ||
self.assertEqual(outname, correct_name) | ||
|
||
# Test list conversion | ||
outnames = radec_to_desiname(ras, decs) | ||
self.assertTrue(np.alltrue(outnames == correct_names)) | ||
|
||
# Test array conversion | ||
outnames = radec_to_desiname(np.array(ras), | ||
np.array(decs)) | ||
self.assertTrue(np.alltrue(outnames == correct_names)) |