def METHOD_NAME(mol, Gv, shls_slice=None, aosym='s1', b=numpy.eye(3),
              gxyz=None, Gvbase=None, out=None, intor='GTO_ft_ovlp',
              comp=1, q=numpy.zeros(3), return_complex=True, ovlp_mask=None,
              verbose=None):
    r''' FT transform AO pair
    \int i(r) j(r) exp(-ikr) dr^3
    '''
    intor = mol._add_suffix(intor)
    if shls_slice is None:
        shls_slice = (0, mol.nbas, 0, mol.nbas)
    GvT = numpy.asarray(Gv.T, order='C') + q[:,None]
    nGv = Gv.shape[0]
    if (gxyz is None or b is None or Gvbase is None
        # backward compatibility for pyscf-1.2, in which the argument Gvbase is gs
        or (Gvbase is not None and isinstance(Gvbase[0], (int, numpy.integer)))):
        p_gxyzT = lib.c_null_ptr()
        p_gs = (ctypes.c_int*3)(0,0,0)
        p_b = (ctypes.c_double*1)(0)
        eval_gz = 'GTO_Gv_general'
    else:
        if abs(b-numpy.diag(b.diagonal())).sum() < 1e-8:
            eval_gz = 'GTO_Gv_orth'
        else:
            eval_gz = 'GTO_Gv_nonorth'
        gxyzT = numpy.asarray(gxyz.T, order='C', dtype=numpy.int32)
        p_gxyzT = gxyzT.ctypes.data_as(ctypes.c_void_p)
        bqGv = numpy.hstack((b.ravel(), q) + Gvbase)
        p_b = bqGv.ctypes.data_as(ctypes.c_void_p)
        p_gs = (ctypes.c_int*3)(*[len(x) for x in Gvbase])
    ao_loc = gto.moleintor.make_loc(mol._bas, intor)
    if aosym == 's1':
        if (shls_slice[:2] == shls_slice[2:4] and
            intor.startswith('GTO_ft_ovlp')):
            fill = 'fill_s1hermi'
        else:
            fill = 'fill_s1'
        ni = ao_loc[shls_slice[1]] - ao_loc[shls_slice[0]]
        nj = ao_loc[shls_slice[3]] - ao_loc[shls_slice[2]]
        shape = (nj, ni, nGv)
    else:
        fill = 'fill_s2'
        i0 = ao_loc[shls_slice[0]]
        i1 = ao_loc[shls_slice[1]]
        nij = i1*(i1+1)//2 - i0*(i0+1)//2
        shape = (nij, nGv)
    if comp != 1:
        shape = (comp,) + shape
    if return_complex:
        fill = 'GTO_ft_z' + fill
        dtype = numpy.complex128
    else:
        if fill == 'fill_s2':
            raise NotImplementedError
        fill = 'GTO_ft_d' + fill
        dtype = numpy.double
        shape = (2,) + shape
    if out is None:
        out = numpy.zeros(shape, dtype=dtype)
    else:
        out = numpy.ndarray(shape, dtype=dtype, buffer=out)
        out[:] = 0
    if aosym == 's1':
        out = numpy.rollaxis(out, -2, -3)
        out = numpy.rollaxis(out, -1, -3)
    else:
        out = numpy.rollaxis(out, -1, -2)
    if nGv == 0:
        return out
    fn = libcgto.GTO_ft_fill_drv
    intor = getattr(libcgto, intor)
    eval_gz = getattr(libcgto, eval_gz)
    fill = getattr(libcgto, fill)
    phase = 0
    if ovlp_mask is None:
        nish = shls_slice[1] - shls_slice[0]
        njsh = shls_slice[3] - shls_slice[2]
        ovlp_mask = numpy.ones((nish,njsh), dtype=numpy.int8, order='F')
    else:
        ovlp_mask = numpy.asarray(ovlp_mask, dtype=numpy.int8, order='F')
    fn(intor, eval_gz, fill,
       out.ctypes.data_as(ctypes.c_void_p),
       ovlp_mask.ctypes.data_as(ctypes.c_void_p),
       ctypes.c_int(comp), (ctypes.c_int*4)(*shls_slice),
       ao_loc.ctypes.data_as(ctypes.c_void_p), ctypes.c_double(phase),
       GvT.ctypes.data_as(ctypes.c_void_p),
       p_b, p_gxyzT, p_gs, ctypes.c_int(nGv),
       mol._atm.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(mol.natm),
       mol._bas.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(mol.nbas),
       mol._env.ctypes.data_as(ctypes.c_void_p))
    return out