ECLIPSE-Xλ: Reproducible LHS 1140 b Contamination Modeling (A&A, doi:10.1051/0004-6361/202556358)
Abstract
ECLIPSE-Xλ: LHS 1140 b worked example on observational channels ECLIPSE-Xλ is a forward model for stellar contamination in exoplanet transmission spectroscopy that operates directly on the observational channel grid (channel centers plus finite bandpasses). It supports unspotted, spot-only, facula-only, and spot+facula (“both”) configurations and outputs a modeled transit depth spectrum D(λ) evaluated on the same channels as the data. This repository contains a worked example for LHS 1140 b, used in our A&A paper: doi:10.1051/0004-6361/202556358. Design goal: do not invent an arbitrary wavelength grid. Instead, compute SED contrasts, limb darkening, and the depth spectrum directly on the observational channels. What the model computes Given: Stellar parameters: radius, mass, photospheric effective temperature (and any optional SED metadata such as log g, [Fe/H] if used by your SED provider) Planet/orbit parameters: planet radius, period, inclination, semi-major axis (plus optional eccentricity/angles if enabled) Observational channels: λ centers and Δλ bandpasses (optionally order indices for multi-order instruments) Active regions: covering fractions and temperatures (optionally positions/geometry if localized regions are modeled) ECLIPSE-Xλ computes: Channel-integrated contrasts rspot(λ)r_{\rm spot}(\lambda)rspot(λ) and/or rfac(λ)r_{\rm fac}(\lambda)rfac(λ) from SED providers (e.g., PHOENIX) Limb-darkening coefficients per channel (here: grey atmosphere + Planck weighting, i.e., no LDTK) A modeled transit depth spectrum D(λ)D(\lambda)D(λ) on the observational channels Optional plots and a geometry preflight check to warn about transit-chord intersections (if you assume a non-occulted contamination baseline) Repository layout (minimum) grid.py — Driver: loads channels, warms the SED cache, computes per-channel LDCs, runs scenario grids (unspotted / spot / facula / both) main.py — Core engine: channel integration, pre-convolution (constant R or auto R(λ)), contrast smoothing, transit depth synthesis phoenix_sed.py — PHOENIX interface + cache warm-up utilities (local grid or on-demand, depending on implementation) star.py, Planeta.py, Eclipse.py (names may vary) — stellar map, orbital geometry, transit utilities Installation Python ≥ 3.10 recommended. pip install numpy pandas matplotlib scipy astropy requests Notes: astropy is only required if you read FITS products elsewhere; the LHS 1140 b example uses plain text I/O by default. PHOENIX handling depends on how phoenix_sed.py is implemented (local grid vs downloader). Observational channels input (LHS 1140 b) ECLIPSE-Xλ is designed to run on the same channels as the observations. A) MRT-like file (recommended) In grid.py: MRT_INPUT_MODE = "file" MRT_PATH = "apjlad5afat2_mrt.txt" USE_ORDER = None # optionally 1/2 if your file includes an order column Minimum numeric content per row: center_um, width_um Optional columns (if present): depth_ppm, edepth_ppm, order, ... The loader is intentionally permissive: it extracts floats from each row and ignores non-numeric tokens. Default mapping: vals[0] -> center_um vals[1] -> width_um vals[2] -> depth_ppm (optional) vals[3] -> edepth_ppm (optional) vals[6] -> order (optional) If your table layout differs, update the mapping in the MRT loader inside grid.py. B) Manual channels (CSV or arrays) In grid.py: MRT_INPUT_MODE = "manual" MANUAL_CHANNELS_CSV = "channels.csv" Accepted CSV conventions (any of): lambda_um or lambda_nm width_um or width_nm OR R (width computed as Δλ = λ/R) Example: lambda_um,width_um 1.02,0.010 1.03,0.010 Practical note: widths should represent an effective integration window per data point (FWHM-like is fine if that is what the data product reports). To avoid pathological Δλ → 0 channels, the driver can enforce a floor: R_MIN_CHAN_FLOOR = 1000 width_um = max(width_um, lambda_um / R_MIN_CHAN_FLOOR) Running the LHS 1140 b grid From the repository root: python grid.py This will: load observational channels (MRT or manual), warm the SED cache for required temperatures, compute grey/Planck limb darkening per channel, run scenario grids: unspotted / spot / facula / both. Outputs Main output (CSV-like text): simulation_results_LHS1140b.txt (file name may include TARGET) Columns: f_spot, tempSpot, f_facula, tempFacula, wavelength, D_lambda Where: wavelength is typically written in nm (verify the writer in your main.py) D_lambda is the modeled transit depth in ppm Key input parameters (what you control) Most configuration is at the top of grid.py: Star R_star, M_star, T_phot (plus optional SED metadata if used) Planet + orbit R_p, P, a, i (plus optional e, angles if enabled) Active regions f_spot, T_spot, f_facula, T_facula, both_mode Optional localized geometry: number of regions, lat/long, radii (fixed or derived) Channels lambda_center, width (and optional order) Instrument pre-convolution (realism knob) Constant R: AUTO_R_FROM_CHANNELS = False CONSTANT_R = 25 Auto R(λ) from channel widths: AUTO_R_FROM_CHANNELS = True R_AUTO_FLOOR_R = 300.0 R_AUTO_SMOOTH_R = 520.0 R_AUTO_BETA = 1.0 Concept: R(λ)≈β λ/ΔλchannelR(\lambda) \approx \beta\,\lambda/\Delta\lambda_{\rm channel}R(λ)≈βλ/Δλchannel, smoothed in log(λ). Treat β as a calibration factor if Δλ is not a true LSF width. SED provider SED_MODE_PHOT = "phoenix" SED_MODE_ACTIVE = "phoenix" Other modes may include blackbody (bb) or PHOENIX continuum/hybrid variants depending on your implementation. Limb darkening This workflow uses grey atmosphere + Planck weighting per channel.Scientific caution: benchmark against PHOENIX/LDTK LDCs if your analysis relies on fine structure at the
Fields of Study & Subjects
Stellar
planetary
and galactic studies
Astronomy and Astrophysical Research
Adaptive optics and wavefront sensing
Publication details
- Journal / source
- Zenodo (CERN European Organization for Nuclear Research)
- Publication date
- 18 February 2026
- Language
- EN
- Document type
- Book