Source code for stilt.observations.sensors.column
"""Column-sensor implementation for vertical and slanted column observations."""
from __future__ import annotations
from typing import Literal
from stilt.config import VerticalReference
from stilt.observations.observation import Observation
from stilt.observations.receptors import (
build_column_receptor,
build_slant_receptor,
)
from stilt.observations.sensors.base import BaseSensor
from stilt.receptors import Receptor
ColumnMode = Literal["vertical", "slant"]
[docs]
class ColumnSensor(BaseSensor):
"""Sensor family for column and slant-column observation geometries."""
def __init__(
self,
*,
name: str = "column",
supported_species: tuple[str, ...] = (),
mode: ColumnMode = "vertical",
bottom: float | None = None,
top: float | None = None,
altitude_ref: VerticalReference = "agl",
) -> None:
self.name = name
self.supported_species = supported_species
self.mode = mode
self.bottom = bottom
self.top = top
self.altitude_ref: VerticalReference = altitude_ref
[docs]
def build_receptor(self, observation: Observation) -> Receptor:
"""Build a vertical or slanted column receptor for one observation."""
if self.mode == "vertical":
if self.bottom is None or self.top is None:
raise ValueError(
"ColumnSensor(mode='vertical') requires bottom and top heights."
)
return build_column_receptor(
observation,
bottom=self.bottom,
top=self.top,
altitude_ref=self.altitude_ref,
)
if self.mode == "slant":
return build_slant_receptor(observation)
raise ValueError(f"Unknown column sensor mode: {self.mode!r}")