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