"""
Query models
"""
# Copyright CFHT/CNRS/CEA/UParisSaclay
# Licensed under the MIT licence
from typing import Literal
from pydantic import (
BaseModel,
Field,
PydanticUserError,
ValidationInfo,
field_validator
)
from .default import default_filter, default_instrument, filters, instruments
from .exceptions import ETCValidationError
from .types import (
ComputeID,
FilterID,
InstrumentID,
PhotometryID,
PhotSysID,
SkyID,
SourceID,
StackingID
)
[docs]
class ETCQueryModel(BaseModel):
instrument: InstrumentID = Field(
default=default_instrument.id,
description="Instrument ID"
)
airmass: float = Field(
default=1.2,
ge=1.,
description="Observation airmass"
)
aperture: float = Field(
default=3.,
gt=0.,
le=15.,
description="Photometric aperture diameter [\"]"
)
brightness: float = Field(
default=20.,
ge=-100.,
le=1000.,
description="Source brightness"
)
compute: ComputeID = Field(
default='etime',
description="Computation type"
)
etime: float = Field(
default=20.,
ge=0.,
le=1e30,
description="Exposure time [s]"
)
exposures: int = Field(
default=1,
ge=1,
le=1000000,
description="Number of exposures"
)
filter: FilterID = Field(
default=default_filter,
description="Instrument filter"
)
photometry: PhotometryID = Field(
default='model_fitting',
description="Photometry type"
)
seeing: float = Field(
default=0.7,
ge=0.1,
le=100.
)
sky: SkyID = Field(
default='dark',
description="Sky setting"
)
sky_brightness: float = Field(
default=22.,
ge=-100.,
le=1000.,
description="Sky surface brightness"
)
sersic_radius: float = Field(
default=1.,
gt=0.,
le=10.,
description="Sérsic effective radius [\"]"
)
sersic_index: float = Field(
default=1.,
ge=0.3,
le=10.,
description="Sérsic index"
)
sky_unit: PhotSysID = Field(
default='abmag',
description="Sky background photometric system"
)
snr: float = Field(
default=10.,
gt=0.,
description="Required source Signal-to-Noise Ratio"
)
source: SourceID = Field(
default='point_source',
description="Source type"
)
stacking: StackingID = Field(
default='median',
description="Stacking method"
)
transparency: float = Field(
default=1.,
gt=0.,
le=1.,
description="Sky transparency"
)
unit: PhotSysID = Field(
default='abmag',
description="Photometric system"
)
[docs]
@field_validator('filter')
def validate_filter(cls, f: str, info: ValidationInfo) -> str:
"""
Kind of emulate Enum validation and errors.
"""
instrument = info.data['instrument']
fids = list(instruments[instrument].filters.transmissions) + ['upload']
if f not in fids:
expected = f"'{fids[0]}'" + \
(
"".join(f", '{fid}'" for fid in fids[:-1]) \
if len(fids) > 2 else ""
) + (
f" or '{fids[-1]}'" if len(fids) > 1 else ""
)
raise ETCValidationError({
"type": "enum",
"loc": ("query", "filter"),
"input": str(f),
"expected": expected
})
return f