H-currents effect on the fluctuation of gamma/beta oscillations (Avella-Gonzalez et al., 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:186977
This model was designed to study the impact of H-currents on the dynamics of cortical oscillations, and in paticular on the occurrence of high and low amplitude episodes (HAE, LAE) in network oscillations. The H-current is a slow, hyperpolarization-activated, depolarizing current that contributes to neuronal resonance and membrane potential. We characterized amplitude fluctuations in network oscillations by measuring the average durations of HAEs and LAEs, and explored how these were modulated by trains of external spikes, both in the presence and absence of H-channels. We looked at HAE duration, the frequency and power of network oscillations, and the effect of H-channels on the temporal voltage profile in single cells. We found that H-currents increased the oscillation frequency and, in combination with external spikes, representing input from areas outside the network, strongly decreased the synchrony of firing. As a consequence, the oscillation power and the duration of episodes during which the network exhibited high-amplitude oscillations were greatly reduced in the presence of H-channels.
Reference:
1 . Avella Gonzalez OJ, Mansvelder HD, van Pelt J, van Ooyen A (2015) H-Channels Affect Frequency, Power and Amplitude Fluctuations of Neuronal Network Oscillations. Front Comput Neurosci 9:141 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Prefrontal cortex (PFC);
Cell Type(s): Abstract single compartment conductance based cell;
Channel(s): I Na,t; I K; I h;
Gap Junctions:
Receptor(s): GabaA; AMPA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Action Potentials;
Implementer(s): Avella G. Oscar Javier [oscarjavella at gmail dot com];
Search NeuronDB for information about:  GabaA; AMPA; I Na,t; I K; I h; Gaba; Glutamate;
begintemplate SpikePlot2
public sources, vecs, g, update
public map, save_data, save, b
public flush, begin, plot, size, view_count, fastflush, simgraph
external addplot, tstop
objref sources, vecs[1], nc, g, this, y,ps, tobj, b, outlist, nil
strdef tstr, modestr, windowTitle
proc init() {
	CELL 		=0
	ARTIFICIAL 	=1
	SECTION 	=2
	SECTIONLIST	=3
	NETWORKSOURCE=4
	NETWORKARTIFICIALSOURCE=5
	outlist = new List()
	fwindow = 100
	binwidth = 1
	modestr = "Spikes   "
	mode=1
	
	spikeplotstyle=0
	marksize=4
	markcolor=1
	useline=0
		
	y = new Vector(1000)
	ps=new Vector(1000)
	sources = $o1
	sourcetype=$2
	
	subset_start=-1
	subset_end=-1
	lsubset_start=0
	lsubset_end=0

    n=0
    
    if(numarg()>2){
    	sprint(windowTitle,"%s",$s3)
    }else{
		sprint(windowTitle, "%s for %s", this, sources)
	}
    
    
    // Threshold can only be set once for a single target cell
	// and we don't want to have the spikeplot to interfere with network parameters.

    
    if (numarg() == 2 || numarg() == 3 ) {
		build()
		map()
		size(0,tstop,0,0)
	}
}
proc map() {
	//sprint(tstr, "%s for %s", this, sources)
	if (numarg() > 1) {
		b.map(windowTitle, $2,$3,$4,$5)
	}else{
		b.map(windowTitle)
	}
	update()
	flush()
}
proc unmap() {
	b.unmap()
	g = nil
}
proc build() {
	b = new VBox(3)
	b.priority(600)
	b.save("save()")
	b.ref(this)
	b.dismiss_action("unmap()")
	b.intercept(1)
	xpanel("")
	xmenu("Plot")
	xbutton("Update", "update() flush()")
	xmenu("Plot Style")
		xradiobutton("Spikes", "pmode(1)", mode==1)
		xradiobutton("Frequency (Gaussian Window)", "pmode(2)", mode==2)
		xradiobutton("ISI Histogram (Gaussian Window)", "pmode(3)", mode==3)
		xradiobutton("ISI Histogram (Binned)", "pmode(4)", mode==4)
		xradiobutton("Cumulative Frequency (Gaussian Window)", "pmode(5)", mode==5)
		xradiobutton("Cumulative Frequency (Binned)", "pmode(6)", mode==6)
		xradiobutton("Cumulative ISI Histogram (Gaussian Window)", "pmode(7)", mode==7)
		xradiobutton("Cumulative ISI Histogram (Binned)", "pmode(8)", mode==8)
		xradiobutton("Powerspectrum (Gaussian Window)", "pmode(9)", mode==9)
	xmenu()	
	xmenu("Spike Plot Style")
		xradiobutton("Pipe", "pspikeplotstyle(0)", spikeplotstyle==0)
		xradiobutton("Filled Circle", "pspikeplotstyle(1)", spikeplotstyle==1)
		xradiobutton("Filled Triangle", "pspikeplotstyle(2)", spikeplotstyle==2)
		xradiobutton("Filled Square", "pspikeplotstyle(3)", spikeplotstyle==3)
		xradiobutton("Open Circle", "pspikeplotstyle(4)", spikeplotstyle==4)
		xradiobutton("Open Triangle", "pspikeplotstyle(5)", spikeplotstyle==5)
		xradiobutton("Open Square", "pspikeplotstyle(6)", spikeplotstyle==6)
		xbutton("Pick Size and Color","EditMark()")
		xstatebutton("Use Line",&useline ,"flush()")
	xmenu()
	
	xbutton("Select Subset","selectSubset()")

	xmenu()
	xvarlabel(modestr)
	xpvalue("Gaussian Width (ms)", &fwindow, 1, "flush()")
	xpvalue("Bin Width (ms)     ", &binwidth, 1, "flush()")

	xpanel()
	g = new Graph()
	b.intercept(0)
	addplot(this, 1)
	begin()
	pmode(mode)
}
proc pmode() {
	mode = $1
	if (mode == 1) {
		modestr = "Spikes   "
	}else if (mode == 2) {
		modestr = "Frequency (Gaussian Window)"
	}else if (mode == 3) {
		modestr = "ISI Histogram (Gaussian Window)"
	}else if (mode == 4) {
		modestr = "ISI Histogram (Binned)"
	}else if (mode == 5) {
		modestr = "Cumulative Frequency (Gaussian Window)"
	}else if (mode == 6) {
		modestr = "Cumulative Frequency (Binned)"
	}if (mode == 7) {
		modestr = "Cumulative ISI Histogram (Gaussian Window)"
	}else if (mode == 8) {
		modestr = "Cumulative ISI Histogram (Binned)"
	}else if (mode == 9) {
		modestr = "Powerspectrum (Gaussian Window)"
	}
	
  flush()
}

proc pspikeplotstyle(){
	spikeplotstyle=$1
	flush()
}

proc EditMark(){
	xpanel("Edit Mark Size and Color")
		xpvalue("Mark size",  &marksize  , 0, "flush()")
		xpvalue("Mark color", &markcolor , 0, "flush()")
	xpanel()
}

proc selectSubset(){
	lsubset_start=subset_start
	lsubset_end=subset_end
	
	xpanel("Select Subset")
		xpvalue("Subset Start",  &lsubset_start , 0, "setSubset()")
		xpvalue("Subset End", &lsubset_end , 0, "setSubset()")
	xpanel()
	
	
}

proc setSubset(){
	//print "setSubset start: ",  lsubset_start, " end: ", lsubset_end , " n: ", n
	if(0 <= lsubset_start && lsubset_start <= lsubset_end && lsubset_end <= n){
		subset_start=lsubset_start
		subset_end=lsubset_end
		flush()
	}
	lsubset_start=subset_start
	lsubset_end=subset_end
}


proc update() {local i localobj vec
	
	if(sourcetype==ARTIFICIAL || sourcetype==CELL || sourcetype==SECTION || sourcetype==NETWORKSOURCE || sourcetype==NETWORKARTIFICIALSOURCE){
		n = sources.count
	}else if (sourcetype==SECTIONLIST){
		n=0
		forsec sources {
			n=n+1
		}
	}
    
    if(n<subset_end || subset_end==-1) {
		subset_end=n
	}
	
	if(n<subset_start|| subset_start==-1) {
		subset_start=0
	}
    
	if (n == 0) return
	
	objref vecs[n]
	for (i=outlist.count-1; i >= 0; i -= 1) {
		if (outlist.object(i).valid == 0) {
			outlist.remove(i)
		}
	}
	
	if(sourcetype==ARTIFICIAL || sourcetype==CELL || sourcetype==SECTION || sourcetype==NETWORKSOURCE || sourcetype==NETWORKARTIFICIALSOURCE){
		for i=0, n-1 {
			vecs[i] = new Vector(0)
			tobj = sources.object(i)
			
			if(sourcetype==ARTIFICIAL){
				nc = new NetCon(tobj, nil)
			}
			
			if(sourcetype==CELL){
				tobj.soma  nc = new NetCon(&v(1), nil)	
			}
			
			if(sourcetype==SECTION){
				tobj.sec  nc = new NetCon(&v(1), nil)	
			}
			
			if(sourcetype==NETWORKSOURCE){
				tobj.sec().sec  nc = new NetCon(&v(1), nil)	
			}
			
			if(sourcetype==NETWORKARTIFICIALSOURCE){
				 nc = new NetCon(tobj.artificial_cell(), nil)	
			}
			//tobj.connect2target(nil, nc)
			
			if (nc.precelllist.count < 2) {
					outlist.append(nc)
			}
			
// 			vec=nc.get_recordvec()
// 			if(vec==nil){
				nc.record(vecs[i])
// 			}else{
// 				vecs[i]=vec
// 			}
			
			vecs[i].label(tstr)
						
			// nc.threshold=threshold threshold can only be set once for a single target cell
			// and we don't want to have the spikeplot to interfere with network parameters.
			
			nc.delay=0
		}
	}
	
	if(sourcetype==SECTIONLIST ){
		i=0
		forsec sources {

			vecs[i] = new Vector(0)
			
			if(sourcetype==SECTIONLIST){
				 nc = new NetCon(&v(1), nil)	
			}
			//tobj.connect2target(nil, nc)
			
			if (nc.precelllist.count < 2) {
					outlist.append(nc)
			}
			
// 			vec=nc.get_recordvec()
// 			if(vec==nil){
				nc.record(vecs[i])
// 			}else{
// 				vecs[i]=vec
// 			}

			vecs[i].label(tstr)
			// nc.threshold=threshold threshold can only be set once for a single target cell
			// and we don't want to have the spikeplot to interfere with network parameters.
			nc.delay=0
			i=i+1
		}
	}
	objref nc, tobj
}

proc simgraph() {}
proc begin() {}

func view_count() {
	if (g == nil) {
		return 0
	}
	return g.view_count()
}
proc plot() {}
func size() {
	if (numarg() == 4) {
		g.size($1,$2,0,subset_end+1-subset_start)
		return 1.
	}else{
		return g.size($1)
	}
}
proc fastflush() {}

proc flush() {local i
	g.erase_all
	g.vfixed(1)
	g.label(.9,1)
	if (mode == 1) {			//"Spikes   "
		for (i=subset_end-1; i >= subset_start; i -= 1) {
			y.resize(vecs[i].size).fill(i+1-subset_start)
			y.label(vecs[i].label)
			if (spikeplotstyle==0){
				y.mark(g, vecs[i], "|", marksize, markcolor, 1)  //	Pipe"
			}else if (spikeplotstyle==1){
				y.mark(g, vecs[i], "O", marksize, markcolor, 1)  //	"Filled Circle"
			}else if (spikeplotstyle==2){
				y.mark(g, vecs[i], "T", marksize, markcolor, 1)	 // "Filled Triangle"
			}else if (spikeplotstyle==3){
				y.mark(g, vecs[i], "S", marksize, markcolor, 1)	 // "Filled Square" 
			}else if (spikeplotstyle==4){
				y.mark(g, vecs[i], "o", marksize, markcolor, 1)  //	"Open Circle"
			}else if (spikeplotstyle==5){
				y.mark(g, vecs[i], "t", marksize, markcolor, 1)	 // "Open Triangle"
			}else if (spikeplotstyle==6){
				y.mark(g, vecs[i], "s", marksize, markcolor, 1)	 // "Open Square" 
			}
			if(1==useline){	
				y.line(g, vecs[i], markcolor, 0)
			}
		}
		size(0,tstop,0,0)
	}else if (mode == 2) { //"Frequency (Gaussian Window)"
		for (i=subset_end-1; i >= subset_start; i -= 1) {
			y = vecs[i].sumgauss(0, tstop, binwidth, fwindow)
			y.label(vecs[i].label)
			y.mul(1000).line(g, y.c.indgen(0, binwidth), 1,1)
			g.exec_menu("View = plot")
		}
	}else if (mode == 3) {//"ISI Histogram (Gaussian Window)"
		for (i=subset_end-1; i >= subset_start; i -= 1) if (vecs[i].size > 1){
			y = vecs[i].c.deriv(1,1)
			high = y.max
			y = y.sumgauss(0, high, binwidth, fwindow)
			y.label(vecs[i].label)
			y.line(g, y.c.indgen(0, binwidth), 1,1)
			g.exec_menu("View = plot")
		}
	}else if (mode == 4) {//"ISI Histogram (Binned)"
		for (i=subset_end-1; i >= subset_start; i -= 1) if (vecs[i].size > 1){
			y = vecs[i].c.deriv(1,1)
			high = y.max
			y = y.histogram(0, high, binwidth)
			y=y.c(1)
			y.label(vecs[i].label)
			y.line(g, y.c.indgen(0, high/50), 1,1)
			g.exec_menu("View = plot")
		}
	}else if (mode == 5) {//"Cumulative Frequency (Gaussian Window)"
		y  = new Vector ()
		for (i=subset_end-1; i >= subset_start; i -= 1) {
			y = y.append(vecs[i])
		}
		y = y.sumgauss(0, tstop, binwidth, fwindow)
		y.label(modestr)
		y.mul(1000).line(g, y.c.indgen(0, binwidth), 1,1)
		g.exec_menu("View = plot")
	}else if (mode == 6) {//"Cumulative Frequency (Binned)"

		y  = new Vector ()
		for (i=subset_end-1; i >= subset_start; i -= 1) {
			y = y.append(vecs[i])
		}
		high = y.max
		y = y.histogram(0, tstop, binwidth)
		y=y.c(1)
		y.label(modestr)
		y.line(g, y.c.indgen(0, binwidth), 1,1)
		g.exec_menu("View = plot")
	}else if (mode == 7) {//"Cumulative ISI Histogram (Gaussian Window)"
		y  = new Vector ()
		for (i=subset_end-1; i >= subset_start; i -= 1) {
			y = y.append(vecs[i])
		}
		if (y.size > 1){
			y = y.c.deriv(1,1)
			high = y.max
			y = y.sumgauss(0, high, binwidth, fwindow)
			y.label(modestr)
			y.line(g, y.c.indgen(0, binwidth), 1,1)
			g.exec_menu("View = plot")
		}
	}else if (mode == 8) {//"Cumulative ISI Histogram (Binned)"
		y  = new Vector ()
		for (i=subset_end-1; i >= subset_start; i -= 1) {
			y = y.append(vecs[i])
		}
		if (y.size > 1){
			y = y.c.deriv(1,1)
			high = y.max
			y = y.histogram(0, high, binwidth)
			y=y.c(1)
			y.label(modestr)
			y.line(g, y.c.indgen(0, binwidth), 1,1)
			g.exec_menu("View = plot")
		}	
	}else if (mode == 9) {//"Powerspectrum"
		y  = new Vector ()
		ps =new Vector()
		for (i=subset_end-1; i >= subset_start; i -= 1) {
			y = y.append(vecs[i])
		}
		if (y.size > 1){
		  y = y.sumgauss(0, tstop,binwidth, fwindow)
			ps.spctrm(y)		// spectrum
			ps.label(modestr)
			ps.line(g, ps.c.indgen(0, 1000/(2*binwidth),1000/(2*binwidth*ps.size())), 1,1)
			g.exec_menu("View = plot")
		}	
	}
	g.flush()
}


proc save() {
	b.save("load_file(\"netbild.hoc\")\n}")
	save_data(b, "ocbox_")
	b.save("{")
	
}

proc save_data() {
	sprint(tstr, "{%s = new SpikePlot2(%s,1)}", $s2, net) $o1.save(tstr)
	sprint(tstr, "{object_push(%s)}", $s2) $o1.save(tstr)
	sprint(tstr, "mode = %g", mode) $o1.save(tstr)	
	sprint(tstr, "spikeplotstyle= %g", spikeplotstyle) $o1.save(tstr)
	sprint(tstr, "marksize= %g",  marksize ) $o1.save(tstr)
	sprint(tstr, "markcolor= %g", markcolor) $o1.save(tstr)
	sprint(tstr, "useline= %g",  useline) $o1.save(tstr)
	sprint(tstr, "fwindow = %g", fwindow) $o1.save(tstr)
	sprint(tstr, "binwidth = %g", binwidth) $o1.save(tstr)
	$o1.save("build()")
	sprint(tstr, "subset_start=%g",subset_start) $o1.save(tstr)
	sprint(tstr, "subset_end = %g",subset_end) $o1.save(tstr)
	sprint(tstr, "{g.size(%g,%g,%g,%g)}", \
	g.size(1), g.size(2), g.size(3), g.size(4))
	$o1.save(tstr)
	$o1.save("{object_pop()}")

}

endtemplate SpikePlot2