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,
    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