: $Id: netrand.inc,v 1.5 2010/02/23 15:39:27 billl Exp $
VERBATIM
#include "misc.h"
static char *name;
static Symbol* cbsv;
typedef struct ID0 { // extra RANGE variables
double *tsp;
double *wsp;
} id0;
#define IDP (*((id0**) &(_p_sop)))
static id0 *ip, *qp, *rp;
ENDVERBATIM
NEURON {
RANGE g, Erev, fflag
NONSPECIFIC_CURRENT i
POINTER sop :::: Structure pointer for other range vars
GLOBAL Cdur, Alpha, Beta, Rinf, Rtau
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(umho) = (micromho)
(mM) = (milli/liter)
}
PARAMETER {
fflag = 0
}
ASSIGNED {
v (mV) : postsynaptic voltage
i (nA) : current = g*(v - Erev)
g (umho) : conductance
Rinf : steady state channels open
Rtau (ms) : time constant of channel binding
synon
sop
}
STATE {Ron Roff}
INITIAL {
PROTECT Rinf = Alpha / (Alpha + Beta)
PROTECT Rtau = 1 / (Alpha + Beta)
synon = 0
}
CONSTRUCTOR {
VERBATIM
cbsv=0x0;
_p_sop = (double*)ecalloc(1, sizeof(id0)); // important that calloc sets all flags etc to 0
ip = IDP;
ENDVERBATIM
}
DESTRUCTOR {
VERBATIM
free(IDP);
ENDVERBATIM
}
BREAKPOINT {
SOLVE release METHOD cnexp
g = (Ron + Roff)*1(umho)
i = g*(v - Erev)
}
DERIVATIVE release {
Ron' = (synon*Rinf - Ron)/Rtau
Roff' = -Beta*Roff
}
: following supports both saturation from single input and
: summation from multiple inputs
: if spike occurs during CDur then new off time is t + CDur
: ie. transmitter concatenates but does not summate
: Note: automatic initialization of all reference args to 0 except first
NET_RECEIVE (weight, on, nspike, r0, t0 (ms)) {
: flag is an implicit argument of NET_RECEIVE and normally 0
if (t>0) { : bug fix so that init doesn't send a false event
if (flag == 0) { : a spike, so turn on if not already in a Cdur pulse
nspike = nspike + 1
if (!on) {
r0 = r0*Exp1(-Beta*(t - t0))
t0 = t
on = 1
synon = synon + weight
Ron = Ron + r0
Roff = Roff - r0
}
: come again in Cdur with flag = current value of nspike
net_send(Cdur, nspike)
}
if (flag == nspike) { : if this associated with last spike then turn off
r0 = weight*Rinf + (r0 - weight*Rinf)*Exp1(-(t - t0)/Rtau)
t0 = t
synon = synon - weight
Ron = Ron - r0
Roff = Roff + r0
on = 0
}
}
}
PROCEDURE initrnd () {
VERBATIM
int local_i,j,max;
if (hoc_is_str_arg(local_i=1)) {
local_i++;
cbsv=hoc_lookup(gargstr(1));
}
j=vector_arg_px(local_i++, &ip->tsp);
max=vector_arg_px(local_i++, &ip->wsp);
if (max!=j) {printf("initrnd ERR: vecs of different size: %d %d\n",max,j); hxe();}
if (max==0) {printf("initrnd ERR: vec not initialized\n"); hxe();}
ENDVERBATIM
}
FUNCTION Exp1(x) {
if (x < -100) {
Exp1 = 0
} else if (x > 100) {
Exp1 = exp(100)
} else{
Exp1 = exp(x)
}
}
|