P-unit_model/Figures_Baseline.py
2020-08-28 17:40:47 +02:00

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()