Source code for cuvarbase.utils
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
import pkg_resources
[docs]def weights(err):
""" generate observation weights from uncertainties """
w = np.power(err, -2)
return w/sum(w)
[docs]def find_kernel(name):
return pkg_resources.resource_filename('cuvarbase',
'kernels/%s.cu' % (name))
def _module_reader(fname, cpp_defs=None):
txt = open(fname, 'r').read()
if cpp_defs is None:
return txt
preamble = ['#define {key} {value}'.format(key=key,
value=('' if value is None
else value))
for key, value in cpp_defs.items()]
txt = txt.replace('//{CPP_DEFS}', '\n'.join(preamble))
return txt
[docs]def tophat_window(t, t0, d):
w_window = np.zeros_like(t)
w_window[np.absolute(t - t0) < d] += 1.
return w_window / max(w_window)
[docs]def gaussian_window(t, t0, d):
w_window = np.exp(-0.5 * np.power(t - t0, 2) / (d * d))
return w_window / (1. if len(w_window) == 0 else max(w_window))
[docs]def autofrequency(t, nyquist_factor=5, samples_per_peak=5,
minimum_frequency=None,
maximum_frequency=None, **kwargs):
"""
Determine a suitable frequency grid for data.
Note that this assumes the peak width is driven by the observational
baseline, which is generally a good assumption when the baseline is
much larger than the oscillation period.
If you are searching for periods longer than the baseline of your
observations, this may not perform well.
Even with a large baseline, be aware that the maximum frequency
returned is based on the concept of "average Nyquist frequency", which
may not be useful for irregularly-sampled data. The maximum frequency
can be adjusted via the nyquist_factor argument, or through the
maximum_frequency argument.
Parameters
----------
samples_per_peak : float (optional, default=5)
The approximate number of desired samples across the typical peak
nyquist_factor : float (optional, default=5)
The multiple of the average nyquist frequency used to choose the
maximum frequency if maximum_frequency is not provided.
minimum_frequency : float (optional)
If specified, then use this minimum frequency rather than one
chosen based on the size of the baseline.
maximum_frequency : float (optional)
If specified, then use this maximum frequency rather than one
chosen based on the average nyquist frequency.
Returns
-------
frequency : ndarray or Quantity
The heuristically-determined optimal frequency bin
"""
baseline = max(t) - min(t)
n_samples = len(t)
df = 1. / (baseline * samples_per_peak)
nf0 = 1
if minimum_frequency is not None:
nf0 = max([nf0, int(minimum_frequency / df)])
if maximum_frequency is not None:
Nf = int(maximum_frequency / df) - nf0
else:
Nf = int(0.5 * samples_per_peak * nyquist_factor * n_samples)
return df * (nf0 + np.arange(Nf))
[docs]def dphase(dt, freq):
dph = dt * freq - np.floor(dt * freq)
dph_final = dph if dph < 0.5 else 1 - dph
return dph_final
[docs]def get_autofreqs(t, **kwargs):
autofreqs_kwargs = {var: value for var, value in kwargs.items()
if var in ['minimum_frequency', 'maximum_frequency',
'nyquist_factor', 'samples_per_peak']}
return autofrequency(t, **autofreqs_kwargs)