Source code for pydl.goddard.astro
# Licensed under a 3-clause BSD style license - see LICENSE.rst
# -*- coding: utf-8 -*-
"""This module corresponds to the goddard/astro directory in idlutils.
"""
from time import time
import numpy as np
from astropy.units import Angstrom
[docs]def airtovac(air):
"""Convert air wavelengths to wavelengths in vacuum.
Parameters
----------
air : array-like
Values of wavelength in air in Angstroms.
:class:`~astropy.units.Quantity` objects with valid length
dimensions will be internally converted to Angstrom.
Returns
-------
array-like
Values of wavelength in vacuum in Angstroms. If a
:class:`~astropy.units.Quantity` object was passed in, the output
will be converted to the same units as the input.
Notes
-----
* Formula from `P. E. Ciddor, Applied Optics, 35, 1566 (1996)
<https://ui.adsabs.harvard.edu/abs/1996ApOpt..35.1566C/abstract>`_.
* Values of wavelength below 2000 Å are not converted.
"""
try:
u = air.unit
except AttributeError:
u = None
try:
t = air.dtype
except AttributeError:
# Most likely, air is simply a float.
t = None
if t is None:
if air < 2000.0:
return air
vacuum = air
a = air
g = None
else:
try:
a = air.to(Angstrom).value
except AttributeError:
a = air
g = a < 2000.0
if g.all():
return air
vacuum = np.zeros(air.shape, dtype=t) + a
for k in range(2):
sigma2 = (1.0e4/vacuum)**2
fact = (1.0 + 5.792105e-2/(238.0185 - sigma2) +
1.67917e-3/(57.362 - sigma2))
vacuum = a * fact
if g is not None:
vacuum[g] = a[g]
if u is not None:
vacuum = (vacuum * Angstrom).to(u)
return vacuum
[docs]def gcirc(ra1, dec1, ra2, dec2, units=2):
"""Computes rigorous great circle arc distances.
Parameters
----------
ra1, dec1, ra2, dec2 : :class:`float` or array-like
RA and Dec of two points.
units : { 0, 1, 2 }, optional
* units = 0: everything is already in radians
* units = 1: RA in hours, dec in degrees, distance in arcsec.
* units = 2: RA, dec in degrees, distance in arcsec (default)
Returns
-------
:class:`float` or array-like
The angular distance. Units of the value returned depend on the
input value of `units`.
Notes
-----
The formula below is the one best suited to handling small angular
separations. See:
https://en.wikipedia.org/wiki/Great-circle_distance
"""
if units == 0:
rarad1 = ra1
dcrad1 = dec1
rarad2 = ra2
dcrad2 = dec2
elif units == 1:
rarad1 = np.deg2rad(15.0*ra1)
dcrad1 = np.deg2rad(dec1)
rarad2 = np.deg2rad(15.0*ra2)
dcrad2 = np.deg2rad(dec2)
elif units == 2:
rarad1 = np.deg2rad(ra1)
dcrad1 = np.deg2rad(dec1)
rarad2 = np.deg2rad(ra2)
dcrad2 = np.deg2rad(dec2)
else:
raise ValueError('units must be 0, 1 or 2!')
deldec2 = (dcrad2-dcrad1)/2.0
delra2 = (rarad2-rarad1)/2.0
sindis = np.sqrt(np.sin(deldec2)*np.sin(deldec2) +
np.cos(dcrad1)*np.cos(dcrad2)*np.sin(delra2)*np.sin(delra2))
dis = 2.0*np.arcsin(sindis)
if units == 0:
return dis
else:
return np.rad2deg(dis)*3600.0
[docs]def get_juldate(seconds=None):
"""Returns the current Julian date.
Uses the MJD trick & adds the offset to get JD.
Parameters
----------
seconds : :class:`int` or :class:`float`, optional
Time in seconds since the UNIX epoch. This should only be used
for testing.
Returns
-------
:class:`float`
The Julian Day number as a floating point number.
Notes
-----
Do not use this function if high precision is required, or if you are
concerned about the distinction between UTC & TAI.
"""
if seconds is None:
t = time()
else:
t = seconds
mjd = t/86400.0 + 40587.0
return mjd + 2400000.5
[docs]def get_juldate_main(): # pragma: no cover
"""Entry point for the get_juldate command-line script.
"""
print(get_juldate())
return 0
[docs]def vactoair(vacuum):
"""Convert vacuum wavelengths to wavelengths in air.
Parameters
----------
vacuum : array-like
Values of wavelength in vacuum in Angstroms.
:class:`~astropy.units.Quantity` objects with valid length
dimensions will be internally converted to Angstrom.
Returns
-------
array-like
Values of wavelength in air in Angstroms.
:class:`~astropy.units.Quantity` object was passed in, the output
will be converted to the same units as the input.
Notes
-----
* Formula from `P. E. Ciddor, Applied Optics, 35, 1566 (1996)
<https://ui.adsabs.harvard.edu/abs/1996ApOpt..35.1566C/abstract>`_.
* Values of wavelength below 2000 Å are not converted.
"""
try:
u = vacuum.unit
except AttributeError:
u = None
try:
t = vacuum.dtype
except AttributeError:
# Most likely, vacuum is simply a float.
t = None
if t is None:
if vacuum < 2000.0:
return vacuum
air = vacuum
v = vacuum
g = None
else:
try:
v = vacuum.to(Angstrom).value
except AttributeError:
v = vacuum
g = v < 2000.0
if g.all():
return vacuum
air = np.zeros(vacuum.shape, dtype=t) + v
sigma2 = (1.0e4/v)**2
fact = (1.0 + 5.792105e-2/(238.0185 - sigma2) +
1.67917e-3/(57.362 - sigma2))
air = v / fact
if g is not None:
air[g] = v[g]
if u is not None:
air = (air * Angstrom).to(u)
return air