Source code for xicsrt.optics._InteractMirror

# -*- coding: utf-8 -*-
"""
.. Authors:
    Novimir Pablant <npablant@pppl.gov>

Define the :class:`InteractMirror` class.
"""

import numpy as np
from copy import deepcopy


from xicsrt.tools.xicsrt_doc import dochelper
from xicsrt.optics._InteractObject import InteractObject
from xicsrt.tools import xicsrt_math as xm

[docs] @dochelper class InteractMirror(InteractObject): """ A perfect mirror interaction. """
[docs] def interact(self, rays, xloc, norm, mask=None): rays = self.reflect_vectors(rays, xloc, norm, mask) if mask is not None: rays['mask'][:] = mask return rays
[docs] def reflect_vectors(self, rays, xloc, normals, mask=None): if mask is None: mask = rays['mask'] O = rays['origin'] D = rays['direction'] m = mask # Perform reflection around normal vector, creating updating rays with # new origin O = X and new direction D O[:] = xloc[:] D[m] -= 2 * (np.einsum('ij,ij->i', D[m], normals[m])[:, np.newaxis] * normals[m]) return rays