Light curves (lazuli_exo.lightcurve)
Time-domain transit light curves derived from a SimulatedSpectrum.
The per-sample flux noise follows from the same depth uncertainties the spectrum carries. Under the noise tables’ own assumption of an equal out-of-transit baseline, a band’s depth precision sigma_band relates to the per-sample flux noise at cadence c by
sigma_point = sigma_band * sqrt(t14 / (2 c)),
so a depth + baseline fit to the light curve recovers the depth error bar shown on the spectrum to ~10 % depending on the template (0.83-1.07x measured over the registry; the native integration time cancels). With the baseline held fixed the fit is 1/sqrt(2) “too good” by construction, since the sqrt(2) in the tables is the out-of-transit baseline.
Transit shape: when the planet is in the frozen target registry (lazuli_exo.targets) and has a limb-darkening table (precompute/make_ld_tables.py), the model is a quadratically limb-darkened transit with the real geometry: z(t) is the exact sky-projected separation of a Keplerian orbit (orbit.projected_separation; Kepler’s equation solved by Newton iteration, mid-transit at inferior conjunction so z(0) = b with the eccentricity factor). The registry t14_s is the measured archive duration and sets the noise and the window, but the geometric duration t14_geom from (P, a/R*, k, i, e, w) can differ (HAT-P-11 b: 7184 s vs 8480 s), so the time fed to the orbit is scaled by t14_geom / t14_s and the model’s first-to-fourth-contact duration equals t14_s (meta[“t14_geom_s”], meta[“time_stretch”]). Per-band (u1, u2) interpolate the LD table at the band’s bin centers. Otherwise (synthetic planets, missing LD table) it falls back to a trapezoid for a central transit (b = 0, no limb darkening) with ingress t14 * k / (1 + k), k = sqrt(depth). meta[“shape”] records which model was used. Band depths vary; the geometry is shared across bands.
- class lazuli_exo.lightcurve.LightCurveSet(time_hr: numpy.ndarray, flux_model: numpy.ndarray, flux: numpy.ndarray, sigma_point: numpy.ndarray, depth: numpy.ndarray, wl_lo: numpy.ndarray, wl_hi: numpy.ndarray, labels: list, cadence_s: float, t14_s: float, u1: numpy.ndarray = None, u2: numpy.ndarray = None, meta: dict = <factory>)[source]
Bases:
object- Parameters:
- lazuli_exo.lightcurve.transit_flux(z, k, u1, u2, n_r=1601)[source]
Normalized flux of a quadratically limb-darkened star occulted by an opaque disk of radius ratio k at projected separations z (stellar radii).
Numpy-only numerical disk integration: per separation, quadrature over the occulted radial band
[|z|-k, |z|+k]of the analytic overlap-arc weight times the intensity profile. The Chebyshev-type substitution r = c - h*cos(psi) absorbs the square-root behavior at both band edges (planet edge and stellar limb). Measured against the analytic uniform-source solution, the maximum absolute flux error at the default n_r is <= 1e-6 for k <= 0.2 (1.7e-6 at k = 0.3); it grows roughly as k^2 and shrinks as n_r^-1.5. Flux is evaluated at exposure centers by the caller — there is no exposure-time integration.
- lazuli_exo.lightcurve.light_curves(obs, n_groups=1, seed=None, max_points=2000)[source]
Simulated transit light curves in n_groups wavelength bands.
n_groups=1 is the white-light curve. The observation window is +/- t14 around mid-transit (the tables’ equal out-of-transit baseline), sampled at the native integration time, coarsened only if that would exceed max_points samples.