def bin_spikes(spikes, position, window_size, window_advance,
gaussian_std=None, n_gaussian_std=5, normalized=True):
"""Bins spikes using a sliding window.
Parameters
----------
spikes: list
Of nept.SpikeTrain
position: nept.AnalogSignal
window_size: float
window_advance: float
gaussian_std: float or None
n_gaussian_std: int
normalized: boolean
Returns
-------
binned_spikes: nept.AnalogSignal
"""
bin_edges = get_edges(position, window_advance, lastbin=True)
given_n_bins = window_size / window_advance
n_bins = int(round(given_n_bins))
if abs(n_bins - given_n_bins) > 0.01:
warnings.warn("window advance does not divide the window size evenly. "
"Using window size %g instead." % (n_bins*window_advance))
if normalized:
square_filter = np.ones(n_bins) * (1 / n_bins)
else:
square_filter = np.ones(n_bins)
counts = np.zeros((len(spikes), len(bin_edges)))
for idx, spiketrain in enumerate(spikes):
counts[idx] = np.convolve(np.hstack([np.histogram(spiketrain.time, bins=bin_edges)[0],
np.array([0])]),
square_filter, mode='same')
if gaussian_std is not None and gaussian_std > window_advance:
n_points = n_gaussian_std * gaussian_std * 2 / window_advance
n_points = max(n_points, 1.0)
if n_points % 2 == 0:
n_points += 1
n_points = int(round(n_points))
gaussian_filter = signal.gaussian(n_points, gaussian_std / window_advance)
gaussian_filter /= np.sum(gaussian_filter)
if len(gaussian_filter) < counts.shape[1]:
for idx, spiketrain in enumerate(spikes):
counts[idx] = np.convolve(counts[idx], gaussian_filter, mode='same')
else:
raise ValueError("gaussian filter too long for this length of time")
return nept.AnalogSignal(counts.T, bin_edges)
评论列表
文章目录