diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt index de0718e52caae88aff9ba25418fbe6a0c9d94759..a16fe6c04a873eff5f7b08dfe8a03040c5ce89a1 100644 --- a/mechanisms/CMakeLists.txt +++ b/mechanisms/CMakeLists.txt @@ -11,7 +11,7 @@ make_catalogue( make_catalogue( NAME allen - MOD CaDynamics Ca_HVA Ca_LVA Ih Im Im_v2 K_P K_T Kd Kv2like Kv3_1 NaTa NaTs NaV Nap SK + MOD CaDynamics Ca_HVA Ca_LVA Ih Im Im_v2 K_P K_T Kd Kv2like Kv3_1 NaTa NaTs NaV Nap SK Exp2Syn VERBOSE ${ARB_CAT_VERBOSE} ADD_DEPS ON) diff --git a/mechanisms/allen/Exp2Syn.mod b/mechanisms/allen/Exp2Syn.mod new file mode 100644 index 0000000000000000000000000000000000000000..b9cd2f7b06205e584d756a6cea19c6af09195124 --- /dev/null +++ b/mechanisms/allen/Exp2Syn.mod @@ -0,0 +1,80 @@ +COMMENT + +Two state kinetic scheme synapse described by rise time tau1, +and decay time constant tau2. The normalized peak condunductance is 1. +Decay time MUST be greater than rise time. + +The solution of A->G->bath with rate constants 1/tau1 and 1/tau2 is + A = a*exp(-t/tau1) and + G = a*tau2/(tau2-tau1)*(-exp(-t/tau1) + exp(-t/tau2)) + where tau1 < tau2 + +If tau2-tau1 is very small compared to tau1, this is an alphasynapse with time constant tau2. +If tau1/tau2 is very small, this is single exponential decay with time constant tau2. + +The factor is evaluated in the initial block +such that an event of weight 1 generates a +peak conductance of 1. + +Because the solution is a sum of exponentials, the +coupled equations can be solved as a pair of independent equations +by the more efficient cnexp method. + +ENDCOMMENT + +NEURON { + POINT_PROCESS Exp2Syn + RANGE tau1, tau2, erev + NONSPECIFIC_CURRENT i +} + +UNITS { + (nA) = (nanoamp) + (mV) = (millivolt) + (uS) = (microsiemens) +} + +PARAMETER { + v (mV) + tau1 = 0.1 (ms) <1e-9,1e9> + tau2 = 10 (ms) <1e-9,1e9> + erev = 0 (mV) +} + +ASSIGNED { + factor +} + +STATE { + A (uS) + B (uS) +} + +INITIAL { + LOCAL tp + : NOTE Arbor doesn't allow this, so removed for now + :if (tau1 > 0.9999*tau2) { tau1 = 0.9999*tau2 } + :if (tau1 < 1e-9*tau2) { tau1 = tau2*1e-9 } + A = 0 + B = 0 + tp = (tau1*tau2)/(tau2 - tau1) * log(tau2/tau1) + factor = -exp(-tp/tau1) + exp(-tp/tau2) + factor = 1/factor +} + +BREAKPOINT { + SOLVE state METHOD cnexp + LOCAL g + g = B - A + i = g*(v - erev) +} + +DERIVATIVE state { + A' = -A/tau1 + B' = -B/tau2 +} + +NET_RECEIVE(weight (uS)) { + A = A + weight*factor + B = B + weight*factor +}