def fast_lzero(penalty: float, dat: np.ndarray, gamma: float,
               constraint: bool) -> np.ndarray:
    """runs fast spike inference and returns an array like the input trace
    with data substituted by event magnitudes

    Parameters
    ----------
    penalty: float
        tuning parameter lambda > 0
    dat: np.ndarray
        fluorescence data
    gamma: float
        a scalar value for the AR(1) decay parameter; 0 < gamma <= 1
    constraint: bool
        constrained (true) or unconstrained (false) optimization

    Returns
    -------
    out: np.ndarray
        event magnitude array, same shape as dat

    Notes
    -----
    https://github.com/jewellsean/FastLZeroSpikeInference/blob/cdfaade68ceb6aa15ec5003c460de4e0575f1d5f/python/FastLZeroSpikeInference/fast.py#L30  # noqa: E501

    """
    ev = fast.estimate_spikes(dat,
                              gamma,
                              penalty,
                              constraint,
                              estimate_calcium=True)
    out = np.zeros(ev['dat'].shape)
    out[ev['spikes']] = ev['pos_spike_mag']
    return out
예제 #2
0
def estimate_spikes_by_firing_rate(dat, decay_rate, target_firing_rate, lam_min = 1e-6, lam_max = 1e0, max_iters=50, tolerance=5):
    '''
    Estimate spikes based on a target firing rate. Estimates spikes with FastLZeroSpikeInference.fast based on tuning
    parameter lambda. Uses 1D binary search to find a value of the tuning parameter that results in a number of estimated
    spikes that is close to the target_firing_rate

    :param dat: data dict, see data_preprocessing
    :param decay_rate: AR1 decay rate
    :param target_firing_rate: target firing rate in fps
    :param lam_min: minimal tuning parameter value for binary search
    :param lam_max: maximal tuning parameter value for binary search
    :param max_iters: maximum number of binary search iterations
    :param tolerance: stop binary search if difference in number of target and estimated spikes is less than tolerance
    :return: dict of the FastLZeroSpikeInference.fast on the optimal tuning parameter, the optimal parameter (lam_star)
    and details from the binary search
    '''
    gcamp = dat['calcium']
    fps = dat['fps']
    # transform target firing rate into a number of spikes
    n = gcamp.shape[0]
    nbin_spike_target = np.floor(target_firing_rate * n / fps)
    bs_search = one_d_binary_search(gcamp, decay_rate, lam_min, lam_max, nbin_spike_target, max_iters, tolerance)
    lam_star = bs_search['lam_star']
    fit = fast.estimate_spikes(gcamp, decay_rate, lam_star, True, True)
    return {'fit':fit, 'lam_star': lam_star, 'minimizer':bs_search}
 def l0(self, dff, gamma, l, constraint):
     ev = fast.estimate_spikes(dff,
                               gamma,
                               l,
                               constraint,
                               estimate_calcium=True)
     out = np.zeros(ev['dat'].shape)
     out[ev['spikes'] - 1] = ev['pos_spike_mag']
     return out
예제 #4
0
def loss_function_n_spikes(lam, gcamp, decay_rate, nbin_spike_target):
    '''
    Estimate spikes from gcamp with specified decay rate and tuning parameter lambda.
    Assess how far the estimated firing rate is from a target firing rate (as measured by the total
    number of spikes)

    :param gcamp:
    :param decay_rate:
    :param lam:
    :param nbin_spike_target:
    :return:
    '''
    fit = fast.estimate_spikes(gcamp, decay_rate, lam, True)
    nbin_estimated_spikes = len(fit['spikes'])
    return l2_distance(nbin_spike_target, nbin_estimated_spikes)
예제 #5
0
from FastLZeroSpikeInference import fast
import numpy as np

gam = 0.98
y = np.power(gam, np.concatenate([np.arange(100), np.arange(100)]))

# Basic fit, no calcium concentration estimated
fit = fast.estimate_spikes(y, gam, 1, False)

# Determine calcium concentration from fit
fit = fast.estimate_calcium(fit)

# Estimate both spikes and calcium concentration
fit = fast.estimate_spikes(y, gam, 1, False, True)