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.
87 lines
2.4 KiB
87 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)
|
|
|