Source code for aesop.masking

import numpy as np
from scipy.optimize import fmin_l_bfgs_b
import matplotlib.pyplot as plt

__all__ = ['get_spectrum_mask']

def _gaussian(x, a, x0, sigma):
    return a * np.exp(-0.5 * (x - x0)**2 / sigma**2)


def _chi2(p, x, y):
    return np.sum((_gaussian(x, *p) - y) ** 2)


[docs]def get_spectrum_mask(spectrum, cutoff=1.5, plot=False): """ Fit the raw, pre-normalized spectrum's blaze function with a Gaussian. Use a Parameters ---------- spectrum : `~specutils.Spectrum1D` Spectrum to fit cutoff : float Mask channels greater than ``cuttoff``-sigma away from the peak flux. Returns ------- mask : `~numpy.ndarray` Mask that excludes channels greater than ``cuttoff``-sigma away from the peak flux. """ initp = np.array([spectrum.flux.max().value, spectrum.wavelength.mean().value, spectrum.wavelength.ptp().value/4]) bestp = fmin_l_bfgs_b(_chi2, initp[:], approx_grad=True, args=(spectrum.wavelength.value, spectrum.flux.value), bounds=[(0, np.inf), (spectrum.wavelength.min().value, spectrum.wavelength.max().value), (spectrum.wavelength.ptp().value/8, spectrum.wavelength.ptp().value/2)])[0] best_a, best_x0, best_sigma = bestp mask = ((spectrum.wavelength.value > best_x0 - cutoff * best_sigma) & (spectrum.wavelength.value < best_x0 + cutoff * best_sigma)) if plot: plt.figure() plt.plot(spectrum.wavelength, spectrum.flux, label='unmasked') plt.plot(spectrum.wavelength[mask], spectrum.flux[mask], label='masked') plt.legend() return np.logical_not(mask)