Source code for Starfish.utils
from typing import Sequence
import numpy as np
import Starfish.constants as C
[docs]def calculate_dv(wave: Sequence):
"""
Given a wavelength array, calculate the minimum ``dv`` of the array.
Parameters
----------
wave : array-like
The wavelength array
Returns
-------
float
delta-v in units of km/s
"""
return C.c_kms * np.min(np.diff(wave) / wave[:-1])
[docs]def calculate_dv_dict(wave_dict):
"""
Given a ``wave_dict``, calculate the velocity spacing.
Parameters
---------
wave_dict : dict
wavelength dictionary
Returns
-------
float
delta-v in units of km/s
"""
CDELT1 = wave_dict["CDELT1"]
dv = C.c_kms * (10 ** CDELT1 - 1)
return dv
[docs]def create_log_lam_grid(dv, start, end):
"""
Create a log lambda spaced grid with ``N_points`` equal to a power of 2 for
ease of FFT.
Parameters
----------
dv : float
Upper bound on the velocity spacing in km/s
start : float
starting wavelength (inclusive) in Angstrom
end : float
ending wavelength (inclusive) in Angstrom
Returns
-------
dict
a wavelength dictionary containing the specified properties. Note that the returned dv will be less than or equal to the specified dv.
Raises
------
ValueError
If starting wavelength is not less than ending wavelength
ValueError
If any of the wavelengths are less than 0
"""
if start >= end:
raise ValueError("Wavelength must be increasing, but start >= end")
if start <= 0 or end <= 0:
raise ValueError("Cannot have negative or 0 wavelength")
CDELT_temp = np.log10(dv / C.c_kms + 1.0)
CRVAL1 = np.log10(start)
CRVALN = np.log10(end)
N = (CRVALN - CRVAL1) / CDELT_temp
NAXIS1 = 2
while NAXIS1 < N: # Make NAXIS1 an integer power of 2 for FFT purposes
NAXIS1 *= 2
CDELT1 = (CRVALN - CRVAL1) / (NAXIS1 - 1)
p = np.arange(NAXIS1)
wl = 10 ** (CRVAL1 + CDELT1 * p)
return {"wl": wl, "CRVAL1": CRVAL1, "CDELT1": CDELT1, "NAXIS1": NAXIS1}