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= 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