def __init__(self, loop): super(UI, self).__init__() self.loop = loop self.loop.finished.connect(self.update) self.init_UI() self.frame_timer = FrameTimer('UI', verbose=False) self.show()
def __init__(self): try: self.controller = MirrorControllerPython() print 'Mirror python initialization succeeded.' except Exception as e: print 'Mirror python initialization failed:',e try: self.controller = MirrorControllerPythonOld() print 'Mirror python (old style) initialization succeeded.' except Exception as e: print 'Mirror python (old style) initialization failed:',e try: self.controller = MirrorControllerCtypes() print 'Mirror c initialization succeeded.' except Exception as e: print e print 'No mirror driver found. Using virtual mirror.' self.controller = MirrorController() self.mirror_mask = np.loadtxt(ccfg.mirror_mask_filename) self.n_actuators = ccfg.mirror_n_actuators self.flat = np.loadtxt(ccfg.mirror_flat_filename) self.flat0 = np.loadtxt(ccfg.mirror_flat_filename) self.command_max = ccfg.mirror_command_max self.command_min = ccfg.mirror_command_min self.settling_time = ccfg.mirror_settling_time_s self.update_rate = ccfg.mirror_update_rate self.flatten() self.frame_timer = FrameTimer('Mirror',verbose=False) self.logging = False self.paused = False
def __init__(self, camera): super(Sensor, self).__init__() self.image_width_px = ccfg.image_width_px self.image_height_px = ccfg.image_height_px self.lenslet_pitch_m = ccfg.lenslet_pitch_m self.lenslet_focal_length_m = ccfg.lenslet_focal_length_m self.pixel_size_m = ccfg.pixel_size_m self.beam_diameter_m = ccfg.beam_diameter_m self.wavelength_m = ccfg.wavelength_m self.background_correction = ccfg.background_correction self.centroiding_iterations = ccfg.centroiding_iterations self.iterative_centroiding_step = ccfg.iterative_centroiding_step self.filter_lenslets = ccfg.sensor_filter_lenslets self.estimate_background = ccfg.estimate_background self.reconstruct_wavefront = ccfg.sensor_reconstruct_wavefront self.remove_tip_tilt = ccfg.sensor_remove_tip_tilt try: xy = np.loadtxt(ccfg.reference_coordinates_filename) except Exception as e: xy = np.loadtxt(ccfg.reference_coordinates_bootstrap_filename) print 'Bootstrapping with %s' % ccfg.reference_coordinates_bootstrap_filename self.search_boxes = SearchBoxes(xy[:, 0], xy[:, 1], ccfg.search_box_half_width) self.sensor_mask = np.loadtxt(ccfg.reference_mask_filename) self.x0 = np.zeros(self.search_boxes.x.shape) self.y0 = np.zeros(self.search_boxes.y.shape) self.x0[:] = self.search_boxes.x[:] self.y0[:] = self.search_boxes.y[:] self.n_lenslets = self.search_boxes.n n_lenslets = self.n_lenslets self.image = np.zeros((ccfg.image_height_px, ccfg.image_width_px)) self.x_slopes = np.zeros(n_lenslets) self.y_slopes = np.zeros(n_lenslets) self.x_centroids = np.zeros(n_lenslets) self.y_centroids = np.zeros(n_lenslets) self.box_maxes = np.zeros(n_lenslets) self.box_mins = np.zeros(n_lenslets) self.box_means = np.zeros(n_lenslets) self.box_backgrounds = np.zeros(n_lenslets) self.error = 0.0 self.tip = 0.0 self.tilt = 0.0 self.zernikes = None self.wavefront = np.zeros(self.sensor_mask.shape) self.cam = camera self.frame_timer = FrameTimer('Sensor', verbose=False) self.reconstructor = Reconstructor(self.search_boxes.x, self.search_boxes.y, self.sensor_mask) self.logging = False self.paused = False
def __init__(self, loop): super(UI, self).__init__() self.sensor_mutex = QMutex() #loop.sensor_mutex self.mirror_mutex = QMutex() #loop.mirror_mutex self.loop = loop try: self.loop.finished.connect(self.update) except Exception as e: pass self.draw_boxes = ccfg.show_search_boxes self.draw_lines = ccfg.show_slope_lines self.init_UI() self.frame_timer = FrameTimer('UI', verbose=False) self.show()
def __init__(self,camera): self.image_width_px = ccfg.image_width_px self.image_height_px = ccfg.image_height_px self.dark_image = np.zeros((ccfg.image_height_px,ccfg.image_width_px),dtype=np.int16) self.dark_subtract = False self.n_dark = 10 self.lenslet_pitch_m = ccfg.lenslet_pitch_m self.lenslet_focal_length_m = ccfg.lenslet_focal_length_m self.pixel_size_m = ccfg.pixel_size_m self.beam_diameter_m = ccfg.beam_diameter_m self.wavelength_m = ccfg.wavelength_m self.background_correction = ccfg.background_correction self.centroiding_iterations = ccfg.centroiding_iterations self.iterative_centroiding_step = ccfg.iterative_centroiding_step self.filter_lenslets = ccfg.sensor_filter_lenslets self.estimate_background = ccfg.estimate_background self.reconstruct_wavefront = ccfg.sensor_reconstruct_wavefront self.remove_tip_tilt = ccfg.sensor_remove_tip_tilt # calculate diffraction limited spot size on sensor, to determine # the centroiding window size lenslet_dlss = 1.22*self.wavelength_m*self.lenslet_focal_length_m/self.lenslet_pitch_m lenslet_dlss_px = lenslet_dlss/self.pixel_size_m # now we need to account for smearing of spots due to axial displacement of retinal layers extent = 500e-6 # retinal thickness smear = extent*6.75/16.67 # pupil diameter and focal length; use diameter in case beacon is at edge of field try: magnification = ccfg.retina_sensor_magnification except Exception as e: magnification = 1.0 total_size = lenslet_dlss+smear*magnification total_size_px = total_size/self.pixel_size_m self.centroiding_half_width = int(np.floor(total_size_px/2.0))*2 try: xy = np.loadtxt(ccfg.reference_coordinates_filename) except Exception as e: xy = np.loadtxt(ccfg.reference_coordinates_bootstrap_filename) print 'Bootstrapping with %s'%ccfg.reference_coordinates_bootstrap_filename self.search_boxes = SearchBoxes(xy[:,0],xy[:,1],ccfg.search_box_half_width) self.sensor_mask = np.loadtxt(ccfg.reference_mask_filename) self.x0 = np.zeros(self.search_boxes.x.shape) self.y0 = np.zeros(self.search_boxes.y.shape) self.x0[:] = self.search_boxes.x[:] self.y0[:] = self.search_boxes.y[:] self.n_lenslets = self.search_boxes.n n_lenslets = self.n_lenslets self.image = np.zeros((ccfg.image_height_px,ccfg.image_width_px)) self.x_slopes = np.zeros(n_lenslets) self.y_slopes = np.zeros(n_lenslets) self.x_centroids = np.zeros(n_lenslets) self.y_centroids = np.zeros(n_lenslets) self.box_maxes = np.zeros(n_lenslets) self.box_mins = np.zeros(n_lenslets) self.box_means = np.zeros(n_lenslets) self.valid_centroids = np.zeros(n_lenslets,dtype=np.int16) try: self.fast_centroiding = ccfg.fast_centroiding except Exception as e: self.fast_centroiding = False self.box_backgrounds = np.zeros(n_lenslets) self.error = 0.0 self.tip = 0.0 self.tilt = 0.0 self.zernikes = np.zeros(ccfg.n_zernike_terms) self.wavefront = np.zeros(self.sensor_mask.shape) self.image_max = -1 self.image_min = -1 self.image_mean = -1 self.cam = camera self.frame_timer = FrameTimer('Sensor',verbose=False) self.reconstructor = Reconstructor(self.search_boxes.x, self.search_boxes.y,self.sensor_mask) self.n_zernike_orders_corrected=self.reconstructor.N_orders self.centroiding_time = -1.0 self.beeper = Beeper() self.logging = False self.paused = False self.sense_timer = BlockTimer('Sensor sense method') try: self.profile_update_method = ccfg.profile_sensor_update_method except: self.profile_update_method = False
def __init__(self): """The Simulator object simulates the camera, mirror, and dynamic aberrations of the system. CIAO can be run in simulation mode by instantiating a simulator object, then a sensor object using the simulator as its camera, and then a loop object using that sensor and the simulator in place of the mirror.""" self.frame_timer = FrameTimer('simulator') # We need to define a meshes on which to build the simulated spots images # and the simulated wavefront: self.sy = ccfg.image_height_px self.sx = ccfg.image_width_px self.wavefront = np.zeros((self.sy, self.sx)) # Some parameters for the spots image: self.dc = 100 self.spots_range = 2000 self.spots = np.ones((self.sy, self.sx)) * self.dc self.spots = self.noise(self.spots) self.pixel_size_m = ccfg.pixel_size_m # compute single spot self.lenslet_pitch_m = ccfg.lenslet_pitch_m self.f = ccfg.lenslet_focal_length_m self.L = ccfg.wavelength_m fwhm_px = (1.22 * self.L * self.f / self.lenslet_pitch_m) / self.pixel_size_m xvec = np.arange(self.sx) yvec = np.arange(self.sy) xvec = xvec - xvec.mean() yvec = yvec - yvec.mean() XX, YY = np.meshgrid(xvec, yvec) d = np.sqrt(XX**2 + YY**2) self.beam_diameter_m = ccfg.beam_diameter_m self.beam_radius_m = self.beam_diameter_m / 2.0 self.disc_diameter = 170 #self.disc_diameter = ccfg.beam_diameter_m/self.pixel_size_m # was just set to 110 self.disc = np.zeros((self.sy, self.sx)) self.disc[np.where(d <= self.disc_diameter)] = 1.0 self.X = np.arange(self.sx, dtype=np.float) * self.pixel_size_m self.Y = np.arange(self.sy, dtype=np.float) * self.pixel_size_m self.X = self.X - self.X.mean() self.Y = self.Y - self.Y.mean() self.XX, self.YY = np.meshgrid(self.X, self.Y) self.RR = np.sqrt(self.XX**2 + self.YY**2) self.mask = np.zeros(self.RR.shape) self.mask[np.where(self.RR <= self.beam_radius_m)] = 1.0 use_partially_illuminated_lenslets = True if use_partially_illuminated_lenslets: d_lenslets = int( np.ceil(self.beam_diameter_m / self.lenslet_pitch_m)) else: d_lenslets = int( np.floor(self.beam_diameter_m / self.lenslet_pitch_m)) rad = float(d_lenslets) / 2.0 xx, yy = np.meshgrid(np.arange(d_lenslets), np.arange(d_lenslets)) xx = xx - float(d_lenslets - 1) / 2.0 yy = yy - float(d_lenslets - 1) / 2.0 d = np.sqrt(xx**2 + yy**2) self.lenslet_mask = np.zeros(xx.shape, dtype=np.uint8) self.lenslet_mask[np.where(d <= rad)] = 1 self.n_lenslets = int(np.sum(self.lenslet_mask)) self.x_lenslet_coords = xx * self.lenslet_pitch_m / self.pixel_size_m + self.sx / 2.0 self.y_lenslet_coords = yy * self.lenslet_pitch_m / self.pixel_size_m + self.sy / 2.0 in_pupil = np.where(self.lenslet_mask) self.x_lenslet_coords = self.x_lenslet_coords[in_pupil] self.y_lenslet_coords = self.y_lenslet_coords[in_pupil] self.lenslet_boxes = SearchBoxes(self.x_lenslet_coords, self.y_lenslet_coords, ccfg.search_box_half_width) #plt.plot(self.x_lenslet_coords,self.y_lenslet_coords,'ks') #plt.show() self.mirror_mask = np.loadtxt(ccfg.mirror_mask_filename) self.n_actuators = int(np.sum(self.mirror_mask)) self.command = np.zeros(self.n_actuators) # virtual actuator spacing in magnified or demagnified # plane of camera actuator_spacing = ccfg.beam_diameter_m / float( self.mirror_mask.shape[0]) ay, ax = np.where(self.mirror_mask) ay = ay * actuator_spacing ax = ax * actuator_spacing ay = ay - ay.mean() ax = ax - ax.mean() self.flat = np.loadtxt(ccfg.mirror_flat_filename) self.flat0 = np.loadtxt(ccfg.mirror_flat_filename) self.n_zernike_terms = ccfg.n_zernike_terms #actuator_sigma = actuator_spacing*0.75 actuator_sigma = actuator_spacing * 1.5 self.exposure = 10000 # microseconds key = '%d' % hash((tuple(ax), tuple(ay), actuator_sigma, tuple( self.X), tuple(self.Y), self.n_zernike_terms)) key = key.replace('-', 'm') try: os.mkdir(ccfg.simulator_cache_directory) except OSError as e: pass cfn = os.path.join(ccfg.simulator_cache_directory, '%s_actuator_basis.npy' % key) try: self.actuator_basis = np.load(cfn) print 'Loading cached actuator basis set...' except Exception as e: actuator_basis = [] print 'Building actuator basis set...' for x, y in zip(ax, ay): xx = self.XX - x yy = self.YY - y surf = np.exp((-(xx**2 + yy**2) / (2 * actuator_sigma**2))) surf = (surf - surf.min()) / (surf.max() - surf.min()) actuator_basis.append(surf.ravel()) plt.clf() plt.imshow(surf) plt.title('generating actuator basis\n%0.2e,%0.2e' % (x, y)) plt.pause(.1) self.actuator_basis = np.array(actuator_basis) np.save(cfn, self.actuator_basis) zfn = os.path.join(ccfg.simulator_cache_directory, '%s_zernike_basis.npy' % key) self.zernike = Zernike() try: self.zernike_basis = np.load(zfn) print 'Loading cached zernike basis set...' except Exception as e: zernike_basis = [] print 'Building zernike basis set...' #zernike = Zernike() for z in range(self.n_zernike_terms): surf = self.zernike.get_j_surface(z, self.XX, self.YY) zernike_basis.append(surf.ravel()) self.zernike_basis = np.array(zernike_basis) np.save(zfn, self.zernike_basis) #self.new_error_sigma = np.ones(self.n_zernike_terms)*100.0 self.zernike_orders = np.zeros(self.n_zernike_terms) for j in range(self.n_zernike_terms): self.zernike_orders[j] = self.zernike.j2nm(j)[0] self.baseline_error_sigma = 1.0 / (1.0 + self.zernike_orders) * 10.0 self.baseline_error_sigma[3:6] = 150.0 self.new_error_sigma = self.zernike_orders / 10.0 / 100.0 # don't generate any piston, tip, or tilt: self.baseline_error_sigma[:3] = 0.0 self.new_error_sigma[:3] = 0.0 self.error = self.get_error(self.baseline_error_sigma) self.paused = False