data_directory = rootDir + '/' + ID + '/' + session + '/' + session if os.path.exists(data_directory+'/plots')==False: os.mkdir(data_directory+'/plots') path =rootDir + '/' + ID + '/' + session #count number of sessions ns = int([i for i in os.listdir(path) if os.path.isdir(path+'/'+i)==True][-1][-1:]) if ns == 1: episodes=['wake'] else: episodes = ['wake' if i==wakepos else 'sleep' for i in list(range(ns+1))] files = os.listdir(data_directory) from wrappers import loadSpikeData spikes, shank = loadSpikeData(data_directory) from wrappers import loadXML n_channels, fs, shank_to_channel = loadXML(data_directory) # Now we can load the position and rotation contained into the file Tracking_data.csv # The order is by default [rotation y, rotation x, rotation z, position x, position y, position z] from wrappers import loadPosition position = loadPosition(data_directory, events, episodes, n_ttl_channels = 1, optitrack_ch = 0) from wrappers import loadEpoch wake_ep = loadEpoch(data_directory, 'wake', episodes) if ns > 1: sleep_ep = loadEpoch(data_directory, 'sleep') ### #Place fields
def ripple_Decoding(ripple_event, data_dir, epoch, lfp, save_pdf = False): #Purpose: Decoding the ripple event to the Head-Direction angle data ''' NOTE ON function arguments: ripple_event : pandas Dataframe with info about ripple events in the following form : [start time, peak time, end time, Average Power, Instantanous Frequency of ripple]. data_dir : path to the directory where all the session data is stored. epoch : name of epoch in which decoding is needed to be done. lfp : Downasampled neuroseries Time Series with single channel. It can be obtained using loadLFP() function to obtain a time series from a single channel. ''' from matplotlib.backends.backend_pdf import PdfPages import itertools bin_size_un = 20 #ms bin_size_ov = 100 #ms percent_overlap = 0.75 d1,d2 = plot_sharing_calc(bin_size_un, bin_size_ov, (500 * 1000)) ripple_event = ripple_event.values #Loading the correct angular position wrt time from Positions.h5 file. positions = load_Positions(data_directory, epoch) ep = correct_Epochs(positions) #Loading the spike and shank data from wrappers import loadSpikeData, loadEpoch, loadPosition, loadXML spikes, shank = loadSpikeData(data_dir) n_channels, fs, shank_to_channel = loadXML(data_dir) #Loading the wakefulness period data for decoding as it is required to calculate tuning curves and occupancy pos_wake = load_Positions(data_directory, 'wake') wake_ep = correct_Epochs(pos_wake) #Computing Angular Tuning curves for the detection of head-direction cells using Reyleigh's test. #NOTE: Use wakefulness position data to calculate tuning curves and occupancy from functions import computeAngularTuningCurves tuning_curves = computeAngularTuningCurves(spikes, pos_wake['angle'], wake_ep, 61) #spikes: spike data, angle : angle data from all the, no of bins for angles #Defining correct HD Cells using Reileigh's test on angular tuning curves. from functions import findHDCells hd_idx, stat = findHDCells(tuning_curves) tuning_curves = tuning_curves[hd_idx] #To calculate prior using Poisson spiking assumption from functions import decodeHD, decodeHD_overlap2 spikes_hd = {k:spikes[k] for k in hd_idx} occupancy = np.histogram(pos_wake['angle'], np.linspace(0, 2*np.pi, 61), weights = np.ones_like(pos_wake['angle'])/float(len(pos_wake['angle'])))[0] #Here, we will try to decode the HD angle during wake state to see whether the decoding priors like Ocuupancy map and tuning curves are correct or not. wake_dec, prob_wake_dec = decodeHD(tuning_curves, spikes_hd, wake_ep, occupancy, 200) posterior_wake = nts.Tsd(t = prob_wake_dec.index.values, d = prob_wake_dec.max(1).values, time_units = 'ms') ''' figure() subplot(2,1,1) subplot(2,1,1).set_title('Bayesian Decoding during Wakefulness') plot(pos_wake['angle'].restrict(wake_ep), label = 'True HD') plot(wake_dec, label = 'Decoded HD(Bayesian)') legend() subplot(2,1,2) subplot(2,1,2).set_title('Posterior Probability(Bayesian Decoding)') matshow(prob_wake_dec) legend() show() ''' print(ripple_event.shape) #So far, we have calculated the general information that we need for decoding such as occupancy map and spikes of HD cells. They are #important irrespective of the event we are trying to decode. #Now, we will calculate the decoding and probable_angle(wrt time) for each ripple event d = 500 * 1000 ripple_epochs1 = make_Epochs((ep['start'].values[0] + (ripple_event[:,1]*1000000) - d1), (ep['start'].values[0] + (ripple_event[:,1]*1000000) + d1)) #ripple_event is in seconds here... ripple_epochs2 = make_Epochs((ep['start'].values[0] + (ripple_event[:,1]*1000000) - d2), (ep['start'].values[0] + (ripple_event[:,1]*1000000) + d2)) ripple_epochs = make_Epochs((ep['start'].values[0] + (ripple_event[:,1]*1000000) - d), (ep['start'].values[0] + (ripple_event[:,1]*1000000) + d)) proba_angle = [] #Since there are multiple events to decode, the proba_angle will now be a list of decodings for each of the ripple event decoded = [] #e = 67 #signal = signal.as_units('s') if save_pdf == True: print("Initiating Ripple Plotting..") with PdfPages("Ripple_plots_all.pdf") as Pdf: #Some preprocessing to display LFP together... low_cut = 200 high_cut = 400 frequency = 1250 signal = bandPass_filt(lfp_unfiltered = lfp, low_cut = low_cut, high_cut = high_cut, sampling_freq = frequency) ts = np.arange(len(signal))/frequency signal = nts.TsdFrame(ts, signal, time_units = 's') for e in range(5): #for e in range(len(ripple_epochs.index.values)): #Decoding using Non-overlapping equal width bins decoding, p_angle = decodeHD(tuning_curves, spikes_hd, ripple_epochs1[e], occupancy, bin_size_un) #posterior_prob = nts.Tsd(t = p_angle.index.values, d = p_angle.max(1).values, time_units = 'ms') p_mat = p_angle.values entropy1 = -(p_angle*np.log2(p_angle)).sum(1) #print(entropy1) #entropy1 = nts.Tsd(t = p_angle.index.values, d = ent1, time_units = 'ms') #Decoding using Overlapping bins decoding2, p_angle2 = decodeHD_overlap2(tuning_curves, spikes_hd, ripple_epochs2[e], occupancy, bin_size_ov, percent_overlap = percent_overlap) if type(decoding2).__name__ == 'NoneType': continue p_mat2 = p_angle2.values entropy2 = -(p_angle2*np.log2(p_angle2)).sum(1) #print(entropy2) #posterior_prob2 = nts.Tsd(t = p_angle2.index.values, d = p_angle2.max(1).values, time_units = 'ms') #entropy2 = nts.Tsd(t = p_angle2.index.values, d = [-p*math.log(p) for p in posterior_prob2.values], time_units = 'ms') frac = (1/len(spikes_hd)) ind_dix = pd.DataFrame(hd_idx, index = [tuning_curves[k].idxmax() for k in hd_idx], columns = ["cell_id"]) #ind_dix = {tuning_curves[k].idxmax():k for k in hd_idx} w = ind_dix.sort_index() #print(hd_idx) lfp_view = signal.restrict(ripple_epochs[e]) #lfp_view = signal[((ep.as_units('s')['start'].values[0]) + (ripple_event[int(e),0]) - resolution) : ((ep.as_units('s')['start'].values[0]) + (ripple_event[int(e),2]) + resolution)] print("Plotting Figure "+ str(e+1)+".") figure() ax1 = plt.subplot(4,1,1) ax1.set_title('LFP Bandpassed('+ str(low_cut) + '-' + str(high_cut) + 'Hz)') ax1.set_ylabel('mV') ax1.plot(lfp_view) ax1.plot(lfp.restrict(ripple_epochs[e])) ax2 = plt.subplot(4,1,2, sharex = ax1) [[ax2.axvline(_x, linewidth=1, color='r', ymin = i*frac, ymax = (i+1)*frac) for _x in spikes_hd[col].restrict(ripple_epochs[e]).index.values] for col,i in itertools.zip_longest(w['cell_id'].values, np.arange(len(spikes_hd)))] #[ax2.axhline((2*i +1)*frac/2, linewidth=1, color='black') for i in range(len(spikes_hd)+1)] ax2.axis('tight') ax2.set_yticks([(2*i + 1)*frac/2 for i in range(len(hd_idx)+1)]) ax2.set_yticklabels([str('%.2f'%i) for i in w.index.values]) #ax2.set_title('Rastor Plot') ax2.set_ylabel('HD Neuron acc. Preferred Angle') ax3 = plt.subplot(4,1,3, sharex = ax2) #ax3.set_title('Bayesian Decoding') ax3.plot(positions['angle'].restrict(ripple_epochs[e]), label = 'True HD') ax3.plot(decoding, label = 'Decoded HD') ax3.set_ylabel('Decoded Angle(Radians)') ax3.plot(decoding2, label = 'Decoded HD(overlapping)') #ax3.axvline(x = (ripple_epochs.iloc[[e]])['start'].values[0], color = 'green', label = 'Starting point of SWR') #ax3.axvline(x = (ripple_epochs.iloc[[e]])['end'].values[0], color = 'red', label = 'End point of SWR') ax3.legend() ax4 = plt.subplot(4,1,4) #ax4.set_title('Posterior Prob(Bayesian)') ax4.plot(entropy1, label = 'Entropy') ax4.plot(entropy2, label = 'Entropy(Overlapping)') ax4.set_ylabel('Entropy of Decoding') #ax4.axvline(x = (ripple_epochs.iloc[[e]])['start'].values[0], color = 'green', label = 'Starting point of SWR') #ax4.axvline(x = (ripple_epochs.iloc[[e]])['end'].values[0], color = 'red', label = 'End point of SWR') ax4.legend() mng = plt.get_current_fig_manager() mng.window.showMaximized() plt.pause(0.2) try: Pdf.savefig(dpi = 600) except ValueError: continue #legend() #show() plt.close() print("All Plotted. Done!") #sys.exit() entropy_un = [] entropy_b = [] decoded2 = [] decoded = [] print("trying decoding") for i in range(len(ripple_epochs2)): #decoding, p_angle = decodeHD(tuning_curves, spikes_hd, ripple_epochs1[i], occupancy, bin_size_un) #decoded.append(decoding) #decoding, p_angle = decodeHD(tuning_curves, spikes_hd, ripple_epochs.iloc[[i]], occupancy, 20) decoding2, p_angle2 = decodeHD_overlap2(tuning_curves, spikes_hd, ripple_epochs2[i], occupancy, bin_size_ov, percent_overlap = percent_overlap) print(len(decoding2)) decoded2.append(decoding2) #entropy1 = -(p_angle*np.log2(p_angle)).sum(1) #entropy_un.append(entropy1) #decoded.append(decoding) #proba_angle.append(p_angle) #entropy1 = -(p_angle*np.log2(p_angle)).sum(1) #entropy_un.append(entropy1) p_mat2 = p_angle2.values entropy2 = -(p_angle2*np.log2(p_angle2)).sum(1) entropy_b.append(entropy2) print("Done with "+ str(i)) return entropy_b, decoded2