A Model Circuit of Thalamocortical Convergence (Behuret et al. 2013)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:150240
“… Using dynamic-clamp techniques in thalamic slices in vitro, we combined theoretical and experimental approaches to implement a realistic hybrid retino-thalamo-cortical pathway mixing biological cells and simulated circuits. … The study of the impact of the simulated cortical input on the global retinocortical signal transfer efficiency revealed a novel control mechanism resulting from the collective resonance of all thalamic relay neurons. We show here that the transfer efficiency of sensory input transmission depends on three key features: i) the number of thalamocortical cells involved in the many-to-one convergence from thalamus to cortex, ii) the statistics of the corticothalamic synaptic bombardment and iii) the level of correlation imposed between converging thalamic relay cells. In particular, our results demonstrate counterintuitively that the retinocortical signal transfer efficiency increases when the level of correlation across thalamic cells decreases. …”
Reference:
1 . Behuret S, Deleuze C, Gomez L, Fregnac Y and Bal T (2013) Cortically-controlled population stochastic facilitation as a plausible substrate for guiding sensory transfer across the thalamic gateway PLoS Computational Biology 9(12):e1003401
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Neocortex; Thalamus; Retina;
Cell Type(s): Thalamus geniculate nucleus/lateral principal neuron; Thalamus reticular nucleus cell; Neocortex U1 L5B pyramidal pyramidal tract cell; Retina ganglion cell; Thalamus lateral geniculate nucleus interneuron;
Channel(s): I Na,t; I T low threshold; I K; I M;
Gap Junctions:
Receptor(s): GabaA; AMPA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Synaptic Convergence;
Implementer(s): Behuret, Sebastien [behuret at unic.cnrs-gif.fr];
Search NeuronDB for information about:  Thalamus geniculate nucleus/lateral principal neuron; Thalamus reticular nucleus cell; Retina ganglion cell; Neocortex U1 L5B pyramidal pyramidal tract cell; GabaA; AMPA; I Na,t; I T low threshold; I K; I M;
/
TCconvergenceModel
README.html
cadecay.mod *
ConductancePattern.mod
ConstantCurrent.mod
hh2.mod *
IM.mod
IT.mod
ITGHK.mod
RandomGenerator.mod
RetinalInput.mod
SineWaveCurrent.mod
SynapticNoise.mod
Demo.hoc
DEMO.png
Geometry.hoc
GUI.hoc
mosinit.hoc
Recording.hoc
Run.hoc
screenshot.png
Simulation.hoc
Templates.hoc
                            
//
// Recording.hoc - Records activity traces in a binary format
//
// Variables and numbers are all recorded as double precision floats (8 bytes).
//
// Header is composed of the number of recorded retinal cells, then the number of recorded TC cells and finally the number 1 (there is only one cortical cell). 
// (See "StartBinaryRecording" function in this file)
//
// Then, for each time step (dt), in order:
// - for each recorded retinal cells (8 bytes)
//     write 1 if a spike was generated during this step, 0 otherwise
// - for each recorded thalamic cells (16 bytes)
//     write the Vm
//     write the number of input retinal spikes received during this step (sum of all spikes generated by all retinal cells converging to this TC cell)
// - for the cortical cell (16 bytes)
//     write the Vm
//     write the number of input thalamic spikes received during this step (sum of all spikes generated by all relay cells)
// (See "ProcessBinaryRecording" function in this file)
//
// In summary:
// - header size is 24 bytes
// - activity size is 40 bytes * number of steps
// - example for tstop = 10000 and dt = 0.1 (10s of activity at 10kHz)
//     40 bytes * 100001 steps => 4000040 bytes
//     adding header size, total generated file will be 4000064 bytes (~4MB)
//
// Thalamocortical convergence studies
// Sébastien Béhuret, UNIC/CNRS Paris, 2009
//

// Enabled in Simulation.hoc
RecordingEnabled = 0

// Unless you want to compare the generated traces in different cells, you should leave those to 1
// Will not record more than RetinalCellCount and RelayCellCount defined in Geometry.hoc
MaxRecordedRetinalCellCount = 1 //RetinalCellMax
MaxRecordedRelayCellCount = 1 //RelayCellMax

objref RecordingFile, RecordingVector
RecordingFile = new File()
RecordingVector = new Vector(1)

proc init() {
	finitialize(v_init)

	if (RecordingEnabled == 1) {
		ProcessRecording()
	}
}

proc advance() {
	fadvance()

	if (RecordingEnabled == 1) {
		ProcessRecording()
	}
}

proc StartRecording() {
	RecordingFile.wopen($s1)
	RecordingEnabled = 1
	StartBinaryRecording($s1)
}

proc ProcessRecording() {
	ProcessBinaryRecording()
}

proc StartBinaryRecording() {
	RecordedRetinalCellCount = RetinalCellCount
	if (RecordedRetinalCellCount > MaxRecordedRetinalCellCount) { RecordedRetinalCellCount = MaxRecordedRetinalCellCount }

	RecordedRelayCellCount = RelayCellCount
	if (RecordedRelayCellCount > MaxRecordedRelayCellCount) { RecordedRelayCellCount = MaxRecordedRelayCellCount }

	// header
	RecordingVector.x[0] = RecordedRetinalCellCount
	RecordingVector.fwrite(RecordingFile)

	RecordingVector.x[0] = RecordedRelayCellCount
	RecordingVector.fwrite(RecordingFile)

	RecordingVector.x[0] = 1
	RecordingVector.fwrite(RecordingFile)
}

proc ProcessBinaryRecording() { local i, RecordedRelayCellCount
	RecordedRetinalCellCount = RetinalCellCount
	if (RecordedRetinalCellCount > MaxRecordedRetinalCellCount) { RecordedRetinalCellCount = MaxRecordedRetinalCellCount }

	RecordedRelayCellCount = RelayCellCount
	if (RecordedRelayCellCount > MaxRecordedRelayCellCount) { RecordedRelayCellCount = MaxRecordedRelayCellCount }

	// Retinal spikes
	for i = 0, RecordedRetinalCellCount - 1 {
		RecordingVector.x[0] = RetinalCells[i].Spike
		RecordingVector.fwrite(RecordingFile)
	}

	// Relay Vms & summed inputs
	for i = 0, RecordedRelayCellCount - 1 {
		RecordingVector.x[0] = RelayCells[i].Soma.v(0.5)
		RecordingVector.fwrite(RecordingFile)

		Sum = 0
		for j = 0, RelayConvergenceCount - 1 {
			if (RelayAMPA[i][j].Trigger > RelayAMPA[i][j].Threshold) {
				Sum = Sum + RelayAMPA[i][j].Weight / RelayAMPAWeight
			}
		}
		RecordingVector.x[0] = Sum
		RecordingVector.fwrite(RecordingFile)
	}

	// Cortical Vm
	RecordingVector.x[0] = CorticalCell.Soma.v(0.5)
	RecordingVector.fwrite(RecordingFile)

	// Cortical summed input
	Sum = 0
	for i = 0, RelayCellCount - 1 {
		if (CorticalAMPA[i].Trigger > CorticalAMPA[i].Threshold) {
			Sum = Sum + 1
		}
	}
	RecordingVector.x[0] = Sum
	RecordingVector.fwrite(RecordingFile)
}

proc StopRecording() {
	RecordingEnabled = 0
	RecordingFile.close()
}

proc RecordingGUI() {
	xlabel("==============================")
	xlabel("recording")
	xlabel("==============================")
	xlabel("")
	xbutton("start", "StartRecording(\"Default.dat\")")
	xbutton("stop", "StopRecording()")
	xlabel("")
}