def __init__(self,main_widget,data_base_path): # Call parent class constructor super(Experiment,self).__init__() self.exiting = False self.main_widget = main_widget self.setup = main_widget.setup self.cameraControl = main_widget.cameraWidget.cameraControl self.column_names = [ 'key INTEGER', 'time REAL', 'zPos REAL', 'molointensity REAL', 'bkgmean REAL', 'bkgstd REAL', 'exposure REAL', 'MIExpWeighted REAL' ] self.database_path = data_base_path print(self.database_path) db.create_sql_database(self.column_names,self.database_path) self.stop_thread = False self.pause_thread = False
def run(self): # get cursor and connection to new SQL database experiment_start_time = time.time() # depending on stack type change image aquisition method exposure = self.setup.camera.exposure if self.stack_type == self.stack_type_list[0]: # time stack for i in range(self.num_captures): # If stop button was pressed, exit loop if self.stop_thread: break # If pause button was pressed, wait until it is pressed again while self.pause_thread: continue z_position = self.setup.motors.z.pos('um') time.sleep(0.2) # Record start time start_time = time.time() # Determine file name for image #self.cameraControl.update_exposure_slider(exposure*0.9) image_name = self.setup.chip.file_name() image_name += '_' + 'exposure-' + str(exposure) + '-ms' image_name += '_' + str(i+1) # Try a few times to capture/save print('Capturing ( ' + image_name + ' ): ' + str(i+1)) num_attempts = 10 for j in range(num_attempts): img,retval = self.setup.camera.get_raw_img() curr_time = start_time - experiment_start_time if retval: if self.crop_image: self.setup.camera.crop_and_save_img(self.image_path+'/'+image_name, img) break else: self.setup.camera.save_img(self.image_path+'/'+image_name, img) break entry = mologram_processing.calc_datapoint_entry(i,curr_time,z_position,exposure,img,retval) if retval: if self.adjust_exposure: if np.amax(img) > 3000: print("Adjusted Exposure") exposure = exposure*0.9 self.setup.camera.set_exposure(exposure) db.add_entry(entry,self.database_path) if self.update_plots: print("lauched Signal to update GUI") self.emit(QtCore.SIGNAL("database_updated")) # Wait until delay is passed while time.time() - start_time < self.time_interval: continue elif self.stack_type == self.stack_type_list[1]: z_start = self.setup.motors.z.pos('um') time.sleep(0.2) for i in range(self.num_captures): exposure = self.setup.camera.exposure z_position = self.setup.motors.z.pos('um') time.sleep(0.2) image_name = self.setup.chip.file_name() image_name += '_' + 'exposure-' + str(exposure) + '-ms' image_name += 'z_' + str(z_position-z_start) image_name += '_' + str(i+1) for k in range(self.num_avg): # If stop button was pressed, exit loop if self.stop_thread: break # If pause button was pressed, wait until it is pressed again while self.pause_thread: continue # Record start time start_time = time.time() # Try a few times to capture/save print('Capturing ( ' + image_name + ' ): ' + str(i+1)) num_attempts = 10 for j in range(num_attempts): img,retval = self.setup.camera.get_raw_img() curr_time = start_time - experiment_start_time if retval: if k == 0: avg_image = img else: avg_image += img if k == (self.num_avg-1): avg_image = avg_image/self.num_avg if self.crop_image: self.setup.camera.crop_and_save_img(self.image_path+'/'+image_name, avg_image) break else: self.setup.camera.save_img(self.image_path+'/'+image_name, avg_image) break # Store data in SQL database #update Database entry = mologram_processing.calc_datapoint_entry(i,curr_time,z_position,exposure,img,retval) db.add_entry(entry,self.database_path) if self.update_plots: self.emit(QtCore.SIGNAL("database_updated")) # Wait until delay is passed while time.time() - start_time < self.time_interval: continue self.main_widget.axisControl.z.start_moving(self.stack_incr,'um',relative = True) time.sleep(2) elif self.stack_type == self.stack_type_list[2]: time.sleep(0.2) for i in range(self.num_captures): exposure = self.setup.camera.exposure time.sleep(0.2) image_name = self.setup.chip.file_name() image_name += '_' + 'exposure-' + str(exposure) + '-ms' image_name += '_' + str(i+1) for k in range(self.num_avg): # If stop button was pressed, exit loop if self.stop_thread: break # If pause button was pressed, wait until it is pressed again while self.pause_thread: continue # Record start time start_time = time.time() # Try a few times to capture/save print('Capturing ( ' + image_name + ' ): ' + str(i+1)) num_attempts = 10 for j in range(num_attempts): img,retval = self.setup.camera.get_raw_img() curr_time = start_time - experiment_start_time if retval: if k == 0: avg_image = img else: avg_image += img if k == (self.num_avg-1): avg_image = avg_image/self.num_avg if self.crop_image: self.setup.camera.crop_and_save_img(self.image_path+'/'+image_name, avg_image) break else: self.setup.camera.save_img(self.image_path+'/'+image_name, avg_image) break # Store data in SQL database # update database entry = mologram_processing.calc_datapoint_entry(i,curr_time,z_position,exposure,img,retval) db.add_entry(entry,self.database_path) if self.update_plots: self.emit(QtCore.SIGNAL("database_updated")) while time.time() - start_time < self.time_interval: continue self.main_widget.axisControl.TE.start_moving(self.stack_incr,'deg',relative = True) time.sleep(2) self.stop_thread = False self.emit(QtCore.SIGNAL("done_experiment"))