Source code for cnmodel.util.stim
import numpy as np
[docs]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.,
'post': 50.,
'amp': None,
'preamp': 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.:
predur = int(np.floor(stim['predur'] / dt))
else:
predur = 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.:
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.)
maxt = maxt + dt
return(w, maxt, tstims)