Example #1
0
	def __init__(self):
		self.gauss_fitter = GaussFitter()
		self.wireScanData = WireScanData()
		self.gauss_fitter.setIterations(200)
		self.gauss_fitter.setWidthCoeff(1.0e+10)
		self.gd_wf = self.wireScanData.getRawWFX()
		self.rc = null
	def __init__(self):
		self.gauss_fitter = GaussFitter()
		self.wireScanData = WireScanData()
		self.gauss_fitter.setIterations(200)
		self.gauss_fitter.setWidthCoeff(1.0e+10)
		self.gd_wf = self.wireScanData.getRawWFX()
		self.rc = null
Example #3
0
class Local_Gauss_Fitter:
	def __init__(self):
		self.gauss_fitter = GaussFitter()
		self.wireScanData = WireScanData()
		self.gauss_fitter.setIterations(200)
		self.gauss_fitter.setWidthCoeff(1.0e+10)
		self.gd_wf = self.wireScanData.getRawWFX()
		self.rc = null
		
	def setRecord(self,ws_scan_and_fit_Record):
		self.rc = ws_scan_and_fit_Record
			
	def updateFitData(self):
		x_min = self.rc.X_MIN.getValue()
		x_max = self.rc.X_MAX.getValue()
		self.gd_wf.removeAllPoints()
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				self.gd_wf.addPoint(x,self.rc.gd_wf.getY(i))	
				#print "debug update fit data x=",x," y=",self.rc.gd_wf.getY(i)

	def guessAndFit(self):
		self.updateFitData()
		x_min = self.rc.X_MIN.getValue()
		x_max = self.rc.X_MAX.getValue()		
		result = self.gauss_fitter.guessAndFitX(self.wireScanData)
		if(result):
			sigma = self.wireScanData.getSigmaX()
			x_center = self.wireScanData.getCenterX()
			self.rc.X_MIN.setValue(x_center - 3.0*sigma)
			self.rc.X_MAX.setValue(x_center + 3.0*sigma)
			self.updateParams()
			self.updateFitData()
			result = self.gauss_fitter.fitAgainX(self.wireScanData)
			if(result):
				self.updateParams()
				self.rc.fit_is_good = true
				return self.rc.fit_is_good
		self.updateParamsToZero()
		self.rc.fit_is_good = false
		self.rc.X_MIN.setValue(x_min)
		self.rc.X_MAX.setValue(x_max)
		return self.rc.fit_is_good
			
	def fit(self):
		self.updateFitData()
		self.wireScanData.setBaseX(self.rc.CONST.getValue())
		self.wireScanData.setAmpX(self.rc.A0.getValue())
		self.wireScanData.setCenterX(self.rc.X_CENTER.getValue())
		self.wireScanData.setSigmaX(self.rc.SIGMA.getValue())
		#print "debug before fit sigma=",self.wireScanData.getSigmaX()," center=",self.rc.X_CENTER.getValue()
		result = self.gauss_fitter.fitAgainX(self.wireScanData)
		#print "debug after fit sigma RMS=",self.wireScanData.getSigmaRmsX()," center=",self.wireScanData.getCenterX()
		#print "debug res=",result
		if(result):
			self.updateParams()
			self.rc.fit_is_good = true
		else:
			self.updateParamsToZero()
			self.rc.fit_is_good = false	
		return self.rc.fit_is_good		
			
	def _calculateSigmaRMS(self):
		""" 
		This method is needed because the RMS calculations in Gauss Fitter XAL class assume
		zero noise-base. We want to substract it.
		"""
		x_min = self.rc.X_MIN.getValue()
		x_max = self.rc.X_MAX.getValue()		
		y_min = 1.0e+36
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				y = self.rc.gd_wf.getY(i)
				if(y_min > y): y_min = y
		y_min = math.fabs(y_min)
		centerRms = 0.
		weight = 0.
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				y = self.rc.gd_wf.getY(i)
				weight += (y-y_min)
				centerRms += x*(y-y_min)
		if(weight == 0.): return 0.
		centerRms = centerRms/weight
		sigmaRms = 0.
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				y = self.rc.gd_wf.getY(i)			
				sigmaRms += (x - centerRms)*(x - centerRms)*(y-y_min)
		sigmaRms = math.sqrt(sigmaRms/weight)
		return sigmaRms 
				
	def updateParams(self):
		self.rc.CONST.setValueQuietly(self.wireScanData.getBaseX())
		self.rc.A0.setValueQuietly(self.wireScanData.getAmpX())
		self.rc.X_CENTER.setValueQuietly(self.wireScanData.getCenterX())
		self.rc.SIGMA.setValueQuietly(self.wireScanData.getSigmaX())
		self.rc.custom_gauss_sigma =  self.wireScanData.getSigmaX()
		#self.rc.custom_rms_sigma = self.wireScanData.	getSigmaRmsX()
		self.rc.custom_rms_sigma = self._calculateSigmaRMS()
		#print "debug gauss fit sigma RMS=",self.wireScanData.getSigmaRmsX()," new RMS=",self.rc.custom_rms_sigma
		self.rc.plotFitData()
		
	def updateParamsToZero(self):
		self.rc.custom_gauss_sigma = 0.
		self.rc.custom_rms_sigma = 0.
		self.rc.CONST.setValueQuietly(0.)
		self.rc.A0.setValueQuietly(0.)
		self.rc.X_CENTER.setValueQuietly(0.)
		self.rc.SIGMA.setValueQuietly(0.)
		self.rc.gd_fit_wf.removeAllPoints()
		self.rc.gd_log_fit_wf.removeAllPoints()
class Local_Gauss_Fitter:
	def __init__(self):
		self.gauss_fitter = GaussFitter()
		self.wireScanData = WireScanData()
		self.gauss_fitter.setIterations(200)
		self.gauss_fitter.setWidthCoeff(1.0e+10)
		self.gd_wf = self.wireScanData.getRawWFX()
		self.rc = null
		
	def setRecord(self,ws_scan_and_fit_Record):
		self.rc = ws_scan_and_fit_Record
			
	def updateFitData(self):
		x_min = self.rc.X_MIN.getValue()
		x_max = self.rc.X_MAX.getValue()
		self.gd_wf.removeAllPoints()
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				self.gd_wf.addPoint(x,self.rc.gd_wf.getY(i))	
				#print "debug update fit data x=",x," y=",self.rc.gd_wf.getY(i)

	def guessAndFit(self):
		self.updateFitData()
		x_min = self.rc.X_MIN.getValue()
		x_max = self.rc.X_MAX.getValue()		
		result = self.gauss_fitter.guessAndFitX(self.wireScanData)
		if(result):
			sigma = self.wireScanData.getSigmaX()
			x_center = self.wireScanData.getCenterX()
			self.rc.X_MIN.setValue(x_center - 3.0*sigma)
			self.rc.X_MAX.setValue(x_center + 3.0*sigma)
			self.updateParams()
			self.updateFitData()
			result = self.gauss_fitter.fitAgainX(self.wireScanData)
			if(result):
				self.updateParams()
				self.rc.fit_is_good = true
				return self.rc.fit_is_good
		self.updateParamsToZero()
		self.rc.fit_is_good = false
		self.rc.X_MIN.setValue(x_min)
		self.rc.X_MAX.setValue(x_max)
		return self.rc.fit_is_good
			
	def fit(self):
		self.updateFitData()
		self.wireScanData.setBaseX(self.rc.CONST.getValue())
		self.wireScanData.setAmpX(self.rc.A0.getValue())
		self.wireScanData.setCenterX(self.rc.X_CENTER.getValue())
		self.wireScanData.setSigmaX(self.rc.SIGMA.getValue())
		#print "debug before fit sigma=",self.wireScanData.getSigmaX()," center=",self.rc.X_CENTER.getValue()
		result = self.gauss_fitter.fitAgainX(self.wireScanData)
		#print "debug after fit sigma RMS=",self.wireScanData.getSigmaRmsX()," center=",self.wireScanData.getCenterX()
		#print "debug res=",result
		if(result):
			self.updateParams()
			self.rc.fit_is_good = true
		else:
			self.updateParamsToZero()
			self.rc.fit_is_good = false	
		return self.rc.fit_is_good		
			
	def _calculateSigmaRMS(self):
		""" 
		This method is needed because the RMS calculations in Gauss Fitter XAL class assume
		zero noise-base. We want to substract it.
		"""
		x_min = self.rc.X_MIN.getValue()
		x_max = self.rc.X_MAX.getValue()		
		y_min = 1.0e+36
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				y = self.rc.gd_wf.getY(i)
				if(y_min > y): y_min = y
		y_min = math.fabs(y_min)
		centerRms = 0.
		weight = 0.
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				y = self.rc.gd_wf.getY(i)
				weight += (y-y_min)
				centerRms += x*(y-y_min)
		if(weight == 0.): return 0.
		centerRms = centerRms/weight
		sigmaRms = 0.
		for i in range(self.rc.gd_wf.getNumbOfPoints()):
			x = self.rc.gd_wf.getX(i)
			if(x >= x_min and x <= x_max):
				y = self.rc.gd_wf.getY(i)			
				sigmaRms += (x - centerRms)*(x - centerRms)*(y-y_min)
		sigmaRms = math.sqrt(sigmaRms/weight)
		return sigmaRms 
				
	def updateParams(self):
		self.rc.CONST.setValueQuietly(self.wireScanData.getBaseX())
		self.rc.A0.setValueQuietly(self.wireScanData.getAmpX())
		self.rc.X_CENTER.setValueQuietly(self.wireScanData.getCenterX())
		self.rc.SIGMA.setValueQuietly(self.wireScanData.getSigmaX())
		self.rc.custom_gauss_sigma =  self.wireScanData.getSigmaX()
		#self.rc.custom_rms_sigma = self.wireScanData.	getSigmaRmsX()
		self.rc.custom_rms_sigma = self._calculateSigmaRMS()
		print "debug gauss fit sigma RMS=",self.wireScanData.getSigmaRmsX()," new RMS=",self.rc.custom_rms_sigma
		self.rc.plotFitData()
		
	def updateParamsToZero(self):
		self.rc.custom_gauss_sigma = 0.
		self.rc.custom_rms_sigma = 0.
		self.rc.CONST.setValueQuietly(0.)
		self.rc.A0.setValueQuietly(0.)
		self.rc.X_CENTER.setValueQuietly(0.)
		self.rc.SIGMA.setValueQuietly(0.)
		self.rc.gd_fit_wf.removeAllPoints()
		self.rc.gd_log_fit_wf.removeAllPoints()