Noise model (esc_etc.noise)

Analytic coronagraph SNR engine for the ESC ETC.

Extracted verbatim from Observatory.calc_SNR / calc_int_time. This is the default Simulation.noise_model; a future 2D-PSF image model can be swapped in behind the same interface.

Frame accounting (issue #15): an integration of total_time is read out as n_reads = ceil(total_time / frame_time) frames – whole frames of frame_time plus one shorter final frame – and never fewer than one read. Read-noise variance scales with that integer.

Reference subtraction (issue #12): with coronagraph.subtraction == "rdi" a reference star beta = ref_brightness_ratio times brighter than the host is observed for t_ref = ref_time_ratio * total_time, scaled by kappa = total_time / (beta * t_ref) to match the target speckle counts, and subtracted. Its random variance kappa**2 * var_ref (speckle scaled by beta; zodi, exozodi, dark and read noise as on target) adds to the science variance. total_time is on-target science time; charged_time includes the reference. "none" reproduces the single-image budget.

esc_etc.noise.n_reads(total_time, frame_time)[source]

Integer number of detector reads: whole frames plus a shorter last one.

class esc_etc.noise.CountRates(source: astropy.units.quantity.Quantity, zodi: astropy.units.quantity.Quantity, exozodi: astropy.units.quantity.Quantity, speckle: astropy.units.quantity.Quantity, host: astropy.units.quantity.Quantity)[source]

Bases: object

Parameters:
source: Quantity
zodi: Quantity
exozodi: Quantity
speckle: Quantity
host: Quantity
class esc_etc.noise.AnalyticCoronagraphNoiseModel[source]

Bases: object

snr(rates, sensor, coronagraph, total_time, frame_time)[source]
int_time_for_snr(snr, rates, sensor, coronagraph, frame_time)[source]

Integration time to reach snr.

int_time_continuous is the closed-form inversion treating reads as total_time / frame_time; int_time rounds it up to whole frames, the shortest realizable schedule that meets snr. NaN when unreachable (systematic floor).