Source code for pydiet.server.models.query

"""
Query models
"""
# Copyright CFHT/CNRS/CEA/UParisSaclay
# Licensed under the MIT licence

from typing import Literal
from pydantic import (
    BaseModel,
    ConfigDict,
    Field,
    PydanticUserError,
    ValidationInfo,
    field_validator
)

from .default import (
    default_filter,
    default_instrument,
    default_mirror,
    instruments
)
from .exceptions import ETCValidationError
from .types import (
    ComputeID,
    FilterID,
    InstrumentID,
    MirrorID,
    PhotometryID,
    PhotSysID,
    SkyID,
    SolarID,
    SourceID,
    StackingID
)

[docs] class ETCQueryModel(BaseModel): instrument: InstrumentID = Field( default=InstrumentID(default_instrument.id).value, 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=FilterID(default_filter.id).value, description="Instrument filter" ) mirror: MirrorID = Field( default=MirrorID(default_mirror.id).value, description="Mirror condition" ) 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" ) solar: SolarID = Field( default='average', description="Solar activity level" ) 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:-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
[docs] @field_validator('mirror') def validate_mirror(cls, m: str, info: ValidationInfo) -> str: """ Kind of emulate Enum validation and errors. """ instrument = info.data['instrument'] mids = list(instruments[instrument].telescope.transmissions) if m not in mids: expected = f"'{mids[0]}'" + \ ( "".join(f", '{mid}'" for mid in mids[1:-1]) \ if len(mids) > 2 else "" ) + ( f" or '{mids[-1]}'" if len(mids) > 1 else "" ) raise ETCValidationError({ "type": "enum", "loc": ("query", "mirror"), "input": str(m), "expected": expected }) return m
model_config = ConfigDict(arbitrary_types_allowed=True, use_enum_values=True)