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
88 lines
2.4 KiB
2 years ago
|
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)
|