COMMENT
NetStimG() is based on NetStim() but has a Gaussian stochastic interval. The Poisson noise capability is
retained. New parametrs are MeanInterval and SD (standard deviation) which control the interval
Mike Sikora July,2006
Added-The Start time is also Gaussian randomized vars MeanStart + StartSD
ENDCOMMENT
NEURON {
ARTIFICIAL_CELL NetStimG
RANGE interval, number, MeanStart, StartSD
RANGE noise,MeanInterval,SD
}
PARAMETER {
MeanInterval = 10 (ms)
SD = 0.5 (ms)
MeanStart = 50 (ms) : Start of 1st spike
StartSD = 1 : Standard deviation of 1st spike
number = 10 <0,1e9> : number of spikes (independent of noise)
noise = 0 <0,1> : amount of randomness (0.0 - 1.0)
}
ASSIGNED {
event (ms)
on
ispike
interval
}
PROCEDURE seed(x) {
set_seed(x)
}
INITIAL {
interval = normrand(MeanInterval,SD)
on = 0
ispike = 0
if (noise < 0) {
noise = 0
}
if (noise > 1) {
noise = 1
}
if (number > 0) {
: allowing MeanStart to be <0
event = normrand(MeanStart,StartSD)
:
if (event < 0) {
event = 0
}
net_send(event, 3)
}
}
PROCEDURE init_sequence(t(ms)) {
if (number > 0) {
on = 1
event = 0
ispike = 0
}
}
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 next_invl() {
if (number > 0) {
interval=normrand(MeanInterval,SD)
event = invl(interval)
}
if (ispike >= number) {
on = 0
}
}
NET_RECEIVE (w) {
if (flag == 0) { : external event
if (w > 0 && on == 0) { : turn on spike sequence
init_sequence(t)
: randomize the first spike so on average it occurs at
: noise*interval (most likely interval is always 0)
next_invl()
event = event - interval*(1. - noise)
net_send(event, 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) {
ispike = ispike + 1
net_event(t)
next_invl()
if (on == 1) {
net_send(event, 1)
}
}
}