Source code for xicsrt.optics._ShapePlane

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

Define the :class:`ShapePlane` class.
"""

import numpy as np
from copy import deepcopy


from xicsrt.tools.xicsrt_doc import dochelper
from xicsrt.optics._ShapeObject import ShapeObject
from xicsrt.tools import xicsrt_math as xm


[docs] @dochelper class ShapePlane(ShapeObject): """ A planar shape. This class defines intersections with a plane. """
[docs] def intersect(self, rays): dist, mask = self.intersect_distance(rays) xloc = self.location_from_distance(rays, dist, mask) norm = self.intersect_normal(xloc, mask) return xloc, norm, mask
[docs] def intersect_distance(self, rays): """ Calculate the distance to an intersection with a plane. """ O = rays['origin'] D = rays['direction'] m = rays['mask'] if self.param['trace_local']: distance = np.full(m.shape, np.nan, dtype=np.float64) distance[m] = (np.dot((0 - O[m]), np.array([0., 0., 1.])) / np.dot(D[m], np.array([0., 0., 1.]))) else: distance = np.full(m.shape, np.nan, dtype=np.float64) distance[m] = (np.dot((self.param['origin'] - O[m]), self.param['zaxis']) / np.dot(D[m], self.param['zaxis'])) # Update the mask to only include positive distances. m &= (distance >= 0) return distance, m
[docs] def intersect_normal(self, xloc, mask): """ The planar optic is flat, so the normal direction is always the zaxis. """ m = mask norm = np.full(xloc.shape, np.nan, dtype=np.float64) norm[m] = self.param['zaxis'] return norm