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
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)])
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
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
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
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")
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