530 lines
20 KiB
Python
530 lines
20 KiB
Python
|
|
from modules.plotstyle import PlotStyle
|
|
from modules.behaviour_handling import (
|
|
Behavior, correct_chasing_events, center_chirps)
|
|
from modules.datahandling import flatten, causal_kde1d, acausal_kde1d
|
|
from modules.logger import makeLogger
|
|
from pandas import read_csv
|
|
from IPython import embed
|
|
from tqdm import tqdm
|
|
import matplotlib.pyplot as plt
|
|
import pandas as pd
|
|
import numpy as np
|
|
import os
|
|
from extract_chirps import get_valid_datasets
|
|
|
|
|
|
logger = makeLogger(__name__)
|
|
ps = PlotStyle()
|
|
|
|
|
|
def bootstrap(data, nresamples, kde_time, kernel_width, event_times, time_before, time_after):
|
|
|
|
bootstrapped_kdes = []
|
|
data = data[data <= 3*60*60] # only night time
|
|
|
|
diff_data = np.diff(np.sort(data), prepend=0)
|
|
# if len(data) != 0:
|
|
# mean_chirprate = (len(data) - 1) / (data[-1] - data[0])
|
|
|
|
for i in tqdm(range(nresamples)):
|
|
|
|
np.random.shuffle(diff_data)
|
|
|
|
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)
|
|
|
|
bootstrapped_kde = acausal_kde1d(
|
|
bootstrap_data_centered, time=kde_time, width=kernel_width)
|
|
|
|
bootstrapped_kde = list(np.asarray(
|
|
bootstrapped_kde) / len(event_times))
|
|
|
|
bootstrapped_kdes.append(bootstrapped_kde)
|
|
|
|
return bootstrapped_kdes
|
|
|
|
|
|
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)):
|
|
|
|
jackknifed_data = np.random.choice(
|
|
diff_data, subsetsize, replace=False)
|
|
|
|
jackknifed_data = np.cumsum(jackknifed_data)
|
|
|
|
jackknifed_data_centered = center_chirps(
|
|
jackknifed_data, event_times, time_before, time_after)
|
|
|
|
jackknifed_kde = acausal_kde1d(
|
|
jackknifed_data_centered, time=kde_time, width=kernel_width)
|
|
|
|
jackknifed_kde = list(np.asarray(
|
|
jackknifed_kde) / len(event_times))
|
|
|
|
jackknife_kdes.append(jackknifed_kde)
|
|
return jackknife_kdes
|
|
|
|
|
|
def get_chirp_winner_loser(folder_name, Behavior, order_meta_df):
|
|
|
|
foldername = folder_name.split('/')[-2]
|
|
winner_row = order_meta_df[order_meta_df['recording'] == foldername]
|
|
winner = winner_row['winner'].values[0].astype(int)
|
|
winner_fish1 = winner_row['fish1'].values[0].astype(int)
|
|
winner_fish2 = winner_row['fish2'].values[0].astype(int)
|
|
|
|
if winner > 0:
|
|
if winner == winner_fish1:
|
|
winner_fish_id = winner_row['rec_id1'].values[0]
|
|
loser_fish_id = winner_row['rec_id2'].values[0]
|
|
|
|
elif winner == winner_fish2:
|
|
winner_fish_id = winner_row['rec_id2'].values[0]
|
|
loser_fish_id = winner_row['rec_id1'].values[0]
|
|
|
|
chirp_winner = Behavior.chirps[Behavior.chirps_ids == winner_fish_id]
|
|
chirp_loser = Behavior.chirps[Behavior.chirps_ids == loser_fish_id]
|
|
|
|
return chirp_winner, chirp_loser
|
|
return None, None
|
|
|
|
|
|
def main(dataroot):
|
|
|
|
foldernames, _ = np.asarray(get_valid_datasets(dataroot))
|
|
plot_all = True
|
|
time_before = 90
|
|
time_after = 90
|
|
dt = 0.001
|
|
kernel_width = 2
|
|
kde_time = np.arange(-time_before, time_after, dt)
|
|
nbootstraps = 50
|
|
|
|
meta_path = (
|
|
'/').join(foldernames[0].split('/')[:-2]) + '/order_meta.csv'
|
|
meta = pd.read_csv(meta_path)
|
|
meta['recording'] = meta['recording'].str[1:-1]
|
|
|
|
winner_onsets = []
|
|
winner_offsets = []
|
|
winner_physicals = []
|
|
|
|
loser_onsets = []
|
|
loser_offsets = []
|
|
loser_physicals = []
|
|
|
|
winner_onsets_boot = []
|
|
winner_offsets_boot = []
|
|
winner_physicals_boot = []
|
|
|
|
loser_onsets_boot = []
|
|
loser_offsets_boot = []
|
|
loser_physicals_boot = []
|
|
|
|
onset_count = 0
|
|
offset_count = 0
|
|
physical_count = 0
|
|
# winner_count = 0
|
|
# loser_count = 0
|
|
# winner_onset_chirpcount = 0
|
|
# winner_offset_chirpcount = 0
|
|
# winner_physical_chirpcount = 0
|
|
# loser_onset_chirpcount = 0
|
|
# loser_offset_chirpcount = 0
|
|
# loser_physical_chirpcount = 0
|
|
fig, ax = plt.subplots(1, 2, figsize=(
|
|
14 * ps.cm, 7*ps.cm), sharey=True, sharex=True)
|
|
# Iterate over all recordings and save chirp- and event-timestamps
|
|
good_recs = np.asarray([0, 15])
|
|
for i, folder in tqdm(enumerate(foldernames[good_recs])):
|
|
|
|
foldername = folder.split('/')[-2]
|
|
# logger.info('Loading data from folder: {}'.format(foldername))
|
|
|
|
broken_folders = ['../data/mount_data/2020-05-12-10_00/']
|
|
if folder in broken_folders:
|
|
continue
|
|
|
|
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:
|
|
continue
|
|
# winner_count += len(winner)
|
|
# loser_count += len(loser)
|
|
|
|
onsets = (timestamps[category == 0])
|
|
offsets = (timestamps[category == 1])
|
|
physicals = (timestamps[category == 2])
|
|
|
|
onset_count += len(onsets)
|
|
offset_count += len(offsets)
|
|
physical_count += len(physicals)
|
|
|
|
winner_onsets.append(center_chirps(
|
|
winner, onsets, time_before, time_after))
|
|
winner_offsets.append(center_chirps(
|
|
winner, offsets, time_before, time_after))
|
|
winner_physicals.append(center_chirps(
|
|
winner, physicals, time_before, time_after))
|
|
|
|
loser_onsets.append(center_chirps(
|
|
loser, onsets, time_before, time_after))
|
|
loser_offsets.append(center_chirps(
|
|
loser, offsets, time_before, time_after))
|
|
loser_physicals.append(center_chirps(
|
|
loser, physicals, time_before, time_after))
|
|
|
|
# winner_onset_chirpcount += len(winner_onsets[-1])
|
|
# winner_offset_chirpcount += len(winner_offsets[-1])
|
|
# winner_physical_chirpcount += len(winner_physicals[-1])
|
|
# loser_onset_chirpcount += len(loser_onsets[-1])
|
|
# loser_offset_chirpcount += len(loser_offsets[-1])
|
|
# loser_physical_chirpcount += len(loser_physicals[-1])
|
|
# bootstrap
|
|
# chirps = [winner, winner, winner, loser, loser, loser]
|
|
|
|
# winner_onsets_boot.append(bootstrap(
|
|
# winner,
|
|
# nresamples=nbootstraps,
|
|
# kde_time=kde_time,
|
|
# kernel_width=kernel_width,
|
|
# event_times=onsets,
|
|
# time_before=time_before,
|
|
# time_after=time_after))
|
|
# winner_offsets_boot.append(bootstrap(
|
|
# winner,
|
|
# nresamples=nbootstraps,
|
|
# kde_time=kde_time,
|
|
# kernel_width=kernel_width,
|
|
# event_times=offsets,
|
|
# time_before=time_before,
|
|
# time_after=time_after))
|
|
# winner_physicals_boot.append(bootstrap(
|
|
# winner,
|
|
# nresamples=nbootstraps,
|
|
# kde_time=kde_time,
|
|
# kernel_width=kernel_width,
|
|
# event_times=physicals,
|
|
# time_before=time_before,
|
|
# time_after=time_after))
|
|
|
|
# loser_onsets_boot.append(bootstrap(
|
|
# loser,
|
|
# nresamples=nbootstraps,
|
|
# kde_time=kde_time,
|
|
# kernel_width=kernel_width,
|
|
# event_times=onsets,
|
|
# time_before=time_before,
|
|
# time_after=time_after))
|
|
loser_offsets_boot.append(bootstrap(
|
|
loser,
|
|
nresamples=nbootstraps,
|
|
kde_time=kde_time,
|
|
kernel_width=kernel_width,
|
|
event_times=offsets,
|
|
time_before=time_before,
|
|
time_after=time_after))
|
|
# loser_physicals_boot.append(bootstrap(
|
|
# loser,
|
|
# nresamples=nbootstraps,
|
|
# kde_time=kde_time,
|
|
# kernel_width=kernel_width,
|
|
# event_times=physicals,
|
|
# time_before=time_before,
|
|
# time_after=time_after))
|
|
|
|
# loser_offsets_jackknife = jackknife(
|
|
# loser,
|
|
# nresamples=nbootstraps,
|
|
# subsetsize=0.9,
|
|
# kde_time=kde_time,
|
|
# kernel_width=kernel_width,
|
|
# event_times=offsets,
|
|
# time_before=time_before,
|
|
# time_after=time_after)
|
|
|
|
if plot_all:
|
|
|
|
# winner_onsets_conv = acausal_kde1d(
|
|
# winner_onsets[-1], kde_time, kernel_width)
|
|
# winner_offsets_conv = acausal_kde1d(
|
|
# winner_offsets[-1], kde_time, kernel_width)
|
|
# winner_physicals_conv = acausal_kde1d(
|
|
# winner_physicals[-1], kde_time, kernel_width)
|
|
|
|
# loser_onsets_conv = acausal_kde1d(
|
|
# loser_onsets[-1], kde_time, kernel_width)
|
|
loser_offsets_conv = acausal_kde1d(
|
|
loser_offsets[-1], kde_time, kernel_width)
|
|
# loser_physicals_conv = acausal_kde1d(
|
|
# loser_physicals[-1], kde_time, kernel_width)
|
|
|
|
ax[i].plot(kde_time, loser_offsets_conv /
|
|
len(offsets), lw=2, zorder=100, c=ps.gblue1)
|
|
|
|
ax[i].fill_between(
|
|
kde_time,
|
|
np.percentile(loser_offsets_boot[-1], 1, axis=0),
|
|
np.percentile(loser_offsets_boot[-1], 99, axis=0),
|
|
color='gray',
|
|
alpha=0.8)
|
|
|
|
ax[i].plot(kde_time, np.median(loser_offsets_boot[-1], axis=0),
|
|
color=ps.black, linewidth=2)
|
|
|
|
ax[i].axvline(0, color=ps.gray, linestyle='--')
|
|
|
|
# ax[i].fill_between(
|
|
# kde_time,
|
|
# np.percentile(loser_offsets_jackknife, 5, axis=0),
|
|
# np.percentile(loser_offsets_jackknife, 95, axis=0),
|
|
# color=ps.blue,
|
|
# alpha=0.5)
|
|
# ax[i].plot(kde_time, np.median(loser_offsets_jackknife, axis=0),
|
|
# color=ps.white, linewidth=2)
|
|
|
|
ax[i].set_xlim(-60, 60)
|
|
fig.supylabel('Chirp rate (a.u.)', fontsize=14)
|
|
fig.supxlabel('Time (s)', fontsize=14)
|
|
|
|
# fig, ax = plt.subplots(2, 3, figsize=(
|
|
# 21*ps.cm, 10*ps.cm), sharey=True, sharex=True)
|
|
# ax[0, 0].set_title(
|
|
# f"{foldername}, onsets {len(onsets)}, offsets {len(offsets)}, physicals {len(physicals)},winner {len(winner)}, looser {len(loser)} , onsets")
|
|
# ax[0, 0].plot(kde_time, winner_onsets_conv/len(onsets))
|
|
# ax[0, 1].plot(kde_time, winner_offsets_conv /
|
|
# len(offsets))
|
|
# ax[0, 2].plot(kde_time, winner_physicals_conv /
|
|
# len(physicals))
|
|
# ax[1, 0].plot(kde_time, loser_onsets_conv/len(onsets))
|
|
# ax[1, 1].plot(kde_time, loser_offsets_conv/len(offsets))
|
|
# 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,
|
|
# color='gray')
|
|
# for kde in winner_offsets_boot[-1]:
|
|
# ax[0, 1].plot(kde_time, kde,
|
|
# color='gray')
|
|
# for kde in winner_physicals_boot[-1]:
|
|
# ax[0, 2].plot(kde_time, kde,
|
|
# color='gray')
|
|
# for kde in loser_onsets_boot[-1]:
|
|
# ax[1, 0].plot(kde_time, kde,
|
|
# color='gray')
|
|
# for kde in loser_offsets_boot[-1]:
|
|
# ax[1, 1].plot(kde_time, kde,
|
|
# color='gray')
|
|
# for kde in loser_physicals_boot[-1]:
|
|
# ax[1, 2].plot(kde_time, kde,
|
|
# color='gray')
|
|
|
|
# plot bootstrap percentiles
|
|
# 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)
|
|
|
|
# winner_onsets = np.sort(flatten(winner_onsets))
|
|
# winner_offsets = np.sort(flatten(winner_offsets))
|
|
# winner_physicals = np.sort(flatten(winner_physicals))
|
|
# loser_onsets = np.sort(flatten(loser_onsets))
|
|
# loser_offsets = np.sort(flatten(loser_offsets))
|
|
# loser_physicals = np.sort(flatten(loser_physicals))
|
|
|
|
# winner_onsets_conv = acausal_kde1d(
|
|
# winner_onsets, kde_time, kernel_width)
|
|
# winner_offsets_conv = acausal_kde1d(
|
|
# winner_offsets, kde_time, kernel_width)
|
|
# winner_physicals_conv = acausal_kde1d(
|
|
# winner_physicals, kde_time, kernel_width)
|
|
# loser_onsets_conv = acausal_kde1d(
|
|
# loser_onsets, kde_time, kernel_width)
|
|
# loser_offsets_conv = acausal_kde1d(
|
|
# loser_offsets, kde_time, kernel_width)
|
|
# loser_physicals_conv = acausal_kde1d(
|
|
# loser_physicals, kde_time, kernel_width)
|
|
|
|
# winner_onsets_conv = winner_onsets_conv / onset_count
|
|
# winner_offsets_conv = winner_offsets_conv / offset_count
|
|
# winner_physicals_conv = winner_physicals_conv / physical_count
|
|
# loser_onsets_conv = loser_onsets_conv / onset_count
|
|
# loser_offsets_conv = loser_offsets_conv / offset_count
|
|
# loser_physicals_conv = loser_physicals_conv / physical_count
|
|
|
|
# winner_onsets_boot = np.concatenate(
|
|
# winner_onsets_boot)
|
|
# winner_offsets_boot = np.concatenate(
|
|
# winner_offsets_boot)
|
|
# winner_physicals_boot = np.concatenate(
|
|
# winner_physicals_boot)
|
|
# loser_onsets_boot = np.concatenate(
|
|
# loser_onsets_boot)
|
|
# loser_offsets_boot = np.concatenate(
|
|
# loser_offsets_boot)
|
|
# loser_physicals_boot = np.concatenate(
|
|
# loser_physicals_boot)
|
|
|
|
# percs = [5, 50, 95]
|
|
# winner_onsets_boot_quarts = np.percentile(
|
|
# winner_onsets_boot, percs, axis=0)
|
|
# winner_offsets_boot_quarts = np.percentile(
|
|
# winner_offsets_boot, percs, axis=0)
|
|
# winner_physicals_boot_quarts = np.percentile(
|
|
# winner_physicals_boot, percs, axis=0)
|
|
# loser_onsets_boot_quarts = np.percentile(
|
|
# loser_onsets_boot, percs, axis=0)
|
|
# loser_offsets_boot_quarts = np.percentile(
|
|
# loser_offsets_boot, percs, axis=0)
|
|
# loser_physicals_boot_quarts = np.percentile(
|
|
# loser_physicals_boot, percs, axis=0)
|
|
|
|
# fig, ax = plt.subplots(2, 3, figsize=(
|
|
# 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, 1].fill_between(kde_time,
|
|
# winner_offsets_boot_quarts[0],
|
|
# winner_offsets_boot_quarts[2],
|
|
# color=ps.gray,
|
|
# alpha=0.5)
|
|
|
|
# ax[0, 2].fill_between(kde_time,
|
|
# loser_physicals_boot_quarts[0],
|
|
# loser_physicals_boot_quarts[2],
|
|
# color=ps.gray,
|
|
# alpha=0.5)
|
|
|
|
# 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, 1].fill_between(kde_time,
|
|
# loser_offsets_boot_quarts[0],
|
|
# loser_offsets_boot_quarts[2],
|
|
# color=ps.gray,
|
|
# alpha=0.5)
|
|
|
|
# ax[1, 2].fill_between(kde_time,
|
|
# loser_physicals_boot_quarts[0],
|
|
# loser_physicals_boot_quarts[2],
|
|
# color=ps.gray,
|
|
# alpha=0.5)
|
|
plt.subplots_adjust(bottom=0.21, top=0.93)
|
|
plt.savefig('../poster/figs/kde.pdf')
|
|
plt.show()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main('../data/mount_data/')
|