Upload files to ''

This commit is contained in:
jacquelinegoebl 2021-07-16 12:07:15 +02:00
parent 709e572426
commit 3336201c90
5 changed files with 874 additions and 0 deletions

251
do_calc_activity.py Normal file
View File

@ -0,0 +1,251 @@
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.colors as mcolors
import matplotlib.gridspec as gridspec
from IPython import embed
from scipy import stats
import math
import os
from IPython import embed
import helper_functions as hf
from params import *
import itertools
def fill_cbf_plot(matrix, x, t, i, time_point1, time_point2):
matrix[i].extend(x[(t >= time_point1) & (t <= time_point2)])
return matrix
def plot_changes_for_swim_through(x, y, dur, f):
plt.plot(x, y)
plt.title('dur: %.1f, %.1f' % (dur, f))
ax = plt.gca()
ax.beautimechannelaxis()
ax.timeaxis()
plt.show()
def chances_per_bin_filler(time_bins, x, t, cbf, cbf_counter):
for idx, tb in enumerate(time_bins[:-1]):
xx = x[(t >= tb) & (t <= time_bins[idx + 1])]
if np.any(xx):
cbf[0, idx, cbf_counter] = len(xx[xx < 0])
cbf[1, idx, cbf_counter] = len(xx[xx > 0])
cbf[2, idx, cbf_counter] = len(xx[xx == 0])
cbf_counter += 1
return cbf, cbf_counter
def make_trajectory(x, y, kernel):
smooth_y = np.convolve(y, kernel, 'valid')
smooth_x = x[int(np.ceil(kernel_size / 2)):-int(np.floor(kernel_size / 2) - 1)]
# interpolate
fish_x = flat_x[np.where(flat_x == x_tickses[0])[0][0]:np.where(flat_x == x_tickses[-1])[0][0] + 1]
trajectory = np.round(np.interp(fish_x, smooth_x, smooth_y))
return fish_x, trajectory
if __name__ == '__main__':
###################################################################################################################
# parameter and variables
# plot params
inch = 2.45
save_path = '../../thesis/Figures/Results/'
kernel_size = 100
kernel = np.ones(kernel_size) / kernel_size
c = 0
cc = 1
all_first = []
all_last = []
# time_bins in seconds
time_factor = 60*60
time_bins = np.arange(0, 24 * time_factor + 1, bin_len)
time_bins_recordings = np.zeros(len(time_bins)-1)
# changes per bin of bin_len seconds for all fish
cbf = np.full([3, len(time_bins) - 1, 166], np.nan)
cbf_counter = 0
# percent roaming
pr = []
swim_trough_list = []
trial_durs = []
transit_data = []
# average speed
speed = []
# trajectory
trajectories = []
trajec_x = []
std_trajecs = []
# for frequency vs. activity
f = []
eigen = []
males = []
females = []
n = []
all_changes = []
###################################################################################################################
# load data
###################################################################################################################
# load all the data of one day
for index, filename_idx in enumerate([0, 1, 2, 3]):
filename = sorted(os.listdir('../data/'))[filename_idx]
aifl = np.load('../data/' + filename + '/aifl2.npy', allow_pickle=True)
all_xticks = np.load('../data/' + filename + '/all_xtickses.npy', allow_pickle=True)
all_Ctime_v = np.load('../data/' + filename + '/all_Ctime_v.npy', allow_pickle=True)
all_max_ch_means = np.load('../data/' + filename + '/all_max_ch.npy', allow_pickle=True)
power_means = np.load('../data/' + filename + '/power_means.npy', allow_pickle=True)
freq = np.load('../data/' + filename + '/fish_freq_q10.npy', allow_pickle=True)
all_hms = np.load('../data/' + filename + '/all_hms.npy', allow_pickle=True)
names = np.load('../data/' + filename + '/fish_species.npy', allow_pickle=True)
###############################################################################################################
# lists
flat_x = np.unique(np.hstack(all_xticks))
# in which bins is this recording, fill time_bins_recordings
flat_hms = np.unique(np.hstack(all_hms))
for idx, tb in enumerate(time_bins[:-1]):
if np.any((flat_hms >= tb) & (flat_hms <= time_bins[idx + 1])):
time_bins_recordings[idx] += 1
###############################################################################################################
# analysis of the changes and trajectories
for fish_number in range(len(power_means)):
if power_means[fish_number] >= -90.0:
x_tickses = all_xticks[fish_number]
max_ch_mean = all_max_ch_means[fish_number]
# make trajectory
fish_x, trajectory = make_trajectory(x_tickses, max_ch_mean, kernel)
# trial_duration
t_s = datetime.timedelta(np.diff([fish_x[0], fish_x[-1]])[0])
trial_dur = t_s.total_seconds() / 60
trial_durs.append(trial_dur)
changes = np.sum(np.abs(np.diff(trajectory)) > 0.5) / trial_dur
if changes > 6:
continue
# average changes per trial
all_changes.append(changes)
f.append(freq[fish_number, 2])
n.append(names[fish_number])
# percent roaming
m = np.median(trajectory)
percent = (len(trajectory[trajectory > m + 1]) + len(trajectory[trajectory < m - 1])) / len(trajectory)
pr.append(percent)
std_trajecs.append(np.std(trajectory))
# trajectories
trajectories.append(trajectory)
trajec_x.append(all_hms[fish_number])
# average speed
speed.append(np.sum(np.abs(np.diff(trajectory))) / trial_dur)
# activity vs. time
t = all_hms[fish_number][:-1]
x = np.diff(trajectory)
if names[fish_number] == 'Eigenmannia':
cbf, cbf_counter = chances_per_bin_filler(time_bins, x, t, cbf, cbf_counter)
elif names[fish_number] == 'Apteronotus':
cbf, cbf_counter = chances_per_bin_filler(time_bins, x, t, cbf, cbf_counter)
# swim through
first = fish_x[0]
last = fish_x[-1]
start15 = mdates.date2num(mdates.num2date(first) + datetime.timedelta(seconds=2 * 60))
stop15 = mdates.date2num(mdates.num2date(last) - datetime.timedelta(seconds=2 * 60))
if np.any(trajectory[fish_x < start15] >= 13) and np.any(trajectory[fish_x > stop15] <= 2):
c += 1
swim_trough_list.append(True)
transit_data.append(np.array([first, last, trial_dur]))
# print(names[fish_number])
# plot_changes_for_swim_through(fish_x, trajectory, trial_dur, freq[fish_number, 2])
elif np.any(trajectory[fish_x < start15] <= 2) and np.any(trajectory[fish_x > stop15] >= 13):
c += 1
swim_trough_list.append(True)
transit_data.append(np.array([first, last, trial_dur]))
# print(names[fish_number])
# plot_changes_for_swim_through(fish_x, trajectory, trial_dur, freq[fish_number, 2])
elif np.any(trajectory[fish_x < start15] <= 1) \
and np.any(trajectory[fish_x > stop15] >= 6) \
and np.any(trajectory[fish_x > stop15] <= 7):
c += 1
swim_trough_list.append(True)
transit_data.append(np.array([first, last, trial_dur]))
# print(names[fish_number])
# plot_changes_for_swim_through(fish_x, trajectory, trial_dur, freq[fish_number, 2])
elif np.any(trajectory[fish_x < start15] >= 6) \
and np.any(trajectory[fish_x < start15] <= 7) \
and np.any(trajectory[fish_x > stop15] <= 1):
c += 1
swim_trough_list.append(True)
transit_data.append(np.array([first, last, trial_dur]))
# print(names[fish_number])
# plot_changes_for_swim_through(fish_x, trajectory, trial_dur, freq[fish_number, 2])
elif np.any(trajectory[fish_x < start15] >= 14) \
and np.any(trajectory[fish_x > stop15] >= 8) \
and np.any(trajectory[fish_x > stop15] <= 9):
c += 1
swim_trough_list.append(True)
transit_data.append(np.array([first, last, trial_dur]))
# print(names[fish_number])
# plot_changes_for_swim_through(fish_x, trajectory, trial_dur, freq[fish_number, 2])
elif np.any(trajectory[fish_x < start15] >= 8) \
and np.any(trajectory[fish_x < start15] <= 9) \
and np.any(trajectory[fish_x > stop15] >= 14):
c += 1
swim_trough_list.append(True)
transit_data.append(np.array([first, last, trial_dur]))
# print(names[fish_number])
# plot_changes_for_swim_through(fish_x, trajectory, trial_dur, freq[fish_number, 2])
else:
cc += 1
swim_trough_list.append(False)
# np.save('../data/pr.npy', pr)
# np.save('../data/stl.npy', swim_trough_list)
# np.save('../data/speed.npy', speed)
# np.save('../data/trial_dur.npy', trial_durs)
# np.save('../data/trajectories'+str(bin_len)+'.npy', trajectories)
# np.save('../data/trajec_x'+str(bin_len)+'.npy', trajec_x)
# np.save('../data/std_trajec.npy', std_trajecs)
#
# np.save('../data/f.npy', f)
# np.save('../data/all_changes.npy', all_changes)
# np.save('../data/n.npy', n)
#
# np.save('../data/cbf_e'+str(bin_len)+'.npy', cbf_e)
# np.save('../data/cbf_a'+str(bin_len)+'.npy', cbf_a)
np.save('../data/cbf'+str(bin_len)+'.npy', cbf)
embed()
quit()

107
do_calc_eod_times.py Normal file
View File

@ -0,0 +1,107 @@
import sys
import os
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt
from thunderfish.dataloader import open_data
from thunderfish.eodanalysis import eod_waveform
from IPython import embed
def load_tracker_data(foldername):
'''
Load data
:param foldername: where are the data saved
:return: ident_v: identity vector
power: power vector
freq_v: frequency vector
timeidx: time vector in indices
realtime: time vector in relative real time to the beginning
'''
ident_v = np.load('../../../data/' + foldername + '/all_ident_v.npy', allow_pickle=True)
power = np.load('../../../data/' + foldername + '/all_sign_v.npy', allow_pickle=True)
freq_v = np.load('../../../data/' + foldername + '/all_fund_v.npy', allow_pickle=True)
timeidx = np.load('../../../data/' + foldername + '/all_idx_v.npy', allow_pickle=True)
realtime = np.load('../../../data/' + foldername + '/all_times.npy', allow_pickle=True)
aifl = np.load('../data/' + foldername + '/aifl2.npy', allow_pickle=True)
return ident_v, power, freq_v, timeidx, realtime, aifl
def extract_times_freq_for_plotting(aifl, ident_v, freq_v, power_v, timeidx, realtime, fish_number):
t = []
f = []
time_res = np.diff(realtime)[0]
dt = 10 # IN SECONDS
for channel in tqdm(range(16)):
for id in aifl[channel,fish_number][~np.isnan(aifl[channel, fish_number])]:
i_df_power_channel = []
itr = np.arange(len(ident_v[channel]))[ident_v[channel] == id]
for i0 in itr[np.array(np.round(np.linspace(0, len(itr)*.9-1, 100)), dtype=int)]:
freqs_of_interest = freq_v[channel][(np.arange(len(ident_v[channel])) >= i0) &
(np.arange(len(ident_v[channel])) <= i0 + dt / time_res) &
(ident_v[channel] == id)]
df = np.max(freqs_of_interest) - np.min(freqs_of_interest)
mean_f = np.mean(freqs_of_interest)
# if df <= 0.5:
sign_of_interest = power_v[channel][(np.arange(len(ident_v[channel])) >= i0) &
(np.arange(len(ident_v[channel])) <= i0 + dt / time_res) &
(ident_v[channel] == id)]
max_channel = np.argmax(sign_of_interest, axis=1)
power = list(map(lambda x: np.max(x), sign_of_interest))
i_df_power_channel.append([i0, mean_f, np.min(power), max_channel[0], df])
i0, mean_f, power, c, df = i_df_power_channel[np.nanargmax(np.array(i_df_power_channel)[:, 4])]
t.append(realtime[timeidx[channel][i0]])
f.append(mean_f)
return t, f
def main(filename):
'''
Extracts the time points and corresponding frequencies where the EOD waveforms should be calculated
:param filename:
:return: all_t: list; all time points of each fish where the eod should be extracted
all_f: list; all frequencies of each fish where the eod should be extracted
all_fish: list; fish_number of the aifl
'''
# load data
ident_v, power_v, freq_v, timeidx, realtime, aifl = load_tracker_data(filename)
fish_in_aifl = list(np.unique(np.where(~np.isnan(aifl[:, :, 0]))[1]))
all_t = []
all_f = []
all_fish = []
for fish_number in fish_in_aifl:
print(fish_number)
# if 400 <= all_q10[fish_number, 2] <= 650 and power_means[fish_number] >= -90.0:
times, freqs = extract_times_freq_for_plotting(aifl, ident_v, freq_v, power_v, timeidx, realtime, fish_number)
all_t.append(times)
all_f.append(freqs)
all_fish.append(fish_number)
return all_t, all_f, all_fish
if __name__ == '__main__':
for index, filename_idx in enumerate([0, 2, 3, 5]):
filename = sorted(os.listdir('../../../data/mount_data/sanmartin/softgrid_1x16/'))[filename_idx]
print('new file: '+ filename)
all_t, all_f, all_fish = main(filename)
#############################################################################################################
# save data
if filename not in os.listdir('../data/'):
os.mkdir('../data/' + filename)
np.save('../data/' + filename + '/eod_times_new_new.npy', all_t)
np.save('../data/' + filename + '/eod_freq_new_new.npy', all_f)
np.save('../data/' + filename + '/eod_fishnumber_new_new.npy', all_fish)

196
do_check_for_overlap.py Normal file
View File

@ -0,0 +1,196 @@
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.colors as mcolors
from IPython import embed
import helper_functions as hf
import os
import datetime
import itertools
import matplotlib.gridspec as gridspec
from params import *
def plot_overlap_figure(fig, ax, aifl, emptyN1, emptyN2, emptyN3, emptyN4, color_v):
# plot lines in figure
for plot_cidx in range(16):
fish1 = aifl[plot_cidx, emptyN1, ~np.isnan(aifl[plot_cidx, emptyN1])]
fish2 = aifl[plot_cidx, emptyN2, ~np.isnan(aifl[plot_cidx, emptyN2])]
for eN1_idx in range(len(fish1)):
ax.plot(timeidx[plot_cidx][ident[plot_cidx] == fish1[eN1_idx]],
freq[plot_cidx][ident[plot_cidx] == fish1[eN1_idx]],
Linewidth=3, label='1', color=color_v[0], alpha=0.3)
for eN2_idx in range(len(fish2)):
ax.plot(timeidx[plot_cidx][ident[plot_cidx] == fish2[eN2_idx]],
freq[plot_cidx][ident[plot_cidx] == fish2[eN2_idx]],
Linewidth=3, label='2', color=color_v[1], alpha=0.3)
if emptyN3 is not None:
fish3 = aifl[plot_cidx, emptyN3, ~np.isnan(aifl[plot_cidx, emptyN3])]
for eN3_idx in range(len(fish3)):
ax.plot(timeidx[plot_cidx][ident[plot_cidx] == fish3[eN3_idx]],
freq[plot_cidx][ident[plot_cidx] == fish3[eN3_idx]],
Linewidth=3, label='3', color=color_v[4], alpha=0.3)
if emptyN4 is not None:
fish4 = aifl[plot_cidx, emptyN4, ~np.isnan(aifl[plot_cidx, emptyN4])]
for eN4_idx in range(len(fish4)):
ax.plot(timeidx[plot_cidx][ident[plot_cidx] == fish4[eN4_idx]],
freq[plot_cidx][ident[plot_cidx] == fish4[eN4_idx]],
Linewidth=3, label='4', color=color_v[5], alpha=0.3)
# plot the line which has to be assigned to one of the emptyN
ax.plot(timeidx[channel_idx][ident[channel_idx] == false_fish[ff_idx]],
freq[channel_idx][ident[channel_idx] == false_fish[ff_idx]],
Linewidth=1, color='red')
# create legend without duplicated labels
hf.legend_without_duplicate_labels(fig, ax)
plt.show()
def get_list_of_fishN_with_overlap(aifl, fish_in_aifl, time, identity):
liste = []
for fishN in fish_in_aifl:
for Ch_idx in range(16):
fishs_idxs = aifl[Ch_idx, fishN, ~np.isnan(aifl[Ch_idx, fishN])]
len_f_idxs = len(fishs_idxs)
if len_f_idxs >= 2:
time_traces = []
for f_idx in range(len_f_idxs):
time_traces.append(time[Ch_idx][identity[Ch_idx] == fishs_idxs[f_idx]])
for subset in itertools.combinations(fishs_idxs, 2):
r1 = set(time[Ch_idx][identity[Ch_idx] == subset[0]])
result = r1.intersection(time[Ch_idx][identity[Ch_idx] == subset[1]])
if bool(result):
print('overlap -- new sorting')
liste.append(fishN)
liste = np.unique(liste)
return liste
def assigne_ID_to_fishN_in_aifl(aifl, CH_idx, false_fish, i, empty_counter, fishN, N1, N2, N3, N4):
if in_str == '1':
aifl = hf.add_id_to_aifl(aifl, CH_idx, false_fish[i], [[N1]])
elif in_str == '2':
aifl = hf.add_id_to_aifl(aifl, CH_idx, false_fish[i], [[N2]])
elif in_str == '3':
if N3 is None:
N3 = int(empty_fishNs[empty_counter])
empty_counter += 1
aifl = hf.add_id_to_aifl(aifl, CH_idx, false_fish[i], [[N3]])
print(fishN, N1, N2, N3)
else:
aifl = hf.add_id_to_aifl(aifl, CH_idx, false_fish[i], [[N3]])
elif in_str == '4':
if N4 is None:
N4 = int(empty_fishNs[empty_counter])
empty_counter += 1
aifl = hf.add_id_to_aifl(aifl, CH_idx, false_fish[i], [[N4]])
print(fishN, N1, N2, N3, N4)
else:
aifl = hf.add_id_to_aifl(aifl, CH_idx, false_fish[i], [[N4]])
else:
print('trace was not assigned to any fish -- trace Ch+ID:', CH_idx, false_fish[i])
return aifl, empty_counter, N3, N4
if __name__ == '__main__':
###################################################################################################################
# load data
###################################################################################################################
# load all the data of one day
filename = sorted(os.listdir('../../../data/'))[6]
ident = np.load('../../../data/' + filename + '/all_ident_v.npy', allow_pickle=True)
freq = np.load('../../../data/' + filename + '/all_fund_v.npy', allow_pickle=True)
timeidx = np.load('../../../data/' + filename + '/all_idx_v.npy', allow_pickle=True)
aifl = np.load('../data/'+filename+'/aifl2.npy', allow_pickle=True)
faifl = np.load('../data/'+filename+'/faifl2.npy', allow_pickle=True)
# faifl = np.delete(faifl, [0], axis=0)
###################################################################################################################
# params
# color_v, font_size, _, _, _, _ = params.params()
# variables
empty_counter = 0
# lists
fish_in_aifl = list(np.unique(np.where(~np.isnan(aifl[:, :, 0]))[1]))
fish_in_faifl = list(np.unique(faifl[:, [1, 3]]))
###################################################################################################################
# get me the fish_numbers with overlapping traces
new_sorting = get_list_of_fishN_with_overlap(aifl, fish_in_aifl, timeidx, ident)
###################################################################################################################
# get me the fish_numbers with no fish_ids
empty_fishNs = []
for i in range(len(aifl[0])):
if np.all(np.isnan(aifl[:, i])):
empty_fishNs = np.append(empty_fishNs, i)
###################################################################################################################
# get me the fish_numbers with no fish_ids
for fish_number in fish_in_aifl:
emptyN3 = None
emptyN4 = None
ax = hf.plot_together(timeidx, freq, ident, aifl, int(fish_number), color_vec[0])
if fish_number not in new_sorting:
correct_str = input('Do we have to correct the fish? [y/n]')
else:
correct_str = 'y'
if correct_str == 'n':
continue
else:
emptyN1 = int(empty_fishNs[empty_counter])
empty_counter += 1
emptyN2 = int(empty_fishNs[empty_counter])
empty_counter += 1
print(fish_number, emptyN1, emptyN2)
for channel_idx in range(16):
false_fish = aifl[channel_idx, int(fish_number), ~np.isnan(aifl[channel_idx, int(fish_number)])]
for ff_idx in range(len(false_fish)):
# __________________________________________________________________________________________________
# make figure
fig1 = plt.figure(figsize=(16, 14))
gs = gridspec.GridSpec(1, 1, left=0.125, right=0.95, top=0.90, bottom=0.15, wspace=0.15, hspace=0.15)
ax1 = fig1.add_subplot(gs[0, 0])
ax1.set_xlim(ax.get_xlim())
ax1.set_ylim(ax.get_ylim())
fig1.suptitle('Ch {}, ID {}'.format(channel_idx, false_fish[ff_idx]), fontsize=fs)
for i in range(16):
fish1 = aifl[i, fish_number, ~np.isnan(aifl[i, fish_number])]
r1 = len(fish1)
# print(fish1)
for len_idx1 in range(r1):
plt.plot(timeidx[i][ident[i] == fish1[len_idx1]],
freq[i][ident[i] == fish1[len_idx1]],
Linewidth=1, color='gray', alpha=0.2)
plot_overlap_figure(fig1, ax1, aifl, emptyN1, emptyN2, emptyN3, emptyN4, color_vec)
# __________________________________________________________________________________________________
# where does the new red line belong to? -- then fill aifl at the fish_number with the ID of the red
# line
in_str = input('Where does the traces belong to? [1/2/3/4]')
aifl, empty_counter, emptyN3, emptyN4 = assigne_ID_to_fishN_in_aifl(aifl, channel_idx, false_fish,
ff_idx, empty_counter,
fish_number, emptyN1, emptyN2,
emptyN3, emptyN4)
aifl[:, fish_number, :] = np.nan
###################################################################################################################
# save
if filename not in os.listdir('../data/'):
os.mkdir('../data/'+filename)
np.save('../data/' + filename + '/aifl2.npy', aifl)
np.save('../data/' + filename + '/faifl2.npy', faifl)
embed()
quit()

185
do_connect_fish_id.py Normal file
View File

@ -0,0 +1,185 @@
import numpy as np
import matplotlib.pyplot as plt
from IPython import embed
from scipy import stats
from helper_functions import fill_aifl
import os
# from tqdm import tqdm
def connect_fish(aifl, faifl, uni_ident_list, matrix_fish_counter, jumper):
''' function that connects all ids of the channels with the next channels
and can be varied in the check distance by jumper
Parameters
----------
aifl: 3-D array
all identity fish list; 1_D: channel; 2_D: fish number; 3_D: fish identities
faifl: 2-D array
false all identity fish list; 1_D: number of how many false enteries in the aifl exist
2_D: channels and fish number that are falsely connected;
4 columns: Ch, fishN0, Ch_connect, fishN1
uni_ident_list: 2-D array
array of all unique identities per channel; 1_D: channel; 2_D: identities
matrix_fish_counter: int
counter where the new fish should be registered
jumper: int
defines which channel should be compared with which next channel; channel+jumper
Returns
-------
aifl: 3-D array
updated aifl
faifl 2-D array
updated faifl
matrix_fish_counter: int
updated counter
'''
for channel in range(len(uni_ident_list) - jumper):
print(channel)
connect_channel = channel + jumper
# find for each identity the first and last time stamp in the given channel and the next
# channel 0
t_Ch0 = np.empty((len(uni_ident_list[channel]), 2))
for index in range(len(uni_ident_list[channel])):
id0 = uni_ident_list[channel][index]
t = timeidx[channel][ident[channel] == id0]
t_Ch0[index][0] = t[0]
t_Ch0[index][1] = t[-1]
# channel 1
t_Ch1 = np.empty((len(uni_ident_list[connect_channel]), 2))
for index in range(len(uni_ident_list[connect_channel])):
id1 = uni_ident_list[connect_channel][index]
t1 = timeidx[connect_channel][ident[connect_channel] == id1]
t_Ch1[index][0] = t1[0]
t_Ch1[index][1] = t1[-1]
# parameters
jitter_time = 61
tolerance_time = jitter_time*2
false_count = 0
true_count = 0
for i in range(len(t_Ch0)):
for j in range(len(t_Ch1)):
id0 = uni_ident_list[channel][i]
t0 = timeidx[channel][ident[channel] == id0]
f0 = freq[channel][ident[channel] == id0]
id1 = uni_ident_list[connect_channel][j]
t1 = timeidx[connect_channel][ident[connect_channel] == id1]
f1 = freq[connect_channel][ident[connect_channel] == id1]
t00 = t_Ch0[i][0] - jitter_time
t0n = t_Ch0[i][1] + jitter_time
t10 = t_Ch1[j][0] - jitter_time
t1n = t_Ch1[j][1] + jitter_time
# time sorting
sort_it = False
if (t00 <= t10) and (t00 <= t1n) and (t0n >= t1n):
sort_it = True
elif (t10 <= t00) and (t10 <= t0n) and (t1n >= t0n):
sort_it = True
elif (t00 <= t10) and (t0n >= t10) and (t0n <= t1n):
sort_it = True
elif (t10 <= t00) and (t1n >= t00) and (t1n <= t0n):
sort_it = True
else:
false_count += 1
pass
# frequency sorting
window_times = sorted(np.array([t00, t0n, t10, t1n]))[1:3] # only where they are overlapping
if sort_it:
true_count += 1
if window_times[0] < 0:
window_times[0] = 0.0
f0_box_min = np.median(f0[np.isclose(t0, window_times[0], atol=tolerance_time)])
f0_box_max = np.median(f0[np.isclose(t0, window_times[1], atol=tolerance_time)])
f1_box_min = np.median(f1[np.isclose(t1, window_times[0], atol=tolerance_time)])
f1_box_max = np.median(f1[np.isclose(t1, window_times[1], atol=tolerance_time)])
if f0_box_min.size > 0 and f1_box_min.size > 0:
fdiff0 = abs(f0_box_min - f1_box_min)
if fdiff0 <= 2:
matrix_fish_counter, aifl, faifl = fill_aifl(id0, id1, aifl, channel, connect_channel,
matrix_fish_counter,
timeidx, freq, ident, faifl)
else:
continue
elif f0_box_max.size > 0 and f1_box_max.size > 0:
fdiff1 = abs(f0_box_max - f1_box_max)
if fdiff1 <= 2:
matrix_fish_counter, aifl, faifl = fill_aifl(id0, id1, aifl, channel, connect_channel,
matrix_fish_counter,
timeidx, freq, ident, faifl)
else:
continue
return aifl, faifl, matrix_fish_counter
if __name__ == '__main__':
###################################################################################################################
# load data
###################################################################################################################
# load all the data of one day
filename = sorted(os.listdir('../../../data/'))[6]
ident = np.load('../../../data/' + filename + '/all_ident_v.npy', allow_pickle=True)
freq = np.load('../../../data/' + filename + '/all_fund_v.npy', allow_pickle=True)
timeidx = np.load('../../../data/' + filename + '/all_idx_v.npy', allow_pickle=True)
###################################################################################################################
# Parameters
###################################################################################################################
# find me for each channel the unique identities
uni_ident_list = []
for index in range(len(ident)):
uni_ident = np.unique(ident[index][~np.isnan(ident[index])])
uni_ident_list.append(uni_ident)
# all_identity_fish_list
# dim z, y, x, dim 3, 1, 2
aifl = np.empty([16, 500, 100])
aifl.fill(np.nan)
faifl = np.empty([1, 4])
faifl.fill(np.nan)
matrix_fish_counter = 0
for jump in [1, 2, 3]:
print('Jump ', jump)
aifl, faifl, matrix_fish_counter = connect_fish(aifl, faifl, uni_ident_list, matrix_fish_counter, jump)
oofl = []
counter = 0
for idx in range(len(uni_ident_list)):
for j in range(len(uni_ident_list[idx])):
if not np.any(aifl[idx] == uni_ident_list[idx][j]):
oofl.append([idx, uni_ident_list[idx][j]])
counter = counter + 1
###################################################################################################################
# save
if filename not in os.listdir('../data/'):
os.mkdir('../data/'+filename)
np.save('../data/' + filename + '/aifl.npy', aifl)
np.save('../data/' + filename + '/faifl.npy', faifl)
np.save('../data/' + filename + '/oofl.npy', oofl)
embed()
quit()

135
do_correct_for_Q10.py Normal file
View File

@ -0,0 +1,135 @@
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.colors as mcolors
import matplotlib.gridspec as gridspec
import math
from IPython import embed
from scipy import stats
import os
from IPython import embed
from params import *
import datetime
import itertools
import pandas as pd
if __name__ == '__main__':
###################################################################################################################
# load data
###################################################################################################################
# load all the data of one day
filename = sorted(os.listdir('../../../data/'))[6]
ident = np.load('../../../data/' + filename + '/all_ident_v.npy', allow_pickle=True)
freq = np.load('../../../data/' + filename + '/all_fund_v.npy', allow_pickle=True)
timeidx = np.load('../../../data/' + filename + '/all_idx_v.npy', allow_pickle=True)
realtime = np.load('../../../data/' + filename + '/all_times.npy', allow_pickle=True)
temp = pd.read_csv('../../../data/' + filename + '/temperatures.csv', sep=';')
temp_l = np.array(temp.values.tolist())
aifl = np.load('../data/'+filename+'/aifl2.npy', allow_pickle=True)
###################################################################################################################
# parameter
# color_vec, fs, fs_ticks, lw, a, h_bins = params.params()
# variables
mean_bins = temp_l[:, 0] - 150
mean_bins[0] = 0
all_freq_mean = []
literature_q10 = 1.4
# lists
fish_in_aifl = list(np.unique(np.where(~np.isnan(aifl[:, :, 0]))[1]))
fish_q10 = np.full([len(fish_in_aifl), 4], np.nan)
###################################################################################################################
# analysis
for counter, fish_number in enumerate(fish_in_aifl):
q10_werte = []
afm = []
corr_freq_v = []
for channel in range(16):
fish_IDs = aifl[channel, fish_number, ~np.isnan(aifl[channel, fish_number])]
for len_idx1 in range(len(fish_IDs)):
ID = fish_IDs[len_idx1] # current ID
t = timeidx[channel][ident[channel] == ID] # timeidx vec of this ID
f = freq[channel][ident[channel] == ID] # freq vec of this ID
# Cfreq: current frequency vector
# interpol_freq_vec: interpolated frequency vector
Cfreq = np.full([len(realtime)], np.nan)
interpol_freq_vec = np.full([len(realtime)], np.nan)
#######################################################################################################
# fill interpolated frequency vector
Cfreq[t] = f # frequency points on the realtime points
Ctime = realtime[~np.isnan(Cfreq[:])] # time points on the realtime points
all_Ctime = realtime[t[0]:t[-1]+1] # the realtime points
try:
interpol_freq_vec[np.arange(t[0], t[-1]+1)] = np.interp(all_Ctime, Ctime, f)
except:
continue
#######################################################################################################
# freq mean in bins of the sampling rate of the temperature vector
freq_mean = np.full([len(mean_bins)], np.nan)
for i in range(len(mean_bins) - 1):
idx_low = np.where(realtime >= mean_bins[i])[0][0]
idx_up = np.where(realtime <= int(mean_bins[i + 1]))[0][-1]
if i == len(mean_bins) - 1:
freq_mean[i] = np.nanmedian(interpol_freq_vec[idx_low:])
else:
freq_mean[i] = np.nanmedian(interpol_freq_vec[idx_low:idx_up])
afm.append(freq_mean)
#######################################################################################################
# q10 calculation
# every value in freq_mean with every other value
for subset in itertools.combinations(freq_mean[~np.isnan(freq_mean)], 2):
f1 = subset[0]
f2 = subset[1]
T1 = temp_l[np.where(freq_mean == subset[0])[0][0]][1]
T2 = temp_l[np.where(freq_mean == subset[1])[0][0]][1]
if T1 == T2:
continue
else:
q10_werte.append((f2/f1)**(10/(T2-T1)))
fish_q10[counter, 0] = fish_number
fish_q10[counter, 1] = np.nanmedian(q10_werte)
for i in range(len(afm)):
for k in range(len(afm[i])):
if math.isnan(afm[i][k]):
continue
else:
if math.isnan(fish_q10[counter, 1]):
corr_f = afm[i][k] * literature_q10 ** ((25 - temp_l[k, 1]) / 10)
else:
corr_f = afm[i][k] * fish_q10[counter, 1]**((25-temp_l[k, 1])/10)
corr_freq_v.append(corr_f)
fish_q10[counter, 2] = np.nanmedian(corr_freq_v)
fish_q10[counter, 3] = np.nanmax(corr_freq_v) - np.nanmin(corr_freq_v)
# print(np.nanmedian(corr_freq_v), np.nanmax(corr_freq_v) - np.nanmin(corr_freq_v))
all_freq_mean.append(np.nanmean(np.array(afm), axis=0))
if filename not in os.listdir('../data/'):
os.mkdir('../data/'+filename)
os.mkdir('../data/'+filename)
np.save('../data/' + filename + '/fish_freq_q10.npy', fish_q10)
np.save('../data/' + filename + '/all_freq_mean.npy', all_freq_mean)
embed()
quit()