def tuning_curve_2d(position, spikes, xedges, yedges, occupied_thresh=0, gaussian_sigma=None):
"""Creates 2D tuning curves based on spikes and 2D position.
Parameters
----------
position : nept.Position
Must be a 2D position.
spikes : list
Containing nept.SpikeTrain for each neuron.
xedges : np.array
yedges : np.array
sampling_rate : float
occupied_thresh: float
gaussian_sigma : float
Sigma used in gaussian filter if filtering.
Returns
-------
tuning_curves : np.array
Where each inner array is the tuning curve for an individual neuron.
"""
sampling_rate = np.median(np.diff(position.time))
position_2d, pos_xedges, pos_yedges = np.histogram2d(position.y, position.x, bins=[yedges, xedges])
position_2d *= sampling_rate
shape = position_2d.shape
occupied_idx = position_2d > occupied_thresh
tc = []
for spiketrain in spikes:
spikes_x = []
spikes_y = []
for spike_time in spiketrain.time:
spike_idx = find_nearest_idx(position.time, spike_time)
if np.abs(position.time[spike_idx] - spike_time) < sampling_rate:
spikes_x.append(position.x[spike_idx])
spikes_y.append(position.y[spike_idx])
spikes_2d, spikes_xedges, spikes_yedges = np.histogram2d(spikes_y, spikes_x, bins=[yedges, xedges])
firing_rate = np.zeros(shape)
firing_rate[occupied_idx] = spikes_2d[occupied_idx] / position_2d[occupied_idx]
tc.append(firing_rate)
if gaussian_sigma is not None:
tuning_curves = []
for firing_rate in tc:
tuning_curves.append(gaussian_filter(firing_rate, gaussian_sigma))
else:
print('Tuning curves with no filter.')
tuning_curves = tc
return np.array(tuning_curves)
评论列表
文章目录