95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from IPython import embed
|
|
from model import simulate, load_models
|
|
import matplotlib.gridspec as gridspec
|
|
from myfunctions import default_settings
|
|
"""
|
|
Dependencies:
|
|
numpy
|
|
matplotlib
|
|
numba (optional, speeds simulation up: pre-compiles functions to machine code)
|
|
"""
|
|
|
|
|
|
def main():
|
|
# tiny example program:
|
|
#embed()
|
|
parameters = load_models("models.csv")
|
|
freq_all = [[]]*len(parameters)
|
|
isis_all = [[]] * len(parameters)
|
|
spikes_all = [[]] * len(parameters)
|
|
period_all = [[]]* len(parameters)
|
|
#for i in range(4):
|
|
for i in range(len(parameters)):
|
|
model_params = parameters[i]
|
|
cell = model_params.pop('cell')
|
|
print(cell)
|
|
EODf = model_params.pop('EODf')
|
|
|
|
|
|
# generate EOD-like stimulus
|
|
deltat = model_params["deltat"]
|
|
stimulus_length = 11.0 # in seconds
|
|
time = np.arange(0, stimulus_length,deltat)
|
|
# baseline EOD with amplitude 1:
|
|
stimulus = np.sin(2 * np.pi * EODf * time)
|
|
# das lasse ich eine sekunde integrieren dann weitere 10 sekunden integrieren und das nehmen
|
|
spikes = simulate(stimulus, **model_params)
|
|
period_all[i] = 1/EODf
|
|
# cut off first second of response
|
|
new_spikes = spikes[spikes >1]
|
|
#spikes_all[i] = new_spikes*1
|
|
freq,isis = calculate_isi_frequency(new_spikes, deltat)
|
|
freq_all[i] = freq
|
|
isis_all[i] = isis
|
|
#embed()
|
|
|
|
default_settings([0], intermediate_width=6.29*2, intermediate_length=10, ts=9, ls=9, fs=7)
|
|
row = int(np.sqrt(len(parameters)))
|
|
col = int(np.ceil(np.sqrt(len(parameters))))
|
|
grid = gridspec.GridSpec(row,col,hspace = 1, wspace = 0.5)
|
|
ax = {}
|
|
for i in range(len(freq_all)):
|
|
ax[i] = plt.subplot(grid[i])
|
|
plt.title('#'+str(i) +'B: '+str(int(np.mean(freq_all[i])))+'Hz')
|
|
plt.hist(isis_all[i]/(1/EODf), bins = 100, density = True)
|
|
ax[int(row*col-row/2)].set_xlabel('EOD multiples')
|
|
plt.savefig('isi_model.pdf')
|
|
plt.savefig('../highbeats_pdf/isi_model.pdf')
|
|
plt.show()
|
|
embed()
|
|
|
|
|
|
|
|
def calculate_isi_frequency(spikes, deltat):
|
|
"""
|
|
calculates inter-spike interval frequency
|
|
(wasn't tested a lot may give different length than time = np.arange(spikes[0], spikes[-1], deltat),
|
|
or raise an index error for some inputs)
|
|
|
|
:param spikes: spike time points
|
|
:param deltat: integration time step of the model
|
|
|
|
:return: the frequency trace:
|
|
starts at the time of first spike
|
|
ends at the time of the last spike.
|
|
"""
|
|
|
|
isis = np.diff(spikes)
|
|
freq_points = 1 / isis
|
|
freq = np.zeros(int((spikes[-1] - spikes[0]) / deltat))
|
|
|
|
current_idx = 0
|
|
for i, isi in enumerate(isis):
|
|
end_idx = int(current_idx + np.rint(isi / deltat))
|
|
freq[current_idx:end_idx] = freq_points[i]
|
|
current_idx = end_idx
|
|
|
|
return freq,isis
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|