// Network cell template
// PyramidalCell
// Geometry: 14 sections + axon
begintemplate PyramidalCell
public is_art
public init, topol, basic_shape, subsets, geom, biophys
public pre_list, connect2target,current_balance
public soma, radTprox, radTmed, radTdist, lm_thick2, lm_medium2, lm_thin2
public lm_thick1, lm_medium1, lm_thin1, oriprox1, oridist1, oriprox2, oridist2
public axon
public all, rad, lm, ori,xdist
objref pre_list
create soma, radTprox, radTmed, radTdist, lm_thick2, lm_medium2, lm_thin2
create lm_thick1, lm_medium1, lm_thin1, oriprox1, oridist1, oriprox2, oridist2
create axon
proc init() {
gmaxnmda=1
v_init=$3
topol()
subsets()
geom()
geom_nseg()
biophys($1,$2,$4,$5,$6,$7,$8,$9,$10,$11,$12) //sAHP,mAHP,taucalH
pre_list = new List()
synapses(gmaxnmda)
}
proc topol() { local i
connect radTprox(0), soma(1)
connect radTmed(0), radTprox(1)
connect radTdist(0), radTmed(1)
connect lm_thick2(0), radTdist(1)
connect lm_medium2(0), lm_thick2(1)
connect lm_thin2(0), lm_medium2(1)
connect lm_thick1(0), radTdist(1)
connect lm_medium1(0), lm_thick1(1)
connect lm_thin1(0), lm_medium1(1)
connect oriprox1(0), soma(0)
connect oridist1(0), oriprox1(1)
connect oriprox2(0), soma(1)
connect oridist2(0), oriprox2(1)
connect axon(0), soma(1)
basic_shape()
}
proc basic_shape() {
soma {pt3dclear() pt3dadd(0, 0, 0, 1) pt3dadd(15, 0, 0, 1)}
radTprox {pt3dclear() pt3dadd(15, 0, 0, 1) pt3dadd(15, 30, 0, 1)}
radTmed {pt3dclear() pt3dadd(15, 30, 0, 1) pt3dadd(15, 60, 0, 1)}
radTdist {pt3dclear() pt3dadd(15, 60, 0, 1) pt3dadd(15, 90, 0, 1)}
lm_thick2 {pt3dclear() pt3dadd(15, 90, 0, 1) pt3dadd(45, 105, 0, 1)}
lm_medium2 {pt3dclear() pt3dadd(45, 105, 0, 1) pt3dadd(75, 120, 0, 1)}
lm_thin2 {pt3dclear() pt3dadd(75, 120, 0, 1) pt3dadd(105, 135, 0, 1)}
lm_thick1 {pt3dclear() pt3dadd(15, 90, 0, 1) pt3dadd(-14, 105, 0, 1)}
lm_medium1 {pt3dclear() pt3dadd(-14, 105, 0, 1) pt3dadd(-44, 120, 0, 1)}
lm_thin1 {pt3dclear() pt3dadd(-44, 120, 0, 1) pt3dadd(-89, 135, 0, 1)}
oriprox1 {pt3dclear() pt3dadd(0, 0, 0, 1) pt3dadd(-44, -29, 0, 1)}
oridist1 {pt3dclear() pt3dadd(-44, -29, 0, 1) pt3dadd(-74, -59, 0, 1)}
oriprox2 {pt3dclear() pt3dadd(15, 0, 0, 1) pt3dadd(60, -29, 0, 1)}
oridist2 {pt3dclear() pt3dadd(60, -29, 0, 1) pt3dadd(105, -59, 0, 1)}
axon {pt3dclear() pt3dadd(15, 0, 0, 1) pt3dadd(15, -149, 0, 1)}
}
objref all,rad, lm, ori
proc subsets() { local i
all = new SectionList()
soma all.append()
radTprox all.append()
radTmed all.append()
radTdist all.append()
lm_thick2 all.append()
lm_medium2 all.append()
lm_thin2 all.append()
lm_thick1 all.append()
lm_medium1 all.append()
lm_thin1 all.append()
oriprox1 all.append()
oridist1 all.append()
oriprox2 all.append()
oridist2 all.append()
axon all.append()
rad=new SectionList()
radTprox rad.append()
radTmed rad.append()
radTdist rad.append()
ori=new SectionList()
oriprox1 ori.append()
oridist1 ori.append()
oriprox2 ori.append()
oridist2 ori.append()
lm=new SectionList()
lm_thick1 lm.append()
lm_medium1 lm.append()
lm_thin1 lm.append()
lm_thick2 lm.append()
lm_medium2 lm.append()
lm_thin2 lm.append()
}
proc geom() {
soma { L = 10 diam = 10 }
// SR is first 500um of apical dendrite
radTprox { L = 50 diam = 2 }
radTmed { L =50 diam = 1.5 }
radTdist { L = 100 diam = 1 }
// OLM is final 300um of apical dendrite
lm_thick2 { L = 50 diam = 1 }
lm_medium2 { L = 50 diam = 0.75 }
lm_thin2 { L = 25 diam = 0.5 }
lm_thick1 { L = 50 diam = 1 }
lm_medium1 { L = 50 diam = 0.75 }
lm_thin1 { L = 50 diam = 0.5 }
// Basal dendrites extend 300 um
oriprox1 { L = 50 diam = 1 }
oriprox2 { L =50 diam = 1 }
oridist1 { L = 100 diam = 0.75 }
oridist2 { L = 100 diam = 0.75 }
// Short section of axon
axon { L = 75 diam = 1 }
}
/*
proc geom() {
soma { L = 10 diam = 10 }
// SR is first 500um of apical dendrite
radTprox { L = 100 diam = 4 }
radTmed { L = 100 diam = 3 }
radTdist { L = 200 diam = 2 }
// OLM is final 300um of apical dendrite
lm_thick2 { L = 100 diam = 2 }
lm_medium2 { L = 100 diam = 1.5 }
lm_thin2 { L = 50 diam = 1 }
lm_thick1 { L = 100 diam = 2 }
lm_medium1 { L = 100 diam = 1.5 }
lm_thin1 { L = 50 diam = 1 }
// Basal dendrites extend 300 um
oriprox1 { L = 100 diam = 2 }
oridist1 { L = 200 diam = 1.5 }
oriprox2 { L = 100 diam = 2 }
oridist2 { L = 200 diam = 1.5 }
// Short section of axon
axon { L = 150 diam = 1 }
}
*/
external lambda_f
proc geom_nseg() {
forsec all { nseg = int((L/(0.1*lambda_f(100))+.9)/2)*2 + 1 }
}
proc biophys() {
Rm_axon = 28000 // Ohm.cm^2 (Migliore value)
Rm_soma = 28000 // Ohm.cm^2 (Migliore value)
Rm_trunk=25000
Rm_non_trunk= 25000
Rm_dend=25000
Ra_soma=Ra_basal=Ra_trunk=Ra_non_trunk=Ra_dend=150
Ra_axon=50
clesius=34
Cm_axon =1
Cm_soma=1
Cm_trunk=28/25
Cm_non_trunk=28/25
Cm_dend=28/25
crebsAHP=$1
crebmAHP=$2
tauca=$3
soma_caL =3*$10
soma_car =0.5*0.0003// for dendrite
gsomacar =0.0003
soma_calH =$10
soma_caT =$9
soma_km=0.001//0.001
soma_mykca =0.005//0.5*
soma_kca =0.0001// 0.005 AD case 0.0001 ctrl
soma_kap =$6
gh_soma = $8
soma_kad =$7
AXKdr=2
AXNa=2.5
qqa=7.2
qqinf=2
gna=0.025//0.18
gkdr=0.018
gnadend=0.02
gkdrdend=0.015
gnanosoma=0.02
gkdrnosoma=0.018
thnax=-30
qanax=7.5
thinfnax=-50
qinfnax=qqinf
thna3=$4
qana3=qqa
thinfna3=-50
qinfna3=qqinf
thna3dend =$5
qana3dend=qqa
thinfna3dend=-50
qinfna3dend=qqinf
thinfna3nosoma=-50
qinfna3nosoma=qqinf
thna3nosoma =$5
qana3nosoma=qqa
thna3dist = $5
qana3dist=qqa
qinfna3dist=qqinf
thinfna3dist=-50
shift=$11
shiftkm=shift
shiftkap=shift
shiftkad=shift
shifth=shift
forsec "soma" {
insert na3
gbar_na3=gna
qa_na3=qana3
tha_na3=thna3
qinf_na3=qinfna3
thinf_na3=thinfna3
sh_na3=shift
insert kdr
gkdrbar_kdr=gkdr
sh_kdr=shift
insert pas // leak conductance
g_pas = 1/Rm_soma
e_pas = v_init
Ra = Ra_soma
cm= Cm_soma
insert h // h current
ghdbar_h = gh_soma
vhalf_h = -73
sh_h=shifth
insert kap // proximal A current
gkabar_kap = soma_kap
ek = -80
sh_kap=shiftkap
insert km // m-type potassium current
gbar_km = soma_km
ek = -80
sh_km=shiftkm
insert cal // HVA Ca++-L type current
gcalbar_cal = soma_caL
insert cat // LVA Ca++-T type current
gcatbar_cat = soma_caT
insert somacar // HVAm Ca++-R type current
gcabar_somacar = gsomacar
insert kca // K(Ca) sAHP potassium type current
gbar_kca = 5*soma_kca*crebsAHP
insert mykca // K(Ca) mAHP potassium type current
gbar_mykca = soma_mykca*crebmAHP
insert cad // calcium pump/buffering mechanism
}
radTprox {
insert car
gcabar_car = soma_car
insert cad // calcium pump/buffering mechanism
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP
insert mykca // medium AHP K++ current (BPG)
gbar_mykca = 0.5*soma_mykca*crebmAHP
insert na3
gbar_na3=gna
tha_na3 = thna3
qa_na3= qana3
qinf_na3=qinfna3
thinf_na3=thinfna3
sh_na3=shift
insert kdr
gkdrbar_kdr=gkdr
sh_kdr=shift
insert pas // leak conductance
g_pas = 1/Rm_trunk
e_pas = v_init
Ra = Ra_trunk
cm = Cm_trunk
}
radTmed {
insert car // HVAm Ca++-R type current
gcabar_car = soma_car
insert cad // calcium pump/buffering mechanism
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP // varies depending on distance from 0.5*0.0001 to 5*0.0001
insert mykca // medium AHP K++ current (BPG)
gbar_mykca = 0.5*soma_mykca*crebmAHP
insert na3
tha_na3 = thna3nosoma
qa_na3= qana3nosoma
gbar_na3=gnanosoma
qinf_na3=qinfna3nosoma
thinf_na3=thinfna3nosoma
sh_na3=shift
insert kdr
gkdrbar_kdr=gkdrnosoma
sh_kdr=shift
insert pas
g_pas=1/Rm_trunk
Ra = Ra_trunk
cm = Cm_trunk
// leak conductance
}
radTdist {
insert car
gcabar_car = soma_car
insert cad // calcium pump/buffering mechanism
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP
insert mykca // medium AHP K++ current (BPG)
gbar_mykca =0.5* soma_mykca*crebsAHP
insert kdr
gkdrbar_kdr=gkdrnosoma
sh_kdr=shift
insert na3
tha_na3 = thna3nosoma
qa_na3= qana3nosoma
gbar_na3=gnanosoma
qinf_na3=qinfna3nosoma
thinf_na3=thinfna3nosoma
sh_na3=shift
insert pas
g_pas=1/Rm_trunk
Ra = Ra_trunk
cm = Cm_trunk
}
forsec lm {
insert na3
tha_na3 = thna3dist
qa_na3= qana3dist
gbar_na3=gnanosoma
qinf_na3=qinfna3dist
thinf_na3=thinfna3dist
sh_na3=shift
insert kdr
gkdrbar_kdr=gkdrnosoma
sh_kdr=shift
insert cat // LVA Ca++-T type current
gcatbar_cat = 3*soma_caT
insert car
gcabar_car =0.5* soma_car
insert mykca // K(Ca) mAHP potassium type current
gbar_mykca =0.5* soma_mykca*crebmAHP
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP
insert pas // passive properties
g_pas = 1/Rm_non_trunk
Ra = Ra_non_trunk
cm=Cm_non_trunk
}
oriprox1 {
insert h // h current according to Migliore et al. 2004
ghdbar_h = gh_soma
vhalfl_h = -73
insert car
gcabar_car = soma_car
insert calH
gcalbar_calH = 0.1*soma_calH // varies from .1*0.00031635 to 4.6*0.00031635 as distance increases
insert cat
gcatbar_cat = soma_caT
insert cad // calcium pump/buffering mechanism
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP // varies depending on distance from 0.5*0.0001 to 5*0.0001
insert mykca // medium AHP K++ current (BPG)
gbar_mykca = 0.5*soma_mykca*crebmAHP
insert kap // Inserting A-current
gkabar_kap = soma_kap //0.0075
sh_kap=shiftkap
insert kad
gkabar_kad = 0
sh_kad=shiftkad
insert na3dend
insert kdr
gbar_na3dend=gnadend
gkdrbar_kdr=gkdrdend
sh_kdr=shift
sh_na3dend=shift
insert pas
g_pas=1/Rm_dend
Ra = Ra_dend
cm = Cm_dend
}
oridist1 {
insert h // h current according to Migliore et al. 2004
ghdbar_h = 2*gh_soma
vhalfl_h = -81
sh_h=shifth
insert car
gcabar_car = soma_car
insert calH
gcalbar_calH = 0.1*soma_calH // varies from 4.6*0.00031635 to 0.1*0.00031635
insert cat
gcatbar_cat = soma_caT
insert cad // calcium pump/buffering mechanism
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP // varies depending on distance from 0.5*0.0001 to 5*0.0001
insert mykca // medium AHP K++ current (BPG)
gbar_mykca = 0.5*soma_mykca*crebmAHP
insert kap // Inserting A-current
gkabar_kap = soma_kap
sh_kap=shiftkap
insert kad
gkabar_kad = 0
sh_kad=shiftkad
insert na3dend
insert kdr
gbar_na3dend=gnadend
gkdrbar_kdr=gkdrdend
sh_kdr=shift
sh_na3dend=shift
insert pas
g_pas=1/Rm_dend
Ra = Ra_dend
cm = Cm_dend
}
oriprox2 {
insert h // h current according to Migliore et al. 2004
ghdbar_h = gh_soma
vhalfl_h = -73
sh_h=shifth
insert car
gcabar_car = soma_car
insert calH
gcalbar_calH = 0.1*soma_calH // varies from .1*0.00031635 to 4.6*0.00031635 as distance increases
insert cat
gcatbar_cat = soma_caT
insert cad // calcium pump/buffering mechanism
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP // varies depending on distance from 0.5*0.0001 to 5*0.0001
insert mykca // medium AHP K++ current (BPG)
gbar_mykca = 0.5*soma_mykca*crebmAHP
insert kap // Inserting A-current
gkabar_kap = soma_kap //0.0075
sh_kap=shiftkap
insert kad
gkabar_kad = 0
sh_kad=shiftkad
insert na3dend
insert kdr
gbar_na3dend=gnadend
gkdrbar_kdr=gkdrdend
sh_kdr=shift
sh_na3dend=shift
insert pas
g_pas=1/Rm_dend
Ra = Ra_dend
cm = Cm_dend
}
oridist2 {
insert h // h current according to Migliore et al. 2004
ghdbar_h = 2*gh_soma
vhalfl_h = -81
sh_h=shifth
insert car
gcabar_car = soma_car
insert calH
gcalbar_calH = 0.1*soma_calH // varies from 4.6*0.00031635 to 0.1*0.00031635
insert cat
gcatbar_cat = soma_caT
insert cad // calcium pump/buffering mechanism
insert kca // slow AHP K+ current
gbar_kca = 5*soma_kca*crebsAHP // varies depending on distance from 0.5*0.0001 to 5*0.0001
insert mykca // medium AHP K++ current (BPG)
gbar_mykca =0.5* soma_mykca*crebmAHP
insert kap // Inserting A-current
gkabar_kap = soma_kap //0.0075
ek=-80
sh_kap=shiftkap
insert kad
gkabar_kad = 0
sh_kad=shiftkad
insert na3dend
insert kdr
gbar_na3dend=gnadend
gkdrbar_kdr=gkdrdend
sh_kdr=shift
sh_na3dend=shift
insert pas
g_pas=1/Rm_dend
Ra = Ra_dend
cm = Cm_dend
}
axon {
insert nax
gbar_nax=AXNa*gna
tha_nax = thnax
qa_nax= qanax
qinf_nax=qinfnax
thinf_nax=thinfnax
sh_nax=shift
insert kdr
gkdrbar_kdr=AXKdr*gkdr
sh_kdr=shift
insert pas // leak conductance
g_pas = 1/Rm_axon // 1.4286e-5
e_pas = v_init
Ra = Ra_axon
cm = Cm_axon
insert km // m-type potassium current
gbar_km = 3*soma_km
ek = -80
sh_km=shiftkm
insert kap // proximal A current
gkabar_kap = soma_kap
ek = -80
sh_kap=shiftkap
}
forsec all {
ek = -80
ena = 50
e_pas = v_init
}
forall if (ismembrane("kap") ) {
ek=-80
}
forall if (ismembrane("kad") ) {
ek=-80
}
forall if (ismembrane("calH") ) {
mytau_calH = tauca
}
if (ismembrane("h") ) {ehd_h=-10}
}
forall if(ismembrane("ca_ion")) {
eca = 140
ion_style("ca_ion",0,1,0,0,0)
vshift_ca = 0
}
obfunc connect2target() { localobj nc //$o1 target point process, optional $o2 returned NetCon
soma nc = new NetCon(&v(1), $o1)
nc.threshold = -10
if (numarg() == 2) { $o2 = nc } // for backward compatibility
return nc
}
objref syn_
proc synapses() {
/* E0 */ lm_thick1 syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // AMPA EC input
syn_.tau1 = 0.5
syn_.tau2 = 3
syn_.e = 0
/* E1 */ lm_thick2 syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // AMPA EC input
syn_.tau1 = 0.5
syn_.tau2 = 3
syn_.e = 0
/* E2 */ radTmed syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // AMPA CA3 Schaffer collaterals
syn_.tau1 = 0.5
syn_.tau2 = 3
syn_.e = 0
/* E3 */ radTmed syn_ = new NMDA(0.5) pre_list.append(syn_) // NMDA CA3 Schaffer collaterals
/* syn_.tcon = 2.3
syn_.tcoff = 100
*/
//syn_.gNMDAmax = $1 // use connection weight to determine max cond
/* E4 */ radTprox syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // AMPA PC recurrent input
syn_.tau1 = 0.5
syn_.tau2 = 3
syn_.e = 0
/* I5 */ soma syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // GABA-A B cell
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I6 */ axon syn_ = new MyExp2Syn(0.1) pre_list.append(syn_) // GABA-A AA cell
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I7 */ lm_thick1 syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // GABA-A OLM cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I8 */ lm_thick2 syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // GABA-A OLM cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I9 */ lm_thick1 syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // GABA-B OLM cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* I10 */ lm_thick2 syn_ = new MyExp2Syn(0.5) pre_list.append(syn_) // GABA-B OLM cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* I11 */ radTmed syn_ = new MyExp2Syn(0.8) pre_list.append(syn_) // GABA-A BS cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I12 */ radTmed syn_ = new MyExp2Syn(0.7) pre_list.append(syn_) // GABA-A BS cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I13 */ radTmed syn_ = new MyExp2Syn(0.6) pre_list.append(syn_) // GABA-A BS cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I14 */ radTmed syn_ = new MyExp2Syn(0.4) pre_list.append(syn_) // GABA-A BS cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I15 */ radTmed syn_ = new MyExp2Syn(0.3) pre_list.append(syn_) // GABA-A BS cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I16 */ radTmed syn_ = new MyExp2Syn(0.2) pre_list.append(syn_) // GABA-A BS cells
syn_.tau1 = 1
syn_.tau2 = 8
syn_.e = -75
/* I17 */ radTmed syn_ = new MyExp2Syn(0.8) pre_list.append(syn_) // GABA-B BS cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* I18 */ radTmed syn_ = new MyExp2Syn(0.7) pre_list.append(syn_) // GABA-B BS cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* I19 */ radTmed syn_ = new MyExp2Syn(0.6) pre_list.append(syn_) // GABA-B BS cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* I20 */ radTmed syn_ = new MyExp2Syn(0.4) pre_list.append(syn_) // GABA-B BS cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* I21 */ radTmed syn_ = new MyExp2Syn(0.3) pre_list.append(syn_) // GABA-B BS cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* I22 */ radTmed syn_ = new MyExp2Syn(0.2) pre_list.append(syn_) // GABA-B BS cells
syn_.tau1 = 35
syn_.tau2 = 100
syn_.e = -75
/* E23 */ radTmed syn_ = new STDPE2(0.5) pre_list.append(syn_) // AMPA modifiable CA3 Schaffer collaterals
syn_.tau1 = 0.5
syn_.tau2 = 3
syn_.e = 0
}
func is_art() { return 0 }
proc current_balance() {
finitialize($1)
fcurrent()
printf("Balancing each compartment to %d mV\n", $1)
forall {
for (x) {
if (ismembrane("na_ion") && ismembrane("ca_ion") && ismembrane("Ca_ion") && (ismembrane("k_ion"))) {
e_pas(x)=(ina(x)+ik(x)+ica(x)+iCa(x)+g_pas(x)*v(x))/g_pas(x)
if (ismembrane("h")) {e_pas(x)=e_pas(x)+i_h(x)/g_pas(x)}
} else if (ismembrane("na_ion") && ismembrane("ca_ion") && (ismembrane("k_ion"))){
e_pas(x)=(ina(x)+ik(x)+ica(x)+g_pas(x)*v(x))/g_pas(x)
if (ismembrane("h")) {e_pas(x)=e_pas(x)+i_h(x)/g_pas(x)}
} else if (ismembrane("na_ion") && (ismembrane("k_ion"))) {
e_pas(x)=(ina(x)+ik(x)+g_pas(x)*v(x))/g_pas(x)
if (ismembrane("h")) {e_pas(x)=e_pas(x)+i_h(x)/g_pas(x)}
} else {
// print "simply assigning v(x)"
e_pas(x)=v(x)
}
}
}
}
endtemplate PyramidalCell