//**********************       GRANULE CELL         ****************************************

// extracted from
// Dentate gyrus network model 
// Santhakumar V, Aradi I, Soltesz I (2005) J Neurophysiol 93:437-53 
// https://senselab.med.yale.edu/ModelDB/showModel.cshtml?model=51781&file=\dentategyrusnet2005\DG500_M7.hoc

// ModelDB file along with publication:
// Yim MY, Hanuschkin A, Wolfart J (2015) Hippocampus 25:297-308.
// http://onlinelibrary.wiley.com/doi/10.1002/hipo.22373/abstract

// modified and augmented by
// Man Yi Yim / 2015
// Alexander Hanuschkin / 2011

objref Gcell[ngcell]

begintemplate GranuleCell

external scale_gpas_dg_
external scale_sk_dg_
external scale_gabaa_
external scale_kir_

ndend1=4
ndend2=4
public  pre_list, connect_pre, subsets, is_art, is_connected
public  vbc2gc, vmc2gc, vhc2gc, vgc2bc, vbc2bc, vmc2bc, vhc2bc, vgc2mc, vbc2mc, vmc2mc, vhc2mc, vgc2hc, vmc2hc
public soma, gcdend1, gcdend2
public all, gcldend, pdend, mdend, ddend

create soma, gcdend1[ndend1], gcdend2[ndend2]
objref syn, pre_list


//to include steady state current injection
nst=1
objectvar stim[nst]
public stim
// double stimdur[nst], stimdel[nst], stimamp[nst]
// public stim, stimdur, stimamp, stimdel

proc init() {
	pre_list = new List()
	subsets()
	gctemp()
	synapse()
}

objref all, gcldend, pdend, mdend, ddend
proc subsets(){ local i
	objref all, gcldend, pdend, mdend, ddend
	all = new SectionList()
		soma all.append()
		for i=0, 3 gcdend1 [i] all.append()
		for i=0, 3 gcdend2 [i] all.append()

	gcldend  = new SectionList()
		gcdend1 [0] gcldend.append()
		gcdend2 [0] gcldend.append()

	pdend  = new SectionList()
		gcdend1 [1] pdend.append()
		gcdend2 [1] pdend.append()

	mdend  = new SectionList()
		gcdend1 [2] mdend.append()
		gcdend2 [2] mdend.append()

	ddend  = new SectionList()
		gcdend1 [3] ddend.append()
		gcdend2 [3] ddend.append()
}
proc gctemp() {

scale_area = 1./1.13

// ********** Parameters for reversal potentials (assigned below) *********
e_gabaa_ 	= -70.			// reversal potential GABAA

// ***************** Parameters
g_pas_fit_ 	= 1.44e-05  * (scale_gpas_dg_ / 100.) 
gkbar_kir_fit_  = 1.44e-05 * (scale_kir_ / 100.) 
ggabaabar_fit_  = 0.722e-05 * (scale_gabaa_ / 100.) 

// *********************** PAS ******************************************
cm_fit_ 	=  1.			
Ra_fit_ 	=  184. 			// fitted

// *********************** KIR *****************************************
vhalfl_kir_fit_ = -98.923594  		// for Botzman I/V curve, fitted
kl_kir_fit_     = 10.888538 		// for Botzman I/V curve, fitted
q10_kir_fit_    = 1.			// temperature factor, set to 1
vhalft_kir_fit_ = 67.0828           	// 3 values for tau func from Stegen et al. 2011
at_kir_fit_     = 0.00610779
bt_kir_fit_     = 0.0817741

// ********************* Neuron Morphology etc ***************************
LJP_ 		= -10.			// Liquid junction potential [mV]
V_rest 		= -68.16+LJP_   	// resting potential [mV]
V_init 		= -68.16+LJP_   	// initial potential [mV]

// ******************** GABAA ******************** 
e_pas_fit_	= -83.8
e_pas_fit_Dend 	= -81.74

	soma {nseg=1 L=16.8*scale_area diam=16.8*scale_area} // changed L & diam
		
	gcdend1 [0] {nseg=1 L=50*scale_area diam=3*scale_area}
	for i = 1, 3	gcdend1 [i] {nseg=1 L=150*scale_area diam=3*scale_area}

	gcdend2 [0] {nseg=1 L=50*scale_area diam=3*scale_area}
	for i = 1, 3	gcdend2 [i] {nseg=1 L=150*scale_area diam=3*scale_area}	

	forsec all {
		insert ccanl
			catau_ccanl = 10
			caiinf_ccanl = 5.e-6
		Ra=Ra_fit_
	}

	soma {insert ichan2  						
			gnatbar_ichan2=0.12 				// value Aradi & Holmes 1999 <ah>
			gkfbar_ichan2=0.016  
			gksbar_ichan2=0.006
			gl_ichan2 = g_pas_fit_
			el_ichan2 = e_pas_fit_				// set leak reversal poti to gain Vrest of cell <ah>
		insert ka 						
			gkabar_ka=0.012
		insert nca  						
			gncabar_nca=0.002  
		insert lca 						
			glcabar_lca=0.005
		insert tca						
			gcatbar_tca=0.000037
		insert sk						
			gskbar_sk=0.001  * (scale_sk_dg_ / 100.)
		insert bk 						
			gkbar_bk=0.0006
		cm=cm_fit_
	} 

	forsec gcldend {insert ichan2
			gnatbar_ichan2=0.018  				// value Aradi & Holmes 1999 <ah>
			gkfbar_ichan2=0.004
			gksbar_ichan2=0.006
			gl_ichan2 = g_pas_fit_
			el_ichan2 = e_pas_fit_				// set leak reversal poti to gain Vrest of cell <ah>
		insert nca  // HAV-N- Ca channel
			gncabar_nca=0.003  				// value Aradi & Holmes 1999 <ah>
		insert lca 
			glcabar_lca=0.0075
		insert tca
			gcatbar_tca=0.000075
		insert sk
			gskbar_sk=0.0004 * (scale_sk_dg_ / 100.)
		insert bk
			gkbar_bk=0.0006
		cm=cm_fit_
	}
		
	forsec pdend {insert ichan2
			gnatbar_ichan2=0.013				// value Aradi & Holmes 1999 <ah>
			gkfbar_ichan2=0.004
			gksbar_ichan2=0.006
			gl_ichan2 = g_pas_fit_ * (0.000063/0.00004)
			el_ichan2 = e_pas_fit_Dend 			// see comment above <ah>
		insert nca  // HAV-N- Ca channel
			gncabar_nca=0.001  				// value Aradi & Holmes 1999 <ah>
		insert lca 
			glcabar_lca=0.0075
		insert tca
			gcatbar_tca=0.00025
		insert sk
			gskbar_sk=0.0002  * (scale_sk_dg_ / 100.)
		insert bk
			gkbar_bk=0.001
		cm=cm_fit_*1.6
	}
		
	forsec mdend {insert ichan2
			gnatbar_ichan2=0.008				// value Aradi & Holmes 1999 <ah>
			gkfbar_ichan2=0.001
			gksbar_ichan2=0.006
			gl_ichan2 = g_pas_fit_ * (0.000063/0.00004)
			el_ichan2 = e_pas_fit_Dend  			// see comment above <ah>
		insert nca  
			gncabar_nca=0.001  				// value Aradi & Holmes 1999 <ah>
		insert lca 
			glcabar_lca=0.0005
		insert tca
			gcatbar_tca=0.0005
		insert sk
			gskbar_sk=0.0     * (scale_sk_dg_ / 100.)
		insert bk
			gkbar_bk=0.0024
		cm=cm_fit_*1.6
	}

	forsec ddend {insert ichan2
			gnatbar_ichan2=0.0
			gkfbar_ichan2=0.001
			gksbar_ichan2=0.008
			gl_ichan2 = g_pas_fit_ * (0.000063/0.00004)
			el_ichan2 = e_pas_fit_Dend  			// see comment above <ah>
		insert nca  
			gncabar_nca=0.001  				// value Aradi & Holmes 1999 <ah>
		insert lca 
			glcabar_lca=0.0
		insert tca
			gcatbar_tca=0.001
		insert sk
			gskbar_sk=0.0     * (scale_sk_dg_ / 100.)
		insert bk
			gkbar_bk=0.0024
		cm=cm_fit_*1.6
	}
		
	
	connect gcdend1[0](0), soma(1)
	connect gcdend2[0](0), soma(1)
	for i=1,3 {
		connect gcdend1[i](0), gcdend1[i-1](1)
	}
	for i=1,3 {
		connect gcdend2[i](0), gcdend2[i-1](1)
	}

	forsec all {
		insert kir						// kir conductance added in Yim et al. 2015, note that eK=-90mV is used instead of -105mV as reported in the paper <ah>
			gkbar_kir       =       gkbar_kir_fit_
			vhalfl_kir      =       vhalfl_kir_fit_
			kl_kir          =       kl_kir_fit_
			vhalft_kir      =       vhalft_kir_fit_
			at_kir          =       at_kir_fit_
			bt_kir          =       bt_kir_fit_
			ggabaa_ichan2 	= 	ggabaabar_fit_		// added GabaA in Yim et al. 2015 <ah> 
			egabaa_ichan2 	= 	e_gabaa_		// reversal potential GABAA added in Yim et al. 2015 <ah>
        		ena 		= 	50		        // ena was unified from enat=55 (BC, HIPP, MC) and enat=45 (GC) in Santhakumar et al. (2005) <ah>
                        ek		=	-90		        // simplified ekf=eks=ek=esk; note the eK was erroneously reported as -105mV in the Yim et al. 2015 <ah>
                        cao_ccanl	=	2 }
} // end of gctemp()

// Retrieval of objref arguments uses the syntax: $o1, $o2, ..., $oi.
// http://web.mit.edu/neuron_v7.1/doc/help/neuron/general/ocsyntax.html#arguments
proc connect_pre() {  
	soma $o2 = new NetCon (&v(1), $o1)
}


// Define synapses on to GCs using 
//- an Exp2Syn object (parameters tau1 -rise, tau2 -decay, 
// time constant [ms] and e - rev potential [mV]
// delay [ms] and weight -variablr betw 0 and 1 [1 corresponding to 1 'S]

proc synapse() {
	gcdend1[3] syn = new Exp2Syn(0.5) // PP syn based on data from Greg Hollrigel and Kevin Staley   <AH> NOTE: both synapses are identical!
	syn.tau1 = 1.5	syn.tau2 = 5.5	syn.e = 0
	pre_list.append(syn)

	gcdend2[3] syn = new Exp2Syn(0.5) // PP syn based on Greg and Staley
	syn.tau1 = 1.5	syn.tau2 = 5.5	syn.e = 0
	pre_list.append(syn)

	gcdend1[1] syn = new Exp2Syn(0.5) // MC syn *** Estimated
	syn.tau1 = 1.5	syn.tau2 = 5.5	syn.e = 0
	pre_list.append(syn)

	gcdend2[1] syn = new Exp2Syn(0.5) // MC syn   *** Estimated
	syn.tau1 = 1.5	syn.tau2 = 5.5	syn.e = 0
	pre_list.append(syn)

	gcdend1[3] syn = new Exp2Syn(0.5) // HIPP  syn based on Harney and Jones corrected for temp
	syn.tau1 = 0.5	syn.tau2 = 6	syn.e = -70
	pre_list.append(syn)

	gcdend2[3] syn = new Exp2Syn(0.5) // HIPP syn based on Harney and Jones corrected for temp
	syn.tau1 = 0.5	syn.tau2 = 6	syn.e = -70
	pre_list.append(syn)

	soma syn = new Exp2Syn(0.5) // BC  syn  based on Bartos
	syn.tau1 = 0.26	syn.tau2 = 5.5	syn.e = -70
	pre_list.append(syn)

	gcdend1[1] syn = new Exp2Syn(0.5) 								// NOTE: SPROUTED SYNAPSE based on Molnar and Nadler
	syn.tau1 = 1.5	syn.tau2 = 5.5	syn.e = 0
	pre_list.append(syn)

	gcdend2[1] syn = new Exp2Syn(0.5) 								// NOTE: SPROUTED SYNAPSE
	syn.tau1 = 1.5	syn.tau2 = 5.5	syn.e = 0
	pre_list.append(syn)

	// Total of 7 synapses per GC 0,1 PP; 	2,3 MC;	4,5 HIPP and 	6 BC	7,8 Sprout
}

func is_art() { return 0 }

endtemplate GranuleCell