Observation Noise#

Here we present noise models available in popkinmocks. Noise \(\epsilon\) is added to the signal \(\bar{y}\) to give the observed cube \(y_\mathrm{obs}\),

\[ y_\mathrm{obs}(\mathbf{x},\omega) = \bar{y}(\mathbf{x},\omega) + \epsilon(\mathbf{x},\omega). \]

Currently we assume that noise is un-correlated between spaxels and Gaussian i.e. \(\epsilon(\mathbf{x},\omega)\) is sampled from a normal distribution with variance \(\sigma(\mathbf{x},\omega)^2\),

\[ \epsilon(\mathbf{x},\omega) \sim \mathcal{N}(0, \sigma(\mathbf{x},\omega)^2). \]

We provide two models for \(\sigma(\mathbf{x},\omega)\). To demonstrate these, I’ll use the mixture model we saved on the Constructing Models page:

import numpy as np
np.random.seed(301288)
import matplotlib.pyplot as plt
import dill

import popkinmocks as pkm

with open('data/my_mixture_component.dill', 'rb') as file:
    galaxy = dill.load(file)
cube = galaxy.cube

Constant SNR#

This implements a constant signal-to-noise ratio (SNR), i.e.

\[ \sigma(\mathbf{x},\omega) = \frac{\bar{y}(\mathbf{x},\omega)}{\mathrm{SNR}} \]
constant_snr = pkm.noise.ConstantSNR(galaxy)
yobs_const_snr = constant_snr.get_noisy_data(snr=100)

Shot noise#

This model is more realistic. Motivated by Poisson/shot noise, here the noise standard deviation scales as the square root of the signal, i.e.

\[ \sigma(\mathbf{x},\omega) = K \sqrt{\bar{y}(\mathbf{x},\omega)}. \]

The constant of proportionality is chosen so that a desired maximum signal-to-noise ratio is achieved in the brightest voxel, i.e.

\[ K = \frac{\max{\sqrt{\bar{y}(\mathbf{x},\omega)}}}{\mathrm{SNR}}. \]
shot_noise = pkm.noise.ShotNoise(galaxy)
yobs_shot_noise = shot_noise.get_noisy_data(snr=100)

Comparison#

def plot_spectrum_from_pixel(i, j, ax):
  cube.plot_spectrum(galaxy.ybar[:,i,j], '-', ax=ax, label='$\\bar{y}$')
  cube.plot_spectrum(yobs_const_snr[:,i,j], '.', ax=ax, label='ConstantSNR')
  cube.plot_spectrum(yobs_shot_noise[:,i,j], '.', ax=ax, label='ShotNoise')
  ax.legend()
  ax.set_xlim(5800, 6000)
  ax.set_yticks([])

fig, ax = plt.subplots(1,2)
plot_spectrum_from_pixel(10, 10, ax=ax[0])
ax[0].set_title('Inner, bright pixel')
plot_spectrum_from_pixel(0, 0, ax=ax[1])
ax[1].set_title('Outer, faint pixel')
fig.tight_layout()
../_images/537758f9f438266ccdfed848d90a537a5476afb446c66958b080ba4931a6b467.png

In the bright central pixel (left) the SNRs of the two noise models are equal, both with SNR=100. At the outer pixel (right) the SNR of the ShotNoise model has decreased in line with the decreased flux, while for ConstantSNR the SNR remains high.