def xafsft(k, chi, group=None, kmin=0, kmax=20, kweight=0, dk=1, dk2=None, window='kaiser', rmax_out=10, nfft=2048, kstep=0.05, _larch=None, **kws): """ calculate forward XAFS Fourier transform """ if _larch is None: raise Warning("cannot do xafsft -- larch broken?") # allow kweight keyword == kw if 'kw' in kws: kweight = kws['kw'] cchi, win = xafsft_prep(k, chi, kmin=kmin, kmax=kmax, kweight=kweight, dk=dk, dk2=dk2, nfft=nfft, kstep=kstep, window=window, _larch=_larch) out = xafsft_fast(cchi*win, kstep=kstep, nfft=nfft) rstep = pi/(kstep*nfft) irmax = min(nfft/2, int(1.01 + rmax_out/rstep)) if _larch.symtable.isgroup(group): r = rstep * arange(irmax) mag = sqrt(out.real**2 + out.imag**2) group.kwin = win[:len(chi)] group.r = r[:irmax] group.chir = out[:irmax] group.chir_mag = mag[:irmax] group.chir_pha = complex_phase(out[:irmax]) group.chir_re = out.real[:irmax] group.chir_im = out.imag[:irmax] else: return out[:irmax]
def xafsift(r, chir, group=None, rmin=0, rmax=20, dr=1, dr2=None, rw=0, window='kaiser', qmax_out=None, nfft=2048, kstep=0.05, _larch=None, **kws): """ calculate reverse XAFS Fourier transform This assumes that chir_re and (optional chir_im are on a uniform r-grid given by r. """ if _larch is None: raise Warning("cannot do xafsft -- larch broken?") if 'rweight' in kws: rw = kws['rweight'] rstep = r[1] - r[0] kstep = pi/(rstep*nfft) scale = 1.0 cchir = zeros(nfft, dtype='complex128') r_ = rstep * arange(nfft, dtype='float64') cchir[0:len(chir)] = chir if chir.dtype == np.dtype('complex128'): scale = 0.5 win = ftwindow(r_, xmin=rmin, xmax=rmax, dx=dr, dx2=dr2, window=window) out = scale * xafsift_fast( cchir*win * r_**rw, kstep=kstep, nfft=nfft) if qmax_out is None: qmax_out = 30.0 q = linspace(0, qmax_out, int(1.05 + qmax_out/kstep)) nkpts = len(q) if _larch.symtable.isgroup(group): group.q = q mag = sqrt(out.real**2 + out.imag**2) group.rwin = win[:len(chir)] group.chiq_mag = mag[:nkpts] group.chiq_pha = complex_phase(out[:nkpts]) group.chiq_re = out.real[:nkpts] group.chiq_im = out.imag[:nkpts] else: return out[:nkpts]
def _xafsft(self, chi, group=None, rmax_out=10, **kws): "returns " for key, val in kws: if key == 'kw': key = 'kweight' setattr(self, key, val) self.make_karrays() out = self.fftf(chi) irmax = min(self.nfft/2, int(1.01 + rmax_out/self.rstep)) if self._larch.symtable.isgroup(group): r = self.rstep * arange(irmax) mag = sqrt(out.real**2 + out.imag**2) group.kwin = self.kwin[:len(chi)] group.r = r[:irmax] group.chir = out[:irmax] group.chir_mag = mag[:irmax] group.chir_pha = complex_phase(out[:irmax]) group.chir_re = out.real[:irmax] group.chir_im = out.imag[:irmax] else: return out[:irmax]