/*======================================================================
A GENESIS GUI for providing inputs to an auditory cortex model
======================================================================*/
//===============================
// Function Definitions
//===============================
// Display the parameters for the specified input
function show_params(input_num)
str control_form = "/input_control"
int input_num, row_num
setfield {control_form}/input_num value {input_num}
float frequency, delay, width, interval
str pulse_src = {input_source} @ "[" @ {input_num} @ "]" @ "/spikepulse"
str spike_out = {input_source} @ "[" @ {input_num} @ "]" @ "/soma/spike"
// this assumes set_pulse_params has been called so that abs_refract != 0
row_num = {getfield {{input_source} @ "[" @ {input_num} @ "]"} input_row}
setfield {control_form}/targ_row value {row_num}
frequency = {getfield {{input_source} @ "[" @ {input_num} @ "]"} input_freq}
setfield {control_form}/spikefreq value {frequency}
delay = {getfield {pulse_src} delay1 }
float width = {getfield {pulse_src} width1}
interval = {getfield {pulse_src} delay1} \
+ {getfield {pulse_src} delay2}
setfield {control_form}/pulse_delay value {delay}
setfield {control_form}/pulse_width value {width}
setfield {control_form}/interval value {interval}
// Set the spiketoggle state
int toggle_state = 0
if ({getfield {pulse_src} level1} > 0.5)
toggle_state = 1
end
setfield {control_form}/spiketoggle state {toggle_state}
// set the Spike train weight dialog from the output_weight field
setfield {control_form}/st_weight value \
{getfield {{input_source} @ "[" @ {input_num} @ "]"} output_weight }
// This is an ugly hack to make sure that the main form gets input_num
// It assumes that there is an xdialog control/show_params
setfield /control/show_params value {input_num}
xshow {control_form}
end
function decr_input_num
str form = "/input_control"
int input_num
input_num = {getfield {form}/input_num value}
if ({input_num} > 1)
input_num = input_num - 1
end
show_params {input_num}
end
function incr_input_num
str form = "/input_control"
int input_num
input_num = {getfield {form}/input_num value}
if ({input_num} < {Ninputs})
input_num = input_num + 1
end
show_params {input_num}
end
function set_spike_pulse
str form = "/input_control"
int input_num
input_num = {getfield {form}/input_num value}
float frequency, delay, width, interval
frequency = {getfield {form}/spikefreq value}
delay = {getfield {form}/pulse_delay value}
width = {getfield {form}/pulse_width value}
interval = {getfield {form}/interval value}
set_pulse_params {input_num} {frequency} {delay} {width} {interval}
echo "Spike frequency = "{frequency}
echo "Pulse delay = "{getfield {form}/pulse_delay value}" sec"
echo "Pulse width = "{getfield {form}/pulse_width value}" sec"
echo "Pulse interval = "{getfield {form}/interval value}" sec"
end
function spike_toggle // toggles spike train ON/OFF for given input
str form = "/input_control"
int input_num
input_num = {getfield {form}/input_num value}
if ({getfield {form}/spiketoggle state} == 1)
setfield {input_source}[{input_num}]/spikepulse level1 1.0 // ON
else
setfield {input_source}[{input_num}]/spikepulse level1 0.0 // OFF
end
end
function set_input_weight
str form = "/input_control"
int input_num
input_num = {getfield {form}/input_num value}
float weight
weight = {getfield {form}/st_weight value}
set_spiketrain_weight {input_num} {weight}
end
function set_input_delays_from_GUI
str form = "/input_control"
// Set the global values from the values in the form
input_delay = {getfield {form}/input_delay value}
input_jitter = {getfield {form}/input_jitter value}
// check range of jitter value
if ((input_jitter < 0.0) || (input_jitter > 1.0))
echo "jitter must be >= 0, and <= 1.0"
input_jitter = 0.0
setfield {form}/input_jitter value {input_jitter}
end
set_input_delays {input_delay} {input_jitter}
end
//==========================================================
// Functions to create the Graphical User Interface
//==========================================================
function make_input_control
int control_height = 520
create xform /input_control [0,{35 + control_height},270,345]
pushe /input_control
create xlabel spikeparms -label "Parameters for inputs 1 - "{Ninputs}
create xbutton less -label " < " -wgeom 20% -script decr_input_num
create xdialog input_num -xgeom 0:less -ygeom 0:spikeparms -wgeom 60% \
-label "Input:" -value 1 -script "show_params <v>"
create xbutton more -label " > " -wgeom 20% -xgeom 0:input_num \
-ygeom 0:spikeparms -script incr_input_num
create xtoggle spiketoggle -label "" -script spike_toggle
setfield spiketoggle offlabel "Spike Train OFF" state 0
setfield spiketoggle onlabel "Spike Train ON"
spike_toggle // initialize
create xdialog targ_row -label "Target Row" -value 0
create xdialog st_weight -label "Spike train weight" \
-value 1.0 -script "set_input_weight"
create xdialog spikefreq -label "Input freq" -value {spikefreq} \
-script "set_spike_pulse"
create xdialog pulse_delay -label "Delay (sec)" \
-value {pulse_delay} -script "set_spike_pulse"
create xdialog pulse_width -label "Width (sec)" \
-value {pulse_width} -script "set_spike_pulse"
create xdialog interval -label "Interval (sec)" -value {pulse_interval} \
-script "set_spike_pulse"
// The delay and jitter are set globally for all MGBv connections
create xdialog input_delay -label "Input delay" -value {input_delay} \
-script "set_input_delays_from_GUI"
create xdialog input_jitter -label "Input jitter" -value {input_jitter} \
-script "set_input_delays_from_GUI"
create xbutton DISMISS -script "xhide /input_control"
pope
// Initialize values for input 1
show_params 1
xshow /input_control
end
function make_MGBv_Vmgraph
str form = "/MGBv_Vm"
float vmin = -0.075
float vmax = 0.125
create xform {form} [1048,0,400,250]
create xgraph {form}/voltage -hgeom 100% \
-title "MGBv_cell Membrane Potential" -bg white
setfield ^ XUnits sec YUnits V
setfield ^ xmax {tmax} ymin {vmin} ymax {vmax}
makegraphscale {form}/voltage
xshow {form}
end
|