: $Id: OFThpo.mod,v 1.3 2009/03/13 11:57:56 billl Exp $
COMMENT
based on Otto Friesen Neurodynamix model
spiking portion of cell model
variant on OFThresh.mod that uses paste-on instead of calculated spike
ENDCOMMENT
TITLE OF Threshold Spiking
UNITS {
(mV) = (millivolt)
(nA) = (nanoamp)
(uS) = (microsiemens)
}
NEURON {
POINT_PROCESS OFPO
USEION other WRITE iother VALENCE 1.0
RANGE gkbase : base level of k+ conductance after a spike
RANGE gkmin : min level of k+ conductance can decay to after a spike
RANGE vth : threshold for spike
RANGE tauvtha, vthinc : used for threshold adaptation
RANGE taugka, gkinc : used for gk adaptation (gkadapt state var)
RANGE ik,ek : k-related variables
RANGE tauk : tau for k current
RANGE i,spkht : current, spike height
RANGE refrac : duration of absolute refractory period
RANGE inrefrac : if in refractory period
RANGE apdur : action potential duration
RANGE ena,gnamax : na-related variables -- NOT used
GLOBAL verbose
GLOBAL checkref : check for spikes @ end of refrac
}
ASSIGNED {
v (mV)
iother (nA)
}
STATE { gk vthadapt gkadapt }
PARAMETER {
gkbase=0.060(uS) : Max Potassium conductance
taugka=100 (ms) : Time constant of adaptation
kadapt=0.007(uS) : Amount of adaptation for potassium
spkht = 55(mV)
tauk=2.3 (ms) : Time constant for potassium current
ek = -70(mV)
vth = -40(mV)
refrac = 2.7(ms)
inrefrac = 0
verbose = 0
apdur = 0.9 (ms)
gkinc = 0.006(uS)
tauvtha = 1(ms)
vthinc = 0
ik = 0(nA)
i = 0(nA)
gkmin = 0.00001(uS)
checkref = 1
gnamax = 0 : Na not used -- back compatibility
ena = 0
}
BREAKPOINT {
SOLVE states METHOD cnexp
if( gk < gkmin ) { gk = gkmin }
if( gkadapt < gkbase ) { gkadapt = gkbase }
if( vthadapt < vth ) { vthadapt = vth }
iassign()
}
INITIAL {
net_send(0,1)
gk = 0(uS)
gkadapt = gkbase
vthadapt = vth
ik = 0
i = 0
iother = 0
inrefrac = 0
}
DERIVATIVE states {
gk' = -gk/tauk
gkadapt' = (gkbase - gkadapt)/taugka
vthadapt' = (vth - vthadapt)/tauvtha
}
PROCEDURE iassign () {
ik = gk*(v-ek)
i = ik
iother = i
}
NET_RECEIVE (w) {
if (flag == 1) {
WATCH (v > vthadapt) 2
} else if (flag == 2) { :v > threshold
if(inrefrac == 0) { :if not in refractory period, spike
net_event(t) :send spike event
net_send(apdur,3) :send event for end of action potential
net_send(refrac,4) :send event for end of refractory period
inrefrac=1 :in refractory period
if( verbose ) { printf("spike at t=%g\n",t) }
} else {
if( verbose ) { printf("in refrac @ t = %g, no spike\n",t) }
}
} else if(flag == 3) { :end of action potential
gkadapt = gkadapt + gkinc
vthadapt = vthadapt + vthinc : threshold adaptation
gk = gkadapt :turn gk to max after action potential over
if (verbose) { printf("end of action potential @ t = %g\n",t) }
} else if(flag == 4) { :end of refractory period
inrefrac = 0 :set inrefrac flag off
if( verbose ) { printf("refrac over @ t = %g\n",t) }
:check for new spike @ end of refrac
if(checkref && v > vthadapt) { net_send(0,2) }
}
}
FUNCTION fflag () { fflag=1 }
PROCEDURE version () {
printf("$Id: OFThpo.mod,v 1.3 2009/03/13 11:57:56 billl Exp $ ")
}