// FILE IN USE 05/17/2005 -- present.
// Changes to previous version of 01/05:
//	1. HCN channels rebuilt based on Chan et al (2004), J Neurosci 24: 9921-32.	

//genesis
float  xmin = -0.2
float  xmax = 0.1
int    xdivs = 299 
float  dx = (xmax - xmin)/xdivs

int xdivs_interp = 6000
float  dx_interp = (xmax - xmin)/xdivs_interp

float  x
int i

//==================================================================
// 	Tab channel descriptions for GP neuron modeling
// 	Created by J. Hanson
//	edited 10-02
//	Updated by J. Edgerton, 9/2003 --
//==================================================================



//==================================================================
//                      Fast Na channel
//	Activation and fast inactivation made to replicate resurgent
//		sodium current from Raman & Bean.
//	Slow inactivation gate added by J. Edgerton, 2004.
//	Support for voltage-dependent Z-gate by Cengiz Gunay, 2004
//==================================================================
function make_Na_fast_GP_Zgate
        if ({exists Na_fast_GP})
                return
        end
        create  tabchannel Na_fast_GP
	float mpower = 3
        setfield Na_fast_GP Ek {ENa} Gbar {G_Na_fast_GP} Ik 0 Gk 0\
                Xpower {mpower} Ypower 1 Zpower 1
		
//	Activation & Deactivation
	float Vhalfm 	= {Vhalfm_NaF}
	float Km 	= {Km_NaF}
	float taummax 	= {taummax_NaF}	// 0.000028	//0.00010   
        float taummin 	= {taummin_NaF}	//  0.00000157	//0.00002
	float Ktau1   =	 0.02
	float Ktau2   =  0.02
	float V0m, minf, taum
	V0m = {Vhalfm} + ({Km} * {log {(1 / {pow 0.5 {1/{mpower}}}) - 1}})
	echo "Na_fast V0m: " {V0m}
        call Na_fast_GP TABCREATE X {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                minf = 1 / (1 + {exp {({V0m} - x) / {Km} }})
		taum = {taummin} + (({taummax} - {taummin}) / ({exp { (x - {V0m}) / {Ktau1} } } + {exp {({V0m} - x) / {Ktau2} }}))
                setfield Na_fast_GP X_A->table[{i}] {taum}
                setfield Na_fast_GP X_B->table[{i}] {minf}
                x = x + dx
        end
        tweaktau Na_fast_GP X
	call Na_fast_GP TABFILL X {xdivs_interp} 0
	setfield Na_fast_GP X_A->calc_mode {NO_INTERP}
	setfield Na_fast_GP X_B->calc_mode {NO_INTERP}

//	Fast Inactivation
	float V0h	= {V0h_NaF}
	float tauhV0	= {tauhV0_NaF}
	float Kh      =	{Kh_NaF}	// 	-0.003848
	float tauhmax =  {tauhmax_NaF}	//	0.004 
        float tauhmin =  {tauhmin_NaF}	//	0.0002
	float Ktau1h   =  0.005
	float Ktau2h   =  0.01
	float hinf, tauh
        call Na_fast_GP TABCREATE Y {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                hinf = 1 / (1 + {exp {({V0h} - x) / {Kh} }})
		tauh = {tauhmin} + (({tauhmax} - {tauhmin}) / ({exp { (x - {tauhV0}) / {Ktau1h} } } + {exp {({tauhV0} - x) / {Ktau2h} }}))
                setfield Na_fast_GP Y_A->table[{i}] {tauh}
                setfield Na_fast_GP Y_B->table[{i}] {hinf}
                x = x + dx
        end
        tweaktau Na_fast_GP Y
        call Na_fast_GP TABFILL Y {xdivs_interp} 0
	setfield Na_fast_GP Y_A->calc_mode {NO_INTERP}
	setfield Na_fast_GP Y_B->calc_mode {NO_INTERP}


//	Slow Inactivation
//	Equations & params from Spampanato et al, 2003, except that
//		tausmin added to prevent segmentation faults due to
//		excessively small time constants at voltage extremes.
	float V0s	= {V0s_NaF}
	float tausV0	= {V0s_NaF}
	float Ks      	= {Ks_NaF}
	float mins	= {mins_NaF}
	float Ktaus1   	= {Ktaus1_NaF}
	float Ktaus2	= {Ktaus2_NaF}
	float tausmax	= {tausmax_NaF}
	float tausmin	= {tausmin_NaF}
	float sinf, taus
	
        call Na_fast_GP TABCREATE Z {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
		sinf = {mins} + ((1-{mins}) / (1 + {exp {({V0s} - x) / {Ks} }}))
		taus = tausmin + ({tausmax} - {tausmin}) / ({exp {({tausV0} - x) / {Ktaus1}}} + {exp {(x - {tausV0}) / {Ktaus2}}}) 

		setfield Na_fast_GP Z_A->table[{i}] {taus}
                setfield Na_fast_GP Z_B->table[{i}] {sinf}
                x = x + dx
        end
        tweaktau Na_fast_GP Z
        call Na_fast_GP TABFILL Z {xdivs_interp} 0
	setfield Na_fast_GP Z_A->calc_mode {NO_INTERP}
	setfield Na_fast_GP Z_B->calc_mode {NO_INTERP}
	setfield Na_fast_GP Z_conc 0  // Z-gate voltage-dependent
end

//==================================================================
//                      Fast Na channel
//	Activation and fast inactivation made to replicate resurgent
//		sodium current from Raman & Bean.
//	Slow inactivation gate added by J. Edgerton, 2004.
//	Support for voltage-dependent Z-gate by Cengiz Gunay, 2004
// 	Populates all table entries from the original equation,
//	rather than using TABFILL (for testing purposes).
//==================================================================
function make_Na_fast_GP_Zgate_nofill
        if ({exists Na_fast_GP})
                return
        end
        create  tabchannel Na_fast_GP
	float mpower = 3
        setfield Na_fast_GP Ek {ENa} Gbar {G_Na_fast_GP} Ik 0 Gk 0\
                Xpower {mpower} Ypower 1 Zpower 1
		
//	Activation & Deactivation
	float Vhalfm 	= {Vhalfm_NaF}
	float Km 	= {Km_NaF}
	float taummax 	= {taummax_NaF}	// 0.000028	//0.00010   
        float taummin 	= {taummin_NaF}	//  0.00000157	//0.00002
	float Ktau1   =	 0.02
	float Ktau2   =  0.02
	float V0m, minf, taum
	V0m = {Vhalfm} + ({Km} * {log {(1 / {pow 0.5 {1/{mpower}}}) - 1}})
	echo "Na_fast V0m: " {V0m}
        call Na_fast_GP TABCREATE X {xdivs_interp} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs_interp}; i = i + 1)
                minf = 1 / (1 + {exp {({V0m} - x) / {Km} }})
		taum = {taummin} + (({taummax} - {taummin}) / ({exp { (x - {V0m}) / {Ktau1} } } + {exp {({V0m} - x) / {Ktau2} }}))
                setfield Na_fast_GP X_A->table[{i}] {taum}
                setfield Na_fast_GP X_B->table[{i}] {minf}
                x = x + dx_interp
        end
        tweaktau Na_fast_GP X
		//call Na_fast_GP TABFILL X {xdivs_interp} 0
	setfield Na_fast_GP X_A->calc_mode {NO_INTERP}
	setfield Na_fast_GP X_B->calc_mode {NO_INTERP}

//	Fast Inactivation
	float V0h	= {V0h_NaF}
	float tauhV0	= {tauhV0_NaF}
	float Kh      =	{Kh_NaF}	// 	-0.003848
	float tauhmax =  {tauhmax_NaF}	//	0.004 
        float tauhmin =  {tauhmin_NaF}	//	0.0002
	float Ktau1h   =  0.005
	float Ktau2h   =  0.01
	float hinf, tauh
        call Na_fast_GP TABCREATE Y {xdivs_interp} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs_interp}; i = i + 1)
                hinf = 1 / (1 + {exp {({V0h} - x) / {Kh} }})
		tauh = {tauhmin} + (({tauhmax} - {tauhmin}) / ({exp { (x - {tauhV0}) / {Ktau1h} } } + {exp {({tauhV0} - x) / {Ktau2h} }}))
                setfield Na_fast_GP Y_A->table[{i}] {tauh}
                setfield Na_fast_GP Y_B->table[{i}] {hinf}
                x = x + dx_interp
        end
        tweaktau Na_fast_GP Y
		//call Na_fast_GP TABFILL Y {xdivs_interp} 0
	setfield Na_fast_GP Y_A->calc_mode {NO_INTERP}
	setfield Na_fast_GP Y_B->calc_mode {NO_INTERP}

//	Slow Inactivation
//	Equations & params from Spampanato et al, 2003, except that
//		tausmin added to prevent segmentation faults due to
//		excessively small time constants at voltage extremes.
	float V0s	= {V0s_NaF}
	float tausV0	= {V0s_NaF}
	float Ks      	= {Ks_NaF}
	float mins	= {mins_NaF}
	float Ktaus1   	= {Ktaus1_NaF}
	float Ktaus2	= {Ktaus2_NaF}
	float tausmax	= {tausmax_NaF}
	float tausmin	= {tausmin_NaF}
	float sinf, taus
	
        call Na_fast_GP TABCREATE Z {xdivs_interp} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs_interp}; i = i + 1)
		sinf = {mins} + ((1-{mins}) / (1 + {exp {({V0s} - x) / {Ks} }}))
		taus = tausmin + ({tausmax} - {tausmin}) / ({exp {({tausV0} - x) / {Ktaus1}}} + {exp {(x - {tausV0}) / {Ktaus2}}}) 

		setfield Na_fast_GP Z_A->table[{i}] {taus}
                setfield Na_fast_GP Z_B->table[{i}] {sinf}
                x = x + dx_interp
        end
        tweaktau Na_fast_GP Z
		//call Na_fast_GP TABFILL Z {xdivs_interp} 0
	setfield Na_fast_GP Z_A->calc_mode {NO_INTERP}
	setfield Na_fast_GP Z_B->calc_mode {NO_INTERP}
	setfield Na_fast_GP Z_conc 0  // Z-gate voltage-dependent
end

//==================================================================
//                      Fast Na channel
//	Activation and fast inactivation made to replicate resurgent
//		sodium current from Raman & Bean.
//	Slow inactivation gate added by J. Edgerton, 2004.
//	Adapted to use the tab2Dchannel instead of Z-gate by C. Gunay, Jan 2006.
//==================================================================
function make_Na_fast_GP_tab2D
        if ({exists Na_fast_GP})
                return
        end
        create  tab2Dchannel Na_fast_GP
	float mpower = 3
        setfield Na_fast_GP Ek {ENa} Gbar {G_Na_fast_GP} Ik 0 Gk 0\
                Xpower {mpower} Ypower 1 Zpower 1
		
//	Activation & Deactivation
	float Vhalfm 	= {Vhalfm_NaF}
	float Km 	= {Km_NaF}
	float taummax 	= {taummax_NaF}	// 0.000028	//0.00010   
        float taummin 	= {taummin_NaF}	//  0.00000157	//0.00002
	float Ktau1   =	 0.02
	float Ktau2   =  0.02
	float V0m, minf, taum
	V0m = {Vhalfm} + ({Km} * {log {(1 / {pow 0.5 {1/{mpower}}}) - 1}})
	echo "Na_fast V0m: " {V0m}
	// Special use of 2D table as a 1D table
        call Na_fast_GP TABCREATE X 0 0 0 {xdivs_interp} {xmin} {xmax} 
        x = xmin
        for (i = 0; i <= {xdivs_interp}; i = i + 1)
                minf = 1 / (1 + {exp {({V0m} - x) / {Km} }})
		taum = {taummin} + (({taummax} - {taummin}) / ({exp { (x - {V0m}) / {Ktau1} } } + {exp {({V0m} - x) / {Ktau2} }}))
	        // tweaktau doesn't apply to tab2D, we fill tables directly with A & B
     		setfield Na_fast_GP X_A->table[0][{i}] {({minf} / {taum})}
 		setfield Na_fast_GP X_B->table[0][{i}] {(1 / {taum})}
                x = x + dx_interp
        end
		/*setfield Na_fast_GP X_A->calc_mode {NO_INTERP}
		  setfield Na_fast_GP X_B->calc_mode {NO_INTERP}*/
	// Voltage dependent gate
	setfield Na_fast_GP Xindex VOLT_INDEX

//	Fast Inactivation
	float V0h	= {V0h_NaF}
	float tauhV0	= {tauhV0_NaF}
	float Kh      =	{Kh_NaF}	// 	-0.003848
	float tauhmax =  {tauhmax_NaF}	//	0.004 
        float tauhmin =  {tauhmin_NaF}	//	0.0002
	float Ktau1h   =  0.005
	float Ktau2h   =  0.01
	float hinf, tauh
        call Na_fast_GP TABCREATE Y  0 0 0 {xdivs_interp} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs_interp}; i = i + 1)
                hinf = 1 / (1 + {exp {({V0h} - x) / {Kh} }})
		tauh = {tauhmin} + (({tauhmax} - {tauhmin}) / ({exp { (x - {tauhV0}) / {Ktau1h} } } + {exp {({tauhV0} - x) / {Ktau2h} }}))
     		setfield Na_fast_GP Y_A->table[0][{i}] {({hinf} / {tauh})}
		setfield Na_fast_GP Y_B->table[0][{i}] {(1 / {tauh})}
                x = x + dx_interp
        end
		/*setfield Na_fast_GP Y_A->calc_mode {NO_INTERP}
		  setfield Na_fast_GP Y_B->calc_mode {NO_INTERP}*/
	setfield Na_fast_GP Yindex VOLT_INDEX

//	Slow Inactivation
//	Equations & params from Spampanato et al, 2003, except that
//		tausmin added to prevent segmentation faults due to
//		excessively small time constants at voltage extremes.
	float V0s	= {V0s_NaF}
	float tausV0	= {V0s_NaF}
	float Ks      	= {Ks_NaF}
	float mins	= {mins_NaF}
	float Ktaus1   	= {Ktaus1_NaF}
	float Ktaus2	= {Ktaus2_NaF}
	float tausmax	= {tausmax_NaF}
	float tausmin	= {tausmin_NaF}
	float sinf, taus
	
        call Na_fast_GP TABCREATE Z  0 0 0  {xdivs_interp} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs_interp}; i = i + 1)
		sinf = {mins} + ((1-{mins}) / (1 + {exp {({V0s} - x) / {Ks} }}))
		taus = tausmin + ({tausmax} - {tausmin}) / ({exp {({tausV0} - x) / {Ktaus1}}} + {exp {(x - {tausV0}) / {Ktaus2}}}) 

     		setfield Na_fast_GP Z_A->table[0][{i}] {({sinf} / {taus})}
		setfield Na_fast_GP Z_B->table[0][{i}] {(1 / {taus})}
                x = x + dx_interp
        end
		/*setfield Na_fast_GP Z_A->calc_mode {NO_INTERP}
		  setfield Na_fast_GP Z_B->calc_mode {NO_INTERP}*/
	// Z-gate voltage-dependent
	setfield Na_fast_GP Zindex VOLT_INDEX
end

//==================================================================
//                      persistent Na channel
//	Based on Magistretti & Alonso (1999), JGP 114:491-509
//		and Magistretti & Alonso (2002), JGP 120: 855-873.
//	Created by J.R. Edgerton, 03/2004
//	Modified 10/2004 by JRE: add z-gate slow inactivation, improve 
//		model's y-gate intermediate inactivation.
//==================================================================
function make_Na_slow_GP
    if ({exists Na_slow_GP})
                return
    end
	create  tabchannel Na_slow_GP
	float mpower = 3
    setfield Na_slow_GP Ek {ENa} Gbar {G_Na_slow_GP} Ik 0 Gk 0 \
	Xpower {mpower} Ypower 1 Zpower 1
	
	float q10 = 3	// = Q10^((32-22)/10) with Q10 = 3.
	
//	***	Activation & Deactivation (m-gate)
    float Km    = 0.0057	// with mpower = 3, this makes actual K = 0.0045.
    float Vhalfm   = {Vhalfm_NaP}	// -0.053 according to Magistretti & Alonso
	float Ktaum =	0.0144	
	float V0taum =	-0.0416
	float alp0	=	2130	// 0.00213
	float bet0 = 	2460

	float V0m = {Vhalfm} + ({Km} * {log {(1 / {pow 0.5 {1/{mpower}}}) - 1}})
	echo "Na_slow V0m: " {V0m}

	float alpham, betam, taum, minf
        call Na_slow_GP TABCREATE X {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
		
			alpham = alp0 * {exp {(x - {V0taum}) / {Ktaum}}} * {q10}
			betam = bet0 * {exp {({V0taum} - x) / {Ktaum}}} * {q10}
			
            minf = 1 / (1 + {exp {({V0m} - x) / {Km} }})
			taum = 1 / ({alpham} + {betam})
			
            setfield Na_slow_GP X_A->table[{i}] {taum}
            setfield Na_slow_GP X_B->table[{i}] {minf}
            x = x + dx
        end
	
        tweaktau Na_slow_GP X
	call Na_slow_GP TABFILL X {xdivs_interp} 0
	setfield Na_slow_GP X_A->calc_mode {NO_INTERP}
	setfield Na_slow_GP X_B->calc_mode {NO_INTERP}

//	***	Fast / Intermediate Inactivation (h-gate)
	float hmin	= {hmin_NaP}	// 0.154
	float V0h   	= {V0h_NaP}	// -0.057	
    	float Kh   	= {Kh_NaP}	// -0.004
	float V0tauh = -0.034		
	float Ktauh1 = -0.026
	float Ktauh2 = -0.0319
	float tauhmin = 0.030
	float tauhmax = 0.051

	float tauh, hinf
        call Na_slow_GP TABCREATE Y {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
		
            hinf = {hmin} + ((1 - {hmin}) / (1 + {exp {({V0h} - x) / {Kh} }}))
			tauh = ({tauhmin} + (({tauhmax} - {tauhmin}) / ({exp {(x - {V0tauh}) / {Ktauh1}}} + {exp {({V0tauh} - x) / {Ktauh2}}}))) / {q10}
			
            setfield Na_slow_GP Y_A->table[{i}] {tauh}
            setfield Na_slow_GP Y_B->table[{i}] {hinf}
            x = x + dx
        end
	
        tweaktau Na_slow_GP Y
	call Na_slow_GP TABFILL Y {xdivs_interp} 0
	setfield Na_slow_GP Y_A->calc_mode {NO_INTERP}
	setfield Na_slow_GP Y_B->calc_mode {NO_INTERP}

//	*** Slow Inactivation (s-gate)	
    float Ks      =	-0.0049
    float V0s     =	{V0s_NaP}
	float Aalpha =	-2.88	//units of /volt/sec
	float Balpha =	-0.049	//units of /sec
	float Kalpha =	0.00463	//units of volt
	float Abeta =	{Abeta_NaP}	//6.94	//units of /volt/sec
	float Bbeta =	{Bbeta_NaP}	// 0.447	//units of /sec
	float Kbeta =	-0.00263	//units of volt

	float alphas, betas, taus, sinf
        call Na_slow_GP TABCREATE Z {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
			alphas = {q10} * (({Aalpha} * x) + {Balpha}) / (1 - {exp {((x + ({Balpha} / {Aalpha})) / {Kalpha})}})
			betas = {q10} * (({Abeta} * x) + {Bbeta}) / (1 - {exp {((x + ({Bbeta} / {Abeta})) / {Kbeta})}})
		
			taus = 1 / ({alphas} + {betas})
        	sinf = 1 / (1 + {exp {({V0s} - x) / {Ks} }})
        	setfield Na_slow_GP Z_A->table[{i}] {taus}
            setfield Na_slow_GP Z_B->table[{i}] {sinf}
            x = x + dx
        end
        tweaktau Na_slow_GP Z
        call Na_slow_GP TABFILL Z {xdivs_interp} 0
	setfield Na_slow_GP Z_A->calc_mode {NO_INTERP}
	setfield Na_slow_GP Z_B->calc_mode {NO_INTERP}
	setfield Na_slow_GP Z_conc 0  // Z-gate voltage-dependent
end


//==================================================================
//         		Kdr Kv2 
//		(Kv2.1) slow activating
//              Created based on GP data:
//              Baranuskas, Tkatch and Surmeier
//              1999, J Neurosci 19(15):6394-6404
//==================================================================
function make_Kv2_GP
        if (({exists Kv2_GP}))
                return
        end
        create tabchannel Kv2_GP
	float npower = {npower_Kv2}	//4
        setfield Kv2_GP Ek {EK} Gbar {G_Kv2_GP} Ik 0 Gk 0\
                Xpower {npower} Ypower 1 Zpower 0
	float taunmax = {taunmax_Kv2}	// 0.03 
	float taunmin = {taunmin_Kv2}	// 0.0001	
    float Kn = {Kn_Kv2}
    float Vhalfn = {Vhalfn_Kv2}	// True Vhalf for channel activation
	float K1tau = -0.01391
	float K2tau = -0.02174
	float V0n, ninf, taun, alpha, beta
	V0n = {Vhalfn} + ({Kn} * {log {(1 / {pow 0.5 {1/{npower}}}) - 1}})
	echo "Kv2 V0n: " {V0n}
	//V0n is Vhalf for each individual n gate.
	call Kv2_GP TABCREATE X {xdivs} {xmin} {xmax}
	x = xmin
	for (i = 0; i <= {xdivs}; i = i + 1)
		ninf = 1 / (1 + {exp { ({V0n} - x) / {Kn} } } )
		taun = {taunmin} + (({taunmax} - {taunmin}) / ({exp { ({V0n} - x) / {K1tau} } } + {exp {-({V0n} - x) / {K2tau} }}))
		setfield Kv2_GP X_A->table[{i}] {taun}
		setfield Kv2_GP X_B->table[{i}] {ninf}
/* Manual table contruction bypassing tweaktau:
		alpha = {ninf} / {taun}
		beta = {(1 / {taun}) - {alpha}}
		setfield Kv2_GP X_A->table[{i}] {alpha}
		setfield Kv2_GP X_B->table[{i}] {1 / {taun}}
*/
		x = x + dx
	end
	tweaktau Kv2_GP X
	call Kv2_GP TABFILL X {xdivs_interp} 0
	setfield Kv2_GP X_A->calc_mode {NO_INTERP}
	setfield Kv2_GP X_B->calc_mode {NO_INTERP}
        
	float Kh    =  	0.010
        float V0h   = 	-0.02
	float hmin  =	{hmin_Kv2}	// 0.2	
	float tauhmax = 3.4   
        float tauhmin =	3.4
	float tauhK   =	0.010
	float tauhV0  =	0 //-0.070 
	float hinf, tauh
        call Kv2_GP TABCREATE Y {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                hinf = {hmin} + ((1 - {hmin}) / (1 + {exp {(x - {V0h}) / {Kh} }}))
		tauh = {{tauhmax}-{tauhmin}} / (1 + {exp {(x - {tauhV0}) / {tauhK} }})  + {tauhmin} 
                setfield Kv2_GP Y_A->table[{i}] {tauh}
                setfield Kv2_GP Y_B->table[{i}] {hinf}
                x = x + dx
        end
        tweaktau Kv2_GP Y
	call Kv2_GP TABFILL Y {xdivs_interp} 0
	setfield Kv2_GP Y_A->calc_mode {NO_INTERP}
	setfield Kv2_GP Y_B->calc_mode {NO_INTERP}
end



//==================================================================
//         		Kdr Kv3
//		(Kv3.1/3.4 heteromultimers) fast activating,
//			incompletely inactivating.
//		From Surmeier's kv3sur.mod NEURON mechanism
//			written by Josh Held
//		Adapted to genesis by J.R. Edgerton, 2003
//		Modified to reflect new data in
//		Baranauskas et al (2003) by J.R. Edgerton, 2004.
//              Baranauskas, Tkatch and Surmeier
//              	1999, J Neurosci 19(15):6394-6404
//		Baranauskas, Tkatch, Nagata, Yeh & Surmeier 2003.
//			Nat Neurosci 6: 258-66.
//==================================================================
function make_Kv3_GP
        if (({exists Kv3_GP}))
                return
        end
        create tabchannel Kv3_GP
	float npower = {npower_Kv3}	// 4
        setfield Kv3_GP Ek {EK} Gbar {G_Kv3_GP} Ik 0 Gk 0\
                Xpower {npower} Ypower 1 Zpower 0
        float Kn = {Kn_Kv3}	// individual n-gate K	
        float Vhalfn = {Vhalfn_Kv3}	// True Vhalf for channel activation.
	float taunmax = 0.014	// actual peak of tauV curve is about 7 ms.
	float taunmin = 0.0001	// = true min tau
	float K1tau = -0.012
	float K2tau = -0.013	// changed from -0.021 02/16/2005
	float V0n, ninf, taun, alpha, beta
	V0n = {Vhalfn} + ({Kn} * {log {(1 / {pow 0.5 {1/{npower}}}) - 1}})
	echo "Kv3 V0n: " {V0n}
	//V0n is Vhalf for each individual n gate.
	
	call Kv3_GP TABCREATE X {xdivs} {xmin} {xmax}
	x = xmin
	for (i = 0; i <= {xdivs}; i = i + 1)
		ninf = 1 / (1 + {exp { ({V0n} - x) / {Kn} } } )
		taun = {taunmin} + (({taunmax} - {taunmin}) / ({exp { ({V0n} - x) / {K1tau} } } + {exp {-({V0n} - x) / {K2tau} }}))
		setfield Kv3_GP X_A->table[{i}] {taun}
		setfield Kv3_GP X_B->table[{i}] {ninf}
/* Manual table contruction bypassing tweaktau:
		alpha = {ninf} / {taun}
		beta = {(1 / {taun}) - {alpha}}
		setfield Kv3_GP X_A->table[{i}] {alpha}
		setfield Kv3_GP X_B->table[{i}] {1 / {taun}}
*/
		x = x + dx
	end
	tweaktau Kv3_GP X
	call Kv3_GP TABFILL X {xdivs_interp} 0
	setfield Kv3_GP X_A->calc_mode {NO_INTERP}
	setfield Kv3_GP X_B->calc_mode {NO_INTERP}
		
        float Kh    =  	0.010
        float V0h   = 	-0.02
	float hmin  =	{hmin_Kv3}	//	0.6	
	float tauhmax = 0.033   
        float tauhmin =	0.007
	float tauhK   =	0.010
	float tauhV0  =	0 //-0.070 
	float hinf, tauh
        call Kv3_GP TABCREATE Y {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                hinf = {hmin} + ((1 - {hmin}) / (1 + {exp {(x - {V0h}) / {Kh} }}))
		tauh = {{tauhmax}-{tauhmin}} / (1 + {exp {(x - {tauhV0}) / {tauhK} }})  + {tauhmin} 
                setfield Kv3_GP Y_A->table[{i}] {tauh}
                setfield Kv3_GP Y_B->table[{i}] {hinf}
                x = x + dx
        end
        tweaktau Kv3_GP Y
	call Kv3_GP TABFILL Y {xdivs_interp} 0
	setfield Kv3_GP Y_A->calc_mode {NO_INTERP}
	setfield Kv3_GP Y_B->calc_mode {NO_INTERP}

end


//==================================================================
//                      KA Kv4 fast
//               Low voltage-activated
//              Created based on GP data:
//              Tkatch, Baranauskas and Surmeier
//              2000, J Neurosci 20(2):579-588
//		Modified by J. R. Edgerton 02/2004
//==================================================================
function make_Kv4_fast_GP
        if (({exists Kv4_fast_GP}))
                return
        end
        create tabchannel Kv4_fast_GP
	float npower = 4
        setfield Kv4_fast_GP Ek {EK} Gbar {G_Kv4_fast_GP} Ik 0 Gk 0\
                Xpower {npower} Ypower 1 Zpower 0
        float Kn    	= {Kn_Kv4}	//	0.029
        float V0n   	= {V0n_Kv4}	//	-0.053	
	float taunmax 	=  0.007   
        float taunmin 	=  0.00025
	float Ktaun1 	= {Ktaun1_Kv4}	//	0.029
	float Ktaun2 	= {Ktaun2_Kv4}	//	0.029
	float ninf, taun
//	V0n = {Vhalfn} + ({Kn} * {log {(1 / {pow 0.5 {1/{npower}}}) - 1}})
	echo "Kv4f V0n: " {V0n}
 //	V0n = -0.043	//corrected for mpower = 4.
 	call Kv4_fast_GP TABCREATE X {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                ninf = 1 / (1 + {exp {({V0n} - x) / {Kn} }})
		taun = taunmin + ({taunmax} - {taunmin}) / ({exp {({V0n} - x) / {Ktaun1}}} + {exp {(x - {V0n}) / {Ktaun2}}}) 
                setfield Kv4_fast_GP X_A->table[{i}] {taun}
                setfield Kv4_fast_GP X_B->table[{i}] {ninf}
                x = x + dx
        end
        tweaktau Kv4_fast_GP X
	call Kv4_fast_GP TABFILL X {xdivs_interp} 0
	setfield Kv4_fast_GP X_A->calc_mode {NO_INTERP}
	setfield Kv4_fast_GP X_B->calc_mode {NO_INTERP}

	
	float tauhmax 	= 0.021   
        float tauhmin 	= 0.007
        float Kh    	= {Kh_Kv4}	//-0.0047
        float V0h   	= {V0h_Kv4}	//-0.072
	float Ktauh1 	= {Ktauh1_Kv4}	//0.010
	float Ktauh2 	= {Ktauh2_Kv4}	//0.010
	float hinf, tauh
        call Kv4_fast_GP TABCREATE Y {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                hinf = 1 / (1 + {exp {({V0h} - x) / {Kh} }})
		tauh = tauhmin + ({tauhmax} - {tauhmin}) / ({exp {({V0h} - x) / {Ktauh1}}} + {exp {(x - {V0h}) / {Ktauh2}}}) 
                setfield Kv4_fast_GP Y_A->table[{i}] {tauh}
                setfield Kv4_fast_GP Y_B->table[{i}] {hinf}
                x = x + dx
        end
        tweaktau Kv4_fast_GP Y
	call Kv4_fast_GP TABFILL Y {xdivs_interp} 0
	setfield Kv4_fast_GP Y_A->calc_mode {NO_INTERP}
	setfield Kv4_fast_GP Y_B->calc_mode {NO_INTERP}

end


//==================================================================
//                      KA Kv4 slow
//               Low voltage-activated
//              Created based on GP data:
//              Tkatch, Baranauskas and Surmeier
//              2000, J Neurosci 20(2):579-588
//		Modified by J. R. Edgerton 02/2004
//==================================================================
function make_Kv4_slow_GP
        if (({exists Kv4_slow_GP}))
                return
        end
        create tabchannel Kv4_slow_GP
	float npower = 4
        setfield Kv4_slow_GP Ek {EK} Gbar {G_Kv4_slow_GP} Ik 0 Gk 0\
                Xpower {npower} Ypower 1 Zpower 0
        float Kn    	= {Kn_Kv4}	//	0.029
        float V0n   	= {V0n_Kv4}	//	-0.053	
	float taunmax 	=  0.007   
        float taunmin 	=  0.00025
	float Ktaun1 	= {Ktaun1_Kv4}	//	0.029
	float Ktaun2 	= {Ktaun2_Kv4}	//	0.029
	float ninf, taun
//	V0n = {Vhalfn} + ({Kn} * {log {(1 / {pow 0.5 {1/{npower}}}) - 1}})
	echo "Kv4s V0n: " {V0n}
 //	V0n = -0.043	//corrected for mpower = 4.
 	call Kv4_slow_GP TABCREATE X {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                ninf = 1 / (1 + {exp {({V0n} - x) / {Kn} }})
		taun = taunmin + ({taunmax} - {taunmin}) / ({exp {({V0n} - x) / {Ktaun1}}} + {exp {(x - {V0n}) / {Ktaun2}}}) 
                setfield Kv4_slow_GP X_A->table[{i}] {taun}
                setfield Kv4_slow_GP X_B->table[{i}] {ninf}
                x = x + dx
        end
        tweaktau Kv4_slow_GP X
	call Kv4_slow_GP TABFILL X {xdivs_interp} 0
	setfield Kv4_slow_GP X_A->calc_mode {NO_INTERP}
	setfield Kv4_slow_GP X_B->calc_mode {NO_INTERP}

	
	float tauhmax =  0.121   
        float tauhmin =  0.05
        float Kh    	= {Kh_Kv4}	//-0.0047
        float V0h   	= {V0h_Kv4}	//-0.072
	float Ktauh1 	= {Ktauh1_Kv4}	//0.010
	float Ktauh2 	= {Ktauh2_Kv4}	//0.010
	float hinf, tauh
        call Kv4_slow_GP TABCREATE Y {xdivs} {xmin} {xmax}
        x = xmin
        for (i = 0; i <= {xdivs}; i = i + 1)
                hinf = 1 / (1 + {exp {({V0h} - x) / {Kh} }})
		tauh = tauhmin + ({tauhmax} - {tauhmin}) / ({exp {({V0h} - x) / {Ktauh1}}} + {exp {(x - {V0h}) / {Ktauh2}}}) 
                setfield Kv4_slow_GP Y_A->table[{i}] {tauh}
                setfield Kv4_slow_GP Y_B->table[{i}] {hinf}
                x = x + dx
        end
        tweaktau Kv4_slow_GP Y
	call Kv4_slow_GP TABFILL Y {xdivs_interp} 0
	setfield Kv4_slow_GP Y_A->calc_mode {NO_INTERP}
	setfield Kv4_slow_GP Y_B->calc_mode {NO_INTERP}

end


//==================================================================
//         			KCNQ 
// Activation kinetics: Gamper, Stockand, Shapiro (2003). J Neurosci 23: 84-95.
// GV curve, deact kinetics: Prole & Marrion (2004). Biophys J. 86: 1454-69.
//==================================================================
function make_KCNQ_GP
        if (({exists KCNQ_GP}))
                return
        end
        create tabchannel KCNQ_GP
	float npower = 4
        setfield KCNQ_GP Ek {EK} Gbar {G_KCNQ_GP} Ik 0 Gk 0\
                Xpower {npower} Ypower 0 Zpower 0
	float taunmax = 0.1	//Q10 = 3 adjusted	
	float taunmin = 0.0067	//Q10 = 3 adjusted
    float Kn = {Kn_KCNQ}
    float Vhalfn = {Vhalfn_KCNQ}	// True Vhalf for channel activation
	float K1tau = -0.025
	float K2tau = -0.035
	float V0n, ninf, taun, alpha, beta
	V0n = {Vhalfn} + ({Kn} * {log {(1 / {pow 0.5 {1/{npower}}}) - 1}})
	echo "KCNQ V0n: " {V0n}
	//V0n is Vhalf for each individual n gate.
	call KCNQ_GP TABCREATE X {xdivs} {xmin} {xmax}
	x = xmin
	for (i = 0; i <= {xdivs}; i = i + 1)
		ninf = 1 / (1 + {exp { ({V0n} - x) / {Kn} } } )
		taun = {taunmin} + (({taunmax} - {taunmin}) / ({exp { ({V0n} - x) / {K1tau} } } + {exp {-({V0n} - x) / {K2tau} }}))
		setfield KCNQ_GP X_A->table[{i}] {taun}
		setfield KCNQ_GP X_B->table[{i}] {ninf}
/* Manual table contruction bypassing tweaktau:
		alpha = {ninf} / {taun}
		beta = {(1 / {taun}) - {alpha}}
		setfield KCNQ_GP X_A->table[{i}] {alpha}
		setfield KCNQ_GP X_B->table[{i}] {1 / {taun}}
*/
		x = x + dx
	end
	tweaktau KCNQ_GP X
	call KCNQ_GP TABFILL X {xdivs_interp} 0
	setfield KCNQ_GP X_A->calc_mode {NO_INTERP}
	setfield KCNQ_GP X_B->calc_mode {NO_INTERP}
end


//==================================================================
//                       HVA Ca2+ Channels 
//	Voltage-dependent activation from GP data:  
//		Surmeier Seno and Kitai 1994
//             	J Neurophysio. 71(3):1272-1280
//==================================================================
//First make a calcium concentration object that will keep track of the
//Ca2+ coming in from the calcium channels and apply buffering. 
function make_Ca_GP_conc
        if (({exists Ca_GP_conc}))
                return
        end
        create Ca_concen Ca_GP_conc
        setfield Ca_GP_conc    \
                tau     {tau_CaClearance}   \   // sec
                B       5.2e-6 \   // Moles per coulomb, later scaled to conc
                Ca_base 5e-05     //Units in mM, so = 50 nM.
end

//Next make nernst object to keep track of Calcium reversal potential
//during changes in intracellular calcium concentration.
function make_Ca_GP_nernst
        if (({exists Ca_GP_nernst}))
                return
        end
	create nernst Ca_GP_nernst
	setfield Ca_GP_nernst	\
		Cout	2	\	//external Ca2+ conc
		Cin	5e-5	\	//baseline internal Ca2+ conc 50 nM
		T	32	\	//temp in Celsius
		valency	2	\	//divalent
		scale 	1		//E in volts
end

//Finally make actual calcium channels.
function make_Ca_HVA_GP
        if (({exists Ca_HVA_GP}))
                return
        end
	int ndivs, i
        float x, y
        create tabchannel Ca_HVA_GP
	setfield Ca_HVA_GP Ek {ECa} Gbar {G_Ca_HVA_GP} Ik 0 Gk 0 \
		Xpower {npower_CaHVA} Ypower 0 Zpower 0

	//first setup voltage-dependent activation
	float tau =  0.0002    //estimated from traces Q10=2.5 adjusted
        float K = -1*{Kn_CaHVA}		// -0.007
        float V0 = {Vhalfn_CaHVA}	// -0.002
        setuptau Ca_HVA_GP X \
                {tau} {tau*1e-6} 0 0 1e6 \
                1 0 1 {-1.0*V0} {K} -range {xmin} {xmax} 
	call Ca_HVA_GP TABFILL X {xdivs_interp} 0
	setfield Ca_HVA_GP X_A->calc_mode {NO_INTERP}
	setfield Ca_HVA_GP X_B->calc_mode {NO_INTERP}

end

function make_Ca_HVA_GP2
        if (({exists Ca_HVA_GP}))
                return
        end
	int ndivs, i
        float x, y
        create tabchannel Ca_HVA_GP
	setfield Ca_HVA_GP Ek {ECa} Gbar {G_Ca_HVA_GP} Ik 0 Gk 0 \
		Xpower {npower_CaHVA} Ypower 0 Zpower 0

	//first setup voltage-dependent activation
        float Kn = {Kn_CaHVA}
	float V0n = {Vhalfn_CaHVA} + ({Kn} * {log {(1 / {pow 0.5 {1/{npower_CaHVA}}}) - 1}})
	float taunmin = 0.0002    //estimated from traces Q10=2.5 adjusted
	float taunmax = 0.0002

	for (i = 0; i <= {xdivs}; i = i + 1)
		ninf = 1 / (1 + {exp { ({V0n} - x) / {Kn} } } )
		taun = {taunmin} + (({taunmax} - {taunmin}) / ({exp { ({V0n} - x) / {Kn} } } + {exp {-({V0n} - x) / {Kn} }}))
		setfield Ca_HVA_GP X_A->table[{i}] {taun}
		setfield Ca_HVA_GP X_B->table[{i}] {ninf}

		x = x + dx
	end

	tweaktau Ca_HVA_GP X
	call Ca_HVA_GP TABFILL X {xdivs_interp} 0
	setfield Ca_HVA_GP X_A->calc_mode {NO_INTERP}
	setfield Ca_HVA_GP X_B->calc_mode {NO_INTERP}

end


//==================================================================
//	SK channel from Volker Steuber's DCN neuron model, modified to
//		reflect Hill fits in the following:
//		Hirschberg et al, 1999: Biophys J. 77: 1905-13. 
//		Keen et al, 1999: J. Neurosci 19: 8830-38.
//		Tau-Ca equation made by Volker based on Hirschberg et al, 1998:
//			JGP 111: 565-581.
//==================================================================	
function make_SK_GP
	if ({exists K_ahp_GP})
		return
	end
 
	float cxmin, cxmax, cxdivs, cdx
	float taum, minf
	float hillslope = 4.6	// Hirschberg et al, 1999
	float taumax = 0.076	// deactivation tau in 0 Ca2+
	float taumin = 0.004	// max activation rate
	float caSat = 0.005	// calcium conc at which tauact hits max
	float tauK = ({taumax} - {taumin}) / {caSat}
	// NOTE: genesis SI concentration units = mols / m^3 = millimolar!
	create tabchannel K_ahp_GP
	setfield K_ahp_GP Ek {EK} Gbar {G_K_ahp_GP}  \
		Xpower 0 Ypower 0 Zpower 1 
	cxmin = 0.00001	// 10 nM
	cxmax = 0.06 		// 60 microM
				// Conc-dependence grid will have xdivs_interp points spanning 
				//	1 nM to 6 microM with resolution of 1 nM.
	cxdivs = 5999	// Have to use high-resolution for channel setup because
			// most of G-Ca curve falls within the first 1 microM.
	cdx = (cxmax - cxmin)/cxdivs
	call K_ahp_GP TABCREATE Z {cxdivs} {cxmin} {cxmax}
	x = cxmin

	for (i = 0; i <= {cxdivs}; i = i + 1)
    
    	if (x < {caSat})
      		taum = ({taumax} - x*{tauK})/{dQ10_SK}
    	else
      		taum = {taumin}/{dQ10_SK}
    	end
    	minf = {pow {x} {hillslope}} / ({pow {x} {hillslope}} + {pow {EC50_SK} {hillslope}})

    	setfield K_ahp_GP Z_A->table[{i}] {taum}
    	setfield K_ahp_GP Z_B->table[{i}] {minf}

		x = x + cdx
  	end
	
	tweaktau K_ahp_GP Z
	call K_ahp_GP TABFILL Z {xdivs_interp} 0
	setfield K_ahp_GP Z_A->calc_mode {NO_INTERP}
	setfield K_ahp_GP Z_B->calc_mode {NO_INTERP}
end
	

//==================================================================
//      H current  (Anomalous rectifier--mixed Na and K current)
//		HCN1/HCN2 heteromeric channel, GP-specific
//		Channel model from Chan et al (2004), J Neurosci 24: 9921-32.
//		Original model from Siegelbaum lab. Wang et al (2002), Neuron 36:
//			451-62. Chen et al (2001), JGP 117: 491-504.
//==================================================================
function make_h_HCN_GP
	if ({exists h_HCN_GP})
       		return
	end
	create tabchannel h_HCN_GP
	setfield h_HCN_GP Ek {Eh} Gbar {{G_h_HCN_GP}}  \
	Xpower 1 Ypower 0 Zpower 0
	float Km      	= -0.0033
    float V0m     	= -0.0764
	float taumin	= 0
	float tau0		= 14.5
	float Ktau1		= 0.00748
	float Ktau2		= 0.00656
	float dq10 = 4
    float minf, taum
    call h_HCN_GP TABCREATE X {xdivs} {xmin} {xmax}
    x = xmin
    for (i = 0; i <= {xdivs}; i = i + 1)
		minf = 1 / (1 + {exp {({V0m} - x) / {Km} }})
    		taum = ({taumin} + {tau0} / ({exp {(x-{V0m})/{Ktau1}}} + {exp {({V0m}-x)/{Ktau2}}})) / dq10
		setfield h_HCN_GP X_A->table[{i}] {taum}
		setfield h_HCN_GP X_B->table[{i}] {minf}
		x = x + dx
    end
    tweaktau h_HCN_GP X
    call h_HCN_GP TABFILL X {xdivs_interp} 0
	setfield h_HCN_GP X_A->calc_mode {NO_INTERP}
	setfield h_HCN_GP X_B->calc_mode {NO_INTERP}
end

//==================================================================
//      H current  (Anomalous rectifier--mixed Na and K current)
//		HCN2 homomeric channel, GP-specific
//		Channel model from Chan et al (2004), J Neurosci 24: 9921-32.
//		Original model from Siegelbaum lab. Wang et al (2002), Neuron 36:
//			451-62. Chen et al (2001), JGP 117: 491-504.
//==================================================================
function make_h_HCN2_GP
	if ({exists h_HCN2_GP})
       		return
	end
	create tabchannel h_HCN2_GP
	setfield h_HCN2_GP Ek {Eh} Gbar {{G_h_HCN2_GP}}  \
	Xpower 1 Ypower 0 Zpower 0
	float Km      	= -0.004
    float V0m     	= -0.0875
	float taumin	= 0
	float tau0		= 25.2
	float Ktau1		= 0.0082
	float Ktau2		= 0.0089
	float dq10 = 4
    float minf, taum
    call h_HCN2_GP TABCREATE X {xdivs} {xmin} {xmax}
    x = xmin
    for (i = 0; i <= {xdivs}; i = i + 1)
		minf = 1 / (1 + {exp {({V0m} - x) / {Km} }})
    		taum = ({taumin} + {tau0} / ({exp {(x-{V0m})/{Ktau1}}} + {exp {({V0m}-x)/{Ktau2}}})) / dq10
		setfield h_HCN2_GP X_A->table[{i}] {taum}
		setfield h_HCN2_GP X_B->table[{i}] {minf}
		x = x + dx
    end
    tweaktau h_HCN2_GP X
    call h_HCN2_GP TABFILL X {xdivs_interp} 0
	setfield h_HCN2_GP X_A->calc_mode {NO_INTERP}
	setfield h_HCN2_GP X_B->calc_mode {NO_INTERP}
end