//genesis float dt = user_dt float refresh_factor = user_refresh int i int col1 = 15 int col2 = 15 // we need a synactivator to activate synaptic channels on // command. include synactivator.g function do_xcell_run_control for (i = 0; i < 10; i = i + 1) setclock {i} {dt} end setclock 9 {dt*refresh_factor} create x1form /cell_run_control [0,50,380,500] -nolabel ce ^ disable . create x1label "SIMULATION CONTROL PANEL" [0,0,100%,40] create x1button stop [2%,45,30%,] -script finish_run create x1button reset [7:stop.right,45,30%,] -script reset create x1button run [7:reset.right,45,30%,] -script runsteps create x1button save [2%,72,30%,] -script save_sim create x1button restore [7:save.right,72,30%,] -script \ restore_sim create x1button "run paradigm" [7:restore.right,72,30%,] \ -script do_paradigm create x1dialog nstep -script "nstep "<widget> -value 10000 create x1dialog runtime [8,5:nstep.bottom,64%,30] -script \ "runtime "<widget> -value 0.1 create x1dialog method [4:runtime.right,5:nstep.bottom,30%,30] \ -script "intmethod "<widget> -value 0 setfield /cell_run_control/method value {user_intmethod} /* If we change the clock used by a script_out element to one with ** another period, we can get commands executed different rates. ** Here, clock 1 starts up at 1/10 the simulation clock rate so ** the script is executed every 10 timesteps */ create script_out /output/refresh_out create disk_out /output/field_out disable /output/field_out create asc_file /output/field_aout disable /output/field_aout create disk_out /output/plot_out disable /output/plot_out setfield /output/refresh_out command get_current_time useclock /output/refresh_out 9 useclock /output/field_out 9 useclock /output/field_aout 9 useclock /output/plot_out 9 create x1label /cell_run_control/"TIMING (sec)" create x1dialog current_time -script get_current_time -value \ 0.000 create x1dialog clock [2%,5:current_time.bottom,50%,30] -value \ {dt} -script "setdt <widget> " create x1dialog refresh_factor \ [7:clock.right,5:current_time.bottom,44%,30] -script \ "setrefresh <widget>" -value {refresh_factor} setfield runtime value {user_runtime} setfield nstep value {user_runtime/user_dt} create x1label "ELECTROPHYSIOLOGY" create x1toggle Record [0,4:ELECTROPHYSIOLOGY.bottom,16%,] \ -script "do_run_clickmode "<widget> create x1toggle Iclamp [16%,4:ELECTROPHYSIOLOGY.bottom,16%,] \ -script "do_run_clickmode "<widget> create x1toggle Vclamp [32%,4:ELECTROPHYSIOLOGY.bottom,16%,] \ -script "do_run_clickmode "<widget> create x1toggle "Syn act" [48%,4:ELECTROPHYSIOLOGY.bottom,17%,] \ -script "do_run_clickmode "<widget> create x1toggle "Syn spike" \ [65%,4:ELECTROPHYSIOLOGY.bottom,18%,] -script \ "do_run_clickmode "<widget> create x1toggle "Syn rand" \ [83%,4:ELECTROPHYSIOLOGY.bottom,17%,] -script \ "do_run_clickmode "<widget> create neutral /stimulus // the rand element holds the rate and weight information // for synaptic spike input. The rate and weight fields are // aliases for the y and z fields of the element create neutral /stimulus/rand addfield /stimulus/rand rate -indirect . y addfield /stimulus/rand weight -indirect . z setfield ^ rate {user_rate} weight {user_weight} // The spike_on_command element is used to activate // synaptic channels directly when the user clicks on // a compartment. We will call the SEND_SPIKE action // to send the spike passing the channel path as an // argument. The weight is determined by the weight field // which is set by the user through a dialog. // The synactivator object is defined in synactivator.g // which is included above. create synactivator /stimulus/spike_on_command setfield ^ weight {user_spike} create x1label dummy_dialog -label "Plant or remove recording electrodes" \ [2%,29:ELECTROPHYSIOLOGY.bottom,96%,30] create x1dialog "inject (nanoAmps)" \ [2%,29:ELECTROPHYSIOLOGY.bottom,96%,30] -script \ "update_inject "<widget> setfield "inject (nanoAmps)" value {user_inject} create x1dialog "Clamp voltage (mV)" \ [2%,29:ELECTROPHYSIOLOGY.bottom,96%,30] -script \ "set_vclamp "<widget> setfield "Clamp voltage (mV)" value {user_clamp} create x1dialog "Spike rate (Hz)" \ [2%,29:ELECTROPHYSIOLOGY.bottom,48%,30] -script \ "set_rand_rate "<widget> setfield "Spike rate (Hz)" value {user_rate} create x1dialog "Spike weight" \ [50%,29:ELECTROPHYSIOLOGY.bottom,48%,30] -script \ "set_rand_wt "<widget> setfield "Spike weight" value {user_weight} create x1dialog "Amount of synaptic activation" \ [2%,29:ELECTROPHYSIOLOGY.bottom,96%,30] -script \ "set_act_dummy "<widget> setfield "Amount of synaptic activation" value {user_activ} create x1dialog "Weight of spike" \ [2%,29:ELECTROPHYSIOLOGY.bottom,96%,30] -script \ "set_synspike_wt <widget>" setfield "Weight of spike" value {user_spike} create x1dialog click_site1 -script "click_site 1" -value none create x1dialog click_site2 -script "click_site 2" -value none create x1button {user_syntype1} [2%,3:click_site2.bottom,15%,30] \ -script set_syn_type1 create x1button {user_syntype2} [18%,3:click_site2.bottom,15%,30] \ -script set_syn_type2 create x1dialog "Syn Type" [34%,3:click_site2.bottom,64%,30] \ -value {user_syntype1} create x1button "Remove all electrophysiology probes" -script \ remplot create x1toggle "FILE IO" [0,,50%,] -script \ "popup_file_io "<widget> setfield ^ label0 "Show Simulation IO control" \ label1 "Hide Simulation IO control" create x1toggle toggle_xout2 [50%,0:"Remove all electrophysiology probes",50%,] -script \ "show_xout2 "<widget> setfield ^ label0 "Show extra cell window" \ label1 "Hide extra cell window" create x1form /file_IO [0,555,380,350] -nolabel ce ^ disable . create x1dialog filepath setfield filepath value {user_filepath} create x1dialog save_restore_file setfield save_restore_file value {user_restorefile} create x1dialog file_index -value 0 create x1toggle save_run_info setfield ^ label1 "Save run info" \ label0 "Do Not Save run info" create x1dialog info_file -value test create x1dialog notes -value " " create x1toggle save_plot setfield ^ label1 "Save Plots (graph1)" \ label0 "Do Not Save Plots (graph1)" create x1dialog plot_file -value testplot create x1toggle save_field [2%,4:plot_file.bottom,46%,] setfield ^ label1 "Save Field" \ label0 "Do Not Save Field" create x1toggle save_type [52%,4:plot_file.bottom,46%,] setfield ^ label1 "Ascii" label0 "Binary" create x1dialog field setfield field value {user_filefield} create x1dialog field_path setfield field_path value {cellpath}/{user_filefieldpath} create x1dialog field_file setfield field_file value {user_filename} end function get_current_time setfield /cell_run_control/current_time value {getstat -time} end function nstep(widget) str widget float nsteps = ({getfield {widget} value}) setfield /cell_run_control/runtime value {nsteps*dt} end function runtime(widget) str widget float runtime = ({getfield {widget} value}) int nsteps nsteps = runtime/dt + 0.5 setfield /cell_run_control/nstep value {nsteps} end function intmethod(widget) str widget int imethod = ({getfield {widget} value}) if ((imethod) == 10) if (!({exists {cellpath}/solve})) create hsolve {cellpath}/solve if ({user_symcomps}) setfield {cellpath}/solve path {cellpath}/##[][TYPE=symcompartment] else setfield {cellpath}/solve path {cellpath}/##[][TYPE=compartment] end setfield {cellpath}/solve chanmode 1 setmethod {cellpath}/solve 10 call {cellpath}/solve SETUP echo Warning : the previous integration scheme \ will still apply for non-hsolvable elements echo Note : a reset may be necessary reset else setmethod {cellpath}/solve 10 end end if ((imethod) == 11) if (!({exists {cellpath}/solve})) create hsolve {cellpath}/solve if ({user_symcomps}) setfield {cellpath}/solve path {cellpath}/##[][TYPE=symcompartment] else setfield {cellpath}/solve path {cellpath}/##[][TYPE=compartment] end setfield {cellpath}/solve chanmode 1 setmethod {cellpath}/solve 11 call {cellpath}/solve SETUP echo Warning : the previous integration scheme \ will still apply for non-hsolvable elements echo Note : a reset may be necessary reset else setmethod {cellpath}/solve 11 end end if ((imethod) < -1) echo illegal entry, setting to exponential method imethod = 0 setfield /cell_run_control/method value 0 end if (((imethod) != 10) && ((imethod) != 11)) if (({exists {cellpath}/solve})) delete {cellpath}/solve echo reset may be necessary end if ((imethod) > 7) echo illegal entry, setting to exponential \ method end end setmethod {cellpath}/## {imethod} /* ** This is what we ought to do, but method fields are not universal if ({user_symcomps}) set {cellpath}/##[][TYPE=symcompartment] method {imethod} else set {cellpath}/##[][TYPE=compartment] method {imethod} end */ end function setrefresh(widget) str widget echo setting refresh_factor to {getfield {widget} value} refresh_factor = ({getfield {widget} value}) //sec : for the refresh views setclock 9 {({getclock 0})*refresh_factor} end function showtoggle(widget, form) str widget str form echo {widget} {form} if (({getfield {widget} state}) == 1) xhide {form} else xshow {form} end end function do_nothing// a dummy function end function setdt(widget) str widget str cell int clockno, nsteps dt = {getfield {widget} value} echo setting {cell} timesteps to {dt} echo a reset may be necessary. setclock {clockno} {dt} // sec if (clockno == 0) setclock 9 {dt*refresh_factor} end nsteps = ({getfield /cell_run_control/runtime value}/dt + 0.5) setfield /cell_run_control/nstep value {nsteps} end function run_func source cellparms.g end /* function run_para set dummy_para script {get(paradigm_file,value)} if (strcmp({get(paradigm_file,value)},"cellparms") == 0) cellparms return end if (strcmp({get(paradigm_file,value)},"para1") == 0) para1 return end if (strcmp({get(paradigm_file,value)},"para2") == 0) para2 return end // Default op is to step as many as specified nstep /cell_run_control/nstep end */ str info_file str plot_file str field_file function start_run pushe /file_IO info_file = ({getfield filepath value}) @ "/" @ ({getfield info_file value}) @ ({getfield file_index value}) plot_file = ({getfield filepath value}) @ "/" @ ({getfield plot_file value}) @ ({getfield file_index value}) field_file = ({getfield filepath value}) @ "/" @ ({getfield field_file value}) @ ({getfield file_index value}) if (({getfield save_run_info state}) == 1) echo saving run info in {info_file} openfile {info_file} "a" writefile {info_file} writefile {info_file} {getdate} /* writefile {info_file} paradigm : {get(paradigm_file,value)} */ writefile {info_file} Cell input res = \ {calcRm {cellpath}/soma} writefile {info_file} Approx Cell cap = \ {calcCm {cellpath}} writefile {info_file} notes : {getfield notes value} writefile {info_file} if (({getfield save_plot state}) == 1) writefile {info_file} storing plots in {plot_file} end if (({getfield save_field state}) == 1) writefile {info_file} storing field \ '{getfield field value}' in {field_file} end end /* \ This makes the data go to a new file with the new header info. ** It should overwrite existing files with the same name, so ** beware ! */ if (({getfield save_plot state}) == 1) enable /output/plot_out setfield /output/plot_out filename {plot_file} \ initialize 1 end if (({getfield save_field state}) == 1) if (({getfield save_type state}) == 1) enable /output/field_aout setfield /output/field_aout \ filename {field_file} initialize 1 call /output/field_aout RESET else enable /output/field_out setfield /output/field_out filename {field_file} \ initialize 1 call /output/field_out RESET end end pope end function make_output_messages str name str field str src int nmsgs int i pushe /file_IO if (({getfield save_plot state}) == 1) setfield /output/plot_out filename {plot_file} append 1 \ leave_open 1 nmsgs = {getmsg {cellpath}graph1/graph -incoming -count} for (i = 0; i < nmsgs; i = i + 1) src = {getmsg {cellpath}graph1/graph -incoming -source {i}} addmsg {src} /output/plot_out SAVE Vm end // look at all messages going to the graph, and send them to // a file as well // openfile {plot_file} "a" end if (({getfield save_field state}) == 1) field = ({getfield field value}) if (({getfield save_type state}) == 1) setfield /output/field_aout \ filename {field_file} append 1 leave_open 1 \ flush 1 else setfield /output/field_out filename {field_file} \ append 1 leave_open 1 flush 1 end foreach name ({el {getfield field_path value}}) if (({getfield save_type state}) == 1) addmsg {name} /output/field_aout SAVE \ {field} else addmsg {name} /output/field_out SAVE \ {field} end end reset end pope end function finish_run pushe /file_IO stop if (({getfield save_run_info state}) == 1) closefile {info_file} end pope disable /output/field_out disable /output/field_aout disable /output/plot_out end function clean_output_messages int nmsgs, i pushe /file_IO /* Getting rid of the messages */ if (({getfield save_plot state}) == 1) nmsgs = {getmsg /output/plot_out -incoming -count} for (i = 0; i < nmsgs; i = i + 1) deletemsg /output/plot_out 0 -incoming end end if (({getfield save_field state}) == 1) if (({getfield save_type state}) == 1) nmsgs = {getmsg /output/field_aout -incoming -count} for (i = 0; i < nmsgs; i = i + 1) deletemsg /output/field_aout 0 \ -incoming end else nmsgs = {getmsg /output/field_out -incoming -count} for (i = 0; i < nmsgs; i = i + 1) deletemsg /output/field_out 0 -incoming end end end pope end function do_dummy click_site 1 end function set_rand_rate(widget) setfield /stimulus/rand rate {getfield {widget} value} end function set_rand_wt(widget) setfield /stimulus/rand weight {getfield {widget} value} end function set_synspike_wt(widget) setfield /stimulus/spike_on_command weight {getfield {widget} value} end function do_run_clickmode(widget) str widget str widgname = {getfield {widget} name} int n str num, draww ce /cell_run_control if (({getfield Record state}) == 1) setfield Record state 0 end if (({getfield Iclamp state}) == 1) setfield Iclamp state 0 end if (({getfield Vclamp state}) == 1) setfield Vclamp state 0 end if (({getfield "Syn act" state}) == 1) setfield "Syn act" state 0 end if (({getfield "Syn spike" state}) == 1) setfield "Syn spike" state 0 end if (({getfield "Syn rand" state}) == 1) setfield "Syn rand" state 0 end setfield {widget} state 1 for (n = 1; n <= 2; n = n + 1) num = n draww = (cellpath) @ "xout" @ (num) @ "/draw" if ({strcmp {widgname} "Record"} == 0) select_mouse {draww} add_plot "add_plot "{num} \ drop_plot "drop_plot "{num} dummy do_dummy xraise dummy_dialog end if ({strcmp {widgname} "Iclamp"} == 0) select_mouse {draww} inject "do_inject "{num} \ unject "clear_inject "{num} dummy do_dummy xraise "inject (nanoAmps)" end if ({strcmp {widgname} "Vclamp"} == 0) select_mouse {draww} Vclamp "do_vclamp "{num} \ unclamp "clear_vclamp "{num} dummy do_dummy xraise "Clamp voltage (mV)" end if ({strcmp {widgname} "Syn act"} == 0) xraise "Amount of synaptic activation" select_mouse {draww} SynAct "do_act "{num} UnAct \ "do_unact "{num} dummy do_dummy end if ({strcmp {widgname} "Syn spike"} == 0) xraise /cell_run_control/"Weight of spike" select_mouse {draww} SynSpike "do_spike "{num} \ UnSpike "do_unspike "{num} dummy do_dummy end if ({strcmp {widgname} "Syn rand"} == 0) xraise /cell_run_control/"Spike rate (Hz)" xraise /cell_run_control/"Spike weight" select_mouse {draww} RandSyn "do_rand "{num} \ UnRand "do_unrand "{num} dummy do_dummy end end end function set_act_dummy(widget) str widget int n float act str compt, channame, iname, num for (n = 1; n <= user_numxouts; n = n + 1) num = n compt = {getfield {cellpath}xout{num}/draw value} channame = {getfield /cell_run_control/"Syn Type" value} iname = {getfield {compt} name} @ {getfield {compt} index} act = {getfield {widget} value} if ( \ {exists {cellpath}xout{num}/draw/act{channame}{iname}/dummy} \ ) setfield \ {cellpath}xout{num}/draw/act{channame}{iname}/dummy \ z {act} end end end function remplot int nmsgs, i, n str name, num for (n = 1; n <= user_numxouts; n = n + 1) num = n nmsgs = {getmsg {cellpath}graph{num}/graph -incoming -count} for (i = 0; i < nmsgs; i = i + 1) deletemsg {cellpath}graph{num}/graph 0 \ -incoming end foreach name ({el {cellpath}xout{num}/draw/Tr#}) delete {name} end foreach name ({el {cellpath}xout{num}/draw/Inj#}) delete {name} end foreach name ({el {cellpath}/#[]/Vclamp#}) delete {name} end foreach name ({el {cellpath}xout{num}/draw/rand#}) delete {name} end // This seems to be wrong! ---dhb //delete /stimulus/axon:0 foreach name ({el {cellpath}xout{num}/draw/act#}) delete {name} end xupdate {cellpath}xout{num}/draw end if ((user_symcomps)) foreach name ({el {cellpath}/##[TYPE=symcompartment]}) setfield {name} inject 0.0 end else foreach name ({el {cellpath}/##[TYPE=compartment]}) setfield {name} inject 0.0 end end echo removed all electrophysiology probes end function update_inject(widget) str widget if (({strcmp {lastinjectsite1} "none"}) != 0) setfield {lastinjectsite1} \ inject {{getfield {widget} value}/1.0e9} echo \ "setting injection on "{lastinjectsite1}" to "{getfield {widget} value}" nA" end if (({strcmp {lastinjectsite2} "none"}) != 0) setfield {lastinjectsite2} \ inject {{getfield {widget} value}/1.0e9} echo \ "setting injection on "{lastinjectsite2}" to "{getfield {widget} value}" nA" end end function set_vclamp(widget) str widget float temp = {getfield {widget} value} str draww, iname draww = cellpath @ "xout1/draw" if (lastinjectsite1 != "none") iname = {getfield {lastinjectsite1} name} @ {getfield {lastinjectsite1} index} if ({exists {draww}/Vclamp{iname}}) temp = temp/1.0e3 /* set {draww}/Vclamp{iname}/Vclamp x {temp} */ setfield {lastinjectsite1}/Vclamp x {temp} end end draww = cellpath @ "xout2/draw" if (lastinjectsite2 != "none") iname = {getfield {lastinjectsite2} name} @ {getfield {lastinjectsite2} index} if ({exists {draww}/Vclamp{iname}}) temp = temp/1.0e3 /* set {draww}/Vclamp{iname}/Vclamp x {temp} */ setfield {lastinjectsite2}/Vclamp x {temp} end end end function runsteps echo doing {getfield /cell_run_control/nstep value} steps start_run make_output_messages resched step {getfield /cell_run_control/nstep value} finish_run clean_output_messages echo finished {getfield /cell_run_control/nstep value} steps end function set_syn_type1 setfield /cell_run_control/"Syn Type" value {user_syntype1} end function set_syn_type2 setfield /cell_run_control/"Syn Type" value {user_syntype2} end function show_xout2(widget) str widget if (({getfield {widget} state}) == 0) disable {cellpath}graph2 disable {cellpath}xout2 xhide {cellpath}xout2 xhide {cellpath}graph2 setfield {cellpath}xout1 width 600 setfield {cellpath}graph1 width 600 user_numxouts = 1 else setfield {cellpath}xout1 \ width {(user_screenwidth - 380)/2} setfield {cellpath}graph1 \ width {(user_screenwidth - 380)/2} enable {cellpath}graph2 enable {cellpath}xout2 xshowontop {cellpath}xout2 xshowontop {cellpath}graph2 user_numxouts = 2 end end function popup_file_io(widget) str widget if (({getfield {widget} state}) == 0) xhide /file_IO else xshowontop /file_IO end end function save_sim str \ file_name = ({getfield /file_IO/save_restore_file value}) @ ({getfield /file_IO/file_index value}) save {getfield /file_IO/field_path value} {file_name} end function restore_sim str \ file_name = ({getfield /file_IO/save_restore_file value}) @ ({getfield /file_IO/file_index value}) restore {file_name} end