model of DCN pyramidal neuron
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.0 KiB

"""
Test the embedded auditory nerve model with a set of tone pips.
(Zilany et al. 2014; requires MATLAB)
This demonstrates the lowest-level access to the auditory nerve model that is
available in the cnmodel API. For higher-level tools, see test_sound_stim.py
(which uses an_model.get_spiketrain) and test_sgc_input.py (which uses
cells.DummySGC).
Usage:
python test_an_model.py
(no arguments)
(Adapted from makeANF_CF_RI.m)
"""
import time
import numpy as np
import pyqtgraph as pg
from cnmodel import an_model
from cnmodel.util import sound
def test_an_model():
# model fiber parameters
CF = 1.5e3 # CF in Hz
cohc = 1.0 # normal ohc function
cihc = 1.0 # normal ihc function
species = (
1
) # 1 for cat (2 for human with Shera et al. tuning 3 for human with Glasberg & Moore tuning)
noiseType = 1 # 1 for variable fGn (0 for fixed fGn)
fiberType = (
3
) # spontaneous rate (in spikes/s) of the fiber BEFORE refractory effects "1" = Low "2" = Medium "3" = High
implnt = (
0
) # "0" for approximate or "1" for actual implementation of the power-law functions in the Synapse
# stimulus parameters
F0 = CF # stimulus frequency in Hz
Fs = 100e3 # sampling rate in Hz (must be 100, 200 or 500 kHz)
T = 150e-3 # stimulus duration in seconds
pdur = 0.02 # pip duration
pstart = [0.01, 0.035] # pip start times
rt = 2.5e-3 # rise/fall time in seconds
stimdb = 65 # stimulus intensity in dB SPL
# PSTH parameters
nrep = 50 # number of stimulus repetitions (e.g., 50)
psthbinwidth = 0.5e-3 # binwidth in seconds
stim = sound.TonePip(
rate=Fs,
duration=T,
f0=F0,
dbspl=stimdb,
pip_duration=pdur,
pip_start=pstart,
ramp_duration=rt,
)
t = stim.time
pin = stim.sound
db = stim.measure_dbspl(rt, T - rt)
an_model.seed_rng(34978)
start = time.time()
vihc = an_model.model_ihc(
pin, CF, nrep, 1 / Fs, T + 1e-3, cohc, cihc, species
) # , _transfer=False)
print("IHC time:", time.time() - start)
start = time.time()
m, v, psth = an_model.model_synapse(
vihc, CF, nrep, 1 / Fs, fiberType, noiseType, implnt
)
print("Syn time:", time.time() - start)
win = pg.GraphicsWindow()
p1 = win.addPlot(title="Input Stimulus (%0.1f dBSPL)" % db)
p1.plot(t, pin)
p2 = win.addPlot(col=0, row=1, title="IHC voltage")
p2.setXLink(p1)
# vihc = vihc.get()[0]
vihc = vihc[: len(vihc) // nrep]
t = np.arange(len(vihc)) * 1e-5
p2.plot(t, vihc)
p3 = win.addPlot(col=0, row=2, title="ANF PSTH")
p3.setXLink(p2)
ds = 100
size = psth.size // ds
psth = psth[: size * ds].reshape(size, ds).sum(axis=1)
t = np.arange(len(psth)) * 1e-5 * ds
p3.plot(t, psth[:-1], stepMode=True, fillLevel=0, fillBrush="w")
if sys.flags.interactive == 0:
pg.QtGui.QApplication.exec_()
if __name__ == "__main__":
import sys
test_an_model()