Thalamocortical Relay cell under current clamp in high-conductance state (Zeldenrust et al 2018)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:232876
Mammalian thalamocortical relay (TCR) neurons switch their firing activity between a tonic spiking and a bursting regime. In a combined experimental and computational study, we investigated the features in the input signal that single spikes and bursts in the output spike train represent and how this code is influenced by the membrane voltage state of the neuron. Identical frozen Gaussian noise current traces were injected into TCR neurons in rat brain slices to adjust, fine-tune and validate a three-compartment TCR model cell (Destexhe et al. 1998, accession number 279). Three currents were added: an h-current (Destexhe et al. 1993,1996, accession number 3343), a high-threshold calcium current and a calcium- activated potassium current (Huguenard & McCormick 1994, accession number 3808). The information content carried by the various types of events in the signal as well as by the whole signal was calculated. Bursts phase-lock to and transfer information at lower frequencies than single spikes. On depolarization the neuron transits smoothly from the predominantly bursting regime to a spiking regime, in which it is more sensitive to high-frequency fluctuations. Finally, the model was used to in the more realistic “high-conductance state” (Destexhe et al. 2001, accession number 8115), while being stimulated with a Poisson input (Brette et al. 2007, Vogels & Abbott 2005, accession number 83319), where fluctuations are caused by (synaptic) conductance changes instead of current injection. Under “standard” conditions bursts are difficult to initiate, given the high degree of inactivation of the T-type calcium current. Strong and/or precisely timed inhibitory currents were able to remove this inactivation.
Reference:
1 . Zeldenrust F, Chameau P, Wadman WJ (2018) Spike and burst coding in thalamocortical relay cells. PLoS Comput Biol 14:e1005960 [PubMed]
2 . Destexhe A, Bal T, McCormick DA, Sejnowski TJ (1996) Ionic mechanisms underlying synchronized oscillations and propagating waves in a model of ferret thalamic slices. J Neurophysiol 76:2049-70 [PubMed]
3 . Huguenard JP, Mccormick DA (1994) Electrophysiology of the Neuron: An Interactive Tutorial
4 . Destexhe A, Rudolph M, Fellous JM, Sejnowski TJ (2001) Fluctuating synaptic conductances recreate in vivo-like activity in neocortical neurons. Neuroscience 107:13-24 [PubMed]
5 . Brette R, Rudolph M, Carnevale T, Hines M, Beeman D, Bower JM, Diesmann M, Morrison A, Goodman PH, Harris FC, Zirpe M, Natschläger T, Pecevski D, Ermentrout B, Djurfeldt M, Lansner A, Rochel O, Vieville T, Muller E, Davison AP, El Boustani S, Destexhe A (2007) Simulation of networks of spiking neurons: a review of tools and strategies. J Comput Neurosci 23:349-98 [PubMed]
6 . Vogels TP, Abbott LF (2005) Signal propagation and logic gating in networks of integrate-and-fire neurons. J Neurosci 25:10786-95 [PubMed]
7 . Destexhe A, Neubig M, Ulrich D, Huguenard J (1998) Dendritic low-threshold calcium currents in thalamic relay cells. J Neurosci 18:3574-88 [PubMed]
8 . Destexhe A, Babloyantz A, Sejnowski TJ (1993) Ionic mechanisms for intrinsic slow oscillations in thalamic relay neurons. Biophys J 65:1538-52 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Thalamus;
Cell Type(s): Thalamus geniculate nucleus/lateral principal GLU cell;
Channel(s): I L high threshold; I K,Ca; I h; I T low threshold;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Bursting; Information transfer; Rebound firing; Sensory coding;
Implementer(s): Zeldenrust, Fleur [fleurzeldenrust at gmail.com];
Search NeuronDB for information about:  Thalamus geniculate nucleus/lateral principal GLU cell; I L high threshold; I T low threshold; I h; I K,Ca;
/
TCR
current_clamp
cells
cadecay.mod *
hh2.mod *
ic.mod *
Ih_des93.mod *
il.mod *
ITGHK.mod *
VClamp.mod *
El.oc *
loc3.oc *
stim_long.dat *
tc3_cc_hcur_kc.hoc
                            
/*
?0 UserClasses Electrode

An current injection electrode inserted in the middle of the
current section which can be switched between current and voltage
clamp modes and can do simple voltage clamp families.

usage: section e = new Electrode([xplacement, yplacement])
e.stim and e.vc can used to set parameters programatically.

Electrode can be saved in a .session file and is best used
anonymously so that it is dismissed and point processes deleted
when the graphic is dismissed.

?1 IClamp
Switches the Electrode to single pulse current injection. Uses IClamp
point process.

? del
Time (ms) of the onset of the current stimulus relative to t = 0.
? dur
Duration (ms) of the current stimulus
? amp
Amplitude (mV) of the current stimulus

?1 VClamp
Switches the Electrode to two electrode voltage clamp. Uses VClamp point
process that allows up to three level changes. The clamp is set to be ideal.

?2 dur0 dur1 dur2
Duration in milliseconds of each level change starting at t=0. Each level
is concatenated. At t = dur0+dur1+dur2 the clamp is switched off and
no longer injects current.

?2 amp0 amp1 amp2
Amplitude in millivolts of each level.

? VClampigraph
Creates a currentgraph displaying the voltage clamp current. This button
exists because, with the present implementation, it is generally not
possible to reference the Electrode object from hoc because the only reference
is held by a vbox which in turn is only referenced by this Electrode. In
this way, when the Electrode window is dismissed, the Electrode is
destroyed and the point processes are removed from the neuron.

?1 VClampFamily
Several common families for voltage clamp experiments. One should bring
up a current graph (VClampigraph button in VClamp card) and select KeepLines
in the graph popup menu. Only one clamp parameter is changed and the other
duration and amplitude levels are given by the values set in the VClamp panel
See User HocCode Electrode varyamp for the how the levels are varied.

? Testlevel
varies amp1 in 10 steps
? Holding
varies amp0 in 10 steps. Initialization is carried out at the value of amp0
so it is equivalent to the holding potential.

? Returnlevel
varies amp2 in 10 steps.


?1 Location
Shows a Shape scene of the neuron with the Electrode location marked as
a blue dot. The electrode location can be changed by making sure the
Section item in the selection menu is selected (right mouse button) and
pressing the left mouse button at any point on the picture of the neuron.
The position of the electrode is also reflected in the varlabel in the panel
just above the Shape.

?0 User HocCode Electrode

Modified: Alain Destexhe, Jan 1995, with SEVClamp 
*/

help ?0

begintemplate Electrode
public stim, vc, unmap, map, v1, installIclamp
external run, set_v_init, stoppedrun, addplot

objectvar stim, vc, v1, d1, this, shape, g
strdef durstr, ampstr, tempstr, grname
double vdur[3]
double vamp[3]

proc set_vclamp() {
        for i=0,2 {vc.dur[i] = vdur[i]   vc.amp[i] = vamp[i]}
}
proc store_vclamp() {
        for i=0,2 {vdur[i] = vc.dur[i]  vamp[i] = vc.amp[i]}
}

proc installVclamp() {local i
	set_vclamp()
	if (is_cl == 0) {
		samp=stim.amp  stim.amp=0
		is_cl = 1
	}
	d1.flip_to(0)
}
proc installIclamp() {local i
	if (is_cl == 1) {
	        stim.amp = samp
	        for i=0,2 {vc.dur[i] = -1}
		is_cl = 0
	}
	d1.flip_to(1)
}
proc installFamily() {
	installVclamp()
	d1.flip_to(2)
	sprint(durstr, "dur %g %g %g", vdur[0], vdur[1], vdur[2])
	sprint(ampstr, "amp %g %g %g", vamp[0], vamp[1], vamp[2])
}

strdef sec
strdef location

proc init() {local i
	can_locate = 1
	sectionname(sec)
	xloc=.5
	sprint(location, "%s(%g)", sec, xloc)
	stim = new IClamp(.5)
	stim.del=.1 stim.dur=.1 stim.amp=0
	vc = new SEVClamp(.5)
	sprint(grname, "%s Graph", vc)
	vc.dur[0]=.1  vc.amp[0]=-65  vc.dur[1] = 5 vc.amp[1]=10
	vc.dur[2]=100 vc.amp[2]=-65
	if (numarg() == 1) {
		if ($1 == 0) {
			return
		}
	}
	map()
}

proc locate() {
	if ($1 == 1 && can_locate == 1) {
		d1.flip_to(3)
		return
	}else{
		push_section(sec)
		hoc_ac_ = xloc
		move()
		pop_section()
	}
}

proc move() {
	xloc = hoc_ac_
	if (object_id(shape)) {
		shape.select()
	}
	stim.loc(xloc)
	vc.loc(xloc)
	sectionname(sec)
	sprint(location, "%s(%g)", sec, xloc)
}

proc glyph() {
	// v1 is the main box and contains a panel and deck
	v1 = new VBox()
	v1.ref(this)
	v1.save("save()")
	v1.intercept(1)
	xpanel("Electrode")
		xradiobutton("IClamp", "installIclamp()")
		xradiobutton("VClamp", "installVclamp()")
		xradiobutton("VClamp Family", "installFamily()")
		if (can_locate) {
			xradiobutton("Location", "locate(1)")
		}
		xvarlabel(location)
	xpanel()
	v1.intercept(0)
	d1 = new Deck()
	d1.intercept(1)
		xpanel("VClamp")
			sprint(tempstr, "%s pulses", vc)
			xlabel(tempstr)
			for i=0,2 {
				sprint(tempstr, "dur %d", i)
				xpvalue(tempstr, &vdur[i], 1, "set_vclamp()")
			}
			for i=0,2 {
				sprint(tempstr, "amp %d", i)
				xpvalue(tempstr, &vamp[i], 1, "set_vclamp()")
			}
			xbutton("VClamp.i graph", "mkgraph()")
		xpanel()
		xpanel("IClamp")
			sprint(tempstr, "%s pulse", stim)
			xlabel(tempstr)
			xpvalue("del", &stim.del, 1)
			xpvalue("dur", &stim.dur, 1)
			xpvalue("amp", &stim.amp, 1)
		xpanel()
		xpanel("VClampFamily")
			sprint(tempstr, "%s Families", vc)
			xlabel(tempstr)
			xvarlabel(durstr)
			xvarlabel(ampstr)
			xbutton("Test level", "varyamp(1)")
			xbutton("Holding", "varyamp(0)")
			xbutton("Return level", "varyamp(2)")
		xpanel()
		if (can_locate) {
			shape = new Shape()
			shape.point_mark(stim, 3)
			shape.action("move()")
			locate(0)
		}
	d1.intercept(0)
	v1.intercept(1)
	d1.map()
	v1.intercept(0)
	installVclamp()
	installIclamp()
	if (can_locate) {
		d1.flip_to(3)
	}
}

objectvar grbox
proc mkgraph() {
	grbox = new VBox()
	grbox.save("")
	grbox.intercept(1)
	g = new Graph()
	g.addvar("vc.i")
	grbox.intercept(0)
	grbox.map(grname)
	addplot(g, 0)
}

proc varyamp() {local i, x, x1, x2, dx, old
	i = $1
	set_vclamp()
	old = set_v_init()
	if (i == 0) {
		x1 = -100  x2=-50  dx=5
	}else if (i == 1) {
		x1 = -50  x2 = 40 dx=10
	}else{
		x1=-100 x2 = 0 dx=10
	}
	for (x = x1; x <= x2; x = x + dx) {
		vc.amp[i] = x
		if (i == 0) {
			set_v_init(x)
		}
		run()
		if (stoppedrun()) {
			break
		}
		set_v_init(old)
	}
}

proc varydur() {
	set_vclamp()
}

proc map() {
	samp = stim.amp
	store_vclamp()
	glyph()
	if (numarg() == 2) {
		v1.map("I/V Clamp Electrode", $1, $2, 100, 100)
	}else{
		v1.map("I/V Clamp Electrode")
	}
}

proc unmap() {
	v1.unmap()
}

proc save() {local i
	v1.save("load_template(\"Electrode\")}\n{") //has to be executed first
	v1.save("ocbox_=new Electrode(0)")
	sprint(tempstr, "can_locate=%d sec=\\\"%s\\\" xloc=%g locate(0)",\
		can_locate, sec, xloc)
	v1.save(tempstr, "ocbox_")	//execute in scope of the object
	installVclamp()
	for i=0,2 {
		sprint(tempstr, "vc.dur[%d]=%g vc.amp[%d]=%g",\
			 i, vc.dur[i], i, vc.amp[i])
		v1.save(tempstr, "ocbox_")
	}
	installIclamp()
	sprint(tempstr, "stim.del=%d stim.dur=%g stim.amp=%g",\
		stim.del, stim.dur, stim.amp)
	v1.save(tempstr, "ocbox_")
	v1.save("samp=stim.amp  store_vclamp() glyph()", "ocbox_")
	v1.save("ocbox_ = ocbox_.v1")
}

endtemplate Electrode

objectvar tempobj
proc makeelectrode() {
	tempobj = new Electrode()
	objectvar tempobj
}