Exemple #1
0
def trace_ray_grid(opt_model, grid_rng, fld, wvl, foc, append_if_none=True,
                   **kwargs):
    """Trace a grid of rays at fld and wvl and return ray_pkgs in 2d list."""
    start = np.array(grid_rng[0])
    stop = grid_rng[1]
    num = grid_rng[2]
    step = np.array((stop - start)/(num - 1))
    grid = []
    for i in range(num):
        grid_row = []

        for j in range(num):
            pupil = np.array(start)
            if (pupil[0]**2 + pupil[1]**2) < 1.0:
                ray_pkg = trace.trace_base(opt_model, pupil, fld, wvl,
                                           **kwargs)
                grid_row.append([pupil[0], pupil[1], ray_pkg])
            else:  # ray outside pupil
                if append_if_none:
                    grid_row.append([pupil[0], pupil[1], None])

            start[1] += step[1]

        grid.append(grid_row)
        start[0] += step[0]
        start[1] = grid_rng[0][1]

    return grid
Exemple #2
0
def trace_safe(opt_model, pupil, fld, wvl, ray_list, output_filter,
               rayerr_filter, **kwargs):
    """Wrapper for trace_base that handles exceptions.
    
    Args:
        opt_model: :class:`~.OpticalModel` instance
        pupil: 2d vector of relatice pupil coordinates
        fld: :class:`~.Field` point for wave aberration calculation
        wvl: wavelength of ray (nm)
        ray_list: list to append the ray data
        output_filter:

        - if None, append entire ray
        - if 'last', append the last ray segment only
        - else treat as callable and append the return value

        rayerr_filter:

        - if None, on ray error append nothing
        - if 'summary', append the exception without ray data
        - if 'full', append the exception with ray data up to error
        - else append nothing

    """
    use_named_tuples = kwargs.get('use_named_tuples', False)

    try:
        ray_pkg = trace.trace_base(opt_model, pupil, fld, wvl, **kwargs)
    except terr.TraceError as rayerr:
        if rayerr_filter is None:
            pass
        elif rayerr_filter == 'full':
            ray, op_delta, wvl = rayerr.ray_pkg
            ray = [trace.RaySeg(*rs) for rs in ray]
            rayerr.ray_pkg = ray, op_delta, wvl
            ray_list.append([pupil[0], pupil[1], rayerr])
        elif rayerr_filter == 'summary':
            rayerr.ray_pkg = None
            ray_list.append([pupil[0], pupil[1], rayerr])
        else:
            pass
    else:
        if use_named_tuples:
            ray, op_delta, wvl = ray_pkg
            ray = [trace.RaySeg(*rs) for rs in ray]
            ray_pkg = ray, op_delta, wvl

        if output_filter is None:
            ray_list.append([pupil[0], pupil[1], ray_pkg])
        elif output_filter == 'last':
            ray, op_delta, wvl = ray_pkg
            final_seg_pkg = (ray[-1], op_delta, wvl)
            ray_list.append([pupil[0], pupil[1], final_seg_pkg])
        else:
            ray_list.append([pupil[0], pupil[1], output_filter(ray_pkg)])
Exemple #3
0
def trace_ray_fan(opt_model, fan_rng, fld, wvl, foc, **kwargs):
    """ xy determines whether x (=0) or y (=1) fan """
    start = np.array(fan_rng[0])
    stop = fan_rng[1]
    num = fan_rng[2]
    step = (stop - start)/(num - 1)
    fan = []
    for r in range(num):
        pupil = np.array(start)
        ray_pkg = trace.trace_base(opt_model, pupil, fld, wvl, **kwargs)
        fan.append([pupil[0], pupil[1], ray_pkg])
        start += step
    return fan
Exemple #4
0
def trace_ray_fan(opt_model, fan_rng, fld, wvl, foc, **kwargs):
    """Trace a fan of rays, according to fan_rng. """
    start = np.array(fan_rng[0])
    stop = fan_rng[1]
    num = fan_rng[2]
    step = (stop - start) / (num - 1)
    fan = []
    for r in range(num):
        pupil = np.array(start)
        ray_pkg = trace.trace_base(opt_model, pupil, fld, wvl, **kwargs)
        fan.append([pupil[0], pupil[1], ray_pkg])
        start += step
    return fan
Exemple #5
0
def trace_ray_list(opt_model, pupil_coords, fld, wvl, foc,
                   append_if_none=False, **kwargs):
    """Trace a list of rays at fld and wvl and return ray_pkgs in a list."""

    ray_list = []
    for pupil in pupil_coords:
        if (pupil[0]**2 + pupil[1]**2) < 1.0:
            ray_pkg = trace.trace_base(opt_model, pupil, fld, wvl, **kwargs)
            ray_list.append([pupil[0], pupil[1], ray_pkg])
        else:  # ray outside pupil
            if append_if_none:
                ray_list.append([pupil[0], pupil[1], None])

    return ray_list
Exemple #6
0
    def create_ray_table(self, opt_model):
        osp = opt_model.optical_spec
        pupil = [0., 1.]
        fi = 0
        wl = osp.spectral_region.reference_wvl
        fld, wvl, foc = osp.lookup_fld_wvl_focus(fi, wl)
        ray, ray_op, wvl = trace.trace_base(opt_model, pupil, fld, wvl)
#        ray, ray_op, wvl, opd = trace.trace_with_opd(opt_model, pupil,
#                                                     fld, wvl, foc)

#        cr = trace.RayPkg(ray, ray_op, wvl)
#        s, t = trace.trace_coddington_fan(opt_model, cr, foc)

        ray = [RaySeg(*rs) for rs in ray]
        model = cmds.create_ray_table_model(opt_model, ray)
        self.create_table_view(model, "Ray Table")
Exemple #7
0
    def update_data(self, **kwargs):
        """Set the fan attribute to a list of (pupil coords), dx, dy, opd."""
        build = kwargs.pop('build', 'rebuild')
        if build == 'rebuild':
            ray_pkg = trace.trace_base(self.opt_model, self.pupil, self.fld,
                                       self.wvl, **kwargs)
            self.ray_seg = ray_pkg[0][self.srf_indx]

            if self.srf_save == 'all':
                self.ray_pkg = ray_pkg

        ray_seg = self.ray_seg
        dist = self.foc / ray_seg[mc.d][2]
        defocused_pt = ray_seg[mc.p] + dist * ray_seg[mc.d]
        self.t_abr = defocused_pt[:-1] - self.image_pt_2d

        return self