Thalamic interneuron multicompartment model (Zhu et al. 1999)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:116862
This is an attempt to recreate a set of simulations originally performed in 1994 under NEURON version 3 and last tested in 1999. When I ran it now it did not behave exactly the same as previously which I suspect is due to some minor mod file changes on my side rather than due to any differences among versions. After playing around with the parameters a little bit I was able to get something that looks generally like a physiological trace in J Neurophysiol, 81:702--711, 1999, fig. 8b top trace. This sad preface is simply offered in order to encourage anyone who is interested in this model to make and post fixes. I'm happy to help out. Simulation by JJ Zhu To run nrnivmodl nrngui.hoc
Reference:
1 . Zhu JJ, Uhlrich DJ, Lytton WW (1999) Burst firing in identified rat geniculate interneurons. Neuroscience 91:1445-60 [PubMed]
2 . Zhu JJ, Lytton WW, Xue JT, Uhlrich DJ (1999) An intrinsic oscillation in interneurons of the rat lateral geniculate nucleus. J Neurophysiol 81:702-11 [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):
Channel(s): I Na,t; I L high threshold; I T low threshold; I K,leak; I h; I K,Ca; I CAN;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Bursting; Oscillations;
Implementer(s): Zhu, J. Julius [jjzhu at virginia.edu];
Search NeuronDB for information about:  I Na,t; I L high threshold; I T low threshold; I K,leak; I h; I K,Ca; I CAN;
/
b09jan13
readme.html
AMPA.mod
cadecay.mod
clampex.mod *
cp.mod *
cp2.mod *
GABAA.mod
GABAB.mod
HH2.mod *
Iahp.mod *
Ican.mod *
Ih.mod *
IL.mod
IL3.mod *
IT.mod *
IT2.mod *
kdr2.mod *
kleak.mod *
kmbg.mod
naf2.mod *
nap.mod *
NMDA.mod
nthh.mod *
ntIh.mod *
ntleak.mod
ntt.mod *
pregencv.mod
vecst.mod
batch_.hoc
bg_cvode.inc
misc.h
mosinit.hoc *
netcon.inc
screenshot.jpg
                            
: $Id: clampex.mod,v 1.2 1998/12/18 21:04:46 adam Exp $

NEURON {
	POINT_PROCESS ClampExData
}

ASSIGNED {
	pointer
}

VERBATIM
extern double chkarg();
#ifndef NRN_VERSION_GTEQ_8_2_0
double *hoc_pgetarg();
#endif

typedef struct CEXData {
#if 1
	char header[1024];
#else
	float parm_[80];
	char comment_[77];
	char labels[5][16];
	char reserve1[35];
	char cond_pulse[64];
	long parm_extension[16];
	float adc_ext_offset[16];
	float adc_ext_gain[16];
	float adc_disp_amp[16];
	float adc_disp_offset[16];
	char  adc_units[16][8];
#endif
	short* data;
}CEXData;
#define CEXD CEXData* cexd = (CEXData*)((unsigned long)pointer);
	
static void reverse(char* b, int n) {
	int i, j, v_;
	for (i=0, j=n-1; i<j; ++i, --j) {
		v_ = b[i];
		b[i] = b[j];
		b[j] = v_;
	}
}

static void header_endian(char* h) {
	char* b;
	int i;
	b = h;
	for (i=0; i < 80; ++i) {/* parameters */
		reverse(b, 4);
		b += 4;
	}
	b += (77 + 80 + 35 + 64);
	for (i=0; i < 16; ++i) {/* parameter extension */
		reverse(b, 4);
		b += 4;
	}
	for (i=0; i < 64; ++i) {
		reverse(b, 4);
		b += 4;
	}
}

static double get_parm(int i, char* h) {
	char* b;
	float* f;
	long* n;
	b = h;
	if (i <= 80) {
		f = (float*)b;
		return (double)f[i-1];
	}
	b += 320 + 77 + 80 + 35 + 64;
	if (i <= 96) {
		f = (float*)b;
		return (double)f[i- 81];
	}
	b += 64;
	if (i <= 160) {
		f = (float*)b;
		return (double)f[i - 97];
	}
	return 0.;
}
		
ENDVERBATIM

CONSTRUCTOR {
	VERBATIM	
	FILE* fin;
	int endian = 0;
	int samples, episodes;
	CEXData* cexd;
	char* fname;
	fname = gargstr(2);
//	printf("fname = %s\n", fname);
	fin = fopen(fname, "rb");
	if (!fin) {
		printf("can't open %s for reading\n", fname);
	}
	cexd = (CEXData*)emalloc(sizeof(CEXData));
	pointer = (double) ((unsigned long)cexd);
	fread(cexd->header, 1024, 1, fin);
	cexd->data = 0;
	if (get_parm(1, cexd->header) != 1.) {
		header_endian(cexd->header);
		endian = 1;
	}
	if (get_parm(1, cexd->header) != 1.) {
		printf("%s is not a CLAMPEX file\n", fname);
	}
	samples = (int)get_parm(3, cexd->header);
	episodes = (int)get_parm(4, cexd->header);
	cexd->data = (short*)emalloc(samples*episodes*sizeof(short));
	fread(cexd->data, samples*episodes, sizeof(short), fin);
	fclose(fin);
	if (endian) {
		int i;
		for (i=0; i < samples*episodes; ++i) {
			reverse((char*)(cexd->data + i), 2);
		}
	}
	ENDVERBATIM
}


DESTRUCTOR {
	VERBATIM
	CEXD
	if (cexd->data) {
		free(cexd->data);
	}
	free(cexd);
	ENDVERBATIM
}

FUNCTION parm() {
	VERBATIM
	CEXD
	int i;
	i = (int)chkarg(1, 1., 160.);
	_lparm = get_parm(i, cexd->header);
	ENDVERBATIM
}

PROCEDURE datavec() {
	VERBATIM
	int ntrace, trace, i, length;
	double* pd;
	short* tr;
	CEXD
	length = (int)get_parm(3, cexd->header);
	ntrace = (int)get_parm(4, cexd->header);
	trace = (int)chkarg(1, 0., (double)(ntrace - 1));
	tr = cexd->data + length*trace;
	pd = hoc_pgetarg(2);
	for (i = 0; i < length; ++i) {
		pd[i] = (double)tr[i];
	}
	ENDVERBATIM
}

FUNCTION timestep() {
	VERBATIM
	CEXD
	_ltimestep = get_parm(14, cexd->header)*.001;
	ENDVERBATIM
}

FUNCTION gain() {
	VERBATIM
	CEXD
	_lgain = get_parm(113, cexd->header);
	ENDVERBATIM
}

PROCEDURE get_comment() {
	VERBATIM
	char buf[80];
	CEXD
	strncpy(buf, cexd->header + 320, 77);
	buf[77] = '\0';
	printf("%s\n", buf);
	ENDVERBATIM
}
PROCEDURE get_label() {
	VERBATIM
	char buf[80];
	CEXD
	int i = (int)chkarg(1, 1., 5.);
	strncpy(buf, cexd->header + (320 + 77  +(i-1)*16), 16);
	buf[16] = '\0';
	printf("%s\n", buf);
	ENDVERBATIM
}
PROCEDURE get_cpulse() {
	VERBATIM
	char buf[80];
	CEXD
	strncpy(buf, cexd->header + 320 + 77 + 80 + 35, 64);
	buf[64] = '\0';
	printf("%s\n", buf);
	ENDVERBATIM
}
PROCEDURE get_adcunit() {
	VERBATIM
	char buf[80];
	CEXD
	int i = (int)chkarg(1, 1., 16.);
	strncpy(buf, cexd->header + (320 + 77 + 80 + 35 + 6*64 + (i-1)*8), 8);
	buf[8] = '\0';
	printf("%s\n", buf);
	ENDVERBATIM
}