def update(self): if self._y is None: return pars = self.getParameters() #smoothed data y = numpy.ravel(numpy.array(self._y)).astype(numpy.float) ysmooth = SpecfitFuns.SavitskyGolay(y, pars['stripfilterwidth']) f = [0.25, 0.5, 0.25] ysmooth[1:-1] = numpy.convolve(ysmooth, f, mode=0) ysmooth[0] = 0.5 * (ysmooth[0] + ysmooth[1]) ysmooth[-1] = 0.5 * (ysmooth[-1] + ysmooth[-2]) #loop for anchors x = self._x niter = pars['stripiterations'] anchorslist = [] if pars['stripanchorsflag']: if pars['stripanchorslist'] is not None: ravelled = x for channel in pars['stripanchorslist']: if channel <= ravelled[0]: continue index = numpy.nonzero(ravelled >= channel)[0] if len(index): index = min(index) if index > 0: anchorslist.append(index) if niter > 1000: stripBackground = SpecfitFuns.subac(ysmooth, pars['stripconstant'], niter, pars['stripwidth'], anchorslist) #final smoothing stripBackground = SpecfitFuns.subac(stripBackground, pars['stripconstant'], 500, 1, anchorslist) elif niter > 0: stripBackground = SpecfitFuns.subac(ysmooth, pars['stripconstant'], niter, pars['stripwidth'], anchorslist) else: stripBackground = 0.0 * ysmooth + ysmooth.min() if len(anchorslist) == 0: anchorslist = [0, len(ysmooth) - 1] anchorslist.sort() snipBackground = 0.0 * ysmooth lastAnchor = 0 width = pars['snipwidth'] for anchor in anchorslist: if (anchor > lastAnchor) and (anchor < len(ysmooth)): snipBackground[lastAnchor:anchor] =\ SpecfitFuns.snip1d(ysmooth[lastAnchor:anchor], width, 0) lastAnchor = anchor if lastAnchor < len(ysmooth): snipBackground[lastAnchor:] =\ SpecfitFuns.snip1d(ysmooth[lastAnchor:], width, 0) self.graphWidget.addCurve(x, y, \ legend='Input Data',\ replace=True, replot=False) self.graphWidget.addCurve(x, stripBackground,\ legend='Strip Background',\ replot=False) self.graphWidget.addCurve(x, snipBackground,\ legend='SNIP Background', replot=True)
def _getStripBackground(self, x=None, y=None): #this makes the assumption x are equally spaced #and I should build a spline if that is not the case #but I do not want to put a dependency on SciPy if y is not None: ywork = y else: ywork = self._y if x is not None: xwork = x else: xwork = self._x n=len(xwork) #loop for anchors anchorslist = [] if self._fitConfiguration['fit']['stripanchorsflag']: if self._fitConfiguration['fit']['stripanchorslist'] is not None: oldShape = xwork.shape ravelled = xwork ravelled.shape = -1 for channel in self._fitConfiguration['fit']['stripanchorslist']: if channel <= ravelled[0]:continue index = numpy.nonzero(ravelled >= channel) if len(index): index = min(index) if index > 0: anchorslist.append(index) ravelled.shape = oldShape #work with smoothed data ysmooth = self._getSmooth(xwork, ywork) #SNIP algorithm if self._fitConfiguration['fit']['stripalgorithm'] in ["SNIP", 1]: if DEBUG: print("CALCULATING SNIP") if len(anchorslist) == 0: anchorslist = [0, len(ysmooth)-1] anchorslist.sort() result = 0.0 * ysmooth lastAnchor = 0 width = self._fitConfiguration['fit']['snipwidth'] for anchor in anchorslist: if (anchor > lastAnchor) and (anchor < len(ysmooth)): result[lastAnchor:anchor] =\ SpecfitFuns.snip1d(ysmooth[lastAnchor:anchor], width, 0) lastAnchor = anchor if lastAnchor < len(ysmooth): result[lastAnchor:] =\ SpecfitFuns.snip1d(ysmooth[lastAnchor:], width, 0) return result #strip background niter = self._fitConfiguration['fit']['stripiterations'] if niter > 0: if DEBUG: print("CALCULATING STRIP") print("iterations = ", niter) print("constant = ", self._fitConfiguration['fit']['stripconstant']) print("width = ", self._fitConfiguration['fit']['stripwidth']) print("anchors = ", anchorslist) result=SpecfitFuns.subac(ysmooth, self._fitConfiguration['fit']['stripconstant'], niter, self._fitConfiguration['fit']['stripwidth'], anchorslist) if niter > 1000: #make sure to get something smooth result = SpecfitFuns.subac(result, self._fitConfiguration['fit']['stripconstant'], 500,1, anchorslist) else: #make sure to get something smooth but with less than #500 iterations result = SpecfitFuns.subac(result, self._fitConfiguration['fit']['stripconstant'], int(self._fitConfiguration['fit']['stripwidth']*2), 1, anchorslist) else: if DEBUG: print("NO STRIP, NO SNIP") result = numpy.zeros(ysmooth.shape, numpy.float) + min(ysmooth) return result