Source code for exosim.utils.grids
import astropy.units as u
import numpy as np
from .checks import check_units
[docs]def wl_grid(wl_min, wl_max, R, return_bin_width=False):
r"""
It returns the wavelength log-grid in microns
The wavelength at the center of the spectral bins is defined as
.. math::
\lambda_c = \frac{1}{2} (\lambda_j + \lambda_{j+1} )
where :math:`\lambda_j` is the wavelength at the bin edge defined by the recursive relation,
and :math:`R` is the `logbin_resolution` defined by the user.
.. math::
\lambda_{j+1} = \lambda_{j} \left( 1 + \frac{1}{R} \right)
And, given the maximum and minimum wavelengths, provided by the user, the number of bins is
.. math::
n_{bins} = \frac{\log \left( \frac{\lambda_{max}}{\lambda_{min}} \right) } {\log \left( 1 + \frac{1}{R}\right)} + 1
Parameters
----------
wl_min: :class:`~astropy.units.Quantity` or float.
minimum wavelength sampled. If no units are attached is considered as expressed in `um`
wl_max: :class:`~astropy.units.Quantity` or float.
maximum wavelength sampled. If no units are attached is considered as expressed in `um`
R: int
spectral resolving power
return_bin_width: bool
if True returns also the bin width. Default is False.
Returns
-------
:class:`~astropy.units.Quantity`
wavelength grid
:class:`~astropy.units.Quantity`
bin wavelength width
"""
wl_min, wl_max = check_units(wl_min, u.um, force=True), check_units(
wl_max, u.um, force=True
)
number_of_spectral_bins = (
np.ceil(np.log(wl_max / wl_min) / np.log(1.0 + 1.0 / R)) + 1
)
wl_bin = wl_min * (1.0 + 1.0 / R) ** np.arange(number_of_spectral_bins)
wl_bin_c = 0.5 * (wl_bin[0:-1] + wl_bin[1:])
wl_bin_width = wl_bin[1:] - wl_bin[0:-1]
if return_bin_width:
return wl_bin_c, wl_bin_width
else:
return wl_bin_c
[docs]def time_grid(time_min, time_max, low_frequencies_resolution=None):
"""
It returns the time grid in hours
Parameters
----------
time_min: :class:`~astropy.units.Quantity` or float.
minimum time sampled. If no units are attached is considered as expressed in hours.
time_max: :class:`~astropy.units.Quantity` or float.
maximum time sampled. If no units are attached is considered as expressed in hours.
low_frequencies_resolution: :class:`~astropy.units.Quantity`, float or None
time sampling interval. If no units are attached is considered as expressed in hours.
If None, a single time point at time_min is returned.
Returns
-------
:class:`~astropy.units.Quantity`
time grid
"""
time_min = check_units(time_min, u.hr, force=True)
time_max = check_units(time_max, u.hr, force=True)
if low_frequencies_resolution is None:
return np.array([time_min.value]) * u.hr
low_frequencies_resolution = check_units(
low_frequencies_resolution, u.hr, force=True
)
return (
np.arange(
time_min.value, time_max.value, low_frequencies_resolution.value
)
* u.hr
)