// granule.tem
// Template for three-compartment granule cell model
// Andrew Davison, The Babraham Institute, 2000

begintemplate Gran
  public soma, periph, deep, AMPAr, NMDAr, spiketimes, spikecount
  public connect2target, synlist
  external thresh
  create soma, periph, deep, s2d, s2p
  objref AMPAr, NMDAr, spiketimes, spikecount, synlist

  proc init() { local Len, Erest, RM, p, q, Atotal, gsp, gsd, AMPAtau, NMDAalpha, NMDAbeta, Erev, rsd, rsp
    create soma, periph, deep, s2d, s2p

	synlist = new List()
    spiketimes = new Vector()
    lastspikecount = 0

    Erest		= -65		// mV
    Atotal		= 8353		// um2
    gsp			= 3.08e-10	// S/cm2
    gsd			= 4.34e-10
    RM			= 120000	// ohm.cm2
    Len			= 50
    p			= 0.0136
    q			= 0.308
    rsd 		= 1/(gsd*Atotal)
    rsp 		= 1/(gsp*Atotal)
    NMDAalpha		= 0.0163	// ms-1
    NMDAbeta		= 0.00292	// ms-1
    AMPAtau		= 5.5		// ms
    Erev		= 0		// mV

    soma {
      L 		= Len
      diam 		= p*Atotal/(PI*Len)
      Ra 		= PI/(4*Len*Atotal)
      insert pas
      e_pas 		= Erest		// reversal potential mV
      g_pas 		= 1/RM 		// membrane conductance S/cm2
      insert nagrantab
      insert kslowtab
      insert kM
      insert kA
      gnabar_nagrantab 	= 0.1611	// S/cm2
      gkbar_kslowtab 	= 0.1313
      gkbar_kM 		= 0.1334
      gkbar_kA 		= 0.0088
    }
    periph {
      L 		= Len
      diam 		= q*Atotal/(PI*Len)
      Ra 		= PI/(4*Len*Atotal)
      insert pas
      e_pas 		= Erest
      g_pas 		= 1/RM
      insert nagrantab
      insert kslowtab
      gnabar_nagrantab 	= 0.1355
      gkbar_kslowtab 	= 0.0243
      AMPAr = new ExpSyn(0.5)
	synlist.append(AMPAr)
      AMPAr.tau 	= AMPAtau
      AMPAr.e 		= Erev
      NMDAr = new NMDA(0.5)
	synlist.append(NMDAr)
      NMDAr.Alpha	= NMDAalpha
      NMDAr.Beta	= NMDAbeta
      NMDAr.e		= Erev
      spikecount = new APCount(0.5)
      spikecount.thresh = -30
      spikecount.record(spiketimes)
    }
    deep {
      L 		= Len
      diam 		= (1-p-q)*Atotal/(PI*Len)
      Ra 		= PI/(4*Len*Atotal)
      insert pas
      e_pas 		= Erest
      g_pas 		= 1/RM
    }
    s2d { 
      diam 		= 1
      Ra = PI*diam*diam/(4*Len*Atotal) * ( 1/gsd )
      L 		= 1
    }
    s2p { 
      diam 		= 1
      Ra = PI*diam*diam/(4*Len*Atotal) * ( 1/gsp )
      L 		= 1
    }

    soma connect s2p(0), 0
    s2p connect periph(0), 1
    soma connect s2d(0), 1
    s2d connect deep(0), 1

    // set reversal potentials, etc.
    forall if (ismembrane("na_ion")) {
      ena = 45	// mV
    }
    forall if (ismembrane("k_ion")) {
      ek  = -70	//  mV
    }

  }

proc connect2target() {
	periph $o2 = new NetCon(&v(0.5), $o1)
	$o2.threshold = thresh
}

endtemplate Gran