def snip_bg(x, y0, width): """Compute the snip bg for y0""" global _BG_SNIP_OLDY global _BG_SNIP_OLDWIDTH global _BG_SNIP_OLDBG global _BG_SMOOTH_OLDWIDTH global _BG_SMOOTH_OLDFLAG global _BG_OLD_ANCHORS global _BG_OLD_ANCHORS_FLAG parameters_changed =\ _BG_SNIP_OLDWIDTH != width or\ _BG_SMOOTH_OLDWIDTH != CONFIG["SmoothingWidth"] or\ _BG_SMOOTH_OLDFLAG != CONFIG["SmoothingFlag"] or\ _BG_OLD_ANCHORS_FLAG != CONFIG["AnchorsFlag"] or\ _BG_OLD_ANCHORS != CONFIG["AnchorsList"] # same parameters if not parameters_changed: # same data if numpy.sum(_BG_SNIP_OLDY == y0) == len(y0): # same result return _BG_SNIP_OLDBG _BG_SNIP_OLDY = y0 _BG_SNIP_OLDWIDTH = width _BG_SMOOTH_OLDWIDTH = CONFIG["SmoothingWidth"] _BG_SMOOTH_OLDFLAG = CONFIG["SmoothingFlag"] _BG_OLD_ANCHORS = CONFIG["AnchorsList"] _BG_OLD_ANCHORS_FLAG = CONFIG["AnchorsFlag"] y1 = savitsky_golay( y0, CONFIG["SmoothingWidth"]) if CONFIG["SmoothingFlag"] else y0 anchors_indices = _convert_anchors_to_indices(x) if anchors_indices is None or not len(anchors_indices): anchors_indices = [0, len(y1) - 1] background = numpy.zeros_like(y1) previous_anchor = 0 for anchor_index in anchors_indices: if (anchor_index > previous_anchor) and (anchor_index < len(y1)): background[previous_anchor:anchor_index] =\ snip1d(y1[previous_anchor:anchor_index], width) previous_anchor = anchor_index if previous_anchor < len(y1): background[previous_anchor:] = snip1d(y1[previous_anchor:], width) _BG_SNIP_OLDBG = background return background
def snip_bg(x, y0, width): """Compute the snip bg for y0""" global _BG_SNIP_OLDY global _BG_SNIP_OLDWIDTH global _BG_SNIP_OLDBG global _BG_SMOOTH_OLDWIDTH global _BG_SMOOTH_OLDFLAG global _BG_OLD_ANCHORS global _BG_OLD_ANCHORS_FLAG parameters_changed =\ _BG_SNIP_OLDWIDTH != width or\ _BG_SMOOTH_OLDWIDTH != CONFIG["SmoothingWidth"] or\ _BG_SMOOTH_OLDFLAG != CONFIG["SmoothingFlag"] or\ _BG_OLD_ANCHORS_FLAG != CONFIG["AnchorsFlag"] or\ _BG_OLD_ANCHORS != CONFIG["AnchorsList"] # same parameters if not parameters_changed: # same data if numpy.sum(_BG_SNIP_OLDY == y0) == len(y0): # same result return _BG_SNIP_OLDBG _BG_SNIP_OLDY = y0 _BG_SNIP_OLDWIDTH = width _BG_SMOOTH_OLDWIDTH = CONFIG["SmoothingWidth"] _BG_SMOOTH_OLDFLAG = CONFIG["SmoothingFlag"] _BG_OLD_ANCHORS = CONFIG["AnchorsList"] _BG_OLD_ANCHORS_FLAG = CONFIG["AnchorsFlag"] y1 = savitsky_golay(y0, CONFIG["SmoothingWidth"]) if CONFIG["SmoothingFlag"] else y0 anchors_indices = _convert_anchors_to_indices(x) if anchors_indices is None or not len(anchors_indices): anchors_indices = [0, len(y1) - 1] background = numpy.zeros_like(y1) previous_anchor = 0 for anchor_index in anchors_indices: if (anchor_index > previous_anchor) and (anchor_index < len(y1)): background[previous_anchor:anchor_index] =\ snip1d(y1[previous_anchor:anchor_index], width) previous_anchor = anchor_index if previous_anchor < len(y1): background[previous_anchor:] = snip1d(y1[previous_anchor:], width) _BG_SNIP_OLDBG = background return background
def _update(self, resetzoom=False): """Compute strip and snip backgrounds, update the curves """ if self._y is None: return pars = self.getParameters() # smoothed data y = numpy.ravel(numpy.array(self._y)).astype(numpy.float64) if pars["SmoothingFlag"]: ysmooth = filters.savitsky_golay(y, pars['SmoothingWidth']) 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]) else: ysmooth = y # loop for anchors x = self._x niter = pars['StripIterations'] anchors_indices = [] if pars['AnchorsFlag'] and pars['AnchorsList'] is not None: ravelled = x for channel in pars['AnchorsList']: if channel <= ravelled[0]: continue index = numpy.nonzero(ravelled >= channel)[0] if len(index): index = min(index) if index > 0: anchors_indices.append(index) stripBackground = filters.strip(ysmooth, w=pars['StripWidth'], niterations=niter, factor=pars['StripThreshold'], anchors=anchors_indices) if niter >= 1000: # final smoothing stripBackground = filters.strip(stripBackground, w=1, niterations=50*pars['StripWidth'], factor=pars['StripThreshold'], anchors=anchors_indices) if len(anchors_indices) == 0: anchors_indices = [0, len(ysmooth)-1] anchors_indices.sort() snipBackground = 0.0 * ysmooth lastAnchor = 0 for anchor in anchors_indices: if (anchor > lastAnchor) and (anchor < len(ysmooth)): snipBackground[lastAnchor:anchor] =\ filters.snip1d(ysmooth[lastAnchor:anchor], pars['SnipWidth']) lastAnchor = anchor if lastAnchor < len(ysmooth): snipBackground[lastAnchor:] =\ filters.snip1d(ysmooth[lastAnchor:], pars['SnipWidth']) self.graphWidget.addCurve(x, y, legend='Input Data', replace=True, resetzoom=resetzoom) self.graphWidget.addCurve(x, stripBackground, legend='Strip Background', resetzoom=False) self.graphWidget.addCurve(x, snipBackground, legend='SNIP Background', resetzoom=False) if self._xmin is not None and self._xmax is not None: self.graphWidget.getXAxis().setLimits(self._xmin, self._xmax)
def _update(self, resetzoom=False): """Compute strip and snip backgrounds, update the curves """ if self._y is None: return pars = self.getParameters() # smoothed data y = numpy.ravel(numpy.array(self._y)).astype(numpy.float) if pars["SmoothingFlag"]: ysmooth = filters.savitsky_golay(y, pars['SmoothingWidth']) 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]) else: ysmooth = y # loop for anchors x = self._x niter = pars['StripIterations'] anchors_indices = [] if pars['AnchorsFlag'] and pars['AnchorsList'] is not None: ravelled = x for channel in pars['AnchorsList']: if channel <= ravelled[0]: continue index = numpy.nonzero(ravelled >= channel)[0] if len(index): index = min(index) if index > 0: anchors_indices.append(index) stripBackground = filters.strip(ysmooth, w=pars['StripWidth'], niterations=niter, factor=pars['StripThreshold'], anchors=anchors_indices) if niter >= 1000: # final smoothing stripBackground = filters.strip(stripBackground, w=1, niterations=50*pars['StripWidth'], factor=pars['StripThreshold'], anchors=anchors_indices) if len(anchors_indices) == 0: anchors_indices = [0, len(ysmooth)-1] anchors_indices.sort() snipBackground = 0.0 * ysmooth lastAnchor = 0 for anchor in anchors_indices: if (anchor > lastAnchor) and (anchor < len(ysmooth)): snipBackground[lastAnchor:anchor] =\ filters.snip1d(ysmooth[lastAnchor:anchor], pars['SnipWidth']) lastAnchor = anchor if lastAnchor < len(ysmooth): snipBackground[lastAnchor:] =\ filters.snip1d(ysmooth[lastAnchor:], pars['SnipWidth']) self.graphWidget.addCurve(x, y, legend='Input Data', replace=True, resetzoom=resetzoom) self.graphWidget.addCurve(x, stripBackground, legend='Strip Background', resetzoom=False) self.graphWidget.addCurve(x, snipBackground, legend='SNIP Background', resetzoom=False) if self._xmin is not None and self._xmax is not None: self.graphWidget.getXAxis().setLimits(self._xmin, self._xmax)