def METHOD_NAME(t, l, mode=None, lbound=None):
    t = np.array(t, dtype=float)
    l = np.array(l, dtype=float)
    if l.ndim == 1:
        # l is a vector
        n_rep = 1
    else:
        n_rep = l.shape[0]
    t = np.tile(t, n_rep)
    l = l.flatten()
    # remove low counts based on lbound
    if lbound is not None:
        t[l < lbound] = np.nan
        l[l < lbound] = np.nan
    n = np.sum(~np.isnan(t))
    tau = t - np.nanmin(t)
    tm = np.nanmean(tau)
    # prepare y
    y = np.log(l)
    ym = np.nanmean(y)
    # calculate slope
    var_t = np.nanmean(tau**2) - tm**2
    cov = np.nansum(y * tau) / n - ym * tm
    k = cov / var_t
    # calculate intercept
    b = np.exp(ym - k * tm) if mode != "fast" else None
    gamma = -k
    u0 = b
    return gamma, u0