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