def compare_truth_pyfnnd(ca_data, learn_theta=(0, 1, 1, 1, 0), tau=0.6): ''' ''' from fit_neuron.evaluate import spkd_lib as spkd n_best, c_best, LL, theta_best = pyfnnd.deconvolve( ca_data.df_f.reshape(-1, 1).T, dt=0.0166, verbosity=1, learn_theta=learn_theta, #tau = tau, spikes_tol=1E-5, params_tol=1E-5) resamp_spikes = MP_analy.downsample_spike_train(ca_data.spike_train, ca_data.spike_time, ca_data.fluor_time) resamp_spikes[resamp_spikes > 1] = 1 n_best = np.roll(n_best, -1) pyfnnd.plotting.plot_fit( ca_data.df_f.reshape(-1, 1).T, n_best, c_best, theta_best, 0.0166) # from sklearn.metrics import roc_curve, auc # fpr, tpr, thresholds = roc_curve(resamp_spikes, n_best, pos_label = 1) # my_auc = auc(fpr, tpr) # plt.figure() # plt.plot(fpr, tpr) # plt.xlabel('False Positive Rate', fontsize = 18) # plt.ylabel('True Positive Rate', fontsize = 18) # plt.title('AUC = ' + str(my_auc)) thresholds = np.arange(0.01, 1, 0.01) true_spk_times = ca_data.spike_time[ca_data.spike_train > 0.5] max_dist = 2 * len(true_spk_times) # maximum distance for victor purpura vp = max_dist * np.ones(99) # victor-purpura vp_cost = 5 for i, thresh in enumerate(thresholds): if np.sum( n_best > thresh ) > max_dist: # is you have a lot of bad spikes, calculating vp can be long continue else: vp[i] = spkd.victor_purpura_dist( ca_data.fluor_time[n_best > thresh], true_spk_times, vp_cost) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) plt.plot(thresholds, 2 * vp / max_dist) plt.xlabel('Threshold', fontsize=18) plt.ylabel('Normalized VP distance ', fontsize=18) plt.title('Minimum distance: ' + str(min(2 * vp / max_dist))) MP_plot.prettify_axes(ax) example_spikes = threshold_spike_prob(n_best, 0.07) ca_data.plot_calcium_spikes() # makes a new figure plt.plot(ca_data.fluor_time, example_spikes + 0.5) return np.min(2 * vp / max_dist)
def plot_calcium_spikes(self): fig = plt.figure() ax = fig.add_subplot(1,1,1) plt.plot(self.fluor_time, self.df_f) resampled_spikes = MP_analy.downsample_spike_train(self.spike_train, self.spike_time, self.fluor_time) plt.plot(self.fluor_time, resampled_spikes - 0.5) plt.xlabel( 'Time (s)', fontsize = 18) plt.ylabel('DF / F // spike probability', fontsize = 18) MP_plot.prettify_axes(ax)
def plot_calcium_spikes(self): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) plt.plot(self.fluor_time, self.df_f) resampled_spikes = MP_analy.downsample_spike_train( self.spike_train, self.spike_time, self.fluor_time) plt.plot(self.fluor_time, resampled_spikes - 0.5) plt.xlabel('Time (s)', fontsize=18) plt.ylabel('DF / F // spike probability', fontsize=18) MP_plot.prettify_axes(ax)
def compare_truth_pyfnnd( ca_data, learn_theta = (0, 1, 1, 1, 0), tau = 0.6 ): from fit_neuron.evaluate import spkd_lib as spkd n_best, c_best, LL, theta_best = pyfnnd.deconvolve( ca_data.df_f.reshape(-1, 1).T, dt=0.0166, verbosity=1, learn_theta=learn_theta, #tau = tau, spikes_tol=1E-5, params_tol=1E-5 ) resamp_spikes = MP_analy.downsample_spike_train(ca_data.spike_train, ca_data.spike_time, ca_data.fluor_time) resamp_spikes[resamp_spikes > 1 ] = 1 n_best = np.roll(n_best, -1) pyfnnd.plotting.plot_fit(ca_data.df_f.reshape(-1, 1).T, n_best, c_best, theta_best, 0.0166) # from sklearn.metrics import roc_curve, auc # fpr, tpr, thresholds = roc_curve(resamp_spikes, n_best, pos_label = 1) # my_auc = auc(fpr, tpr) # plt.figure() # plt.plot(fpr, tpr) # plt.xlabel('False Positive Rate', fontsize = 18) # plt.ylabel('True Positive Rate', fontsize = 18) # plt.title('AUC = ' + str(my_auc)) thresholds = np.arange(0.01, 1, 0.01) true_spk_times = ca_data.spike_time[ca_data.spike_train>0.5] max_dist = 2* len(true_spk_times ) # maximum distance for victor purpura vp = max_dist * np.ones(99) # victor-purpura vp_cost = 5 for i, thresh in enumerate(thresholds): if np.sum(n_best > thresh) > max_dist: # is you have a lot of bad spikes, calculating vp can be long continue else: vp[i] = spkd.victor_purpura_dist(ca_data.fluor_time[n_best >thresh], true_spk_times, vp_cost) fig = plt.figure() ax = fig.add_subplot(1,1,1) plt.plot(thresholds, 2 * vp / max_dist ) plt.xlabel('Threshold', fontsize = 18) plt.ylabel('Normalized VP distance ', fontsize = 18) plt.title('Minimum distance: ' + str(min(2 * vp / max_dist)) ) MP_plot.prettify_axes(ax) example_spikes = threshold_spike_prob(n_best, 0.07) ca_data.plot_calcium_spikes() # makes a new figure plt.plot( ca_data.fluor_time, example_spikes + 0.5) return np.min(2 * vp / max_dist)