Changelog
Current version: 1.5 — 22 June 2026
Release date: 22 June 2026
- Fixed bug in _resolve_best_coadd_ifs (IFS COADD_XY="best" mode): replaced the sky-dominated approximation metric fsq/N with the correct full SNR metric signal/sqrt(signal + N²·bg_per_spaxel), where signal = fsq·S and bg_per_spaxel = sky + dark + RON per spaxel at the reference wavelength. The source spectrum is now passed from all three callers (snr_from_source_ifs, _snr_at_wave_ifs, time_from_source_ifs); when no spectrum is available the old approximation is used as fallback.
- Increased default max_coadd from 20 to 40 for point sources: bad seeing conditions (e.g. 1.5–2") with small spaxels can push the optimal aperture close to or beyond the old cap.
- For resolved sources, max_coadd is now derived automatically from the extent of the source image (min(ima.shape) // oversamp), removing the artificial fixed ceiling and ensuring the full extent of extended morphologies is searched.
Release date: 28 May 2026
- Added GLAO (Ground Layer Adaptive Optics) support: new GLAO=True parameter in the obs dictionary enables a wavelength-dependent IQ formula for IFS (IQ_glao(λ) = (A·λ_nm² + B·λ_nm + C)·AM^0.6, A=1.22465e-7, B=-0.000576386, C=0.717164), and overrides the natural seeing to 0.8 arcsec average for MOS.
- Moffat beta updated: default (non-AO) changed from 2.50 to 2.80; IFS-GLAO uses beta=2.5.
- Added 25 SWIRE galaxy/AGN spectral templates: ellipticals (Ell2/5/13), spirals (Sa/Sb/Sc/Sd/Sdm/S0/Spi4), starbursts (M82/N6090/N6240/Arp220/I19254/I20551/I22491), Seyferts (Sey18/Sey2), QSOs (QSO1/QSO2/BQSO1/TQSO1/Mrk231), and Torus.
- Added snr_in_window(res, lam1, lam2, dlbda, unit, stat) utility function: computes median or mean SNR (per spectral pixel) inside a spectral window from a snr_from_source result.
- Added ETC.time_from_source_window(ins, ima, spec, lam1, lam2, target_snr, unit, compute, n_iter) method: iteratively finds the DIT or NDIT required to reach a target median SNR (per spectral pixel) within a user-defined wavelength window [λ1, λ2]. Returns ndit_raw (pre-ceil float) alongside the ceiled integer.
- NDIT rounding unified to ceil across all compute paths (dit_snr, best, time_from_source_window): max(1, int(np.ceil(...))) — if 7.1 exposures are needed, result is always 8.
- Web interface: added GLAO toggle, spectral window inputs (λ1/λ2) for window-based exposure time computation, improved ASCII/JSON config downloads with timestamped filenames, GLAO/SNR_WIN/LAM_WIN1/LAM_WIN2 included in saved config, SNR window shown in input summary instead of reference wavelength, and consistent NDIT rounding messages showing "X.XXXX, updating to Y for computation." in all paths.
- time_from_source_window convergence improved: max iterations raised to 20, convergence criterion changed to SNR-relative tolerance 1e-4 (0.01%), NDIT sub-1 case exits after one exact analytical step, no artificial floor on param_val during iteration.
- API JSON response: snr_window field added when SNR_WIN=True, reporting median_snr_pixel and (if COADD_WL>1) median_snr_rebin in the requested wavelength window.
- Web results: window mode now shows both rebinned and per-pixel median SNR (when COADD_WL>1) in all compute modes (dit_snr, ndit_snr, best), consistent with non-window behaviour.
- Emission line source (Obj_SED="line"): SNR spectral window is now automatically overridden in all compute modes (DIT/NDIT, DIT&SNR, NDIT&SNR, Best) — SNR_WIN is forced to False and the line central wavelength (SEL_CWAV) is always used as the sole reference. A debug message is emitted when the override occurs. The web interface hides and unchecks the SNR window controls whenever SED type is set to "line".
Release date: 14 May 2026
- Migrated sky background retrieval from skycalc_ipy to skycalc_cli (official ESO CLI package): sky model data now accessed via skm.data attribute and parsed with Table.read(BytesIO(skm.data), format="fits").
- Fixed FITS column names: skycalc_cli v1.4 returns lowercase column names (lam, flux, trans) — updated in both etc.py (get_sky()) and app.py (compute_sky_dummy()).
- Replaced deprecated pkg_resources with importlib.resources in specalib.py for Python 3.9+ compatibility.
- SNR values now displayed in bold in the computation results panel.
- Plot titles and trace names corrected: "x spectral pixel/coadding" replaced with "/ spectral pixel/coadding" throughout the web interface.
- Removed invalid PWV value 0.01 from the allowed grid (SkyCalc minimum is 0.05); previously this caused SkyCalc to reject the entire request.
- Fixed false MAG_SYS validation error raised for emission-line sources (Obj_SED="line"): the check is now skipped when the SED type is "line" or OBJ_MAG is None, since magnitude normalisation is not used in those cases.
Release date: 29 April 2026
- Fixed SkyCalc sky background retrieval: bypassed skycalc_ipy.get_sky_spectrum() to call SkyModel directly and read the returned FITS HDUList with an explicit format="fits" argument, resolving an IORegistryError from newer astropy versions.
- Moon altitude now derived from moon-target separation and target zenith distance (z_moon = rho + z_target), satisfying the SkyCalc constraint |z - z_moon| <= rho <= z + z_moon for all airmasses.
Release date: 24 April 2026
- Added MOS fiber injection fraction (fiber_injection) to exported inputs/results.
- Updated MOS total throughput to include fiber injection fraction; added dedicated fiber inj. frac. curve to MOS throughput plots in the web interface.
- Consolidated recent fixes: RON handling updates, surface-brightness/MOS corrections, and sky-area term consistency updates.
- Added moon-target separation as a user-settable parameter (MOON_SEP, default 45 deg); previously fixed at 45 deg internally.
- Fixed MOS object displacement validation range: now correctly 0–0.6 arcsec (previously the web interface rejected values above 0.3 arcsec).
Release date: 09 March 2026
- Official release of the WST Exposure Time Calculator.
- Throughput curves (all channels) delivered by Olga Bellido (WST System Engineer).