Source code for lightcurve_strategies.transit

from __future__ import annotations

from hypothesis import strategies as st
from hypothesis.strategies import SearchStrategy
from jaxoplanet.orbits import TransitOrbit

from lightcurve_strategies._units import strip_quantity


[docs] @st.composite def transit_orbits( draw: st.DrawFn, *, period: SearchStrategy[float] | None = None, duration: SearchStrategy[float] | None = None, time_transit: SearchStrategy[float] | None = None, impact_param: SearchStrategy[float] | None = None, radius_ratio: SearchStrategy[float] | None = None, ) -> TransitOrbit: """Generate random ``jaxoplanet.orbits.TransitOrbit`` instances. Each keyword accepts a Hypothesis strategy. When ``None``, a sensible default strategy is used. Strategies may yield ``astropy.units.Quantity`` values — they will be converted to plain floats in the expected units (days for time parameters, dimensionless for ratios). Parameters ---------- period: Strategy for orbital period (days). Default: ``floats(0.5, 365.0)``. duration: Strategy for transit duration (days). Default: ``floats(0.001, min(0.5 * period, 2.0))``. time_transit: Strategy for mid-transit time (days). Default: ``floats(0.0, period)``. impact_param: Strategy for impact parameter (dimensionless, 0–1). Default: ``floats(0.0, 1.0)``. radius_ratio: Strategy for planet-to-star radius ratio (dimensionless). Default: ``floats(0.001, 0.3)``. """ try: import astropy.units as u except ImportError: # pragma: no cover u = None # type: ignore[assignment] unit_day = u.day if u is not None else None # --- period --- if period is None: period = st.floats(0.5, 365.0, allow_nan=False, allow_infinity=False) period_val: float = strip_quantity(draw(period), unit=unit_day) # --- duration (must be < period) --- if duration is None: max_dur = min(0.5 * period_val, 2.0) duration = st.floats(0.001, max_dur, allow_nan=False, allow_infinity=False) duration_val: float = strip_quantity(draw(duration), unit=unit_day) # --- time_transit --- if time_transit is None: time_transit = st.floats(0.0, period_val, allow_nan=False, allow_infinity=False) time_transit_val: float = strip_quantity(draw(time_transit), unit=unit_day) # --- impact_param --- if impact_param is None: impact_param = st.floats(0.0, 1.0, allow_nan=False, allow_infinity=False) impact_param_val: float = strip_quantity(draw(impact_param)) # --- radius_ratio --- if radius_ratio is None: radius_ratio = st.floats(0.001, 0.3, allow_nan=False, allow_infinity=False) radius_ratio_val: float = strip_quantity(draw(radius_ratio)) return TransitOrbit( period=period_val, duration=duration_val, time_transit=time_transit_val, impact_param=impact_param_val, radius_ratio=radius_ratio_val, )