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