/*----------------------------------------------------------------------------
CURRENT-CLAMP SIMULATIONS OF TC CELLS
=====================================
Accession number ModelDB: 232876
Simulations of a simplified model of thalamic relay cell.
The current model is described in the following paper:
Zeldenrust F, Chameau P, Wadman WJ. Spike and Burst Coding in Thalamocortical Relay Cells. PLoS Computational Biology, 2017.
The original model, the basis of the current one, is described in the following paper:
Destexhe A, Neubig M, Ulrich D and Huguenard JR. Dendritic
low-threshold calcium currents in thalamic relay cells.
Journal of Neuroscience 18: 3574-3588, 1998.
Please cite these references when using this model.
----------------------------------------------------------------------------*/
//----------------------------------------------------------------------------
// simulation settings
//----------------------------------------------------------------------------
factor = .1
vhold = 80
strdef filename
if(factor == 0.5){
filename = "tcrelay3c_factor_05"
} else if(factor == 0.25){
filename = "tcrelay3c_factor_025"
} else if(factor == 0.75){
filename = "tcrelay3c_factor_075"
} else if(factor == 0){
filename = "tcrelay3c_factor_0"
} else if(factor == 0.1){
filename = "tcrelay3c_factor_01"
} else if(factor == 2){
filename = "tcrelay3c_factor_2"
} else if(factor == 1.5){
filename = "tcrelay3c_factor_15"
} else if(factor == 1){
filename = "tcrelay3c_factor_1"
}
if(vhold == 80){
sprint(filename,"%s%s",filename,"_80")
} else if(vhold == 70){
sprint(filename,"%s%s",filename,"_70")
} else if(vhold == 60){
sprint(filename,"%s%s",filename,"_60")
} else if(vhold == 50){
sprint(filename,"%s%s",filename,"_50")
}
//----------------------------------------------------------------------------
// load and define general graphical procedures
//----------------------------------------------------------------------------
load_file("nrngui.hoc") // updated command version of above
nrncontrolmenu() // create control menu
objectvar g[20] // max 20 graphs
ngraph = 0
proc addgraph() { local ii // define subroutine to add a new graph
// addgraph("variable", minvalue, maxvalue)
ngraph = ngraph+1
ii = ngraph-1
g[ii] = new Graph()
g[ii].size(tstart,tstop,$2,$3)
g[ii].xaxis()
g[ii].yaxis()
g[ii].addvar($s1,1,0)
g[ii].save_name("graphList[0].")
graphList[0].append(g[ii])
}
proc addshape() { local ii // define subroutine to add a new shape
// addshape()
ngraph = ngraph+1
ii = ngraph-1
g[ii] = new PlotShape()
g[ii].scale(-130,50)
}
//----------------------------------------------------------------------------
// transient time
//----------------------------------------------------------------------------
trans = 00
print " "
print ">> Transient time of ",trans," ms"
print " "
//----------------------------------------------------------------------------
// create multi-compartment geometry and insert currents
//----------------------------------------------------------------------------
xopen("cells/tc3.geo") // read geometry file
corrD = 7.954 // dendritic surface correction
// (estimated by fitting voltage-clamp traces)
corrR = 0.75 // make R 25% higher, so g=1/1.25=0.8, do also for C for correction RC time
corrC = 0.9 // make RC time smaller
G_pas = corrR*3.79e-5
E_pas = -73 // to fit current-clamp data (was -71 to -73)
E_pas = -76.5 // within 3 mV error
C_m = corrC*corrR*0.88
forall { // insert passive current everywhere
insert pas
g_pas = G_pas * corrD
e_pas = E_pas
cm = C_m * corrD
Ra = 173
L = L
}
soma {
g_pas = G_pas
cm = C_m
insert hh2 // insert fast spikes
ena = 50
ek = -100
vtraub_hh2 = -52
gnabar_hh2 = 0.1
gkbar_hh2 = 0.1
insert iL // insert IL (high-threshold calcium)
pcabar_iL=0.00005
insert iC // IKC (calcium-dependent potassium)
gkbar_iC=0.001
}
forall {
insert itGHK // T-current everywhere
cai = 2.4e-4
cao = 2
eca = 120
shift_itGHK = -1 // screening charge shift + 3 mV error
gcabar_itGHK = corrD * 0.0002
qm_itGHK = 2.5
qh_itGHK = 2.5
insert cad // calcium diffusion everywhere
depth_cad = 0.1 * corrD
kt_cad = 0 // no pump
kd_cad = 1e-4
taur_cad = 5
cainf_cad = 2.4e-4
insert iar // Ih everywhere
ghbar_iar = factor*1.3e-04
}
xopen("loc3.oc") // load procedures for localizing T-current
// high distal density, match detailed model in voltage-clamp
localize(1.7e-5,corrD*9.5e-5)
//----------------------------------------------------------------------------
// setup simulation parameters
//----------------------------------------------------------------------------
Dt = 0.1
npoints = 9030000 // longer traces stim_long
dt = 0.1 // must be submultiple of Dt
tstart = trans
tstop = trans + npoints * Dt
runStopAt = tstop
steps_per_ms = 1/Dt
celsius=30
v_init = -74 // approximate resting Vm
//----------------------------------------------------------------------------
// insert electrodes in the soma
//----------------------------------------------------------------------------
if(ismenu==0) {
xopen("El.oc") // Electrode with series resistance
ismenu = 1
}
access soma
// DC current electrode for setting holding potential
//----------------------------------------------------------------------------
objectvar El1 // insert electrode
El1 = new Electrode()
electrodes_present = 1
// CURRENT-CLAMP MODE
soma El1.stim.loc(0.5) // put electrode in current-clamp mode
El1.stim.del = 0
El1.stim.dur = tstop - tstart
if(vhold == 80){
El1.stim.amp = -0.7*factor // for -80
} else if(vhold == 70){
El1.stim.amp = -0.475*factor // for -70
} else if(vhold == 60){
El1.stim.amp = -0.275*factor // for -60
} else if(vhold == 50){
El1.stim.amp = -0.0*factor // for -50
}
// Variable current electrode for frozen noise stimulus
//----------------------------------------------------------------------------
objectvar El2
soma El2 = new IClamp(0.5)
El2.del = 0
El2.dur = tstop-tstart
// Frozen noise stimulus
objref r,f
f = new File()
r = new Vector()
// f.ropen("stimt1s3.dat") // tau = 1 ms stimulus
f.ropen("stim_long.dat")
r.scanf(f)
r.play(&El2.amp, dt)
// Variable current electrode for extra noise
//----------------------------------------------------------------------------
// objectvar El3
// soma El3 = new IClamp(0.5)
// El3.del = 0
// El3.dur = tstop-tstart
//
// Noisy stimulus extra noise
// objref r1,f1
// f1 = new File()
// r1 = new Vector()
// f1.ropen("stimvar.dat")
// r1.scanf(f1)
// r1.play(&El3.amp, dt)
//----------------------------------------------------------------------------
// add graphs
//----------------------------------------------------------------------------
addgraph("soma.v(0.5)",-100,50) // soma
//----------------------------------------------------------------------------
// Save
//----------------------------------------------------------------------------
objref rect, recv, recinternalcalcium
objref recicap, recih, recit, recikc, recina, recik
objref recmit, rechit, reco1ih, reco2ih, recmikc, recmina, rechina, recnik
// General
//----------------------------------------------------------------------------
// rect = new Vector()
// rect.record(&t)
recv = new Vector()
recv.record(&soma.v(0.5))
// recinternalcalcium = new Vector()
// recinternalcalcium.record(&soma.v(0.5))
// Currents
//----------------------------------------------------------------------------
// recicap = new Vector()
// recicap.record(&soma.i_cap(0.5))
recih = new Vector()
recih.record(&soma.ih(0.5))
recit = new Vector()
recit.record(&soma.ica(0.5))
// recikc = new Vector()
// recikc.record(&soma.iC(0.5))
recina = new Vector()
recina.record(&soma.ina(0.5))
recik = new Vector()
recik.record(&soma.ik(0.5))
// Gating variables
//----------------------------------------------------------------------------
recmit = new Vector()
recmit.record(&soma.m_itGHK(0.5))
rechit = new Vector()
rechit.record(&soma.h_itGHK(0.5))
reco1ih = new Vector()
reco1ih.record(&soma.o1_iar(0.5))
reco2ih = new Vector()
reco2ih.record(&soma.o2_iar(0.5))
// recmikc = new Vector()
// recmikc.record(&soma.m_iC(0.5))
recmina = new Vector()
recmina.record(&soma.m_hh2(0.5))
rechina = new Vector()
rechina.record(&soma.h_hh2(0.5))
recnik = new Vector()
recnik.record(&soma.n_hh2(0.5))
// Procedures for saving
//----------------------------------------------------------------------------
objref savdata
objref tempmatrix
tempmatrix = new Matrix()
proc fileopen() {
savdata = new File()
sprint(filename,"%s%s",filename,".dat")
savdata.wopen(filename)
}
proc slaop() {
tempmatrix.resize(recv.size(),7)
tempmatrix.setcol(0,recv)
tempmatrix.setcol(1,recih)
tempmatrix.setcol(2,recit)
tempmatrix.setcol(3,recmit)
tempmatrix.setcol(4,rechit)
tempmatrix.setcol(5,reco1ih)
tempmatrix.setcol(6,reco2ih )
tempmatrix.fprint(savdata, " %g")
savdata.close()
}
proc fileopenna() {
savdata = new File()
sprint(filename,"%s%s",filename,"_ina.dat")
savdata.wopen(filename)
}
proc slaopna() {
tempmatrix.resize(recv.size(),3)
tempmatrix.setcol(0,recina)
tempmatrix.setcol(1,recmina)
tempmatrix.setcol(2,rechina)
tempmatrix.fprint(savdata, " %g")
savdata.close()
}
proc fileopenk() {
savdata = new File()
sprint(filename,"%s%s",filename,"_ik.dat")
savdata.wopen(filename)
}
proc slaopk() {
tempmatrix.resize(recv.size(),2)
tempmatrix.setcol(0,recik)
tempmatrix.setcol(1,recnik)
tempmatrix.fprint(savdata, " %g")
savdata.close()
}