289 lines
9.5 KiB
Python
289 lines
9.5 KiB
Python
|
|
|
|
import matplotlib.pyplot as plt
|
|
import matplotlib.gridspec as gridspec
|
|
import numpy as np
|
|
import os
|
|
import functions as fu
|
|
import helperFunctions as hF
|
|
|
|
from CellData import CellData
|
|
from Baseline import BaselineCellData
|
|
from FiCurve import FICurveCellData
|
|
import Figure_constants as consts
|
|
MODEL_COLOR = "orange"
|
|
DATA_COLOR = "blue"
|
|
|
|
DATA_SAVE_PATH = "data/figure_data/"
|
|
|
|
|
|
def main():
|
|
# data_isi_histogram()
|
|
# data_mean_freq_step_stimulus_examples()
|
|
# data_mean_freq_step_stimulus_with_detections()
|
|
# data_fi_curve()
|
|
p_unit_example()
|
|
fi_point_detection()
|
|
pass
|
|
|
|
|
|
def p_unit_example():
|
|
# cell = "data/final/2013-04-17-ac-invivo-1"
|
|
cell = "data/final/2012-04-20-af-invivo-1"
|
|
cell_data = CellData(cell)
|
|
|
|
base = BaselineCellData(cell_data)
|
|
base.load_values(cell_data.get_data_path())
|
|
print("burstiness of example cell:", base.get_burstiness())
|
|
fi = FICurveCellData(cell_data, cell_data.get_fi_contrasts(), save_dir=cell_data.get_data_path())
|
|
step = cell_data.get_sampling_interval()
|
|
|
|
# Overview figure for p-unit behaviour
|
|
|
|
fig = plt.figure(tight_layout=True, figsize=consts.FIG_SIZE_MEDIUM)
|
|
gs = gridspec.GridSpec(3, 2)
|
|
|
|
|
|
# a bit of trace with detected spikes
|
|
ax = fig.add_subplot(gs[0, :])
|
|
|
|
v1 = cell_data.get_base_traces(cell_data.V1)[0]
|
|
time = cell_data.get_base_traces(cell_data.TIME)[0]
|
|
spiketimes = cell_data.get_base_spikes()[0]
|
|
start = 0
|
|
duration = 0.10
|
|
|
|
ax.plot(np.array(time[:int(duration/step)]) - start, v1[:int(duration/step)])
|
|
ax.eventplot([s for s in spiketimes if start < s < start + duration], lineoffsets=max(v1[:int(duration/step)])+0.75, color="black")
|
|
ax.set_ylabel('Voltage in mV')
|
|
ax.set_xlabel('Time in s')
|
|
ax.set_title("Baseline Firing")
|
|
ax.set_xlim((0, duration))
|
|
|
|
|
|
# ISI-hist
|
|
ax = fig.add_subplot(gs[1, 0])
|
|
eod_period = 1.0 / cell_data.get_eod_frequency()
|
|
|
|
isi = np.array(base.get_interspike_intervals()) / eod_period # ISI in ms
|
|
maximum = max(isi)
|
|
bins = np.arange(0, maximum * 1.01, 0.1)
|
|
ax.hist(isi, bins=bins)
|
|
ax.set_ylabel("Count")
|
|
ax.set_xlabel("ISI in EOD periods")
|
|
ax.set_title("ISI-histogram")
|
|
|
|
|
|
# Serial correlation
|
|
ax = fig.add_subplot(gs[2, 0])
|
|
|
|
sc = base.get_serial_correlation(10)
|
|
ax.plot(range(11), [0 for _ in range(11)], color="darkgrey", alpha=0.8)
|
|
ax.plot(range(11), [1] + list(sc))
|
|
|
|
|
|
|
|
ax.set_xlabel("Lag")
|
|
ax.set_ylabel("SC")
|
|
ax.set_title("Serial Correlation")
|
|
ax.set_ylim((-1, 1))
|
|
ax.set_xlim((0, 10))
|
|
ax.set_xticks([0, 2, 4, 6, 8, 10])
|
|
# ax.set_xticklabels([0, 2, 4, 6, 8, 10])
|
|
|
|
|
|
# FI-Curve trace
|
|
ax = fig.add_subplot(gs[1, 1])
|
|
|
|
f_trace_times, f_traces = fi.get_mean_time_and_freq_traces()
|
|
|
|
part = 1 + 0.2 + 0.2 # stim duration + delay up front and a part of the "delay" at the back
|
|
idx = int(part/step)
|
|
|
|
ax.plot(f_trace_times[-1][:idx], f_traces[-1][:idx])
|
|
strength = 200
|
|
smoothed = np.convolve(f_traces[-1][:idx], np.ones(strength)/strength)
|
|
ax.plot(f_trace_times[-1][:idx], smoothed[int(strength/2):idx + int(strength/2)])
|
|
ax.set_xlim((-0.2, part-0.2))
|
|
ylim = ax.get_ylim()
|
|
ax.set_ylim((0, ylim[1]))
|
|
ax.set_xlabel("Time in s")
|
|
ax.set_ylabel("Frequency in Hz")
|
|
ax.set_title("Step Response")
|
|
|
|
|
|
# FI-Curve
|
|
ax = fig.add_subplot(gs[2, 1])
|
|
|
|
contrasts = fi.stimulus_values
|
|
f_zeros = fi.get_f_zero_frequencies()
|
|
f_infties = fi.get_f_inf_frequencies()
|
|
|
|
ax.plot(contrasts, f_zeros, 'x')
|
|
ax.plot(contrasts, f_infties, 'o')
|
|
|
|
x_values = np.arange(min(contrasts), max(contrasts) + 0.0001, (max(contrasts)-min(contrasts)) / 1000)
|
|
f_zero_fit = [fu.full_boltzmann(x, fi.f_zero_fit[0], fi.f_zero_fit[1], fi.f_zero_fit[2], fi.f_zero_fit[3]) for x in x_values]
|
|
f_inf_fit = [fu.clipped_line(x, fi.f_inf_fit[0], fi.f_inf_fit[1]) for x in x_values]
|
|
ax.plot(x_values, f_zero_fit)
|
|
ax.plot(x_values, f_inf_fit)
|
|
|
|
# ax.set_xlim((0, 10))
|
|
# ax.set_ylim((-1, 1))
|
|
ax.set_xlabel("Contrast")
|
|
ax.set_ylabel("Frequency in Hz")
|
|
ax.set_title("FI-Curve")
|
|
|
|
plt.tight_layout()
|
|
plt.savefig("thesis/figures/p_unit_example.png")
|
|
plt.close()
|
|
|
|
|
|
def fi_point_detection():
|
|
# cell = "data/final/2013-04-17-ac-invivo-1"
|
|
cell = "data/final/2012-04-20-af-invivo-1"
|
|
cell_data = CellData(cell)
|
|
|
|
fi = FICurveCellData(cell_data, cell_data.get_fi_contrasts())
|
|
step = cell_data.get_sampling_interval()
|
|
|
|
fig, axes = plt.subplots(1, 2, figsize=consts.FIG_SIZE_SMALL_WIDE, sharey="row")
|
|
|
|
f_trace_times, f_traces = fi.get_mean_time_and_freq_traces()
|
|
|
|
part = 1 + 0.2 + 0.2 # stim duration + delay up front and a part of the "delay" at the back
|
|
idx = int(part / step)
|
|
f_zero = fi.get_f_zero_frequencies()[-1]
|
|
f_zero_idx = fi.indices_f_zero[-1]
|
|
|
|
f_inf = fi.get_f_inf_frequencies()[-1]
|
|
f_inf_idx = fi.indices_f_inf[-1]
|
|
|
|
axes[0].plot(f_trace_times[-1][:idx], f_traces[-1][:idx])
|
|
axes[0].plot([f_trace_times[-1][idx] for idx in f_zero_idx], (f_zero, ), "o")
|
|
axes[0].plot([f_trace_times[-1][idx] for idx in f_inf_idx], (f_inf, f_inf), color="orange", linewidth=4)
|
|
|
|
# mark stim start and end:
|
|
stim_start = cell_data.get_stimulus_start()
|
|
stim_end = cell_data.get_stimulus_end()
|
|
axes[0].plot([stim_start]*2, (0, fi.get_f_baseline_frequencies()[0]), color="darkgrey")
|
|
axes[0].plot([stim_end]*2, (0, fi.get_f_baseline_frequencies()[0]), color="darkgrey")
|
|
axes[0].set_xlim((-0.2, part - 0.2))
|
|
ylimits = axes[0].get_ylim()
|
|
|
|
axes[0].set_xlabel("Time in s")
|
|
axes[0].set_ylabel("Frequency in Hz")
|
|
axes[0].set_title("Step Response")
|
|
|
|
contrasts = fi.stimulus_values
|
|
f_zeros = fi.get_f_zero_frequencies()
|
|
f_infties = fi.get_f_inf_frequencies()
|
|
|
|
axes[1].plot(contrasts, f_zeros, 'x')
|
|
axes[1].plot(contrasts, f_infties, 'o')
|
|
|
|
x_values = np.arange(min(contrasts), max(contrasts) + 0.0001, (max(contrasts) - min(contrasts)) / 1000)
|
|
f_zero_fit = [fu.full_boltzmann(x, fi.f_zero_fit[0], fi.f_zero_fit[1], fi.f_zero_fit[2], fi.f_zero_fit[3]) for x in
|
|
x_values]
|
|
f_inf_fit = [fu.clipped_line(x, fi.f_inf_fit[0], fi.f_inf_fit[1]) for x in x_values]
|
|
axes[1].plot(x_values, f_zero_fit)
|
|
axes[1].plot(x_values, f_inf_fit)
|
|
|
|
axes[1].set_xlabel("Contrast in %")
|
|
# axes[1].set_ylabel("Frequency in Hz")
|
|
axes[1].set_title("FI-Curve")
|
|
axes[1].set_ylim((0, ylimits[1]))
|
|
|
|
|
|
plt.tight_layout()
|
|
plt.savefig("thesis/figures/f_point_detection.png")
|
|
plt.close()
|
|
|
|
def data_fi_curve():
|
|
cell = "data/final/2013-04-17-ac-invivo-1/"
|
|
cell_data = CellData(cell)
|
|
fi = FICurveCellData(cell_data, cell_data.get_fi_contrasts())
|
|
fi.plot_fi_curve()
|
|
|
|
|
|
def data_mean_freq_step_stimulus_with_detections():
|
|
cell = "data/final/2013-04-17-ac-invivo-1/"
|
|
cell_data = CellData(cell)
|
|
fi = FICurveCellData(cell_data, cell_data.get_fi_contrasts())
|
|
|
|
mean_times, mean_freqs = fi.get_mean_time_and_freq_traces()
|
|
idx = -1
|
|
time = np.array(mean_times[idx])
|
|
freq = np.array(mean_freqs[idx])
|
|
f_inf = fi.f_inf_frequencies[idx]
|
|
f_zero = fi.f_zero_frequencies[idx]
|
|
|
|
plt.plot(time, freq, color=DATA_COLOR)
|
|
plt.plot(time[freq == f_zero][0], f_zero, "o", color="black")
|
|
f_inf_time = time[(0.2 < time) & (time < 0.4)]
|
|
plt.plot(f_inf_time, [f_inf for _ in f_inf_time], color="black")
|
|
plt.xlim((-0.1, 0.6))
|
|
plt.show()
|
|
|
|
|
|
def data_mean_freq_step_stimulus_examples():
|
|
# todo smooth! add f_0, f_inf, f_base to it?
|
|
cell = "data/invivo/2013-04-17-ac-invivo-1/"
|
|
cell_data = CellData(cell)
|
|
fi = FICurveCellData(cell_data, cell_data.get_fi_contrasts())
|
|
|
|
time_traces, freq_traces = fi.get_time_and_freq_traces()
|
|
mean_times, mean_freqs = fi.get_mean_time_and_freq_traces()
|
|
|
|
used_idicies = (0, 7, -1)
|
|
fig, axes = plt.subplots(len(used_idicies), figsize=(8, 12), sharex=True, sharey=True)
|
|
for ax_idx, idx in enumerate(used_idicies):
|
|
sv = fi.stimulus_values[idx]
|
|
|
|
# for j in range(len(time_traces[i])):
|
|
# axes[i].plot(time_traces[i][j], freq_traces[i][j], color="gray", alpha=0.5)
|
|
|
|
axes[ax_idx].plot(mean_times[idx], mean_freqs[idx], color=DATA_COLOR)
|
|
# plt.plot(mean_times[i], mean_freqs[i], color="black")
|
|
|
|
axes[ax_idx].set_ylabel("Frequency [Hz]")
|
|
axes[ax_idx].set_xlim((-0.2, 0.6))
|
|
axes[ax_idx].set_title("Contrast {:.2f} ({:} trials)".format(sv, len(time_traces[idx])))
|
|
axes[ax_idx].set_xlabel("Time [s]")
|
|
plt.show()
|
|
|
|
|
|
def data_isi_histogram(recalculate=True):
|
|
# if isis loadable - load
|
|
name = "isi_cell_data.npy"
|
|
path = os.path.join(DATA_SAVE_PATH, name)
|
|
if os.path.exists(path) and not recalculate:
|
|
isis = np.load(path)
|
|
print("loaded")
|
|
else:
|
|
# if not get them from the cell
|
|
cell = "data/invivo/2013-04-17-ac-invivo-1/" # not bursty
|
|
# cell = "data/invivo/2014-12-03-ad-invivo-1/" # half bursty
|
|
# cell = "data/invivo/2015-01-20-ad-invivo-1/" # does triple peaks...
|
|
# cell = "data/invivo/2018-05-08-ae-invivo-1/" # a bit bursty
|
|
# cell = "data/invivo/2013-04-10-af-invivo-1/" # a bit bursty
|
|
cell_data = CellData(cell)
|
|
base = BaselineCellData(cell_data)
|
|
isis = np.array(base.get_interspike_intervals())
|
|
# base.plot_baseline(position=0,time_length=10)
|
|
|
|
# save isis
|
|
np.save(path, isis)
|
|
isis = isis * 1000
|
|
# plot histogram
|
|
bins = np.arange(0, 30.1, 0.1)
|
|
plt.hist(isis, bins=bins, color=DATA_COLOR)
|
|
plt.xlabel("Inter spike intervals [ms]")
|
|
plt.ylabel("Count")
|
|
plt.tight_layout()
|
|
|
|
plt.show()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main() |