: $Id: OFThresh.mod,v 1.22 2010/05/04 21:32:47 billl Exp $
COMMENT
based on Otto Friesen Neurodynamix model
spiking portion of cell model
ENDCOMMENT
TITLE OF Threshold Spiking
UNITS {
(mV) = (millivolt)
(nA) = (nanoamp)
(uS) = (microsiemens)
}
NEURON {
POINT_PROCESS OFTH
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 gna,ena,ina,gnamax : na-related variables
RANGE verbose
GLOBAL checkref : check for spikes @ end of refrac
}
ASSIGNED {
v (mV)
iother (nA)
inrefrac
}
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)
verbose = 0
apdur = 0.9 (ms)
gkinc = 0.006(uS)
tauvtha = 1(ms)
vthinc = 0
gna = 0(uS)
ena = 55(mV)
ina = 0(nA)
ik = 0(nA)
i = 0(nA)
gnamax = .300(uS)
gkmin = 0.00001(uS)
checkref = 1
}
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
gna = 0(uS)
ina = 0
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)
ina = gna*(v-ena)
i = ik + ina
iother = i
}
NET_RECEIVE (w) {
if (flag==1) {
WATCH (v > vthadapt) 2
} else if (flag==2 && !inrefrac) { :v>threshold or direct input
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
gkadapt = gkadapt + gkinc : explicit 'state_discontinuity' command not needed
vthadapt = vthadapt + vthinc : threshold adaptation
gna = gnamax : turn on na
if (verbose) { printf("spike at t=%g\n",t) }
} else if(flag==3) { :end of action potential
gk = gkadapt :turn gk to max after action potential over
gna = 0 :turn off na
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) }
} else if (flag==0 && w>0) {
net_event(t) :extra spike event from outside -- just pass on to postsyn cells
} else if (flag==2 && inrefrac && verbose ) { printf("in refrac @ t = %g, no spike\n",t) }
}
FUNCTION fflag () { fflag=1 }
PROCEDURE version () {
printf("$Id: OFThresh.mod,v 1.22 2010/05/04 21:32:47 billl Exp $ ")
}