NEURON { :NOTE: since this is an interface, there is no POINT_PROCESS name RANGE e, i, gmax, g RANGE tau_r RANGE tau_d RANGE dist :distance from the soma RANGE ndist :normalized distance from the soma RANGE factor RANGE tsyn,mg,mggate,gamma GLOBAL mg_dep RANGE lSF,gSF,Vtrg :local and global synaptic homeostatic plasticity factor between 0-1 RANGE tau_H : time constant for the homeostasis, should be orders of magnitude larger than the membrane time constant. NONSPECIFIC_CURRENT i } UNITS { (nA) = (nanoamp) (mV) = (millivolt) (uS) = (microsiemens) } PARAMETER { e = 0 (mV) tau_r = 0 (ms) tau_d = 0 (ms) dist factor gmax tsyn mg (mM) mggate gamma = 0.062 Vtrg = -60 :the default is that there is not homeostasis with such a high time constant tau_H = 1e300 (ms) :assuming membrane potential within the range of 20ms tau_H is three orders of magnitude higher. mg_dep = 3.57 } ASSIGNED { v (mV) i (nA) g (uS) } STATE { A B lSF } FUNCTION get_factor(tau_fast,tau_slow){ LOCAL tp tp = (tau_fast*tau_slow)/(tau_slow - tau_fast) * log(tau_slow/tau_fast) get_factor = -exp(-tp/tau_fast) + exp(-tp/tau_slow) get_factor = 1/get_factor } INITIAL { :start fresh A = 0 B = 0 g = 0 lSF = 1 tsyn = -1e80 :last time the synapse was active is very long ego if(tau_r/tau_d>0.999){ tau_r = tau_d*0.999 } if(!tau_r || !tau_d){ printf("User must set tau_r and tau_d (zero by default)") } factor = get_factor(tau_r,tau_d) } BREAKPOINT { SOLVE state METHOD cnexp :see Jahr & Stevens, J. Neurosci 10: 1830-1837, 1990; :Jahr & Stevens, J. Neurosci 10: 3178-3182, 1990 : from Jahr & Stevens mggate = 1 / (1 + exp( gamma * -v) * (mg / mg_dep)) lSF = lSF*(lSF>0) g = gmax*(B - A)*mggate*lSF i = g*(v - e) } DERIVATIVE state { A' = -A/tau_r B' = -B/tau_d lSF' = (Vtrg-v)/tau_H :the global implementation requires a pointer to the somatic voltage. } PROCEDURE EPSP(w){ A = A + w*factor B = B + w*factor tsyn = t }