: $Id: nstim.mod,v 1.5 2004/03/15 22:43:00 billl Exp $
NEURON {
ARTIFICIAL_CELL NStim
RANGE y
RANGE interval, number, start, end
RANGE noise,fflag
}
PARAMETER {
interval = 10 (ms) <1e-9,1e9>: time between spikes (msec)
number = 10 <0,1e9> : number of spikes
start = 50 (ms) : start of first spike
noise = 0 <0,1> : amount of randomeaness (0.0 - 1.0)
end = 1e9 (ms) : time to terminate train
fflag = 1 : don't change
}
ASSIGNED {
y
event (ms)
on
endt (ms)
}
PROCEDURE seed(x) {
set_seed(x)
}
INITIAL {
on = 0
y = 0
if (noise < 0) {
noise = 0
}
if (noise > 1) {
noise = 1
}
if (start >= 0 && number > 0) {
: randomize the first spike so on average it occurs at
: start + noise*interval
event = start + invl(interval) - interval*(1. - noise)
: but not earlier than 0
if (event < 0) {
event = 0
}
net_send(event, 3)
}
}
PROCEDURE init_sequence(t(ms)) {
if (number > 0) {
on = 1
event = t
endt = t + 1e-6 + invl(interval)*(number-1)
}
}
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 (number > 0) {
event = event + invl(interval)
}
if (event > endt || event > end) {
on = 0
}
}
NET_RECEIVE (w) {
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) {
y = 2
net_event(t)
event_time()
if (on == 1) {
net_send(event - t, 1)
}
net_send(.1, 2)
}
if (flag == 2) {
y = 0
}
}
INCLUDE "pointer.inc"