diff --git a/code/plot_kdes.py b/code/plot_kdes.py index 03c6621..5fd9cad 100644 --- a/code/plot_kdes.py +++ b/code/plot_kdes.py @@ -18,47 +18,62 @@ logger = makeLogger(__name__) ps = PlotStyle() -def jackknife(data, nresamples, subsetsize, kde_time, kernel_width): +def bootstrap(data, nresamples, kde_time, kernel_width, event_times, time_before, time_after): - if len(data) == 0: - return [] + bootstrapped_kdes = [] + data = data[data <= 3*60*60] # only night time - jackknifed_kdes = [] - data = np.sort(data) - subsetsize = int(np.round(len(data)*subsetsize)) + # diff_data = np.diff(np.sort(data), prepend=0) + # if len(data) != 0: + # mean_chirprate = (len(data) - 1) / (data[-1] - data[0]) - for n in range(nresamples): + for i in tqdm(range(nresamples)): - subset = np.random.choice(data, subsetsize, replace=False) - subset_kde = acausal_kde1d(subset, time=kde_time, width=kernel_width) - jackknifed_kdes.append(subset_kde) + # np.random.shuffle(diff_data) - return jackknifed_kdes + # bootstrapped_data = np.cumsum(diff_data) + bootstrapped_data = data + np.random.randn(len(data)) * 10 + bootstrap_data_centered = center_chirps( + bootstrapped_data, event_times, time_before, time_after) -def bootstrap(data, nresamples, kde_time, kernel_width, event_times, time_before, time_after): + bootstrapped_kde = acausal_kde1d( + bootstrap_data_centered, time=kde_time, width=kernel_width) - bootstrapped_kdes = [] - data = data[data <= 3*60*60] # only night time + # bootstrapped_kdes = list(np.asarray( + # bootstrapped_kdes) / len(event_times)) + + bootstrapped_kdes.append(bootstrapped_kde) + + return bootstrapped_kdes - if len(data) == 0: - logger.info('No data for bootstrap, added zeros') - return [np.zeros_like(kde_time) for i in range(nresamples)] - diff_data = np.diff(np.sort(data), prepend=np.sort(data)[0]) +def jackknife(data, nresamples, subsetsize, kde_time, kernel_width, event_times, time_before, time_after): + + jackknife_kdes = [] + data = data[data <= 3*60*60] # only night time + subsetsize = int(len(data) * subsetsize) + + diff_data = np.diff(np.sort(data), prepend=0) for i in tqdm(range(nresamples)): - np.random.shuffle(diff_data) + bootstrapped_data = np.random.sample(data, subsetsize, replace=False) + bootstrapped_data = np.cumsum(diff_data) + bootstrap_data_centered = center_chirps( bootstrapped_data, event_times, time_before, time_after) + bootstrapped_kde = acausal_kde1d( bootstrap_data_centered, time=kde_time, width=kernel_width) - bootstrapped_kdes.append(bootstrapped_kde) + # bootstrapped_kdes = list(np.asarray( + # bootstrapped_kdes) / len(event_times)) - return bootstrapped_kdes + jackknife_kdes.append(bootstrapped_kde) + + return jackknife_kdes def get_chirp_winner_loser(folder_name, Behavior, order_meta_df): @@ -88,7 +103,7 @@ def get_chirp_winner_loser(folder_name, Behavior, order_meta_df): def main(dataroot): foldernames, _ = get_valid_datasets(dataroot) - plot_all = False + plot_all = True time_before = 60 time_after = 60 dt = 0.001 @@ -134,6 +149,9 @@ def main(dataroot): bh = Behavior(folder) category, timestamps = correct_chasing_events(bh.behavior, bh.start_s) + category = category[timestamps < 3*60*60] # only night time + timestamps = timestamps[timestamps < 3*60*60] # only night time + winner, loser = get_chirp_winner_loser(folder, bh, meta) if winner is None: @@ -162,6 +180,8 @@ def main(dataroot): loser, physicals, time_before, time_after)) # bootstrap + # chirps = [winner, winner, winner, loser, loser, loser] + winner_onsets_boot.append(bootstrap( winner, nresamples=nbootstraps, @@ -240,80 +260,80 @@ def main(dataroot): ax[1, 2].plot(kde_time, loser_physicals_conv/len(physicals)) # # plot bootstrap lines - # for kde in winner_onsets_boot[-1]: - # ax[0, 0].plot(kde_time, kde/len(offsets), - # color='gray') - # for kde in winner_offsets_boot[-1]: - # ax[0, 1].plot(kde_time, kde/len(offsets), - # color='gray') - # for kde in winner_physicals_boot[-1]: - # ax[0, 2].plot(kde_time, kde/len(offsets), - # color='gray') - # for kde in loser_onsets_boot[-1]: - # ax[1, 0].plot(kde_time, kde/len(offsets), - # color='gray') - # for kde in loser_offsets_boot[-1]: - # ax[1, 1].plot(kde_time, kde/len(offsets), - # color='gray') - # for kde in loser_physicals_boot[-1]: - # ax[1, 2].plot(kde_time, kde/len(offsets), - # color='gray') + for kde in winner_onsets_boot[-1]: + ax[0, 0].plot(kde_time, kde/len(onsets), + color='gray') + for kde in winner_offsets_boot[-1]: + ax[0, 1].plot(kde_time, kde/len(offsets), + color='gray') + for kde in winner_physicals_boot[-1]: + ax[0, 2].plot(kde_time, kde/len(physicals), + color='gray') + for kde in loser_onsets_boot[-1]: + ax[1, 0].plot(kde_time, kde/len(onsets), + color='gray') + for kde in loser_offsets_boot[-1]: + ax[1, 1].plot(kde_time, kde/len(offsets), + color='gray') + for kde in loser_physicals_boot[-1]: + ax[1, 2].plot(kde_time, kde/len(physicals), + color='gray') # plot bootstrap percentiles - ax[0, 0].fill_between( - kde_time, - np.percentile(winner_onsets_boot[-1], 5, axis=0)/len(onsets), - np.percentile(winner_onsets_boot[-1], 95, axis=0)/len(onsets), - color='gray', - alpha=0.5) - ax[0, 1].fill_between( - kde_time, - np.percentile(winner_offsets_boot[-1], 5, axis=0)/len(offsets), - np.percentile( - winner_offsets_boot[-1], 95, axis=0)/len(offsets), - color='gray', - alpha=0.5) - ax[0, 2].fill_between( - kde_time, - np.percentile( - winner_physicals_boot[-1], 5, axis=0)/len(physicals), - np.percentile( - winner_physicals_boot[-1], 95, axis=0)/len(physicals), - color='gray', - alpha=0.5) - ax[1, 0].fill_between( - kde_time, - np.percentile(loser_onsets_boot[-1], 5, axis=0)/len(onsets), - np.percentile(loser_onsets_boot[-1], 95, axis=0)/len(onsets), - color='gray', - alpha=0.5) - ax[1, 1].fill_between( - kde_time, - np.percentile(loser_offsets_boot[-1], 5, axis=0)/len(offsets), - np.percentile(loser_offsets_boot[-1], 95, axis=0)/len(offsets), - color='gray', - alpha=0.5) - ax[1, 2].fill_between( - kde_time, - np.percentile( - loser_physicals_boot[-1], 5, axis=0)/len(physicals), - np.percentile( - loser_physicals_boot[-1], 95, axis=0)/len(physicals), - color='gray', - alpha=0.5) - - ax[0, 0].plot(kde_time, np.median(winner_onsets_boot[-1], axis=0)/len(onsets), - color='black', linewidth=2) - ax[0, 1].plot(kde_time, np.median(winner_offsets_boot[-1], axis=0)/len(offsets), - color='black', linewidth=2) - ax[0, 2].plot(kde_time, np.median(winner_physicals_boot[-1], axis=0)/len(physicals), - color='black', linewidth=2) - ax[1, 0].plot(kde_time, np.median(loser_onsets_boot[-1], axis=0)/len(onsets), - color='black', linewidth=2) - ax[1, 1].plot(kde_time, np.median(loser_offsets_boot[-1], axis=0)/len(offsets), - color='black', linewidth=2) - ax[1, 2].plot(kde_time, np.median(loser_physicals_boot[-1], axis=0)/len(physicals), - color='black', linewidth=2) + # ax[0, 0].fill_between( + # kde_time, + # np.percentile(winner_onsets_boot[-1], 5, axis=0), + # np.percentile(winner_onsets_boot[-1], 95, axis=0), + # color='gray', + # alpha=0.5) + # ax[0, 1].fill_between( + # kde_time, + # np.percentile(winner_offsets_boot[-1], 5, axis=0), + # np.percentile( + # winner_offsets_boot[-1], 95, axis=0), + # color='gray', + # alpha=0.5) + # ax[0, 2].fill_between( + # kde_time, + # np.percentile( + # winner_physicals_boot[-1], 5, axis=0), + # np.percentile( + # winner_physicals_boot[-1], 95, axis=0), + # color='gray', + # alpha=0.5) + # ax[1, 0].fill_between( + # kde_time, + # np.percentile(loser_onsets_boot[-1], 5, axis=0), + # np.percentile(loser_onsets_boot[-1], 95, axis=0), + # color='gray', + # alpha=0.5) + # ax[1, 1].fill_between( + # kde_time, + # np.percentile(loser_offsets_boot[-1], 5, axis=0), + # np.percentile(loser_offsets_boot[-1], 95, axis=0), + # color='gray', + # alpha=0.5) + # ax[1, 2].fill_between( + # kde_time, + # np.percentile( + # loser_physicals_boot[-1], 5, axis=0), + # np.percentile( + # loser_physicals_boot[-1], 95, axis=0), + # color='gray', + # alpha=0.5) + + # ax[0, 0].plot(kde_time, np.median(winner_onsets_boot[-1], axis=0), + # color='black', linewidth=2) + # ax[0, 1].plot(kde_time, np.median(winner_offsets_boot[-1], axis=0), + # color='black', linewidth=2) + # ax[0, 2].plot(kde_time, np.median(winner_physicals_boot[-1], axis=0), + # color='black', linewidth=2) + # ax[1, 0].plot(kde_time, np.median(loser_onsets_boot[-1], axis=0), + # color='black', linewidth=2) + # ax[1, 1].plot(kde_time, np.median(loser_offsets_boot[-1], axis=0), + # color='black', linewidth=2) + # ax[1, 2].plot(kde_time, np.median(loser_physicals_boot[-1], axis=0), + # color='black', linewidth=2) ax[0, 0].set_xlim(-30, 30) plt.show() @@ -345,20 +365,18 @@ def main(dataroot): loser_offsets_conv = loser_offsets_conv / offset_count loser_physicals_conv = loser_physicals_conv / physical_count - embed() - winner_onsets_boot = np.concatenate( - winner_onsets_boot) / onset_count + winner_onsets_boot) winner_offsets_boot = np.concatenate( - winner_offsets_boot) / offset_count + winner_offsets_boot) winner_physicals_boot = np.concatenate( - winner_physicals_boot) / physical_count + winner_physicals_boot) loser_onsets_boot = np.concatenate( - loser_onsets_boot) / onset_count + loser_onsets_boot) loser_offsets_boot = np.concatenate( - loser_offsets_boot) / offset_count + loser_offsets_boot) loser_physicals_boot = np.concatenate( - loser_physicals_boot) / physical_count + loser_physicals_boot) percs = [5, 50, 95] winner_onsets_boot_quarts = np.percentile( @@ -378,52 +396,73 @@ def main(dataroot): 21*ps.cm, 10*ps.cm), sharey=True, sharex=True) ax[0, 0].plot(kde_time, winner_onsets_conv) + ax[0, 1].plot(kde_time, winner_offsets_conv) + ax[0, 2].plot(kde_time, winner_physicals_conv) + ax[1, 0].plot(kde_time, loser_onsets_conv) + ax[1, 1].plot(kde_time, loser_offsets_conv) + ax[1, 2].plot(kde_time, loser_physicals_conv) + + ax[0, 0].plot(kde_time, winner_onsets_boot_quarts[1], c=ps.black) + ax[0, 1].plot(kde_time, winner_offsets_boot_quarts[1], c=ps.black) + ax[0, 2].plot(kde_time, winner_physicals_boot_quarts[1], c=ps.black) + ax[1, 0].plot(kde_time, loser_onsets_boot_quarts[1], c=ps.black) + ax[1, 1].plot(kde_time, loser_offsets_boot_quarts[1], c=ps.black) + ax[1, 2].plot(kde_time, loser_physicals_boot_quarts[1], c=ps.black) + + # for kde in winner_onsets_boot: + # ax[0, 0].plot(kde_time, kde, + # color='gray') + # for kde in winner_offsets_boot: + # ax[0, 1].plot(kde_time, kde, + # color='gray') + # for kde in winner_physicals_boot: + # ax[0, 2].plot(kde_time, kde, + # color='gray') + # for kde in loser_onsets_boot: + # ax[1, 0].plot(kde_time, kde, + # color='gray') + # for kde in loser_offsets_boot: + # ax[1, 1].plot(kde_time, kde, + # color='gray') + # for kde in loser_physicals_boot: + # ax[1, 2].plot(kde_time, kde, + # color='gray') + ax[0, 0].fill_between(kde_time, winner_onsets_boot_quarts[0], winner_onsets_boot_quarts[2], color=ps.gray, alpha=0.5) - ax[0, 0].plot(kde_time, winner_onsets_boot_quarts[1], c=ps.black) - ax[0, 1].plot(kde_time, winner_offsets_conv) ax[0, 1].fill_between(kde_time, winner_offsets_boot_quarts[0], winner_offsets_boot_quarts[2], color=ps.gray, alpha=0.5) - ax[0, 1].plot(kde_time, winner_offsets_boot_quarts[1], c=ps.black) - ax[0, 2].plot(kde_time, winner_physicals_conv) ax[0, 2].fill_between(kde_time, loser_physicals_boot_quarts[0], loser_physicals_boot_quarts[2], color=ps.gray, alpha=0.5) - ax[0, 2].plot(kde_time, winner_physicals_boot_quarts[1], c=ps.black) - ax[1, 0].plot(kde_time, loser_onsets_conv) ax[1, 0].fill_between(kde_time, loser_onsets_boot_quarts[0], loser_onsets_boot_quarts[2], color=ps.gray, alpha=0.5) - ax[1, 0].plot(kde_time, loser_onsets_boot_quarts[1], c=ps.black) - ax[1, 1].plot(kde_time, loser_offsets_conv) ax[1, 1].fill_between(kde_time, loser_offsets_boot_quarts[0], loser_offsets_boot_quarts[2], color=ps.gray, alpha=0.5) - ax[1, 1].plot(kde_time, loser_offsets_boot_quarts[1], c=ps.black) - ax[1, 2].plot(kde_time, loser_physicals_conv) ax[1, 2].fill_between(kde_time, loser_physicals_boot_quarts[0], loser_physicals_boot_quarts[2], color=ps.gray, alpha=0.5) - ax[1, 2].plot(kde_time, loser_physicals_boot_quarts[1], c=ps.black) plt.show() diff --git a/poster/figs/algorithm1.pdf b/poster/figs/algorithm1.pdf new file mode 100644 index 0000000..3ac4dfb Binary files /dev/null and b/poster/figs/algorithm1.pdf differ diff --git a/poster/figs/efishlogo.pdf b/poster/figs/efishlogo.pdf new file mode 100644 index 0000000..95372e3 Binary files /dev/null and b/poster/figs/efishlogo.pdf differ diff --git a/poster/main.pdf b/poster/main.pdf index a1d28be..b494d53 100644 Binary files a/poster/main.pdf and b/poster/main.pdf differ diff --git a/poster/main.tex b/poster/main.tex index b746206..c4f1818 100644 --- a/poster/main.tex +++ b/poster/main.tex @@ -7,7 +7,7 @@ blockverticalspace=2mm, colspace=20mm, subcolspace=0mm]{tikzposter} %Default val \begin{document} \renewcommand{\baselinestretch}{1} -\title{\parbox{1500pt}{Detection of transient communication signals in weakly electric fish}} +\title{\parbox{1500pt}{Bypassing time-frequency uncertainty in the detection of transient communication signals in weakly electric fish}} \author{Sina Prause, Alexander Wendt, and Patrick Weygoldt} \institute{Supervised by Till Raab \& Jan Benda, Neuroethology Lab, University of Tuebingen} \usetitlestyle[]{sampletitle} @@ -16,22 +16,25 @@ blockverticalspace=2mm, colspace=20mm, subcolspace=0mm]{tikzposter} %Default val \begin{columns} \column{0.4} -\myblock[TranspBlock]{Introduction}{ +\myblock[GrayBlock]{Introduction}{ The time-frequency tradeoff makes reliable signal detecion and simultaneous - sender identification of freely interacting individuals impossible. - This profoundly limits our current understanding of chirps to experiments + sender identification by simple Fourier decomposition in freely interacting + weakly electric fish impossible. This profoundly limits our current + understanding of chirps to experiments with single - or physically separated - individuals. - \begin{tikzfigure}[] - \label{griddrawing} -<<<<<<< HEAD -======= - \includegraphics[width=0.8\linewidth]{figs/introplot} ->>>>>>> cdcf9564df07914cf57225de5a8bdaa642fbad0e - \end{tikzfigure} + % \begin{tikzfigure}[] + % \label{griddrawing} + % \includegraphics[width=0.8\linewidth]{figs/introplot} + % \end{tikzfigure} } \myblock[TranspBlock]{Chirp detection}{ \begin{tikzfigure}[] - \label{fig:example_a} + \label{fig:alg1} + \includegraphics[width=0.9\linewidth]{figs/algorithm1} + \end{tikzfigure} + \vspace{2cm} + \begin{tikzfigure}[] + \label{fig:alg2} \includegraphics[width=1\linewidth]{figs/algorithm} \end{tikzfigure} \vspace{0cm} diff --git a/poster/style.tex b/poster/style.tex index 0397831..da09710 100644 --- a/poster/style.tex +++ b/poster/style.tex @@ -34,7 +34,7 @@ \centering % \vspace{1cm} \hspace{-10cm} - \includegraphics[width=\linewidth]{example-image-a} + \includegraphics[width=0.8\linewidth]{figs/efishlogo.pdf} \end{minipage}} % \begin{minipage}[c]{0.2\paperwidth} % \vspace{1cm}\hspace{1cm}