neues bild hinzugefügt

This commit is contained in:
saschuta 2024-06-13 12:10:14 +02:00
parent 08388ae10e
commit 75106e9095
6 changed files with 80 additions and 93 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -40,7 +40,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
#reshuffled = 'reshuffled' # , #reshuffled = 'reshuffled' # ,
# standard combination with intruder small # standard combination with intruder small
a_f2s = [0.1]
min_amps = '_minamps_' min_amps = '_minamps_'
dev_name = ['05'] dev_name = ['05']
@ -60,7 +60,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
position_diff = 0 position_diff = 0
plot_style() plot_style()
default_figsize(column=2, length=7.5) default_figsize(column=2, length=5.5)
######################################## ########################################
@ -75,7 +75,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
DF2_frmult[d] = recalc_fr_to_DF1(DF2_frmult, d, frame_cell.fr_data.iloc[0]) DF2_frmult[d] = recalc_fr_to_DF1(DF2_frmult, d, frame_cell.fr_data.iloc[0])
DF1_frmult[d] = recalc_fr_to_DF1(DF1_frmult, d, frame_cell.fr_data.iloc[0]) DF1_frmult[d] = recalc_fr_to_DF1(DF1_frmult, d, frame_cell.fr_data.iloc[0])
##DF2_frmult[d] = recalc_fr_to_DF1(DF2_frmult, d, frame_cell.fr_data.iloc[0]) ##DF2_frmult[d] = recalc_fr_to_DF1(DF2_frmult, d, frame_cell.fr_data.iloc[0])
freqs = [(DF1_frmult[2], DF2_frmult[2])] freqs = [(DF1_frmult[3], DF2_frmult[3])]
@ -88,6 +88,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
nfft = 32768 nfft = 32768
cells_here = ['2012-07-03-ak-invivo-1'] cells_here = ['2012-07-03-ak-invivo-1']
cells_here = ["2013-01-08-aa-invivo-1"]
for cell_here in cells_here: for cell_here in cells_here:
########################################### ###########################################
@ -100,24 +101,26 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
full_names = ['calc_model_amp_freqs-_F1_0.22833333333333333Fr_F2_1Fr_af_coupled__C1Len_50_FirstC1_0.0001_LastC1_1.0_FRrelavtiv__start_0.0001_end_1_StimLen_100_nfft_20000_trialsnr_1_mult_minimum_1_power_1_minamps__dev_original_05_point_1temporal', full_names = ['calc_model_amp_freqs-_F1_0.22833333333333333Fr_F2_1Fr_af_coupled__C1Len_50_FirstC1_0.0001_LastC1_1.0_FRrelavtiv__start_0.0001_end_1_StimLen_100_nfft_20000_trialsnr_1_mult_minimum_1_power_1_minamps__dev_original_05_point_1temporal',
'calc_model_amp_freqs-_F1_0.22833333333333333Fr_F2_1Fr_af_coupled__C1Len_50_FirstC1_0.0001_LastC1_1.0_FRrelavtiv__start_0.0001_end_1_StimLen_100_nfft_20000_trialsnr_1_mult_minimum_1_power_1_minamps__dev_original_05_point_1_old_fit_temporal'] 'calc_model_amp_freqs-_F1_0.22833333333333333Fr_F2_1Fr_af_coupled__C1Len_50_FirstC1_0.0001_LastC1_1.0_FRrelavtiv__start_0.0001_end_1_StimLen_100_nfft_20000_trialsnr_1_mult_minimum_1_power_1_minamps__dev_original_05_point_1_old_fit_temporal']
full_names = ['calc_model_amp_freqs-_F1_0.22833333333333333Fr_F2_1Fr_af_coupled__C1Len_50_FirstC1_0.0001_LastC1_1.0_FRrelavtiv__start_0.0001_end_1_StimLen_100_nfft_20000_trialsnr_1_mult_minimum_1_power_1_minamps__dev_original_05_point_1_fft2_temporal']
c_grouped = ['c1'] # , 'c2'] c_grouped = ['c1'] # , 'c2']
c_nrs_orig = [0.02, 0.2] # 0.0002, 0.05, 0.5 c_nrs_orig = [0.01,0.025, 0.04, 0.1] # 0.0002, 0.05, 0.5
trials_nr = 20 # 20 trials_nr = 20 # 20
redo = False # True redo = False # True
log = 'log' # 'log' log = 'log' # 'log'
grid0 = gridspec.GridSpec(1, 1, bottom=0.08, top=0.93, left=0.11, grid0 = gridspec.GridSpec(1, 1, bottom=0.15, top=0.88, left=0.11,
right=0.95, wspace=0.04) # right=0.95, wspace=0.04) #
grid00 = gridspec.GridSpecFromSubplotSpec(2, 1, grid00 = gridspec.GridSpecFromSubplotSpec(2, 1,
wspace=0.04, hspace=0.1, wspace=0.04, hspace=0.45,
subplot_spec=grid0[0], height_ratios=[1.5,1],) # height_ratios=[2,1], subplot_spec=grid0[0], height_ratios=[1.5,1],) # height_ratios=[2,1],
grid_up = gridspec.GridSpecFromSubplotSpec(len(c_nrs_orig) + 1, 3, grid_up = gridspec.GridSpecFromSubplotSpec(1, len(c_nrs_orig),
hspace=0.75, hspace=0.75,
wspace=0.1, height_ratios=[1, 1, 0.7], wspace=0.1,
subplot_spec=grid00[ subplot_spec=grid00[
0]) # 1.2hspace=0.4,wspace=0.2,len(chirps) 0]) # height_ratios=[1, 1, 0.7], 1.2hspace=0.4,wspace=0.2,len(chirps)
grid_down = gridspec.GridSpecFromSubplotSpec(1, 2, grid_down = gridspec.GridSpecFromSubplotSpec(1, 1,
hspace=0.75, hspace=0.75,
wspace=0.1, wspace=0.1,
subplot_spec=grid00[1]) # 1.2hspace=0.4,wspace=0.2,len(chirps) subplot_spec=grid00[1]) # 1.2hspace=0.4,wspace=0.2,len(chirps)
@ -179,16 +182,17 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
c_dist_recalc=c_dist_recalc) c_dist_recalc=c_dist_recalc)
if not c_dist_recalc: if not c_dist_recalc:
c_nrs = np.array(c_nrs) * 100 c_nrs = np.array(c_nrs) * 100
#embed()
letters = ['A', 'B', 'C', 'D']
letters = ['A', 'B']
indexes = [[0, 1, 2, 3]] indexes = [[0, 1, 2, 3]]
#scores_all = [scores] #scores_all = [scores]
#embed() #embed()
# #
scores = ['amp_B1_012_mean_original', 'amp_B2_012_mean_original', 'amp_B1+B2_012_mean_original', 'amp_B1-B2_012_mean_original'] scores = ['amp_B1_012_mean_original', 'amp_B2_012_mean_original', 'amp_B1+B2_012_mean_original', 'amp_B1-B2_012_mean_original']
scores = ['c_B1_012_original', 'c_B2_012_original', 'c_B1+B2_012_original', 'c_B1-B2_012_original']
color01, color012, color01_2, color02, color0_burst, color0 = colors_suscept_paper_dots() color01, color012, color01_2, color02, color0_burst, color0 = colors_suscept_paper_dots()
colors = [color01, color02, color012, color01_2] colors = [color01, color02, color012, color01_2]
linestyles = ['-','-','-','-'] linestyles = ['-','-','-','-']
@ -201,10 +205,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
except: except:
print('grid search problem4') print('grid search problem4')
embed() embed()
if 'old_fit' in full_name:
ax_u1.set_title('old fit (before 2021)')
else:
ax_u1.set_title('new fit (after 2021)')
plt_single_trace([], ax_u1, frame_cell_orig, freq1, freq2, plt_single_trace([], ax_u1, frame_cell_orig, freq1, freq2,
scores=np.array(scores)[index], labels=np.array(labels)[index], scores=np.array(scores)[index], labels=np.array(labels)[index],
colors=np.array(colors)[index], colors=np.array(colors)[index],
@ -217,14 +218,14 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
frame_cell = frame_cell_orig[ frame_cell = frame_cell_orig[
(frame_cell_orig.df1 == freq1) & (frame_cell_orig.df2 == freq2)] (frame_cell_orig.df1 == freq1) & (frame_cell_orig.df2 == freq2)]
c1 = c_dist_recalc_here(c_dist_recalc, frame_cell) c1 = c_dist_recalc_here(c_dist_recalc, frame_cell)
ax_u1.set_xlim(0, 50) ax_u1.set_xlim(0, 25)
if i != 0: if i != 0:
ax_u1.set_ylabel('') ax_u1.set_ylabel('')
remove_yticks(ax_u1) remove_yticks(ax_u1)
if i < 2: #if i < 2:
ax_u1.fill_between(c1, frame_cell[np.array(scores)[index][0]], # ax_u1.fill_between(c1, frame_cell[np.array(scores)[index][0]],
frame_cell[np.array(scores)[index][1]], color='grey', # frame_cell[np.array(scores)[index][1]], color='grey',
alpha=0.1) # alpha=0.1)
ax_u1.scatter(c_nrs, (np.array(yposs[i]) - 35) * np.ones(len(c_nrs)), color='black', ax_u1.scatter(c_nrs, (np.array(yposs[i]) - 35) * np.ones(len(c_nrs)), color='black',
marker='v', marker='v',
@ -232,7 +233,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
# #
for c_nn, c_nr in enumerate(c_nrs): for c_nn, c_nr in enumerate(c_nrs):
ax_u1.text(c_nr, yposs[i][c_nn] + 50, letters[c_nn], color='black', ha='center', ax_u1.text(c_nr, yposs[i][c_nn] + 15, letters[c_nn], color='black', ha='center',
va='top') va='top')
# ax_u1.plot([c_nr, c_nr], [0, 435], color='black', linewidth=0.8, clip_on=False) # ax_u1.plot([c_nr, c_nr], [0, 435], color='black', linewidth=0.8, clip_on=False)
@ -251,7 +252,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
axes = [] axes = []
p_arrays_all = [] p_arrays_all = []
model_fit = '_old_fit_' # ''#'_old_fit_'#''#'_old_fit_'#''#'_old_fit_'#''###'_old_fit_' model_fit = ''#'_old_fit_' # ''#'_old_fit_'#''#'_old_fit_'#''#'_old_fit_'#''###'_old_fit_'
model_cells, reshuffled = chose_old_vs_new_model(model_fit=model_fit) model_cells, reshuffled = chose_old_vs_new_model(model_fit=model_fit)
for c_nn, c_nr in enumerate(c_nrs): for c_nn, c_nr in enumerate(c_nrs):
@ -279,9 +280,15 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
nfft_here = 2 ** 14 nfft_here = 2 ** 14
stimulus_length_here = 0.5 stimulus_length_here = 0.5
stimulus_length_here = values_stimuluslength_model_full()
trials_nr = 1
nfft_here = values_nfft_full_model()
# # # #
# #
a_f2s = [c_nrs_orig[c_nn]]
_, arrays_spikes, arrays_stim, results_diff, position_diff, auci_wo, auci_w, arrays, names, p_arrays_p, ff_p = calc_roc_amp_core_cocktail( _, arrays_spikes, arrays_stim, results_diff, position_diff, auci_wo, auci_w, arrays, names, p_arrays_p, ff_p = calc_roc_amp_core_cocktail(
[freq1 + eodf], [freq2 + eodf], datapoints, auci_wo, auci_w, results_diff, [freq1 + eodf], [freq2 + eodf], datapoints, auci_wo, auci_w, results_diff,
a_f2s, a_f2s,
@ -294,7 +301,7 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
n=n, n=n,
reshuffled=reshuffled, min_amps=min_amps) reshuffled=reshuffled, min_amps=min_amps)
# ff_p, arrays, names, p_arrays_p, arrays_spikes, arrays_stim, # ff_p, arrays, names, p_arrays_p, arrays_spikes, arrays_stim,
p_arrays_here = p_arrays_p[1::] p_arrays_here = [p_arrays_p[3]]
xlimp = (0, 300) xlimp = (0, 300)
for p in range(len(p_arrays_here)): for p in range(len(p_arrays_here)):
p_arrays_here[p][0] = p_arrays_here[p][0][ff_p < xlimp[1]] p_arrays_here[p][0] = p_arrays_here[p][0][ff_p < xlimp[1]]
@ -305,12 +312,11 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
time = time * 1000 time = time * 1000
# plot the first array # plot the first array
arrays_time = arrays[1::] # [v_mems[1],v_mems[3]]#[1,2]#[1::] arrays_time = [arrays[3]] # [v_mems[1],v_mems[3]]#[1,2]#[1::]
arrays_here = arrays[1::] # [arrays[1],arrays[3]]#arrays[1::]# arrays_here = [arrays[3]] # [arrays[1],arrays[3]]#arrays[1::]#
arrays_st = arrays_stim[1::] # [arrays_stim[1],arrays_stim[3]]# arrays_st = [arrays_stim[3]] #1:: [arrays_stim[1],arrays_stim[3]]#
arrays_sp = arrays_spikes[ arrays_sp = [arrays_spikes[3]] # [arrays_spikes[1],arrays_spikes[3]]#arrays_spikes[1::]
1::] # [arrays_spikes[1],arrays_spikes[3]]#arrays_spikes[1::]
colors_array_here = ['grey', 'grey', 'grey'] # colors_array[1::] colors_array_here = ['grey', 'grey', 'grey'] # colors_array[1::]
p_arrays_all.append(p_arrays_here) p_arrays_all.append(p_arrays_here)
@ -323,18 +329,19 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
freqs = [np.abs(freq2)] freqs = [np.abs(freq2)]
else: else:
freqs = [np.abs(freq1), np.abs(freq2)] freqs = [np.abs(freq1), np.abs(freq2)]
grid_pt = gridspec.GridSpecFromSubplotSpec(5, 1, grid_pt = gridspec.GridSpecFromSubplotSpec(2, 1,
hspace=0.3, hspace=0.3,
wspace=0.2, wspace=0.2,
subplot_spec=grid_up[c_nn, a], subplot_spec=grid_up[a, c_nn],
height_ratios=[1, 0.7, 1, 0.25, ) # hspace=0.4,wspace=0.2,len(chirps)
2.5]) # hspace=0.4,wspace=0.2,len(chirps)
axe = plt.subplot(grid_pt[0]) stim = False
axes.append(axe) if stim:
plt_stim_saturation(a, [], arrays_st, axe, colors_array_here, f, axe = plt.subplot(grid_pt[0])
f_counter, names, time, axes.append(axe)
xlim=xlim) # np.array(arrays_sp)*1000 plt_stim_saturation(a, [], arrays_st, axe, colors_array_here, f,
f_counter, names, time,
xlim=xlim) # np.array(arrays_sp)*1000
a_f2_cm = c_dist_recalc_func(frame_cell, c_nrs=[a_f2s[0]], cell=cell_here, a_f2_cm = c_dist_recalc_func(frame_cell, c_nrs=[a_f2s[0]], cell=cell_here,
c_dist_recalc=c_dist_recalc) c_dist_recalc=c_dist_recalc)
@ -342,83 +349,58 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
if not c_dist_recalc: if not c_dist_recalc:
a_f2_cm = np.array(a_f2_cm) * 100 a_f2_cm = np.array(a_f2_cm) * 100
if a == 2: # if (a_f1s[0] != 0) & (a_f2s[0] != 0): #if a == 2: # if (a_f1s[0] != 0) & (a_f2s[0] != 0):
fish = 'Three fish: $' + label_f_eod_name_core_rm() + '$\,\&\,' + f_vary_name() + '\,\&\,' + f_stable_name() # + '$'#' $\Delta '$\Delta$ #fish = '3 fish: $' + label_f_eod_name_core_rm() + '$\,\&\,' + f_vary_name() + '\,\&\,' + f_stable_name() # + '$'#' $\Delta '$\Delta$
beat_here = twobeat_cond(big=True, double=True, beat_here = '$c_{1}=%s$' % (
cond=False) + '\,' + f_vary_name( int(np.round(c_nrs[c_nn]))) + '$\%$' + ',\,$c_{2}=%s$' % (
freq=int(freq1), delta=True) + ',\,$c_{1}=%s$' % ( int(np.round(a_f2_cm[0]))) + '$\%$' # +'$'
int(np.round(c_nrs[c_nn]))) + '$\%$' + '\n' + f_stable_name(
freq=int(freq2), delta=True) + ',\,$c_{2}=%s$' % ( plt.suptitle(f_vary_name(freq=int(freq1), delta=True)+f_stable_name(freq=int(freq2), delta=True))
int(np.round(a_f2_cm[0]))) + '$\%$' # +'$' title_name = beat_here # fish + '\n' + +c1+c2#twobeat_cond(big=True, double=True,cond=False)
title_name = fish + '\n' + beat_here # +c1+c2
elif a == 0: # elif (a_f1s[0] != 0):
beat_here = ' ' + onebeat_cond(big=True, double=True,
cond=False) + '\,' + f_vary_name(
freq=int(freq1), delta=True) # +'$' + ' $\Delta '
fish = 'Two fish: $' + label_f_eod_name_core_rm() + '$\,\&\,' + f_vary_name() # +'$'
c1 = ',\,$c_{1}=%s$' % (int(np.round(c_nrs[c_nn]))) + '$\%$ \n '
title_name = fish + '\n' + beat_here + c1 # +'cm'+'cm'+'cm'
elif a == 1: # elif (a_f2s[0] != 0):
beat_here = ' ' + onebeat_cond(big=True, double=True,
cond=False) + '\,' + f_stable_name(
freq=int(freq2),
delta=True) # +'$'
fish = '\n Two fish: $' + label_f_eod_name_core_rm() + '$\,\&\,' + f_stable_name() # +'$'
c1 = ',\,$c_{2}=%s$' % (int(np.round(a_f2_cm[0]))) + '$\%$ \n'
title_name = fish + '\n' + beat_here + c1 # +'cm'
axe.text(1, 1.1, title_name, va='bottom', ha='right',
transform=axe.transAxes)
############################# #############################
axs = plt.subplot(grid_pt[1]) spikes = False
if spikes:
axs = plt.subplot(grid_pt[1])
plt_spikes_ROC(axs, 'grey', np.array(arrays_sp[a]) * 1000, xlim, lw=1) plt_spikes_ROC(axs, 'grey', np.array(arrays_sp[a]) * 1000, xlim, lw=1)
############################# #############################
axt = plt.subplot(grid_pt[2]) axt = plt.subplot(grid_pt[0])
axts.append(axt) axts.append(axt)
plt_vmem_saturation(a, arrays_sp, arrays_time, axt, colors_array_here, f, plt_vmem_saturation(a, arrays_sp, arrays_time, axt, colors_array_here, f,
time, xlim=xlim) time, xlim=xlim)
axt.text(1, 1.1, title_name, va='bottom', ha='right',
transform=axt.transAxes)
axp = plt.subplot(grid_pt[-1]) axp = plt.subplot(grid_pt[-1])
axps.append(axp) axps.append(axp)
if a == 0: if c_nn == 0:
axt.show_spines('') axt.show_spines('')
axt.xscalebar(0.1, -0.1, 10, 'ms', va='right', ha='bottom') axt.xscalebar(0.1, -0.1, 30, 'ms', va='right', ha='bottom')
axt.yscalebar(-0.02, 0.35, 600, 'Hz', va='left', ha='top') axt.yscalebar(-0.02, 0.35, 200, 'Hz', va='left', ha='top')
f_counter += 1 f_counter += 1
if (not os.path.exists(name_psd)) | (redo == True): ''' if ((not os.path.exists(name_psd)) | (redo == True)) & do:
np.save(name_psd, p_arrays_all) np.save(name_psd, p_arrays_all)
np.save(name_psd_f, ff_p) np.save(name_psd_f, ff_p)
else: else:
ff_p = np.load(name_psd_f) # p_arrays_p ff_p = np.load(name_psd_f) # p_arrays_p
p_arrays_all = np.load(name_psd) # p_arrays_p p_arrays_all = np.load(name_psd) # p_arrays_p'''
for c_nn, c_nr in enumerate(c_nrs): for c_nn, c_nr in enumerate(c_nrs):
for a in range(len(arrays_here)): for a in range(len(arrays_here)):
axps_here = [[axps[0], axps[1], axps[2]], [axps[3], axps[4], axps[5]]] axps_here = [[axps[0], axps[1], axps[2], axps[3]]]#[axps[3], axps[4], axps[5]
axp = axps_here[c_nn][a] axp = axps_here[a][c_nn]
pp = log_calc_psd(log, p_arrays_all[c_nn][a][0], pp = log_calc_psd(log, p_arrays_all[c_nn][a][0],
np.nanmax(p_arrays_all)) np.nanmax(p_arrays_all))
markeredgecolors = []
if a == 0:
colors_peaks = [color01] # , 'red']
freqs = [np.abs(freq1)] # ], np.abs(freq2)],
elif a == 1:
colors_peaks = [color02] # , 'red']
freqs = [np.abs(freq2)]
else:
colors_peaks = [color01_012, color02_012] # , 'red']
freqs = [np.abs(freq1), np.abs(freq2)]
markeredgecolors = [color01, color02]
colors_peaks = [color01, color02, color012, color01_2] colors_peaks = [color01, color02, color012, color01_2]
markeredgecolors = [color01, color02, color012, color01_2] markeredgecolors = [color01, color02, color012, color01_2]
freqs = [np.abs(freq1), np.abs(freq2), np.abs(freq1)+np.abs(freq2), np.abs(np.abs(freq1)-np.abs(freq2))] freqs = [np.abs(freq1), np.abs(freq2), np.abs(freq1)+np.abs(freq2), np.abs(np.abs(freq1)-np.abs(freq2))]
@ -430,20 +412,20 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
scalebar = False scalebar = False
if scalebar: if scalebar:
axp.show_spines('b') axp.show_spines('b')
if a == 0: if c_nn == 0:
axp.yscalebar(-0.05, 0.5, 20, 'dB', va='center', ha='left') axp.yscalebar(-0.05, 0.5, 20, 'dB', va='center', ha='left')
axp.set_ylim(-33, 5) axp.set_ylim(-33, 5)
else: else:
axp.show_spines('lb') axp.show_spines('lb')
if a == 0: if c_nn == 0:
axp.set_ylabel('dB') # , va='center', ha='left' axp.set_ylabel('dB') # , va='center', ha='left'
else: else:
remove_yticks(axp) remove_yticks(axp)
axp.set_ylim(-39, 5) axp.set_ylim(-39, 5)
else: else:
axp.show_spines('lb') axp.show_spines('lb')
if a != 0: if c_nn != 0:
remove_yticks(axp) remove_yticks(axp)
else: else:
axp.set_ylabel(power_spectrum_name()) axp.set_ylabel(power_spectrum_name())
@ -470,8 +452,8 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
#join_y(ax_us) #join_y(ax_us)
fig = plt.gcf() fig = plt.gcf()
fig.tag([[axes[0], axes[1], axes[2]]], xoffs=0, yoffs=3.7) #fig.tag([[axes[0], axes[1], axes[2]]], xoffs=0, yoffs=3.7)
fig.tag([[axes[3], axes[4], axes[5]]], xoffs=0, yoffs=3.7) #fig.tag([[axes[3], axes[4], axes[5]]], xoffs=0, yoffs=3.7)
#fig.tag([ax_us[0], ax_us[1], ax_us[2]], xoffs=-2.3, yoffs=1.4) #fig.tag([ax_us[0], ax_us[1], ax_us[2]], xoffs=-2.3, yoffs=1.4)
@ -481,4 +463,4 @@ def nonlin_regime(yposs=[450, 450, 450], freqs=[(39.5, -210.5)], printing=False,
if __name__ == '__main__': if __name__ == '__main__':
#embed() #embed()
sys.excepthook = info sys.excepthook = info
nonlin_regime(yposs = [[170,180], [200,200]],)#, [430,470] nonlin_regime(yposs = [[270,270, 270, 270]],)#, [430,470], [200,200], [200,200, 200, 200], [200,200, 200, 200], [200,200, 200, 200]

View File

@ -439,6 +439,11 @@ Theoretical work on leaky integrate-and-fire and conductance-based models sugges
\end{figure*} \end{figure*}
\begin{figure*}[t]
\includegraphics[width=\columnwidth]{nonlin_regime}
\caption{\label{fig:nonlin_regime} }
\end{figure*}
Without any external stimulation, a P-unit fires action potentials at a spontaneous baseline rate \fbase{} to the fish's own EOD of frequency \feod{}. Accordingly, a peak at \fbase{} is present in the power spectrum of this baseline activity (\subfigrefb{fig:motivation}{A}). Superposition of the receiver's EOD with an EOD of another fish with frequency $f_1$ results in a beat, a periodic amplitude modulation of the receiver's EOD. The frequency of the beat is given by the difference frequency $\Delta f_1 = f_1 - \feod$ between the two fish. P-units encode this beat in their firing rate \citep{Bastian1981a,Barayeu2023} and consequently a peak at this beat frequency appears the the power spectrum of the response (\subfigrefb{fig:motivation}{B}). A second peak at the first harmonic indicates a nonlinear response that here is easily identified by the clipping of the P-unit's firing rate at zero. Pairing the fish with another fish with a higher beat frequency $\Delta f_2 = f_2 - \feod$ results in a weaker response with a single peak in the response power spectrum (\subfigrefb{fig:motivation}{C}). Note that $\Delta f_2$ has been choosen to match the P-unit's baseline firing rate. Without any external stimulation, a P-unit fires action potentials at a spontaneous baseline rate \fbase{} to the fish's own EOD of frequency \feod{}. Accordingly, a peak at \fbase{} is present in the power spectrum of this baseline activity (\subfigrefb{fig:motivation}{A}). Superposition of the receiver's EOD with an EOD of another fish with frequency $f_1$ results in a beat, a periodic amplitude modulation of the receiver's EOD. The frequency of the beat is given by the difference frequency $\Delta f_1 = f_1 - \feod$ between the two fish. P-units encode this beat in their firing rate \citep{Bastian1981a,Barayeu2023} and consequently a peak at this beat frequency appears the the power spectrum of the response (\subfigrefb{fig:motivation}{B}). A second peak at the first harmonic indicates a nonlinear response that here is easily identified by the clipping of the P-unit's firing rate at zero. Pairing the fish with another fish with a higher beat frequency $\Delta f_2 = f_2 - \feod$ results in a weaker response with a single peak in the response power spectrum (\subfigrefb{fig:motivation}{C}). Note that $\Delta f_2$ has been choosen to match the P-unit's baseline firing rate.
When stimulating the fish with both frequencies, additional peaks appear in the response power spectrum at the sum \bsum{} and the difference frequency \bdiff{} (\subfigrefb{fig:motivation}{D}). Thus, the response is not equal to sum of the responses to the two beats presented separately. These peaks at the sum and the difference of the two stimulus frequencies are a hallmark of nonlinear interactions that by definition are absent in linear systems. When stimulating the fish with both frequencies, additional peaks appear in the response power spectrum at the sum \bsum{} and the difference frequency \bdiff{} (\subfigrefb{fig:motivation}{D}). Thus, the response is not equal to sum of the responses to the two beats presented separately. These peaks at the sum and the difference of the two stimulus frequencies are a hallmark of nonlinear interactions that by definition are absent in linear systems.