create plot showing the ams...
as arising from foreign and self generated chirps
This commit is contained in:
parent
96ebd10f2f
commit
83969d2a04
122
chirp_ams.py
Normal file
122
chirp_ams.py
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
import numpy as np
|
||||||
|
import scipy.signal as sig
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
from chirp_stimulation import create_chirp
|
||||||
|
from IPython import embed
|
||||||
|
|
||||||
|
def despine(axis, spines=None, hide_ticks=True):
|
||||||
|
|
||||||
|
def hide_spine(spine):
|
||||||
|
spine.set_visible(False)
|
||||||
|
|
||||||
|
for spine in axis.spines.keys():
|
||||||
|
if spines is not None:
|
||||||
|
if spine in spines:
|
||||||
|
hide_spine(axis.spines[spine])
|
||||||
|
else:
|
||||||
|
hide_spine(axis.spines[spine])
|
||||||
|
if hide_ticks:
|
||||||
|
axis.xaxis.set_ticks([])
|
||||||
|
axis.yaxis.set_ticks([])
|
||||||
|
|
||||||
|
|
||||||
|
def get_signals(eodfs, condition, contrast, c_size, c_duration, c_ampl_dip, chirp_times, duration, dt):
|
||||||
|
if not isinstance(condition, str) or ("self" not in condition and "other" not in condition):
|
||||||
|
raise ValueError("Condition argument must be either 'self' or 'other'!")
|
||||||
|
if not isinstance(eodfs, dict) or (not "self" in eodfs.keys() or not "other" in eodfs.keys()):
|
||||||
|
raise ValueError("EOFs must be a dict containing 'self' and 'other' fish's eod frequency!")
|
||||||
|
|
||||||
|
time = np.arange(0.0, duration, dt)
|
||||||
|
non_chirper_freq = eodfs["self"] if condition == "other" else eodfs["other"]
|
||||||
|
non_chirper_signal = np.sin(non_chirper_freq * time * 2 * np.pi)
|
||||||
|
non_chirper_freq_profile = np.ones(time.shape) * non_chirper_freq
|
||||||
|
|
||||||
|
chirper_freq = eodfs["other"] if condition == "other" else eodfs["self"]
|
||||||
|
_, chirper_signal, _, chirper_freq_profile = create_chirp(eodf=chirper_freq, chirpsize=c_size, chirpduration=c_duration,
|
||||||
|
ampl_reduction=c_ampl_dip, chirptimes=chirp_times, duration=duration, dt=dt)
|
||||||
|
|
||||||
|
other_ampl = contrast/100
|
||||||
|
if condition == "self":
|
||||||
|
self_signal = chirper_signal
|
||||||
|
self_freq = chirper_freq_profile
|
||||||
|
other_signal = non_chirper_signal * other_ampl
|
||||||
|
other_freq = non_chirper_freq_profile
|
||||||
|
else:
|
||||||
|
self_signal = non_chirper_signal
|
||||||
|
self_freq = non_chirper_freq_profile
|
||||||
|
other_signal = chirper_signal * other_ampl
|
||||||
|
other_freq = chirper_freq_profile
|
||||||
|
return time, self_signal, self_freq, other_signal, other_freq
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
eod_frequencies = {"self": 600, "other": 620} # Hz, eod frequencies of the two fish, 'self' is the one that we "record" from
|
||||||
|
eod_contrasts = [20, 10, 5, 2.5, 1.25, 0.625, 0.3125] # %, strength of 'other' relative to 'self'
|
||||||
|
chirp_size = 100 # Hz, frequency excursion
|
||||||
|
chirp_duration = 0.015 # s, chirp duration
|
||||||
|
chirp_amplitude_dip = 0.05 # %, amplitude drop during chirp
|
||||||
|
chirp_frequency = 10 # Hz, how often does the fish chirp
|
||||||
|
|
||||||
|
total_duration = 0.5 # s, total duration of simulation
|
||||||
|
dt = 0.00001 # s, stepsize of the simulation
|
||||||
|
|
||||||
|
chirp_times = np.arange(0.125+chirp_duration, 0.125 + total_duration - chirp_duration, 1./chirp_frequency)
|
||||||
|
grid_shape = (5 + len(eod_contrasts) - 1, 7)
|
||||||
|
|
||||||
|
conditions = ["other", "self"]
|
||||||
|
fig = plt.figure(figsize=(4.5, 4.5))
|
||||||
|
for i, condition in enumerate(conditions):
|
||||||
|
time, self_signal, self_freq, other_signal, other_freq = get_signals(eod_frequencies, condition, eod_contrasts[0], chirp_size,
|
||||||
|
chirp_duration, chirp_amplitude_dip, chirp_times,
|
||||||
|
total_duration + 0.25, dt)
|
||||||
|
plot_time = time[(time >= 0.125) & (time < total_duration + 0.125)] - 0.125
|
||||||
|
ax = plt.subplot2grid(grid_shape, (0, i * 3 + i * 1), rowspan=2, colspan=3, fig=fig)
|
||||||
|
ax.plot(plot_time, self_freq[(time >= 0.125) & (time < total_duration + 0.125)], color="#ff7f0e", label="%iHz" % eod_frequencies["self"])
|
||||||
|
ax.plot(plot_time, other_freq[(time >= 0.125) & (time < total_duration + 0.125)], color="#1f77b4", label="%iHz" % eod_frequencies["other"])
|
||||||
|
if i == 0:
|
||||||
|
ax.text(1.15 * plot_time[-1], eod_frequencies["self"], "self", color="#ff7f0e", va="center", ha="left", fontsize=9)
|
||||||
|
ax.text(1.15 * plot_time[-1], eod_frequencies["other"], "other", color="#1f77b4", va="center", ha="left", fontsize=9)
|
||||||
|
ax.text(-0.05 * plot_time[-1], eod_frequencies["self"], "%iHz" % eod_frequencies["self"], color="#ff7f0e", va="center", ha="right", fontsize=9)
|
||||||
|
ax.text(-0.05 * plot_time[-1], eod_frequencies["other"], "%iHz" % eod_frequencies["other"], color="#1f77b4", va="center", ha="right", fontsize=9)
|
||||||
|
despine(ax, spines=["top", "bottom", "left", "right"])
|
||||||
|
|
||||||
|
ax = plt.subplot2grid(grid_shape, (3, i * 3 + i * 1), rowspan=2, colspan=3, fig=fig)
|
||||||
|
combined = self_signal + other_signal
|
||||||
|
plot_combined = combined[(time >= 0.125) & (time < total_duration + 0.125)]
|
||||||
|
am = np.abs(sig.hilbert(combined))
|
||||||
|
plot_am = am[(time >= 0.125) & (time < total_duration + 0.125)]
|
||||||
|
ax.plot(plot_time, plot_combined, color="#2ca02c", label="self + other")
|
||||||
|
ax.plot(plot_time, plot_am, color="#d62728", label="am")
|
||||||
|
ax.set_ylim([-1.25, 1.25])
|
||||||
|
if i == 0:
|
||||||
|
ax.text(1.25 * plot_time[-1], np.mean(combined), "contrast=\n20%",color="#d62728", va="center", ha="center", fontsize=9)
|
||||||
|
ax.text(-0.05 * plot_time[-1], np.mean(am), "am", color="#d62728", va="center", ha="right", fontsize=9)
|
||||||
|
ax.text(-0.05 * plot_time[-1], np.mean(combined), "self+\nother", color="#2ca02c", va="center", ha="right", fontsize=9)
|
||||||
|
despine(ax, spines=["top", "bottom", "left", "right"])
|
||||||
|
|
||||||
|
for j, contrast in enumerate(eod_contrasts[1:]):
|
||||||
|
time, self_signal, self_freq, other_signal, other_freq = get_signals(eod_frequencies, condition, contrast, chirp_size,
|
||||||
|
chirp_duration, chirp_amplitude_dip, chirp_times, total_duration + 0.25, dt)
|
||||||
|
combined = self_signal + other_signal
|
||||||
|
am = np.abs(sig.hilbert(combined))
|
||||||
|
|
||||||
|
plot_time = time[(time >= 0.125) & (time < total_duration + 0.125)] - 0.125
|
||||||
|
plot_combined = combined[(time >= 0.125) & (time < total_duration + 0.125)]
|
||||||
|
plot_am = am[(time >= 0.125) & (time < total_duration + 0.125)]
|
||||||
|
|
||||||
|
ax = plt.subplot2grid(grid_shape, (5 + j, i * 3 + i * 1), rowspan=1, colspan=3)
|
||||||
|
ax.plot(plot_time, plot_am, color="#d62728", label="am")
|
||||||
|
ax.text(1.25 * plot_time[-1], np.mean(am), "%.2f" % contrast, color="#d62728", va="center", ha="center", fontsize=9)
|
||||||
|
ax.set_ylim([0.8, 1.2])
|
||||||
|
if j == len(eod_contrasts)-2:
|
||||||
|
despine(ax, spines=["top", "left", "right"])
|
||||||
|
ax.set_xticks(np.arange(0.0, total_duration + 0.001, 0.25))
|
||||||
|
ax.set_xticklabels(np.arange(0.0, total_duration * 1000+1, 250), fontsize=7)
|
||||||
|
ax.set_xlabel("times [ms]", fontsize=9)
|
||||||
|
else:
|
||||||
|
despine(ax, spines=["top", "bottom", "left", "right"])
|
||||||
|
|
||||||
|
|
||||||
|
fig.subplots_adjust(left=0.1, bottom=0.1, top=0.99, right=0.99)
|
||||||
|
plt.show()
|
Loading…
Reference in New Issue
Block a user