COMMENT
Modification of NetStim by Padraig Gleeson & Matteo Farinella for use in neuroConstruct.
Used to provide a time varying frequency of stimulation to a synaptic input. Actually varies the
interval until the next spike as function of time.
ENDCOMMENT
NEURON {
ARTIFICIAL_CELL NetStimVariable
RANGE minFrequency
RANGE noise, delay, dur
RANGE dc_comp, amp, freq, phase
}
PARAMETER {
minFrequency = 0.0005 (1/ms) <1e-9,1e9> : min frequency of stimulation, since frequency = 0 means no future spikes
noise = 0 <0,1> : amount of randomeness (0.0 - 1.0)
dur = 800 (ms) : burst duration
delay = 100 (ms) : delay before onset of burst
dc_comp = 0.01 (1/ms) : DC amplitude (between 0 az 1/3)
amp = 0.005 (1/ms) : amplitude of stimuli
freq = 0.007 (1/ms) : frequency of stimuli
phase = 0 : phase of stimuli
}
ASSIGNED {
event (ms)
on
end (ms)
}
PROCEDURE seed(x) {
set_seed(x)
}
FUNCTION getFrequency() {
LOCAL evalFreq
evalFreq = dc_comp + amp * sin(2 * 3.14159265 * freq * (t-delay) + phase) : Will be replaced by real expression in neuroConstruct
if(evalFreq < minFrequency) {
getFrequency = minFrequency
} else {
getFrequency = evalFreq
}
}
INITIAL {
LOCAL interval
on = 0
if (noise < 0) {
noise = 0
}
if (noise > 1) {
noise = 1
}
if (delay >= 0 ) {
interval = 1/getFrequency()
: randomize the first spike so on average it occurs at
: delay + noise*interval
event = delay + invl(interval) - interval*(1. - noise)
:printf("----- First event will be at: %g\n", event)
: but not earlier than 0
if (event < 0) {
event = 0
}
net_send(event, 3)
}
}
PROCEDURE init_sequence(t(ms)) {
if (getFrequency() > 0) {
on = 1
event = t
end = delay + dur
}
}
FUNCTION invl(mean (ms)) (ms) {
if (mean <= 0.) {
mean = .01 (ms) : I would worry if it were 0.
}
if (noise == 0) {
invl = mean
} else {
invl = (1. - noise)*mean + noise*mean*exprand(1)
}
}
PROCEDURE event_time() {
if (getFrequency() > 0) {
event = event + invl(1/getFrequency())
}
if (event > end) {
on = 0
}
}
NET_RECEIVE (w) {
:printf("----- NET_RECEIVE at: %g, flag: %g, on: %g\n", t, flag, on)
if (flag == 0) { : external event
if (w > 0 && on == 0) { : turn on spike sequence
init_sequence(t)
net_send(0, 1)
} else if (w < 0 && on == 1) { : turn off spiking
on = 0
}
}
if (flag == 3) { : from INITIAL
if (on == 0) {
init_sequence(t)
net_send(0, 1)
}
}
if (flag == 1 && on == 1) {
net_event(t)
event_time()
if (on == 1) {
:printf("----- Next event time: %g\n", event)
net_send(event - t, 1)
}
}
}