Source code for lenstronomy.SimulationAPI.ObservationConfig.Euclid

"""Provisional Euclid instrument and observational settings.

See Reference for Euclid Instrument and Observation Parameters at:
AB mag (2022, Page 17):
https://arxiv.org/pdf/2405.13496
Sky brightness (2022, Table 2):
https://arxiv.org/pdf/2405.13496
Seeing (2024, Table 1):
https://arxiv.org/pdf/2405.13501
Number of exposures, exposure time (2024, Euclid Wide Survey):
https://www.euclid-ec.org/science/overview/
Read noise (2024, Table 3, a representative value from the Photo row in Table 3):
https://arxiv.org/pdf/2405.13493
"""

import lenstronomy.Util.util as util

__all__ = ["Euclid"]

# NOTE: Updated on 6/4/2026 based on latest Euclid documentation and papers (see links above)
VIS_band_obs = {
    "exposure_time": 566.0,
    "sky_brightness": 22.3,
    "magnitude_zero_point": 25.72,
    "num_exposures": 4,
    "seeing": 0.16,
}

Y_band_obs = {
    "exposure_time": 87.2,
    "sky_brightness": 22.1,
    "magnitude_zero_point": 25.04,
    "num_exposures": 4,
    "seeing": 0.48,
}

J_band_obs = {
    "exposure_time": 87.2,
    "sky_brightness": 22.2,
    "magnitude_zero_point": 25.26,
    "num_exposures": 4,
    "seeing": 0.49,
}

H_band_obs = {
    "exposure_time": 87.2,
    "sky_brightness": 22.3,
    "magnitude_zero_point": 25.21,
    "num_exposures": 4,
    "seeing": 0.50,
}

# - keyword exposure_time: exposure time per image (in seconds)
# - keyword sky_brightness: sky brightness (in magnitude per square arcseconds in units of electrons)
# - keyword magnitude_zero_point: magnitude in which 1 count (e-) per second per arcsecond square is registered
# - keyword num_exposures: number of exposures that are combined (depends on coadd_years)
# - keyword seeing: Full-Width-at-Half-Maximum (FWHM) of PSF
# - keyword psf_type: string, type of PSF ('GAUSSIAN' supported)

VIS_camera = {"read_noise": 4.2, "pixel_scale": 0.101, "ccd_gain": 3.1}

NISP_camera = {"read_noise": 6.1, "pixel_scale": 0.3, "ccd_gain": 3.1}

# - keyword read_noise: std of noise generated by read-out (in units of electrons)
# - keyword pixel_scale: scale (in arcseconds) of pixels
# - keyword ccd_gain: electrons/ADU (analog-to-digital unit)


[docs] class Euclid(object): """Class contains Euclid instrument and observation configurations."""
[docs] def __init__(self, band="VIS", psf_type="GAUSSIAN", coadd_years=6): """ :param band: string, 'VIS', 'Y', 'J', 'H' supported. Determines obs dictionary. :param psf_type: string, type of PSF ('GAUSSIAN' supported). :param coadd_years: int, number of years corresponding to num_exposures in obs dict. Currently supported: 2-6. """ if band == "VIS": self.obs = VIS_band_obs.copy() self.camera = VIS_camera.copy() elif band == "Y": self.obs = Y_band_obs.copy() self.camera = NISP_camera.copy() elif band == "J": self.obs = J_band_obs.copy() self.camera = NISP_camera.copy() elif band == "H": self.obs = H_band_obs.copy() self.camera = NISP_camera.copy() else: raise ValueError( "band %s not supported! Choose 'VIS', 'Y', 'J', or 'H'" % band ) if coadd_years > 6 or coadd_years < 2: raise ValueError( " %s coadd_years not supported! Choose an integer between 2 and 6." % coadd_years ) elif coadd_years != 6: self.obs["num_exposures"] = (coadd_years * self.obs["num_exposures"]) // 6 if psf_type == "GAUSSIAN": self.obs.update({"psf_type": "GAUSSIAN"}) else: raise ValueError("psf_type %s not supported! Choose 'GAUSSIAN'" % psf_type)
[docs] def kwargs_single_band(self): """ :return: merged kwargs from camera and obs dicts """ kwargs = util.merge_dicts(self.camera, self.obs) return kwargs