A two networks model of connectivity-dependent oscillatory activity (Avella OJ et al. 2014)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:155705
Activity in a cortical network may express a single oscillation frequency, alternate between two or more distinct frequencies, or continually express multiple frequencies. In addition, oscillation amplitude may fluctuate over time. Interactions between oscillatory networks may contribute, but their effects are poorly known. Here, we created a two model networks, one generating on its own a relatively slow frequency (slow network) and one generating a fast frequency (fast network). We chose the slow or the fast network as source network projecting feed-forward connections to the other, or target network, and systematically investigated how type and strength of inter-network connections affected target network activity. Our results strongly depended on three factors: the type of the relevant (main) connection, its strength and the amount of source synapses. For high inter-network connection strengths, we found that the source network could completely impose its rhythm on the target network. Interestingly, the slow network was more effective at imposing its rhythm on the fast network than the other way around. The strongest entrainment occurred when excitatory cells of the slow network projected to excitatory or inhibitory cells of the fast network. Just as observed in rat activity at the prefrontal cortex satisfies the behavior described above, such that together, our results suggest that input from other oscillating networks may markedly alter a network’s frequency spectrum and may partly be responsible for the rich repertoire of temporal oscillation patterns observed in the brain.
Reference:
1 . Avella Gonzalez OJ, van Aerde KI, Mansvelder HD, van Pelt J, van Ooyen A (2014) Inter-network interactions: impact of connections between oscillatory neuronal networks on oscillation frequency and pattern. PLoS One 9:e100899 [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):
Channel(s):
Gap Junctions:
Receptor(s): GabaA; AMPA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Oscillations; Brain Rhythms;
Implementer(s): Avella G. Oscar Javier [oscarjavella at gmail dot com];
Search NeuronDB for information about:  GabaA; AMPA;
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