Exemple #1
0
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]
Exemple #2
0
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]
Exemple #3
0
    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]