//genesis str lastinjectsite1 = "none" str lastinjectsite2 = "none" // This function is accessed from the 'when' command in the xsout file function set_field(widget, view) str widget str view setfield {view} field {getfield {widget} value} end // This function is accessed from the 'when' command in the xsout file function autoscale_toggle(widget, view) str widget if (({getfield {widget} state}) == 1) setfield {view} autoscale TRUE else setfield {view} autoscale FALSE end end function click_site(num) str num setfield /cell_run_control/click_site{num} \ value {getfield {cellpath}xout{num}/draw value} end function do_inject(num) str num int inum = num str widget = (cellpath) @ "xout" @ (num) @ "/draw" str name = {getfield {widget} value} str iname = {getfield {name} name} @ {getfield {name} index} click_site {num} setfield {name} \ inject {{getfield /cell_run_control/"inject (nanoAmps)" value}/1e9} if (inum == 1) lastinjectsite1 = name else lastinjectsite2 = name end echo Setting injection on {name} to \ {getfield /cell_run_control/"inject (nanoAmps)" value} nA. if (({exists {widget}/Inj{iname}})) return end copy /xproto/draw/Inj {widget}/Inj{iname} setfield {widget}/Inj{iname} tx {getfield {name} x} \ ty {getfield {name} y} tz {getfield {name} z} end function clear_inject(num) str num int inum = num str widget = (cellpath) @ "xout" @ (num) @ "/draw" str name = {getfield {widget} value} str iname = {getfield {name} name} @ {getfield {name} index} click_site {num} setfield {name} inject {0.0} if (inum == 1) lastinjectsite1 = "none" else lastinjectsite2 = "none" end echo Setting injection on {name} to 0 nA. if (({exists {widget}/Inj{iname}})) delete {widget}/Inj{iname} end end function do_vclamp(num) str num int inum = num str widget = (cellpath) @ "xout" @ (num) @ "/draw" float temp str name = {getfield {widget} value} str iname = {getfield {name} name} @ {getfield {name} index} if (inum == 1) lastinjectsite1 = name else lastinjectsite2 = name end click_site {num} if (({exists {widget}/Vclamp{iname}})) temp = {getfield {name}/Vclamp x} temp = temp*1e3 setfield /cell_run_control/"Clamp voltage (mV)" \ value {temp} return end copy /xproto/draw/Vclamp {widget}/Vclamp{iname} setfield {widget}/Vclamp{iname} tx {getfield {name} x} \ ty {getfield {name} y} tz {getfield {name} z} /* copy /library/Vclamp {widget}/Vclamp{iname} push {widget}/Vclamp{iname}/Vclamp */ copy /library/Vclamp {name} pushe {name}/Vclamp temp = {getfield /cell_run_control/"Clamp voltage (mV)" value} echo Setting clamp Voltage on {name} to {temp} mV. setfield . x {temp/1.0e3} addmsg . lowpass INJECT x addmsg {name} PID SNS Vm addmsg PID {name} INJECT output resched pope end function clear_vclamp(num) str num int inum str widget = (cellpath) @ "xout" @ (num) @ "/draw" str name = {getfield {widget} value} str iname = {getfield {name} name} @ {getfield {name} index} click_site {num} setfield {name} inject {0.0} if (inum == 1) lastinjectsite1 = "none" else lastinjectsite2 = "none" end echo Removing Voltage clamp from {name} if (({exists {widget}/Vclamp{iname}})) delete {widget}/Vclamp{iname} delete {name}/Vclamp end end int col1 = 15 int col2 = 15 function add_plot(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" str graphw = (cellpath) @ "graph" @ (num) @ "/graph" str newplot = {getfield {draww} value} str \ fieldpath = (newplot) @ "/" @ ({getfield {draww}/cell fieldpath}) str field = {getfield {draww}/cell colfield} str name int col click_site {num} if ({strcmp {num} "1"} == 0) col = col1 else col = col2 end name = ({getfield {newplot} name}) @ "[" @ ({getfield {newplot} index}) @ "]" if (({exists {draww}/Tr{name}})) echo already recording from {newplot}, {name} return end if (!({exists {fieldpath}})) echo cannot record from {fieldpath} : it does not exist return end //DHB addmsg {fieldpath} {graphw} PLOT {field} *{name} *hot{col} addmsg {fieldpath} {graphw} PLOT {field} *{name} *{col} setfield {graphw} \ YUnits {getfield {draww}/cell fieldpath}:{field} call {graphw}/{name} RESET copy /xproto/draw/Trode {draww}/Tr{name} setfield {draww}/Tr{name} pixcolor /*"hot"*/{col} \ tx {getfield {newplot} x} ty {getfield {newplot} y} \ tz {{getfield {newplot} z} + 0.00001} col = col + 7 if (col > 63) col = col - 60 end if ({strcmp {num} "1"} == 0) col1 = col else col2 = col end echo adding plot for element '{fieldpath}' of {field} end function drop_plot(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" str graphw = (cellpath) @ "graph" @ (num) @ "/graph" int nmsgs, i str oldplot = {getfield {draww} value} str fieldpath = {el {oldplot}/{getfield {draww}/cell fieldpath}} str src, name str field = {getfield {draww}/cell colfield} click_site {num} nmsgs = {getmsg {graphw} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) src = {getmsg {graphw} -incoming -source {i}} if ({strcmp {src} {fieldpath}} == 0) deletemsg {graphw} {i} -incoming i = i - 1 nmsgs = nmsgs - 1 /* name = {get({oldplot},name)}+ {get({oldplot},index)}+{field} */ name = ({getfield {oldplot} name}) @ "[" @ ({getfield {oldplot} index}) @ "]" delete {draww}/Tr{name} echo dropping plot for '{field}' on element \ '{fieldpath}' end end end function color_plot(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" str graphw = (cellpath) @ "graph" @ (num) @ "/graph" int nmsgs, i, k, l int col str oldplot, src, name, char str field = {getfield {draww}/cell colfield} str fieldpath = ({getfield {draww}/cell fieldpath}) str otype if ({strcmp {num} "1"} == 0) col = col1 else col = col2 end nmsgs = {getmsg {graphw} -incoming -count} col = col + 7 if (col > 63) col = col - 60 end if ({strcmp {num} "1"} == 0) col1 = col else col2 = col end for (i = 0; i < nmsgs; i = i + 1) src = {getmsg {graphw} -incoming -source {0}} // deletemsg {graphw} {0} -incoming /* k = strlen({src}) for (l=k; l>0; l=l-1) char=substring({src},{l},{l}) if (strcmp({char},"/")==0) break end end if (strcmp({fieldpath},".") == 0) //plot is not a subelement oldplot = {src} else l = l - 1 oldplot = substring({src},0,{l}) end name = {get({oldplot},name)}+ {get({oldplot},index)}+{field} name = {get({oldplot},name)}+"["+{get({oldplot},index)}+"]" */ /* */ oldplot = (src) if ({strcmp {fieldpath} "."} != 0) //plot is a subelement for (k = 0; k < 5; k = k + 1) oldplot = ({el {oldplot}/..}) otype = {getfield {oldplot} object->name} if ( \ (({strcmp {otype} compartment}) == 0) || (({strcmp {otype} symcompartment}) == 0) \ ) break end end end name = ({getfield {oldplot} name}) @ "[" @ ({getfield {oldplot} index}) @ "]" //DHB addmsg {src} {graphw} PLOT {field} *{name} *hot{col} // addmsg {src} {graphw} PLOT {field} *{name} *{col} setfield {graphw}/{name} fg {col} setfield {draww}/Tr{name} pixcolor /*"hot"*/{col} end end function do_spike(num) str num str compt = {getfield {cellpath}xout{num}/draw value} str channame = {getfield /cell_run_control/"Syn Type" value} str chanpath = compt @ "/" @ channame float weight click_site {num} if (!{exists {chanpath}}) echo channel '{chanpath}' does not exist return end call /stimulus/spike_on_command SEND_SPIKE {chanpath} echo delivering spike to '{chanpath}' end function do_unspike(num) str num // make this a no-op - DEB 8/195 // str compt = {getfield {cellpath}xout{num}/draw value} // str channame = {getfield /cell_run_control/"Syn Type" value} // str chanpath = (compt) @ "/" @ (channame) // click_site {num} // if (!({exists {chanpath}})) // echo channel '{chanpath}' does not exist // return // end // setfield {chanpath} X 0.0 // setfield {chanpath} Y 0.0 end function do_act(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" str compt = {getfield {draww} value} str channame = {getfield /cell_run_control/"Syn Type" value} str chanpath = (compt) @ "/" @ (channame) str iname = {getfield {compt} name} @ {getfield {compt} index} float act click_site {num} if (!({exists {chanpath}})) echo channel '{chanpath}' does not exist return end act = {getfield /cell_run_control/"Amount of synaptic activation" value} pushe {draww} if (!({exists act{channame}{iname}})) if ({exists /xproto/draw/act{channame}}) copy /xproto/draw/act{channame} act{channame}{iname} else copy /xproto/draw/actACh act{channame}{iname} end setfield {draww}/act{channame}{iname} tx {getfield {compt} x} \ ty {getfield {compt} y} tz {getfield {compt} z} create neutral act{channame}{iname}/dummy addmsg act{channame}{iname}/dummy {chanpath} ACTIVATION \ z end echo setting activation on {chanpath} to {act} setfield act{channame}{iname}/dummy z {act} pope end function do_unact(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" str compt = {getfield {draww} value} str channame = {getfield /cell_run_control/"Syn Type" value} str chanpath = (compt) @ "/" @ (channame) str iname = {getfield {compt} name} @ {getfield {compt} index} click_site {num} if (!({exists {chanpath}})) echo channel '{chanpath}' does not exist return end pushe {draww} if ({exists act{channame}{iname}}) delete act{channame}{iname} else echo no activation has been set on {channame} end pope end function do_rand(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" str compt = {getfield {draww} value} str channame = {getfield /cell_run_control/"Syn Type" value} str chanpath = (compt) @ "/" @ (channame) str iname = {getfield {compt} name} @ {getfield {compt} index} float rate, weight click_site {num} if (!({exists {chanpath}})) echo channel '{chanpath}' does not exist return end pushe {draww} if (({exists rand{channame}{iname}})) echo rand input already being sent to {chanpath} pope return end addmsg /stimulus/rand {chanpath} RAND_ACTIVATION rate weight // This setfield shouldn't be necessary as /stimulus/rand fields // should always be updated from the interface elements. Uncomment // if there's a consistency problem. ---dhb // //setfield /stimulus/rand \ // weight {getfield /cell_run_control/"Spike weight" value} \ // rate {getfield /cell_run_control/"Spike rate (Hz)" value} if ({exists /xproto/draw/rand{channame}}) copy /xproto/draw/rand{channame} rand{channame}{iname} else copy /xproto/draw/randACh rand{channame}{iname} end setfield rand{channame}{iname} tx {getfield {compt} x} \ ty {getfield {compt} y} tz {getfield {compt} z} echo delivering rand spikes to '{chanpath}' pope end function do_unrand(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" str compt = {getfield {draww} value} str channame = {getfield /cell_run_control/"Syn Type" value} str chanpath = (compt) @ "/" @ (channame) str iname = {getfield {compt} name} @ {getfield {compt} index} click_site {num} if (!({exists {chanpath}})) echo channel '{chanpath}' does not exist return end pushe {draww} if (({exists rand{channame}{iname}})) echo deleting random spike input to {chanpath} deletemsg {chanpath} 0 -find /stimulus/rand RAND_ACTIVATION delete rand{channame}{iname} end pope end function setup_mouse(draw, x, y, but1, func1, but2, func2, but3, func3) str draw, but1, but2, but3, func1, func2, func3 int x, y if (({exists {draw}}) == 0) le / le {cellpath}xout echo draw widget '{draw}' does not exist. return end /* x = get({draw},x) + x y = get({draw},y) + y */ if (!({exists {draw}/../MOUSE})) pushe {draw}/.. create x1label MOUSE [{x},{y},330,32] -title \ "MOUSE " else pushe {draw}/.. end if (!({exists {but1}})) create x1button {but1} [{x + 70},{y + 2},75,] end if (!({exists {but2}})) //DHB create xbutton {but2} [{x + 136},{y + 2},50,25] create x1button {but2} [10:{but1},{y + 2},75,] end if (!({exists {but3}})) create x1button {but3} [10:{but2},{y + 2},75,] end dropwhen {draw} all when {draw} click1 do {func1} when {draw} click2 do {func2} when {draw} click3 do {func3} pope end function select_mouse(draw, but1, func1, but2, func2, but3, func3) str draw, but1, but2, but3 str func1, func2, func3 if (!({exists {draw}})) echo draw widget '{draw}' does not exist. return end pushe {draw}/.. if (({exists {but1}}) && ({exists {but2}}) && ({exists {but3}})) xraise MOUSE xraise {but1} xraise {but2} xraise {but3} dropwhen {draw} all when {draw} click1 do {func1} when {draw} click2 do {func2} when {draw} click3 do {func3} end pope end function scalecell(cell) str cell int x, y, w str temp //DHB temp = {getfield {cell}/.. form} //DHB x = {getfield {temp} x} //DHB y = {getfield {temp} y} //DHB w = {getfield {temp} width} x = {getfield {cell}/../.. xgeom} y = {getfield {cell}/../.. ygeom} w = {getfield {cell}/../.. wgeom} create x1form {cell}_scale [{x},{y},200,415] -title Scale create x1button {cell}/scale [0,0,50,] -script \ "disp_cellscale "{cell} pushe {cell}_scale create x1dialog colfield -value {getfield {cell} colfield} //DHB create xdialog fatfield -value {getfield {cell} fatfield} create x1dialog colmin -value {getfield {cell} colmin} create x1dialog colmax -value {getfield {cell} colmax} create x1dialog fatmin -value {getfield {cell} fatmin} create x1dialog fatmax -value {getfield {cell} fatmax} create x1toggle autocol [1%,3:fatmax.bottom,48%,] -state 0 setfield autocol label0 "Autocol OFF" label1 "Autocol ON" create x1toggle colfix [51%,3:fatmax.bottom,48%,] -state 0 setfield colfix label0 "Colfix OFF" label1 "Colfix ON" create x1toggle autofat [1%,3:autocol.bottom,48%,] -state 0 setfield autofat label0 "Autofat OFF" label1 "Autofat ON" create x1toggle fatfix [51%,3:autocol.bottom,48%,] -state 1 setfield fatfix label0 "Fatfix OFF" label1 "Fatfix ON" state 1 create x1dialog fatrange -value {getfield {cell} fatrange} create x1dialog fieldpath -value {getfield {cell} fieldpath} create x1button APPLY -script \ "applycellscale "{cell}" "{cell}_scale" 0" create x1button APPLY_AND_VANISH -script \ "applycellscale "{cell}" "{cell}_scale" 1" pope end function disp_cellscale(cell) str cell pushe {cell}_scale setfield colmin value {getfield {cell} colmin} setfield colmax value {getfield {cell} colmax} setfield fatmin value {getfield {cell} fatmin} setfield fatmax value {getfield {cell} fatmax} pope xshowontop {cell}_scale end function set_cell_flag(cell, flagname, flag) str cell, flagname int flag str state = "FALSE" if (flag == 1) state = "TRUE" end if ({strcmp {state} {getfield {cell} {flagname}}} != 0) setfield {cell} {flagname} {state} end end function applycellscale(cell, cellscale, hide) str cell, cellscale int hide str colfield, fatfield, fieldpath float colmin, colmax, fatmin, fatmax, fatrange int autofat, autocol, fatfix, colfix int l = {strlen {cellpath}} + 4 str num = {substring {cell} {l} {l}} str graphw = (cellpath) @ "graph" @ (num) @ "/graph" int nmsgs, i str field = {getfield {cell} colfield} str path, oldplot, src, name, char str col pushe {cellscale} colfield = {getfield colfield value} //DHB fatfield = {getfield fatfield value} fieldpath = {getfield fieldpath value} autocol = {getfield autocol state} autofat = {getfield autofat state} //DHB colfix = {getfield colfix state} //DHB fatfix = {getfield fatfix state} colmin = {getfield colmin value} colmax = {getfield colmax value} fatmin = {getfield fatmin value} fatmax = {getfield fatmax value} fatrange = {getfield fatrange value} //DHB ({strcmp {colfield} {field}} != 0) || ({strcmp {fatfield} {getfield {cell} fatfield}} != 0) || ({strcmp {fieldpath} {getfield {cell} fieldpath}} != 0) \ if ( \ ({strcmp {colfield} {field}} != 0) || ({strcmp {fieldpath} {getfield {cell} fieldpath}} != 0) \ ) nmsgs = {getmsg {graphw} -incoming -count} for (i = 0; i < nmsgs; i = i + 1) src = {getmsg {graphw} -incoming -source {0}} deletemsg {graphw} {0} -incoming end foreach name ({el {cell}/../Tr#[]}) oldplot = ({substring {getfield {name} name} 2}) @ "[" @ ({getfield {name} index}) @ "]" col = {getfield {name} fg} path = (cellpath) @ "/" @ (oldplot) @ "/" @ (fieldpath) if (({exists {path}})) addmsg {path} {graphw} PLOT {colfield} \ *{oldplot} *{col} end end setfield {cell} colfield {colfield} //DHB setfield {cell} fatfield {fatfield} setfield {cell} fieldpath {fieldpath} setfield {graphw} YUnits {fieldpath}:{colfield} end set_cell_flag {cell} autofat {autofat} set_cell_flag {cell} autocol {autocol} //DHB set_cell_flag {cell} colfix {colfix} //DHB set_cell_flag {cell} fatfix {fatfix} if (autocol == 0) if (colmin != ({getfield {cell} colmin})) setfield {cell} colmin {colmin} end if (colmax != ({getfield {cell} colmax})) setfield {cell} colmax {colmax} end end if (autofat == 0) if (fatmin != ({getfield {cell} fatmin})) setfield {cell} fatmin {fatmin} end if (fatmax != ({getfield {cell} fatmax})) setfield {cell} fatmax {fatmax} end end if (fatrange != ({getfield {cell} fatrange})) setfield {cell} fatrange {fatrange} end if (hide) xhide {cellscale} end xupdate .. pope end function do_xout(num) str num str draww = (cellpath) @ "xout" @ (num) @ "/draw" int xoutwidth = (user_screenwidth - 380)/2 if ({strcmp {num} "1"} == 0) if ((user_numxouts) == 1) create x1form {cellpath}xout1 [380,50,600,470] else create x1form {cellpath}xout1 \ [380,50,{xoutwidth},470] end else create x1form {cellpath}xout2 \ [{380 + xoutwidth},50,{xoutwidth},470] end pushe {cellpath}xout{num} disable . create x1label "CELL GEOMETRY" [1%,2,70%,30] create x1draw draw [1%,2,98%,2:parent.bottom] -transform ortho3d \ -wx {1.4e-3} -wy {1.4e-3} \ -cz 0.2e-3 -vx 10 -vy -15 -vz 7 /* -transform ortho3d */ //DHB setfield ^ wx {user_wx} wy {user_wy} cx {user_cx} cy {user_cy} \ //DHB cz {user_cz} setfield ^ xmin {user_cx - user_wx/2} xmax {user_cx + user_wx/2} \ ymin {user_cy - user_wy/2} ymax {user_cy + user_wy/2} //setfield ^ transform o if ((user_symcomps)) create x1cell draw/cell -path \ {cellpath}/##[TYPE=symcompartment] /* -fatfield dia */ \ -colfield Vm -autocol FALSE -colmin -0.1 -colmax \ 0.05 else create x1cell draw/cell -path \ {cellpath}/##[TYPE=compartment] /* -fatfield dia */ \ -colfield Vm -autocol FALSE -colmin -0.1 -colmax \ 0.05 end if ({strcmp {num} "1"} == 0) setfield {draww}/cell fatrange {user_fatrange1} \ fieldpath {user_path1} colfield {user_field1} \ colmax {user_colmax1} colmin {user_colmin1} \ labelmode none rooticon none // set_cell_flag {cellpath}xout1/draw/cell colfix {user_colfix1} // set_cell_flag {cellpath}xout1/draw/cell fatfix {user_fatfix1} else setfield {draww}/cell fatrange {user_fatrange2} \ fieldpath {user_path2} colfield {user_field2} \ colmax {user_colmax2} colmin {user_colmin2} \ labelmode none rooticon none // set_cell_flag {cellpath}xout2/draw/cell colfix {user_colfix2} // set_cell_flag {cellpath}xout2/draw/cell fatfix {user_fatfix2} end scalecell {draww}"/cell" setup_mouse {draww} 50 0 inject "do_inject "{num} unject \ "clear_inject "{num} dummy do_dummy setup_mouse {draww} 50 0 Vclamp "do_vclamp "{num} unclamp \ "clear_vclamp "{num} dummy do_dummy setup_mouse {draww} 50 0 add_plot "add_plot "{num} drop_plot \ "drop_plot "{num} dummy do_dummy setup_mouse {draww} 50 0 RandSyn "do_rand "{num} UnRand \ "do_unrand "{num} dummy do_dummy setup_mouse {draww} 50 0 SynAct "do_act "{num} UnAct \ "do_unact "{num} dummy do_dummy setup_mouse {draww} 50 0 SynSpike "do_spike "{num} UnSpike \ "do_unspike "{num} dummy do_dummy useclock draw/cell 9 // draw_control draw 0 0 pope end