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