Source code for optika.sags._flat
import dataclasses
import astropy.units as u
import named_arrays as na
import optika
from ._abc import AbstractSag
__all__ = [
"NoSag",
]
[docs]
@dataclasses.dataclass(eq=False, repr=False)
class NoSag(
AbstractSag,
):
"""A flat sag profile."""
@property
def shape(self) -> dict[str, int]:
return na.broadcast_shapes(
optika.shape(self.parameters_slope_error),
optika.shape(self.parameters_roughness),
optika.shape(self.parameters_microroughness),
)
def __call__(
self,
position: na.AbstractCartesian3dVectorArray,
) -> na.AbstractScalar:
if self.transformation is not None:
position = self.transformation.inverse(position)
result = position.replace(z=0 * u.mm)
if self.transformation is not None:
result = self.transformation(result)
return result.z
[docs]
def normal(
self,
position: na.AbstractCartesian3dVectorArray,
) -> na.AbstractCartesian3dVectorArray:
return na.Cartesian3dVectorArray(0, 0, -1)
[docs]
def intercept(
self,
rays: optika.rays.AbstractRayVectorArray,
) -> optika.rays.AbstractRayVectorArray:
if self.transformation is not None:
rays = self.transformation.inverse(rays)
d = -rays.position.z / rays.direction.z
position = rays.position + rays.direction * d
result = rays.replace(position=position)
if self.transformation is not None:
result = self.transformation(result)
return result