{load_file("viewspikes.hoc")}
{load_file("viewspikes1.hoc")}
begintemplate ShowConnect
public smode_, mgrsmap, syns, grasterm_
external ring, net_spatial_len, secdenlen, num_mitral, num_granule, mitral_x, granule_x, sparse_connection_matrix_
external reload_onecell, reload_wholenet, pc, weight_movie
external allsyn, somesyn, cells, flush_list, cvode, addplot, tstop
external pattern_tvec_, pattern_idvec_, mgconnect
external clear, create_stim, mknet, gidvec, classname
external moi, goi
public g, draw, fi_cond_vec
objref g, syns, msel, gsel, mgrsel, msynsel, gsynsel, synsel1, deck
objref b, v_rvp_, keepsyn, keepnc, hinton_shape, tplots
objref exc_hinton_shape, inh_hinton_shape
objref syn_movie_fih, syn_movie_list, syn_movie_nclist, this
objref grasterm_, grasterg_, scm, mgrsmap
objref fih_spikes, fih_bar, fih_cond
strdef sel_str_
create keepsyn_sec
proc init() {local i
spike_viewer_ = 0
show_soma_spikes_ = 1
show_fi_cond_ = 0
rasterm_ = 0
rasterg_ = 0
tplots = new List()
hinton_movie = 0
exc_hinton_movie = 0
inh_hinton_movie = 0
keepsyn_sec { delete_section() }
smode_ = -1
wholenet_ = 1
sel_str_ = "no selection"
sel_gid_ = -1
cells = $o1
//ls = cells.object(0).secden[1].L
ls = secdenlen
//num_mitral = $2
//num_granule = $3
scm = sparse_connection_matrix_
nsyn = 0
for i=0, scm.nrow-1 {
nsyn += scm.sprowlen(i)
}
syns = $o4
msel = new Vector(num_mitral)
gsel = new Vector(num_granule)
msynsel = new Vector(num_mitral) // all synapses assocated with mitral
gsynsel = new Vector(num_granule)
mgrsel = new Vector(nsyn)
synsel1 = new Matrix(num_mitral, num_granule, 2)
build()
draw()
}
proc build() {local mx1, mx2, gx1, gx2
b = new HBox()
b.intercept(1)
b.full_request(1)
b.adjuster(520)
g = new Graph(0)
g.view(0,0,1,1,0,0,520,120)
//cells.object(0).soma mx1 = x3d(0)
//cells.object(num_mitral-1).soma mx2 = x3d(0)
//cells.object(num_mitral).soma gx1 = x3d(0)
//cells.object(num_mitral+num_granule-1).soma gx2 = x3d(0)
mx1 = mitral_x.x[0]
mx2 = mitral_x.x[num_mitral-1]
gx1 = granule_x.x[0]
gx2 = granule_x.x[num_granule-1]
if ( gx1 < mx1) mx1 = gx1
if ( gx2 > mx2) mx2 = gx2
g.size(mx1, mx2, -1, num_mitral)
// g.size(-ls + mx1, ls + mx2, -1, num_mitral)
g.xaxis(3)
deck = new Deck()
deck.intercept(1)
xpanel("")
g.menu_tool("Select cells", "select", "smode(1)")
g.menu_tool("Select all synapses of cells", "select", "smode(2)")
g.menu_tool("Select a few synapses", "select", "smode(3)")
xmenu("Select")
xbutton("Mitrals", "mansel(0)")
xbutton("Granules", "mansel(1)")
xmenu()
xcheckbox("Exc+Inh Hinton synapse movie", &hinton_movie)
xcheckbox("Exc Hinton synapse movie", &exc_hinton_movie)
xcheckbox("Inh Hinton synapse movie", &inh_hinton_movie)
xcheckbox("Mitral soma raster", &rasterm_, "mraster()")
xcheckbox("Granule soma raster", &rasterg_, "graster()")
xcheckbox("Show soma spikes", &show_soma_spikes_, "show_fi_cond_ = (show_fi_cond_ && show_soma_spikes_)")
xcheckbox(" and fih conductance", &show_fi_cond_, "show_fi_cond_ = (show_fi_cond_ && show_soma_spikes_)")
xmenu("Spike Viewers")
xbutton("All Mitrals", "view_spikes(0)")
xbutton("Mitral at all granule positions", "view_spikes(1)")
xmenu()
// xcheckbox("Spike Viewer", &spike_viewer_, "view_spikes()")
// xvarlabel(sel_str_)
xbutton("Simulate", "sim()")
xpanel()
xpanel("")
xbutton("Selection Tool", "whole_net()")
xmenu("Spike Viewers")
xbutton("All Mitrals", "view_spikes(0)")
xbutton("Mitral at all granule positions", "view_spikes(1)")
xmenu()
xbutton("Time plots to file", "p2f(\"tplot.dat\")")
// xbutton("Time plots to file", "p2f(\"temp.tplot\")")
// xcheckbox("Spike Viewer", &spike_viewer_, "view_spikes()")
xpanel()
deck.intercept(0)
deck.flip_to(0)
deck.map()
b.intercept(0)
b.map("Select Subset", 400, 30, 700, 300)
g.exec_menu("Select cells")
}
proc mraster() {local i localobj tv, yv, mi, mt
// objref grasterm_
if (rasterm_) {
grasterm_ = new Graph()
grasterm_.size(0, tstop, 0, num_mitral)
grasterm_.xaxis(3)
grasterm_.xaxis(0, tstop, 0, 5, 0,0,1)
grasterm_.yaxis(0, num_mitral, 0, 5, 0,0,1)
mi = new Vector()
mi.indvwhere(pattern_idvec_, "[)", 0, num_mitral)
mt = new Vector()
mt.index(pattern_tvec_.c, mi)
mi.index(pattern_idvec_, mi)
for i=0, mi.size-1 {
grasterm_.mark(mt.x[i], mi.x[i], "|", 10, (i%8)+1, 1)
}
execute("barinit()")
fih_bar = new FInitializeHandler(0, "cvode.event(0, \"bar()\")")
}
}
proc graster() {local i, x localobj tv, yv, gi, gt
objref grasterg_
if (rasterg_) {
grasterg_ = new Graph()
grasterg_.size(0, tstop, num_mitral-1, num_mitral+num_granule-1)
grasterg_.xaxis(3)
grasterg_.xaxis(0, tstop, -.5, 5, 0,0,1)
grasterg_.yaxis(num_mitral-1, num_mitral+num_granule-1, 0, 5,0,0,1)
gi = new Vector()
gi.indvwhere(pattern_idvec_, "[)", num_mitral, num_mitral+num_granule)
gt = new Vector()
gt.index(pattern_tvec_.c, gi)
gi.index(pattern_idvec_, gi)
gi.sub(num_mitral)
for i=0, gi.size-1 {
grasterg_.mark(gt.x[i], gi.x[i], "|", 10, 1, 1)
}
}
}
proc p2f() {local i, j, sz localobj sf, f, g1, glist, xvec, yvec, lines
sf = new StringFunctions()
glist = new List("Graph")
lines = new List()
xvec = new Vector() yvec = new Vector()
// Yuguo wants text output in matrix form for time plots
// (only save lines that have the same size)
for i=0, glist.count-1 {
g1 = glist.o(i)
if (g1 != grasterg_ && g1 != grasterm_ && g1 != g) {
for (j=-1; (j = g1.getline(j, xvec, yvec)) != -1; ) {
if (sf.net_spatial_len(yvec.label()) > 1 && yvec.size > 1000) {
if (lines.count == 0) {
lines.append(xvec.c)
lines.o(0).label("t")
sz = xvec.size
}
if (sz == yvec.size) {
lines.append(yvec.cl)
}
}
}
}
}
if (lines.count == 0) {
return
}
f = new File()
f.wopen($s1)
f.printf("%d %d\n", lines.count, lines.o(0).size)
for i=0, lines.count-1 {
f.printf("\"%s\"\n",lines.o(i).label())
}
for i = 0, sz-1 {
f.printf("%g", lines.o(0).x[i])
for j=1, lines.count-1 {
f.printf(" %g", lines.o(j).x[i])
}
f.printf("\n")
}
f.close()
}
proc draw() {local i, j, k, x, x0, x1, mx, mn, gi, b, def_color, i1 localobj mgr, sr
def_color = 1
if (wholenet_ == 0) { def_color = 9 }
g.erase_all()
for i1=0, moi.size-1 { i=moi.x[i1]
x = mitral_x.x[i]
g.beginline(9, 1)
if (ring) {
x0 = -ls + x
x1 = ls + x
if (x0 < 0) {
g.line(net_spatial_len + x0, i) g.line(net_spatial_len, i)
x0 = 0
g.flush() g.beginline(9, 1)
}
if (x1 > net_spatial_len) {
g.line(0, i) g.line(x1-net_spatial_len, i)
x1 = net_spatial_len
g.flush() g.beginline(9, 1)
}
g.line(x0, i)
g.line(x1, i)
}else{
g.line(-ls + x, i)
g.line(ls + x, i)
}
// g.flush()
if (msel.x[i] == 1) {
g.mark(x, i, "T", 10, 2, 1)
}else{
g.mark(x, i, "t", 10, def_color, 2)
}
}
for i1=0, goi.size-1 {i = goi.x[i1]
x = granule_x.x[i]
if (gsel.x[i] == 1) {
g.mark(x, -1, "O", 8, 3, 1)
}else{
g.mark(x, -1, "o", 8, def_color, 1)
}
g.beginline(9, 1)
g.line(x, num_mitral-.5)
g.line(x, -1)
// g.flush()
}
// for k=0, syns.count-1 {
// mgr = syns.object(k)
// mi = mgr.mitral_gid
// gi = mgr.granule_gid - num_mitral
for i1 = 0, moi.size-1 {mi=moi.x[i1] for k=0, scm.sprowlen(mi)-1 {
scm.spgetrowval(mi, k, &gi)
x = granule_x.x[gi]
j = mi
b = 0
if (msynsel.x[mi] || gsynsel.x[gi]) {
b = 1
g.mark(x, j, "O", 6, 4, 1)
}else{
if (msel.x[mi]) {
b = 1
if (gsel.x[gi]) {
g.mark(x, j, "O", 5, 2, 1)
g.mark(x, j, "o", 6, 3, 2)
}else{
g.mark(x, j, "O", 6, 2, 1)
}
}else if (gsel.x[gi]) {
b = 1
g.mark(x, j, "O", 6, 3, 1)
}
}
if (b == 0) {
if (wholenet_ == 1) {
g.mark(x, j, "o", 4, 1, 1)
}else if (hinton_movie) {
g.mark(x, j, "O", 3, 1, 1)
}
}
if (synsel1.getval(mi, gi)) {
g.mark(x, j, "O", 6, 6, 1)
}
}}
if (show_fi_cond_ && wholenet_ == 0) {
fi_cond_init()
}
g.flush()
}
proc smode() {
if (smode_ != $1) {
// whole_net()
}
smode_ = $1
sel_gid_ = -1
}
proc view_spikes() {localobj sv
spike_viewer_ = 0
if ($1 == 0) {
sv = new SpikeViewer(pattern_tvec_, pattern_idvec_)
}else{
sv = new SpikeViewer1(pattern_tvec_, pattern_idvec_)
}
}
proc select() {local m, g, min, x, i, j localobj mgr, s
if (wholenet_ != 1) { return }
if ($1 == 2) { //press
//print $1, $2, $3, $4
if ($3 < -.5) {
m = -1
} else {
m = int($3+.5)
}
if (m >= num_mitral) { m = -1}
if (m >= 0) { // closest to moi
if (moi.indwhere("==", m) == -1) {
//s = new String()
//sprint(s.s, "Mitral %g not displayed", m)
//continue_dialog(s.s)
m = -1
}
}
min = 1e9
g = -1
// assume granules evenly distributed from 0 to net_spatial_len
g = int(num_granule*$2/net_spatial_len)
if (g < 0) g = 0
if (g >= num_granule) g = num_granule-1
if (g >= 0) { // closest to g
if (goi.indwhere("==", g) == -1) {
//s = new String()
//sprint(s.s, "Mitral %g not displayed", g)
//continue_dialog(s.s)
g = -1
}
}
//print smode_, m, g
if (smode_ == 1) { // selecting a cell
if (m >= 0) {
msel.x[m] = (msel.x[m] == 0)
sel_gid_ = m
sprint(sel_str_, "mitral gid %d", sel_gid_)
}else if (g >= 0) {
gsel.x[g] = (gsel.x[g] == 0)
sel_gid_ = g + num_mitral
sprint(sel_str_, "granule gid %d", sel_gid_)
}else{
sel_gid_ = -1
sel_str_ = "no selection"
}
}else if (smode_ == 2) { // selecting all syn for a cell
if (m >= 0) {
msynsel.x[m] = (msynsel.x[m] == 0)
sel_gid_ = m
sprint(sel_str_, "mitral gid %d", sel_gid_)
}else if (g >= 0) {
gsynsel.x[g] = (gsynsel.x[g] == 0)
sel_gid_ = g + num_mitral
sprint(sel_str_, "granule gid %d", sel_gid_)
}else{
sel_gid_ = -1
sel_str_ = "no selection"
}
}else{ // select individual synapses
if (m > -1 && g > -1) {
//printf("%d %d %d\n", m, g, scm.getval(m, g))
if (scm.getval(m, g)) {
synsel1.x[m][g] = synsel1.x[m][g]==0
}
}
}
draw()
}
}
obfunc sellist() {localobj a
if (smode_ == 1) {
if ($1 == 0) { a = msel } else { a = gsel }
}else if (smode_ == 2) {
if ($1 == 0) { a = msynsel } else { a = gsynsel }
}
return a
}
proc str2sel() {local i localobj s, a, sf
sf = new StringFunctions()
a = sellist($1)
a.fill(0)
while(sf.net_spatial_len($s2) > 0 && sscanf($s2,"%d", &i)) {
if (i < 0) { continue }
if ($1 == 0) {
if (i >= num_mitral) { continue }
}else{
if (i >= num_granule) { continue }
}
a.x[i] = 1
sf.tail($s2, " ", $s2)
}
}
obfunc sel2str() {local i localobj s, a
s = new String()
a = sellist($1)
if(object_id(a) == 0){
s.s = "Not Allowed"
}else{
for i=0, a.size-1 if (a.x[i]) {
sprint(s.s, "%s %d", s.s, i)
}
}
return s
}
proc mansel() {localobj label, s
label = new String()
if ($1 == 0) {
label.s = "Space separated list of mitral id's"
}else{
label.s = "Space separated list of granule id's"
}
s = sel2str($1)
if (string_dialog(label.s, s.s)) {
str2sel($1, s.s)
draw()
}
}
proc sim() {local i, j, jx, x, mk
if (wholenet_ != 1) { return }
// if (smode_ != 1) { return }
deck.flip_to(1)
wholenet_ = 0
// prune()
create_subnet()
draw()
for i=0, synsel1.nrow-1 {
for jx = 0, synsel1.sprowlen(i)-1 {
x = synsel1.spgetrowval(i, jx, &j)
syn_graph(mgfind(i, j))
}
}
for i=0, msel.size-1 if (msel.x[i]) {
v_movie(i)
t_movie(i)
}
for i=0, gsel.size-1 if (gsel.x[i]) {
t_movie(i + num_mitral)
}
mk = 0
for i=0, msynsel.size-1 if (msynsel.x[i]) {
mk = 1
if (object_id(syn_movie_list) == 0) {
syn_movie_list = new List()
syn_movie_nclist = new List()
}
syn_movie(i)
}
if (hinton_movie) {
mkhinton(1)
mk = 1
}
if (exc_hinton_movie) {
mkhinton(2)
mk = 1
}
if (inh_hinton_movie) {
mkhinton(3)
mk = 1
}
if (mk) {
syn_movie_fih = new FInitializeHandler("cvode.event(0, \"show_weight()\")", this)
}
show_weight()
if (show_soma_spikes_) {
fih_spikes = new FInitializeHandler(0, "cvode.event(0, \"spikesinit()\")")
}
if (show_fi_cond_) {
fih_cond = new FInitializeHandler("cvode.event(20, \"fi_cond_update()\")", this)
}
execute("stdinit()")
}
objref fi_cond_vec[1]
proc fi_cond_init() {local i
objref fi_cond_vec[num_mitral]
for i=0, num_mitral-1 {
fi_cond_vec[i] = new Vector(num_granule)
}
fi_cond_update1()
for i=0, num_mitral-1 {
fi_cond_vec[i].plot(g, granule_x, 1, 1)
}
g.flush()
}
proc fi_cond_update() {
fi_cond_update1()
g.flush()
cvode.event(t+20, "fi_cond_update()")
}
proc fi_cond_update1() {local i, m, g, scl localobj mgrs, cvec, fi
scl = 200
for i=0, syns.count-1 {
mgrs = syns.o(i)
m = mgrs.mitral_gid
g = mgrs.granule_gid - num_mitral
cvec = fi_cond_vec[m]
fi = mgrs.fi
if (object_id(fi)) {
cvec.x[g] = fi.g*scl + m
}
}
}
proc whole_net() {local i
pc.gid_clear()
objref mgrsmap
objref fih_spikes
objref fih_cond
for i=0, tplots.count-1 {
tplots.o(i).unmap()
}
tplots.remove_all()
objref keepsyn, keepnc, syn_movie_nclist, syn_movie_fih, syn_movie_list
objref hinton_shape, exc_hinton_shape, inh_hinton_shape
create keepsyn_sec
keepsyn_sec { delete_section() }
sel_gid_ = -1
sel_str_ = "no selection"
// reload_wholenet()
clear()
wholenet_ = 1
deck.flip_to(0)
draw()
}
proc v_movie() {localobj g, s
s = new String()
g = new Graph(0)
g.view(-secdenlen, -80, 2*secdenlen, 120, 400, 500+$1*300/num_mitral, 700, 200)
v_rvp_ = new RangeVarPlot("v")
pc.gid2cell($1).secden[1] v_rvp_.begin(1)
pc.gid2cell($1).secden[0] v_rvp_.end(1)
v_rvp_.origin(12.5)
g.addobject(v_rvp_, 2, 1, 0.8, 0.9)
sprint(s.s, "mitral gid %d", $1)
g.label(.3,.9,s.s,2)
flush_list.append(g)
tplots.append(g)
}
proc t_movie() {localobj g, s
s = new String()
sprint(s.s, "gid %d: %s.soma.v(.5)", $1, pc.gid2cell($1))
g = new Graph()
addplot(g, 0)
g.size(0, tstop, -80, 40)
tplots.append(g)
g.label(.3, 1, "", 2)
pc.gid2cell($1).soma g.addvar(s.s, "v(0.5)", 1, 1)
}
proc syn_graph() {localobj g, s, mgr
mgr = $o1
if (object_id(mgr) == 0) {
execerror("syn_graph arg is nil")
}
s = new String()
sprint(s.s, "syn (%d, %d)", mgr.mitral_gid, mgr.granule_gid)
g = new Graph()
addplot(g, 0)
g.size(0, tstop, 0, 1)
tplots.append(g)
g.label(.3, .9, s.s, 2)
sprint(s.s, "%s.weight[2]", mgr.gd2fi)
g.addvar("fi", s.s, 3, 1)
sprint(s.s, "%s.weight[2]", mgr.md2ampanmda)
g.addvar("an", s.s, 2, 1)
}
proc syn_movie() {local i localobj g, s, nc, nclist1, nclist2, syn
s = new String()
g = new Graph(0)
g.view(0, 0, net_spatial_len, 1, 400, 250+$1*400/num_mitral, 700, 200)
sprint(s.s, "mitral gid %d", $1)
g.label(.3,.9,s.s,2)
syn_movie_list.append(g)
nclist1 = new List()
nclist2 = new List()
for i = 0, syns.count-1 {
syn = syns.o(i)
if (syn.mitral_gid == $1) {
nclist1.append(syn.gd2fi)
nclist2.append(syn.md2ampanmda)
}
}
syn_movie_nclist.append(nclist1)
syn_movie_nclist.append(nclist2)
}
proc show_weight() {local i, j, k, x, w localobj g, nc, syn, nclist
if (object_id(syn_movie_list)) for i=0, syn_movie_list.count-1 {
g = syn_movie_list.o(i)
g.erase()
for j=0,1 {
nclist = syn_movie_nclist.o(2*i + j)
for k = 0, nclist.count - 1 {
nc = nclist.o(k)
syn = nc.syn
x = syn.x
w = nc.weight[2]
if (j == 1) {
g.mark(x, w, "S", 8, 2, 1)
}else{
g.mark(x, w, "s", 10, 3, 1)
}
}
}
}
if (object_id(hinton_shape)) {
hinton_shape.flush()
}
if (object_id(exc_hinton_shape)) {
exc_hinton_shape.flush()
}
if (object_id(inh_hinton_shape)) {
inh_hinton_shape.flush()
}
cvode.event(t + 100, "show_weight()")
}
proc prune() {local i, mi, gi localobj pc, keepa, keepf, mgr, nil, cell
pc = new ParallelContext()
pc.gid_clear()
// 0 - destroy, 1 - keep where it is, 2 - move to safe place
keepa = new Vector(syns.count)
keepf = new Vector(syns.count)
if (hinton_movie) { keepa.fill(2) keepf.fill(2) }
if (exc_hinton_movie) { keepa.fill(2) }
if (inh_hinton_movie) { keepf.fill(2) }
for i=0, syns.count-1 {
mgr = syns.o(i)
mi = mgr.mitral_gid
gi = mgr.granule_gid - num_mitral
if (msynsel.x[mi]) {keepa.x[i] = 2 keepf.x[i] = 2 }
if (gsynsel.x[gi]) {keepa.x[i] = 2 keepf.x[i] = 2 }
if (synsel1.x[i]) {keepa.x[i] = 2 keepf.x[i] = 2 }
}
for i=0, syns.count-1 {
mgr = syns.o(i)
mi = mgr.mitral_gid
gi = mgr.granule_gid - num_mitral
if (msel.x[mi]) {keepf.x[i] = 1}
if (gsel.x[gi]) {keepa.x[i] = 1}
}
// move/destroy syns
for i=0, syns.count-1 {
mgr = syns.o(i)
mgr.gd = nil
mgr.md = nil
if (keepf.x[i] == 2) {
if (!section_exists("keepsyn_sec", this)) {
create keepsyn_sec
}
keepsyn_sec mgr.fi.loc(.5)
mgr.mitral = nil
}
if (keepa.x[i] == 2) {
if (!section_exists("keepsyn_sec", this)) {
create keepsyn_sec
}
keepsyn_sec mgr.ampanmda.loc(.5)
mgr.granule = nil
mgr.spine = nil
}
if (keepf.x[i] == 0) {
mgr.gd2fi = nil
mgr.fi = nil
mgr.mitral = nil
mgr.granule = nil
}
if (keepa.x[i] == 0) {
mgr.md2ampanmda = nil
mgr.ampanmda = nil
mgr.mitral = nil
mgr.granule = nil
mgr.spine = nil
}
}
// destroy cells
for (i = cells.count-1; i >= 0; i -= 1) {
cell = cells.o(i)
if (i < num_mitral) if(msel.x[i]) {
pc.set_gid2node(i, pc.id)
cell.soma pc.cell(i, new NetCon(&v(.5), nil))
continue
}
if (i > num_mitral) if (gsel.x[i - num_mitral]) {
pc.set_gid2node(i, pc.id)
cell.soma pc.cell(i, new NetCon(&v(.5), nil))
continue
}
cells.remove(i)
cell = nil
}
// recreate connection using the original NetCon
for i=0, syns.count-1 {
mgr = syns.o(i)
if (mgr.fi != nil) {
pc.gid_connect(mgr.gd_gid, mgr.fi, mgr.gd2fi)
}
if (mgr.ampanmda != nil) {
pc.gid_connect(mgr.md_gid, mgr.ampanmda, mgr.md2ampanmda)
}
}
}
proc create_subnet() {local i, m, j, x, g localobj mgr, nil
// first the cells, then synapses not on cells
objref mgrsmap
gidvec.resize(0)
for i=0, msel.size-1 if (msel.x[i]) { gidvec.append(i) }
for i=0, gsel.size-1 if (gsel.x[i]) { gidvec.append(i + num_mitral) }
mknet()
create_stim()
// if hinton we need all remaining syn, otherwise the msynsel...
if (hinton_movie || exc_hinton_movie || inh_hinton_movie) {
mk_mgrsmap()
if (!section_exists("keepsyn_sec", this)) {
create keepsyn_sec
}
keepsyn_sec for m=0, num_mitral-1 for j=0, scm.sprowlen(m)-1 {
scm.spgetrowval(m, j, &g)
mgrs_extra(m, g)
}
objref mgrsmap
}
if (msynsel.indwhere("==", 1) >= 0) {
mk_mgrsmap()
if (!section_exists("keepsyn_sec", this)) {
create keepsyn_sec
}
keepsyn_sec for m=0, num_mitral-1 if (msynsel.x[m]) for j=0, scm.sprowlen(m)-1 {
scm.spgetrowval(m, j, &g)
mgrs_extra(m, g)
}
objref mgrsmap
}
if (gsynsel.indwhere("==", 1) >= 0) {
mk_mgrsmap()
if (!section_exists("keepsyn_sec", this)) {
create keepsyn_sec
}
keepsyn_sec for g=0, num_granule-1 if (gsynsel.x[g]) for m=0, num_mitral-1 {
mgrs_extra(m, g)
}
objref mgrsmap
}
j=0
for i=0, synsel1.nrow-1 if (synsel1.sprowlen(i) > 0) { j=1 break}
if (j) {
mk_mgrsmap()
if (!section_exists("keepsyn_sec", this)) {
create keepsyn_sec
}
keepsyn_sec for m=0, synsel1.nrow-1 for j=0, synsel1.sprowlen(m)-1 {
if (synsel1.spgetrowval(m, j, &g)) {
mgrs_extra(m, g)
}
}
}
objref mgrsmap
mk_mgrsmap()
}
// create any synapses onto the cas for m,g that do not already exist
proc mgrs_extra() {localobj mgrs
mgrs = mgfind($1, $2)
if (object_id(mgrs)) {
mgrs.complete()
mgrs.fi.x = granule_x.x[$2]
mgrs.ampanmda.x = granule_x.x[$2]
}else{
mgconnect($1, $2, 1)
}
}
proc mk_mgrsmap() {local i localobj po, keys, s
if (object_id(mgrsmap) != 0) { return }
po = new PythonObject()
mgrsmap = po.dict()
keys = new Vector(syns.count)
for i=0, syns.count-1 {
s = syns.o(i)
keys.x[i] = s.mitral_gid + (s.granule_gid-num_mitral)*num_mitral
}
mgrsmap = mgrsmap.fromkeys(keys)
for i=0, syns.count-1 {
mgrsmap.__setitem__(keys.x[i], syns.o(i))
}
//nrnpython("a = None")
//po.a = mgrsmap
//nrnpython("print a")
//print "hello"
}
obfunc mgfind() {
return mgrsmap.get($1+num_mitral*$2)
}
objref cmap
proc mkhinton() {local i, mx1, mx2, xmin, xmax, dx, ymin, ymax, yscl \
localobj syn, sl, g
xmin = 0 xmax = net_spatial_len
dx = net_spatial_len/num_granule
//print "dx=", dx
ymin = 0 ymax = num_mitral
yscl = (xmax - xmin)/(ymax - ymin) * 250/700 *.9
// if (dx > yscl/2) { dx = yscl/2 * .9 }
// hinton_build()
//proc hinton_build() {local mx1, mx2, sl
sl = new SectionList()
g = new PlotShape(sl,0)
if ($1 == 1) hinton_shape = g else if ($1 == 2) exc_hinton_shape = g else inh_hinton_shape = g
g.view(xmin, ymin, xmax-xmin, (ymax-ymin)*yscl, 400, 250, 700, 250)
g.colormap(11)
i = -1
g.colormap(i+=1, 111, 0, 111)
g.colormap(i+=1, 143, 0, 127)
g.colormap(i+=1, 175, 0, 95)
g.colormap(i+=1, 207, 0, 63)
g.colormap(i+=1, 223, 47, 47)
g.colormap(i+=1, 255, 79, 15)
g.colormap(i+=1, 255, 111, 0)
g.colormap(i+=1, 255, 143, 0)
g.colormap(i+=1, 255, 175, 0)
//g.colormap(i+=1, 255, 207, 0)
g.colormap(i+=1, 255, 239, 0)
//g.colormap(i+=1, 255, 255, 0)
g.colormap(i+=1, 255, 255, 200)
g.scale(0,1)
g.exec_menu("Shape Plot")
hinton_draw(dx, $1, g)
}
proc hinton_draw() {local i, x, m, b, dx localobj ncl, nc, syn, sr, s
dx = $1
s = new String()
ncl = new List("NetCon")
for i=0, ncl.count-1 {
nc = ncl.object(i)
syn = nc.syn
classname(syn, s.s)
if (strcmp(s.s, "FastInhib") == 0) {
b = 1
}else if (strcmp(s.s, "AmpaNmda") == 0) {
b = 0
}else{
continue
}
x = syn.x
m = syn.mgid
nc.weight[2] = 0
if ($2 == 1) {
$o3.hinton(&nc.weight[2], x, 3*m*dx+(dx)*b, dx)
}else{
if ($2 == 2 && b == 0) {
$o3.hinton(&nc.weight[2], x, m*dx, dx)
}
if ($2 == 3 && b == 1) {
$o3.hinton(&nc.weight[2], x, m*dx, dx)
}
}
}
}
endtemplate ShowConnect
objref sc_
proc showconnect() {
sc_ = new ShowConnect(cells, num_mitral, num_granule, mgrs_list)
}
showconnect()
load_file("michele_movie.hoc")