Single E-I oscillating network with amplitude modulation (Avella Gonzalez et al. 2012)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:156120
"... Intriguingly, the amplitude of ongoing oscillations, such as measured in EEG recordings, fluctuates irregularly, with episodes of high amplitude (HAE) alternating with episodes of low amplitude (LAE). ... Here, we show that transitions between HAE and LAE in the alpha/beta frequency band occur in a generic neuronal network model consisting of interconnected inhibitory (I) and excitatory (E) cells that are externally driven by sustained depolarizing currents(cholinergic input) and trains of action potentials that activate excitatory synapses. In the model, action potentials onto inhibitory cells represent input from other brain areas and desynchronize network activity, being crucial for the emergence of amplitude fluctuations. ..."
Reference:
1 . Avella Gonzalez OJ, van Aerde KI, van Elburg RA, Poil SS, Mansvelder HD, Linkenkaer-Hansen K, van Pelt J, van Ooyen A (2012) External drive to inhibitory cells induces alternating episodes of high- and low-amplitude oscillations. PLoS Comput Biol 8:e1002666 [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:
Cell Type(s): Abstract single compartment conductance based cell;
Channel(s): I K; I Na, leak;
Gap Junctions:
Receptor(s): GabaA; AMPA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; MATLAB;
Model Concept(s):
Implementer(s): Avella G. Oscar Javier [oscarjavella at gmail dot com];
Search NeuronDB for information about:  GabaA; AMPA; I K; I Na, leak;
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