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.

88 lines
2.4 KiB

import numpy as np
def make_pulse(stim):
"""
Generate a pulse train for current / voltage command. Returns a tuple.
Parameters
----------
stim : dict
Holds parameters that determine stimulus shape:
* delay : time before first pulse
* Sfreq : frequency of pulses
* dur : duration of one pulse or main pulse
* predur : duration of prepulse (default should be 0 for no prepulse)
* amp : pulse amplitude
* preamp : amplitude of prepulse
* PT : delay between end of train and test pulse (0 for no test)
* NP : number of pulses
* hold : holding level (optional)
* dt : timestep
Returns
-------
w : stimulus waveform
maxt : duration of waveform
tstims : index of each pulse in the train
"""
defaults = {
"delay": 10,
"Sfreq": 50,
"dur": 100,
"predur": 0.0,
"post": 50.0,
"amp": None,
"preamp": 0.0,
"PT": 0,
"NP": 1,
"hold": 0.0,
"dt": None,
}
for k in stim:
if k not in defaults:
raise Exception("Stim parameter '%s' not accepted." % k)
defaults.update(stim)
stim = defaults
for k, v in stim.items():
if v is None:
raise Exception("Must specify stim parameter '%s'." % k)
dt = stim["dt"]
delay = int(np.floor(stim["delay"] / dt))
ipi = int(np.floor((1000.0 / stim["Sfreq"]) / dt))
pdur = int(np.floor(stim["dur"] / dt))
posttest = int(np.floor(stim["PT"] / dt))
ndur = 5
if stim["predur"] > 0.0:
predur = int(np.floor(stim["predur"] / dt))
else:
predur = 0.0
if stim["PT"] == 0:
ndur = 1
maxt = dt * (delay + predur + (ipi * (stim["NP"] + 3)) + posttest + pdur * ndur)
hold = stim.get("hold", None)
w = np.zeros(int(np.floor(maxt / dt)))
if hold is not None:
w += hold
# make pulse
tstims = [0] * int(stim["NP"])
for j in range(0, int(stim["NP"])):
prestart = delay
start = int(prestart + predur + j * ipi)
if predur > 0.0:
w[prestart : prestart + predur] = stim["preamp"]
w[start : start + pdur] = stim["amp"]
tstims[j] = start
if stim["PT"] > 0.0:
for i in range(start + posttest, start + posttest + pdur):
w[i] = stim["amp"]
w = np.append(w, 0.0)
maxt = maxt + dt
return (w, maxt, tstims)