From e6fafa2f7286966564562d6b3487673dd89d679a Mon Sep 17 00:00:00 2001 From: efish Date: Tue, 27 Nov 2018 14:58:25 +0100 Subject: [PATCH] neu --- code/base_chirps.py | 81 ++++++++++++------------------ code/base_spikes.py | 120 ++++++++++++++++++++++---------------------- code/func_chirp.py | 98 ++++++++++++++++++++++++++---------- code/func_spike.py | 62 +++++++++++++++++++++++ 4 files changed, 226 insertions(+), 135 deletions(-) diff --git a/code/base_chirps.py b/code/base_chirps.py index e8064a2..f19b18e 100644 --- a/code/base_chirps.py +++ b/code/base_chirps.py @@ -8,66 +8,51 @@ from IPython import embed data_dir = "../data" -dataset = "2018-11-09-ad-invivo-1" -#data = ("2018-11-09-ad-invivo-1", "2018-11-09-ae-invivo-1", "2018-11-09-ag-invivo-1", "2018-11-13-aa-invivo-1", "2018-11-13-ac-invivo-1", "2018-11-13-ad-invivo-1", "2018-11-13-ah-invivo-1", "2018-11-13-ai-invivo-1", "2018-11-13-aj-invivo-1", "2018-11-13-ak-invivo-1", "2018-11-13-al-invivo-1", "2018-11-14-aa-invivo-1", "2018-11-14-ac-invivo-1", "2018-11-14-ad-invivo-1", "2018-11-14-af-invivo-1", "2018-11-14-ag-invivo-1", "2018-11-14-ah-invivo-1", "2018-11-14-ai-invivo-1", "2018-11-14-ak-invivo-1", "2018-11-14-al-invivo-1", "2018-11-14-am-invivo-1", "2018-11-14-an-invivo-1","2018-11-20-aa-invivo-1", "2018-11-20-ab-invivo-1", "2018-11-20-ac-invivo-1", "2018-11-20-ad-invivo-1"," 2018-11-20-ae-invivo-1", "2018-11-20-af-invivo-1", "2018-11-20-ag-invivo-1", "2018-11-20-ah-invivo-1", "2018-11-20-ai-invivo-1") +data = ("2018-11-09-ad-invivo-1", "2018-11-09-ae-invivo-1", "2018-11-09-ag-invivo-1", "2018-11-13-aa-invivo-1", "2018-11-13-ac-invivo-1", "2018-11-13-ad-invivo-1", "2018-11-13-ah-invivo-1", "2018-11-13-ai-invivo-1", "2018-11-13-aj-invivo-1", "2018-11-13-ak-invivo-1", "2018-11-13-al-invivo-1", "2018-11-14-aa-invivo-1", "2018-11-14-ac-invivo-1", "2018-11-14-ad-invivo-1", "2018-11-14-af-invivo-1", "2018-11-14-ag-invivo-1", "2018-11-14-ah-invivo-1", "2018-11-14-ai-invivo-1", "2018-11-14-ak-invivo-1", "2018-11-14-al-invivo-1", "2018-11-14-am-invivo-1", "2018-11-14-an-invivo-1", "2018-11-20-aa-invivo-1", "2018-11-20-ab-invivo-1", "2018-11-20-ac-invivo-1", "2018-11-20-ad-invivo-1", "2018-11-20-ae-invivo-1", "2018-11-20-af-invivo-1", "2018-11-20-ag-invivo-1", "2018-11-20-ah-invivo-1", "2018-11-20-ai-invivo-1") -#for dataset in data: -eod = read_chirp_eod(os.path.join(data_dir, dataset)) -times = read_chirp_times(os.path.join(data_dir, dataset)) -df_map = map_keys(eod) +for dataset in data: + print(dataset) + eod = read_chirp_eod(os.path.join(data_dir, dataset)) + times = read_chirp_times(os.path.join(data_dir, dataset)) + df_map = map_keys(eod) + sort_df = sorted(df_map.keys()) -chirp_eod_plot(df_map, eod, times) -plt.close() + chirp_eod_plot(df_map, eod, times) -#ACHTUNG: df für beide Plots anpassen! -#momentan per Hand durch alle Frequenzen -freq = list(df_map[-100]) -ls_mod = [] -ls_beat = [] -for k in freq: - e1 = eod[k] - zeit = np.asarray(e1[0]) - ampl = np.asarray(e1[1]) - ct = times[k] - for chirp in ct: - time_cut = zeit[(zeit > chirp-10) & (zeit < chirp+10)] - eods_cut = ampl[(zeit > chirp-10) & (zeit < chirp+10)] - beat_cut = ampl[(zeit > chirp-55) & (zeit < chirp-10)] - - chirp_mod = np.std(eods_cut) #Std vom Bereich um den Chirp - ls_mod.append(chirp_mod) - ls_beat.extend(beat_cut) + chirp_mods = [] + beat_mods = [] + for i in sort_df: + freq = list(df_map[i]) + ls_mod, beat_mod = cut_chirps(freq, eod, times) + chirp_mods.append(ls_mod) + beat_mods.append(beat_mod) -beat_mod = np.std(ls_beat) #Std vom Bereich vor dem Chirp -plt.figure() -plt.scatter(np.arange(0,len(ls_mod),1), ls_mod) -plt.scatter(np.arange(0,len(ls_mod),1), np.ones(len(ls_mod))*beat_mod, color = 'violet') -plt.close() -#Chirps einer Phase zuordnen - zusammen plotten + #Chirps einer Phase zuordnen - zusammen plotten -dct_phase = {} -chirp_spikes = read_chirp_spikes(os.path.join(data_dir, dataset)) -df_map = map_keys(chirp_spikes) -sort_df = sorted(df_map.keys()) + chirp_spikes = read_chirp_spikes(os.path.join(data_dir, dataset)) + df_map = map_keys(chirp_spikes) + sort_df = sorted(df_map.keys()) -num_bin = 12 -phase_vec = np.arange(0, 1+1/num_bin, 1/num_bin) + #plot_std_chirp(sort_df, df_map, chirp_spikes, chirp_mods) -for i in sort_df: - freq = list(df_map[i]) - dct_phase[i] = [] - for k in freq: - for phase in chirp_spikes[k]: - dct_phase[i].append(phase[1]) -plt.figure() -plt.scatter(dct_phase[-100], ls_mod) -plt.title('Change of std depending on the phase where the chirp occured') -plt.show() + + + #Vatriablen speichern, die man für die Übersicht aller Zellen braucht + name = str(dataset.strip('invivo-1')) + f = open('../results/Chirpcut/Cc_' + name + '.dat' , 'w') + f.write(str(sort_df)) + f.write(str(df_map)) + f.write(str(chirp_spikes)) + f.write(str(eod)) + f.write(str(times)) + #f.write(str(chirp_mods)) + #f.write(str(beat_mods)) + f.close() diff --git a/code/base_spikes.py b/code/base_spikes.py index a6c4720..9f8bbc2 100644 --- a/code/base_spikes.py +++ b/code/base_spikes.py @@ -1,95 +1,93 @@ from read_baseline_data import * from read_chirp_data import * -from utility import * -#import nix_helpers as nh +from func_spike import * import matplotlib.pyplot as plt import numpy as np from IPython import embed #Funktionen imposrtieren + data_dir = "../data" -dataset = "2018-11-13-ad-invivo-1" -#data = ("2018-11-09-ad-invivo-1", "2018-11-13-aa-invivo-1", "2018-11-13-ad-invivo-1", "2018-11-09-af-invivo-1", "2018-11-09-ag-invivo-1", "2018-11-13-ah-invivo-1", "2018-11-13-ai-invivo-1", "2018-11-13-aj-invivo-1", "2018-11-13-ak-invivo-1", "2018-11-13-al-invivo-1", "2018-11-14-aa-invivo-1", "2018-11-14-ab-invivo-1", "2018-11-14-ac-invivo-1", "2018-11-14-ad-invivo-1", "2018-11-14-ae-invivo-1", "2018-11-14-af-invivo-1", "2018-11-14-ag-invivo-1", "2018-11-14-ah-invivo-1", "2018-11-14-aj-invivo-1", "2018-11-14-ak-invivo-1", "2018-11-14-al-invivo-1", "2018-11-14-am-invivo-1", "2018-11-14-an-invivo-1", "2018-11-20-aa-invivo-1", "2018-11-20-ab-invivo-1", "2018-11-20-ac-invivo-1", "2018-11-20-ad-invivo-1"," 2018-11-20-ae-invivo-1", "2018-11-20-af-invivo-1", "2018-11-20-ag-invivo-1", "2018-11-20-ah-invivo-1", "2018-11-20-ai-invivo-1") Durchgang für alle Datensets - zwischenspeichern von Daten? +data_base = ("2018-11-09-ab-invivo-1", "2018-11-09-ad-invivo-1", "2018-11-13-aa-invivo-1", "2018-11-13-ab-invivo-1", "2018-11-13-ad-invivo-1", "2018-11-13-af-invivo-1", "2018-11-13-ag-invivo-1", "2018-11-13-ah-invivo-1", "2018-11-13-ai-invivo-1", "2018-11-13-aj-invivo-1", "2018-11-13-ak-invivo-1", "2018-11-13-al-invivo-1", "2018-11-14-ab-invivo-1", "2018-11-14-ac-invivo-1", "2018-11-14-ad-invivo-1", "2018-11-14-ae-invivo-1", "2018-11-14-af-invivo-1", "2018-11-14-ag-invivo-1", "2018-11-14-aj-invivo-1", "2018-11-14-ak-invivo-1", "2018-11-14-al-invivo-1", "2018-11-14-am-invivo-1", "2018-11-14-an-invivo-1", "2018-11-20-ab-invivo-1", "2018-11-20-ac-invivo-1", "2018-11-20-ad-invivo-1", "2018-11-20-ae-invivo-1", "2018-11-20-af-invivo-1", "2018-11-20-ag-invivo-1", "2018-11-20-ah-invivo-1", "2018-11-20-ai-invivo-1") +data_chirps = ("2018-11-09-ad-invivo-1", "2018-11-09-ae-invivo-1", "2018-11-09-ag-invivo-1", "2018-11-13-aa-invivo-1", "2018-11-13-ac-invivo-1", "2018-11-13-ad-invivo-1", "2018-11-13-ah-invivo-1", "2018-11-13-ai-invivo-1", "2018-11-13-aj-invivo-1", "2018-11-13-ak-invivo-1", "2018-11-13-al-invivo-1", "2018-11-14-aa-invivo-1", "2018-11-14-ac-invivo-1", "2018-11-14-ad-invivo-1", "2018-11-14-af-invivo-1", "2018-11-14-ag-invivo-1", "2018-11-14-ah-invivo-1", "2018-11-14-ai-invivo-1", "2018-11-14-ak-invivo-1", "2018-11-14-al-invivo-1", "2018-11-14-am-invivo-1", "2018-11-14-an-invivo-1", "2018-11-20-aa-invivo-1", "2018-11-20-ab-invivo-1", "2018-11-20-ac-invivo-1", "2018-11-20-ad-invivo-1", "2018-11-20-ae-invivo-1", "2018-11-20-af-invivo-1", "2018-11-20-ag-invivo-1", "2018-11-20-ah-invivo-1", "2018-11-20-ai-invivo-1") + +''' +for dataset in data_base: -spike_times = read_baseline_spikes(os.path.join(data_dir, dataset)) -spike_iv = np.diff(spike_times) + print(dataset) + spike_times = read_baseline_spikes(os.path.join(data_dir, dataset)) + spike_iv = np.diff(spike_times) + x = np.arange(0.001, 0.01, 0.0001) + plt.hist(spike_iv,x) + mu = np.mean(spike_iv) + sigma = np.std(spike_iv) + cv = sigma/mu -x = np.arange(0.001, 0.01, 0.0001) -plt.hist(spike_iv,x) + plt.title('A.lepto ISI Histogramm', fontsize = 14) + plt.xlabel('duration ISI[ms]', fontsize = 12) + plt.ylabel('number of ISI', fontsize = 12) -mu = np.mean(iv) -sigma = np.std(iv) -cv = sigma/mu + plt.xticks(fontsize = 12) + plt.yticks(fontsize = 12) +''' -plt.title('A.lepto ISI Histogramm', fontsize = 14) -plt.xlabel('duration ISI[ms]', fontsize = 12) -plt.ylabel('number of ISI', fontsize = 12) -plt.xticks(fontsize = 12) -plt.yticks(fontsize = 12) -plt.show() +for dataset in data_chirps: + #Nyquist-Theorem Plot: + print(dataset) + chirp_spikes = read_chirp_spikes(os.path.join(data_dir, dataset)) + times = read_chirp_times(os.path.join(data_dir, dataset)) + eod = read_chirp_eod(os.path.join(data_dir, dataset)) + df_map = map_keys(chirp_spikes) + sort_df = sorted(df_map.keys()) + dct_rate, over_r = spike_rates(sort_df, df_map, chirp_spikes) -#Nyquist-Theorem Plot: + plt.figure() + ls_mean = plot_df_spikes(sort_df, dct_rate) -chirp_spikes = read_chirp_spikes(os.path.join(data_dir, dataset)) -df_map = map_keys(chirp_spikes) -sort_df = sorted(df_map.keys()) -plt.figure() -dct_rate = {} -overall_r = {} -for i in sort_df: - freq = list(df_map[i]) - dct_rate[i] = [] - overall_r[i] = [] - for k in freq: - for phase in chirp_spikes[k]: - spikes = chirp_spikes[k][phase] - rate = len(spikes)/ 1.2 - dct_rate[i].append(rate) - #overall_r[i].extend(rate) #kann man nicht erweitern! -ls_mean = [] -for h in sort_df: - mean = np.mean(dct_rate[h]) - ls_mean.append(mean) - plt.plot(np.arange(0,len(dct_rate[h]),1),dct_rate[h], label = h) + #mittlere Feuerrate einer Frequenz auf Frequenz: -#plt.vlines(10, ymin = 190, ymax = 310) -#Anfang Spur und Endpunkt bestimmen -#relativ zur mittleren Feuerrate -#wie hoch ist die Adaption von Zellen -plt.legend() -plt.title('Firing rate of the cell for all trials, sorted by df') -plt.xlabel('# of trials') -plt.ylabel('Instant firing rate of the cell') -plt.show() + plt.figure() + plt.plot(np.arange(0,len(ls_mean),1),ls_mean) + plt.scatter(np.arange(0,len(ls_mean),1), np.ones(len(ls_mean))*over_r) + plt.title('Mean firing rate of a cell for a range of frequency differences') + plt.xticks(np.arange(1,len(sort_df),1), (sort_df)) + plt.xlabel('Range of frequency differences [Hz]') + plt.ylabel('Mean firing rate of the cell') -#mittlere Feuerrate einer Frequenz auf Frequenz: -plt.figure() -plt.plot(np.arange(0,len(ls_mean),1),ls_mean) -#plt.scatter(np.arange(0,len(ls_mean),1), np.mean(int(overall_r))) -plt.title('Mean firing rate of a cell for a range of frequency differences') -plt. xticks(np.arange(1,len(sort_df),1), (sort_df)) -plt.xlabel('Range of frequency differences [Hz]') -plt.ylabel('Mean firing rate of the cell') -plt.show() + #Adaption der Zellen: + #wie viel Prozent der Anfangsrate macht die Adaption von Zellen aus? + adapt = adaptation_df(sort_df, dct_rate) + plt.figure() + plt.boxplot(adapt) + plt.title('Adaptation of cell firing rate during a trial') + plt.xlabel('Cell') + plt.ylabel('Adaptation size [Hz]') -#Boxplot -#wie viel Prozent macht die Adaption von Zellen aus? -#Reihen-Plot -#macht die zeitliche Reihenfolge der Präsentation einen Unterschied in der Zellantwort? + #Vatriablen speichern, die man für die Übersicht aller Zellen braucht + name = str(dataset.strip('invivo-1')) + f = open('../results/Nyquist/Ny_' + name + '.txt' , 'w') + f.write(str(sort_df)) + f.write(str(df_map)) + f.write(str(chirp_spikes)) + f.write(str(times)) + f.write(str(ls_mean)) + f.write(str(over_r)) + f.write(str(adapt)) + f.close() diff --git a/code/func_chirp.py b/code/func_chirp.py index 85823b8..836b52d 100644 --- a/code/func_chirp.py +++ b/code/func_chirp.py @@ -10,32 +10,78 @@ def chirp_eod_plot(df_map, eod, times): #die innnere Schleife bildet die 16 Wiederholungen einer Frequenz ab for i in df_map.keys(): - freq = list(df_map[i]) - fig,axs = plt.subplots(2, 2, sharex = True, sharey = True) + freq = list(df_map[i]) + fig,axs = plt.subplots(2, 2, sharex = True, sharey = True) - for idx, k in enumerate(freq): - ct = times[k] - e1 = eod[k] - zeit = e1[0] - eods = e1[1] + for idx, k in enumerate(freq): + ct = times[k] + e1 = eod[k] + zeit = e1[0] + eods = e1[1] - if idx <= 3: - axs[0, 0].plot(zeit, eods, color= 'blue', linewidth = 0.25) - axs[0, 0].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) - elif 4<= idx <= 7: - axs[0, 1].plot(zeit, eods, color= 'blue', linewidth = 0.25) - axs[0, 1].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) - elif 8<= idx <= 11: - axs[1, 0].plot(zeit, eods, color= 'blue', linewidth = 0.25) - axs[1, 0].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) - else: - axs[1, 1].plot(zeit, eods, color= 'blue', linewidth = 0.25) - axs[1, 1].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) - -fig.suptitle('EOD for chirps', fontsize = 16) -axs[0,0].set_ylabel('Amplitude [mV]') -axs[0,1].set_xlabel('Amplitude [mV]') -axs[1,0].set_xlabel('Time [ms]') -axs[1,1].set_xlabel('Time [ms]') -plt.show() + if idx <= 3: + axs[0, 0].plot(zeit, eods, color= 'blue', linewidth = 0.25) + axs[0, 0].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) + elif 4<= idx <= 7: + axs[0, 1].plot(zeit, eods, color= 'blue', linewidth = 0.25) + axs[0, 1].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) + elif 8<= idx <= 11: + axs[1, 0].plot(zeit, eods, color= 'blue', linewidth = 0.25) + axs[1, 0].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) + else: + axs[1, 1].plot(zeit, eods, color= 'blue', linewidth = 0.25) + axs[1, 1].scatter(np.asarray(ct), np.ones(len(ct))*3, color = 'green', s= 22) + + fig.suptitle('EOD for chirps', fontsize = 16) + axs[0,0].set_ylabel('Amplitude [mV]') + axs[0,1].set_xlabel('Amplitude [mV]') + axs[1,0].set_xlabel('Time [ms]') + axs[1,1].set_xlabel('Time [ms]') + plt.close() + + + +def cut_chirps(freq, eod, times): + ls_mod = [] + ls_beat = [] + for k in freq: + e1 = eod[k] + zeit = np.asarray(e1[0]) + ampl = np.asarray(e1[1]) + + ct = times[k] + for chirp in ct: + time_cut = zeit[(zeit > chirp-10) & (zeit < chirp+10)] + eods_cut = ampl[(zeit > chirp-10) & (zeit < chirp+10)] + beat_cut = ampl[(zeit > chirp-55) & (zeit < chirp-10)] + + chirp_mod = np.std(eods_cut) #Std vom Bereich um den Chirp + ls_mod.append(chirp_mod) + ls_beat.extend(beat_cut) + + beat_mod = np.std(ls_beat) #Std vom Bereich vor dem Chirp + plt.figure() + plt.scatter(np.arange(0,len(ls_mod),1), ls_mod) + plt.scatter(np.arange(0,len(ls_mod),1), np.ones(len(ls_mod))*beat_mod, color = 'violet') + plt.close() + return(ls_mod, beat_mod) + + + +def plot_std_chirp(sort_df, df_map, chirp_spikes, ls_mod): + plt.figure() + dct_phase = {} + num_bin = 12 + phase_vec = np.arange(0, 1+1/num_bin, 1/num_bin) + + for i in sort_df: + freq = list(df_map[i]) + dct_phase[i] = [] + for k in freq: + for phase in chirp_spikes[k]: + dct_phase[i].append(phase[1]) + + plt.scatter(dct_phase[i], ls_mod[i]) + plt.title('Change of std depending on the phase where the chirp occured') + plt.close() diff --git a/code/func_spike.py b/code/func_spike.py index 1a4072d..d512986 100644 --- a/code/func_spike.py +++ b/code/func_spike.py @@ -5,3 +5,65 @@ import matplotlib.pyplot as plt import numpy as np + +def map_keys(input): +#gibt ein Dict mit den Keys eines Dict aus, aber als Int + df_map = {} + for k in input.keys(): + freq = k[1] + df = int(freq.strip('Hz')) + if df in df_map.keys(): + df_map[df].append(k) + else: + df_map[df] = [k] + return df_map + + + +def spike_rates(sort_df, df_map, chirp_spikes): +#damit wird sowohl die individuelle Rate pro Trial, als auch die Gesamt-Feuerrate berechnet + dct_rate = {} + over_spikes = [] + for i in sort_df: + freq = list(df_map[i]) + dct_rate[i] = [] + for k in freq: + for phase in chirp_spikes[k]: + spikes = chirp_spikes[k][phase] + rate = len(spikes)/ 1.2 + dct_rate[i].append(rate) + over_spikes.extend(spikes) + + duration = 1.2 *1600 #1200ms für 16 Trials + overall_r = len(over_spikes)/ duration + over_r = int(overall_r) + return(dct_rate, over_r) + + + +def plot_df_spikes(sort_df, dct_rate): +#gibt die Feuerrate gegen die Frequenz aufgetragen + ls_mean = [] + for h in sort_df: + mean = np.mean(dct_rate[h]) + ls_mean.append(mean) + plt.plot(np.arange(0,len(dct_rate[h]),1),dct_rate[h], label = h) + + plt.legend() + plt.title('Firing rate of the cell for all trials, sorted by df') + plt.xlabel('# of trials') + plt.ylabel('Instant firing rate of the cell') + return(ls_mean) + + + +def adaptation_df(sort_df, dct_rate): + adapt = [] + for d in sort_df: + spur = dct_rate[d] + start = spur[0:-1:10] + stop = spur[9:len(spur):10] + diff = np.asarray(start) - np.asarray(stop) + adapt.extend(diff) + + return(adapt)