Source code for optika.vectors._vectors_scene
from __future__ import annotations
from typing import TypeVar
from typing_extensions import Self
import dataclasses
import named_arrays as na
from . import AbstractFieldVectorArray, FieldVectorArray
__all__ = [
"AbstractSceneVectorArray",
"SceneVectorArray",
]
WavelengthT = TypeVar("WavelengthT", bound=na.ScalarLike)
FieldT = TypeVar("FieldT", bound=na.AbstractCartesian2dVectorArray)
[docs]
@dataclasses.dataclass(eq=False, repr=False)
class AbstractSceneVectorArray(
AbstractFieldVectorArray,
na.AbstractSpectralVectorArray,
):
"""An interface describing a field position and wavelength."""
@property
def type_abstract(self) -> type[AbstractSceneVectorArray]:
return AbstractSceneVectorArray
@property
def type_explicit(self) -> type[SceneVectorArray]:
return SceneVectorArray
@property
def type_matrix(self) -> type[na.AbstractMatrixArray]:
raise NotImplementedError
[docs]
@dataclasses.dataclass(eq=False, repr=False)
class SceneVectorArray(
AbstractSceneVectorArray,
FieldVectorArray[FieldT],
na.SpectralVectorArray[WavelengthT],
):
"""A vector describing a field position and wavelength."""
[docs]
@classmethod
def from_scalar(
cls,
scalar: na.AbstractScalar,
like: None | Self = None,
) -> Self:
if like is not None:
return type(like)(
wavelength=scalar,
field=scalar,
# field=na.Cartesian2dVectorArray.from_scalar(scalar, like=like.field)
)
else:
return cls(
wavelength=scalar,
field=scalar,
# field=na.Cartesian2dVectorArray.from_scalar(scalar),
)