TITLE  potassium delayed rectifier, and potassium A channels
: Anna's version adding some shift values
: Kv4 from Tarfa et al 2017
: sodium from Yu et al 2014
 
UNITS {
        (molar) = (1/liter)
        (S) = (siemens)
        (mA) = (milliamp)
        (mV) = (millivolt)
         F = (faraday) (coulomb)
         R = (mole k) (mV-coulomb/degC)
        (mM) =  (millimolar)
}
 
NEURON {
        SUFFIX hhb
        USEION k WRITE ik
        RANGE  nspeed,gkhhbar,gkabar,ikhh,ika,ik,gk,gka,nshift,bkcor, ashift, nslope, tfast
        RANGE taukv4,asshift,fptog, qfix,qinf,pinf,ninf,ntau, qtau,ptau,kchip,fchip, qfast, qslow,gka2,q1,q2
        :GLOBAL minf,hinf,ninf
}
 
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
 
PARAMETER {
        v   (mV)
        dt  (ms)
		celsius = 35.0 (degC)
        gkhhbar = 665.0e-6 (S/cm2)
        gkabar  = 266.0e-6  (S/cm2) :kv4 conductance should be ~80% of gkhh
        ek  = -90.0  (mV)
        qv = 66.0 (mV)
        qs = 10.0  (1)
        ashift = 0.0 (mV)
        nshift = 0 (mV)
        nslope = 12
        bkcor = 0.0 (ms)
        taukv4 = 1.0
        asshift = 0
        fptog = 0
        qfix = 0
        nspeed = 2
        kchip=1
        fchip=0
        qfast = 0
        qslow = 0
        tfast = 25
 	
}
 
STATE {
         n <1e-3> p <1e-3> qone <1e-3> qtwo <1e-3> p2 <1e-3>
}
 
ASSIGNED {
        ik (mA/cm2)
        ika (mA/cm2)
        ikhh (mA/cm2)
		ninf qinf pinf hsinf p2inf q2inf
		qtau ptau ntau q2tau p2tau
		gk gka gka2
		q1 q2
}
 
BREAKPOINT {
        SOLVE states METHOD cnexp
  	gk = n*n*n

	if(fabs(fptog-1.0)<1e-6){ : neuron can be wonky with boolean-esque values
	  q2 = qfast*fchip
	  q1 = qslow*kchip
	} else {
	  q1 = qone*kchip
	  q2 = qtwo*fchip
	}
	gka = p*p*p*q1+p2*p2*p2*q2 : single activation state
	gka2 = gka*gkabar
    ikhh = gkhhbar*gk*(v - ek)      
    ika = gka2*(v - ek)      
    ik = ika + ikhh

}
 
UNITSOFF
 


: a-type modified to model from Latorre 2012
: this model features better inactivation kinetics
PROCEDURE rates(vf){
LOCAL ahf, bhf, ahs, bhs, am, bm, va

        
        ninf = boltz(vf,-20,nslope)

        
        if(vf>-40.8+2*ashift){
			p2inf = boltz(vf,-40.8+2*ashift,7.73) : fit to data, there will be some discrepency around window current
		} else {
			p2inf = boltz(vf,-40.8+2*ashift,5.73) : fit to data, there will be some discrepency around window current			
		}
        
        :p2inf = boltz(vf,-25,8.0) : 25 activation, with n=4, this makes p4inf at -37 mV (28 originally)
        qinf = boltz(vf,-68.0+ashift,-6.44+asshift) : inactivation
        q2inf = boltz(vf,-68.0+ashift,-6.44+asshift)
        p2inf = pow(p2inf,1.0/3.0)
        
        :pinf = boltz(vf,-25.0,8.0)
        :pinf = pow(pinf,1.0/3.0)
        pinf = p2inf


        

        if (v > -40-nshift){
          :ntau = 1 + 2.0*exp(-(log(1.0+0.05*(vf+40+nshift))/0.05*log(1.0+0.05*(vf+40+nshift))/0.05)/300) : peak tau at -40 mV, tau ~5ms at 0
          ntau = 1.0 +9.0*exp(-((vf+40+nshift))*((vf+40+nshift))/15.0) : peak tau at -40 mV, tau ~5ms at 0 :5 5 9

        } else {
          :ntau = 2.0 + 8.0*exp(-((vf+40+nshift))*((vf+40+nshift))/18.0) : peak tau at -40 mV, tau ~5ms at 0 :5 5 9
          ntau = nspeed +(10.0-nspeed)*exp(-((vf+40+nshift))*((vf+40+nshift))/15.0) : peak tau at -40 mV, tau ~5ms at 0 :5 5 9
          :ntau = 3.0
        }
        ntau =1.0*ntau
        p2tau = (1.029 + 4.83*boltz(vf,-56.7+ashift,-6.22))
        ptau= p2tau : slower activation
        :ptau = p2tau
        qtau = (50.0+(taukv4*250-25)*boltz(vf,-65+ashift,4.0)) : saturates after 100 ms per Tarfa et al
        q2tau = tfast:(10.0+65.0*boltz(vf,-65+ashift,4.0)) : faster may be needed for pacing : fast component inactivation


}
INITIAL {
        rates(v)

        n = ninf
        p = pinf
        qone =qinf
        qtwo = q2inf
        p2 = p2inf

}

DERIVATIVE states {  :Computes state variables m, h, and n 
        rates(v)

        n' = 1.0*(ninf-n)/ntau
        p' = (pinf-p)/ptau
        qone' = (qinf-qone)/qtau
        qtwo' = (q2inf-qtwo)/q2tau
        p2' = (p2inf-p2)/p2tau
}
 
 
 
FUNCTION boltz(x,y,z) {
                boltz = 1/(1 + exp(-(x - y)/z))
}
 
UNITSON