def diff_Fit2D(self, axis="all", dx=0.1): """ ??? @param axis: ??? @type axis: ??? @param dx: ??? @type dx: ??? @return: ??? @rtype: ??? """ tth, I = self.ai.xrpd(self.img, max(self.shape)) dI = SGModule.getSavitzkyGolay(I, npoints=5, degree=2, order=1) / (tth[1] - tth[0]) dImg = self.reconstruct(tth, dI) f = self.ai.getFit2D() tth2d_ref = self.ai.twoThetaArray(self.shape) # useless variable ??? keys = ["centerX", "centerY", "tilt", "tiltPlanRotation"] if axis != "all": keys = [i for i in keys if i == axis] grad = {} for key in keys: fp = f.copy() fp[key] += dx ap = AzimuthalIntegrator() ap.setFit2D(**fp) dtth = (ap.twoThetaArray(self.shape) - self.ai.twoThetaArray(self.shape)) / dx grad[key] = (dtth * dImg).sum() if axis == "all": return grad else: return grad[axis]
def diff_tth_X(self, dx=0.1): """ Jerome peux-tu décrire de quoi il retourne ??? :param dx: ??? :type: float ??? :return: ??? :rtype: ??? """ f = self.ai.getFit2D() fp = f.copy() fm = f.copy() fm["centerX"] -= dx / 2.0 fp["centerX"] += dx / 2.0 ap = AzimuthalIntegrator() am = AzimuthalIntegrator() ap.setFit2D(**fp) am.setFit2D(**fm) dtthX = (ap.twoThetaArray(self.shape) - am.twoThetaArray(self.shape))\ / dx tth, I = self.ai.xrpd(self.img, max(self.shape)) dI = SGModule.getSavitzkyGolay(I, npoints=5, degree=2, order=1)\ / (tth[1] - tth[0]) dImg = self.reconstruct(tth, dI) return (dtthX * dImg).sum()
def derivate(self,xdata,ydata, xlimits=None): x=numpy.array(xdata, copy=False, dtype=numpy.float) y=numpy.array(ydata, copy=False, dtype=numpy.float) if xlimits is not None: i1=numpy.nonzero((xdata>=xlimits[0])&\ (xdata<=xlimits[1]))[0] x=numpy.take(x,i1) y=numpy.take(y,i1) i1 = numpy.argsort(x) x=numpy.take(x,i1) y=numpy.take(y,i1) deltax=x[1:] - x[:-1] i1=numpy.nonzero(abs(deltax)>0.0000001)[0] x=numpy.take(x, i1) y=numpy.take(y, i1) minDelta = deltax.min() xInter = numpy.arange(x[0]-minDelta,x[-1]+minDelta,minDelta) yInter = numpy.interp(xInter, x, y, left=y[0], right=y[-1]) if len(yInter) > 499: npoints = 5 else: npoints = 3 degree = 1 order = 1 coeff = SGModule.calc_coeff(npoints, degree, order) N = int(numpy.size(coeff-1)/2) yInterPrime = numpy.convolve(yInter, coeff, mode='valid')/minDelta i1 = numpy.nonzero((x>=xInter[N+1]) & (x <= xInter[-N]))[0] x = numpy.take(x, i1) result = numpy.interp(x, xInter[(N+1):-N], yInterPrime[1:], left=yInterPrime[1], right=yInterPrime[-1]) return x, result
def diff_Fit2D(self, axis="all", dx=0.1): """ ??? :param axis: ??? :type axis: ??? :param dx: ??? :type dx: ??? :return: ??? :rtype: ??? """ tth, I = self.ai.xrpd(self.img, max(self.shape)) dI = SGModule.getSavitzkyGolay(I, npoints=5, degree=2, order=1)\ / (tth[1] - tth[0]) dImg = self.reconstruct(tth, dI) f = self.ai.getFit2D() _tth2d_ref = self.ai.twoThetaArray(self.shape) # useless variable ??? keys = ["centerX", "centerY", "tilt", "tiltPlanRotation"] if axis != "all": keys = [i for i in keys if i == axis] grad = {} for key in keys: fp = f.copy() fp[key] += dx ap = AzimuthalIntegrator() ap.setFit2D(**fp) dtth = (ap.twoThetaArray(self.shape) - self.ai.twoThetaArray(self.shape)) / dx grad[key] = (dtth * dImg).sum() if axis == "all": return grad else: return grad[axis]
def diff_tth_tilt(self, dx=0.1): """ idem ici ??? @param dx: ??? @type dx: float ??? @return: ??? @rtype: ??? """ f = self.ai.getFit2D() fp = f.copy() fm = f.copy() fm["tilt"] -= dx / 2.0 fp["tilt"] += dx / 2.0 ap = AzimuthalIntegrator() am = AzimuthalIntegrator() ap.setFit2D(**fp) am.setFit2D(**fm) dtthX = (ap.twoThetaArray(self.shape) - am.twoThetaArray(self.shape))\ / dx tth, I = self.ai.xrpd(self.img, max(self.shape)) dI = SGModule.getSavitzkyGolay(I, npoints=5, degree=2, order=1)\ / (tth[1] - tth[0]) dImg = self.reconstruct(tth, dI) return (dtthX * dImg).sum()
def estimateXANESEdge(spectrum, energy=None, full=False): if energy is None: x = numpy.arange(len(spectrum)).astype(numpy.float) else: x = numpy.array(energy, dtype=numpy.float, copy=True) y = numpy.array(spectrum, dtype=numpy.float, copy=True) # make sure data are sorted idx = energy.argsort(kind='mergesort') x = numpy.take(energy, idx) y = numpy.take(spectrum, idx) # make sure data are strictly increasing delta = x[1:] - x[:-1] dmin = delta.min() dmax = delta.max() if delta.min() <= 1.0e-10: # force data are strictly increasing # although we do not consider last point idx = numpy.nonzero(delta>0)[0] x = numpy.take(x, idx) y = numpy.take(y, idx) delta = None sortedX = x sortedY = y # use a regularly spaced spectrum if dmax != dmin: # choose the number of points or deduce it from # the input data length? nchannels = 5 * len(spectrum) xi = numpy.linspace(x[1], x[-2], nchannels).reshape(-1, 1) x.shape = -1 y.shape = -1 y = SpecfitFuns.interpol([x], y, xi, y.min()) x = xi x.shape = -1 y.shape = -1 # take the first derivative npoints = 7 xPrime = x[npoints:-npoints] yPrime = SGModule.getSavitzkyGolay(y, npoints=npoints, degree=2, order=1) # get the index at maximum value iMax = numpy.argmax(yPrime) if full: # return intermediate information return x[iMax], sortedX, sortedY, xPrime, yPrime else: # return the corresponding x value return x[iMax]
def updateGraph(self, ddict): points = ddict['points'] degree = ddict['degree'] order = ddict['order'] self.background = SGModule.getSavitzkyGolay(self.spectrum, points, degree=degree, order=order) if order > 0: maptoy2 = True else: maptoy2 = False self.graph.newCurve(self.xValues, self.background, "Filtered Spectrum", replace=False, maptoy2=maptoy2) #Force information update legend = self.graph.getActiveCurve(just_legend=True) if legend.startswith('Filtered'): self.graph.setActiveCurve(legend)