//genesis // // $Id: control.g 1.14.1.1.2.1.1.1.1.1.1.1.1.2.2.3.1.1.1.2 Thu, 04 Apr 2002 12:35:02 +0200 hugo $ // ////////////////////////////////////////////////////////////////////////////// //' //' Purkinje tutorial //' //' (C) 1998-2002 BBF-UIA //' //' see our site at http://www.bbf.uia.ac.be/ for more information regarding //' the Purkinje cell and genesis simulation software. //' //' //' functional ideas ... Erik De Schutter, erik@bbf.uia.ac.be //' genesis coding ..... Hugo Cornelis, hugo@bbf.uia.ac.be //' //' general feedback ... Reinoud Maex, Erik De Schutter //' ////////////////////////////////////////////////////////////////////////////// // control.g : control panel functionality int include_control if ( {include_control} == 0 ) include_control = 1 include actions.g //! I define the vars first before including any scripts because else //! genesis starts complaining about syntax errors when functions in the //! scripts reference them. //v default simulation time (msec) float runtime = 500 //v target element for current injection str iClampCurrentTarget = "soma" //v current injection without pulses (nA) float iClampCurrentBase = 0.5 //v current injection with pulses (nA) float iClampCurrentOffset = 1.5 //v current injection pulse width (msec) float iClampCurrentWidth = 25 //v current injection pulse period (msec) float iClampCurrentPeriod = 50 //v boolean to enable local synchro firing int bSynchroLocal = 0 //v branch for synchro parallel fiber firing str synchroBranch = "b3s44" //v level of synchro activation, distributed float synchroDistrLevel = 1 //v level of synchro activation, local float synchroLocalLevel = 10 //v number of synchro synapses to activate int synchroSynapses = 50 //v basket synaptical strength float basketLevel = 1 // include scripts that handle settings and actions include actions.g include settings.g /// /// SH: CreateRefresh /// /// PA: path..........: path for refresh elements (ending in '/') /// fnRefresh.....: function to call at each refresh step /// /// DE: Create refresh elements /// Refresh elements use clock 10 /// function CreateRefresh(path,fnRefresh) str path str fnRefresh //- give diagnostics echo "Creating refresh elements for "{path} //- create script_out element in given path create script_out {path}refresh //- set clock for refresh element useclock ^ 10 //- set command field setfield ^ \ command {fnRefresh} end /// /// SH: PurkinjeExit /// /// DE: exit from simulation /// function PurkinjeExit //- set simulation status : none echo 0 > simulation.status //- give diagnostics echo "Exiting simulation" //- exit genesis exit end /// /// SH: PurkinjeReset /// /// DE: resets the simulation /// all compartments and graphs are reset /// function PurkinjeReset //- switch off any pending current clamp ActionIClampStop //- if current clamp is enabled if (iCurrentMode != 0) //- start current clamp with registered pulse mode ActionIClampStart {getfield \ /settings/iClamp/pulse \ state} //- else else end //- reset all //t normally all modules should receive their own reset reset end /// /// SH: PurkinjeRun /// /// DE: do a run for the amount of time steps as set in the time step dialog /// function PurkinjeRun //- force a button down click on the time dialog call /control/time B1DOWN //- retrieve time float time = {runtime} //- determine number of steps to perform int steps = time / 1000 / dt //- give an informational message echo "Running simulation for "{steps}" steps" //- do the simulation steps step {steps} -background end /// /// SH: SetOutputRate /// /// PA: rate..: new output rate /// /// DE: act after change in relative output rate /// calculates clock 9, set global outputRate /// function SetOutputRate(rate) int rate //- give a diagnostic message to the user echo "Relative output rate changed to "{rate} //- set global variable outputRate = rate //- set output clock setclock 9 {dt * outputRate} end /// /// SH: SetRunTime /// /// PA: time..: new time in msec /// /// DE: act after change in run time /// calculates clock 9, set global outputRate /// function SetRunTime(time) float time //- if given time is not negative if ( time > 0 ) //- give a diagnostic message to the user echo "Setting simulation time to "{time}" msec" //- set global variable runtime = {time} //- else else //- give diagnostics echo "You cannot reverse time" //- reset the value of the widget setfield /control/time \ value {runtime} end end /// /// SH: ClearGraphs /// /// PA: path..: top of hierarchy /// /// DE: clear graphs in el and all sub elements /// function ClearGraphs(path) str path //- clear all graphs XGraphClear({path}) end /// /// SH: ToggleAction /// /// PA: action: 1 synchronous parallel fiber /// 2 basket axon activation /// 3 climbing fiber activation /// /// DE: do a simulation action /// function ToggleAction(action) int action //- check for parallel fiber if (action == 1) //- fire parallel fibers if (bSynchroLocal) ActionParallelStart \ {bSynchroLocal} \ {synchroBranch} \ {synchroSynapses} \ {synchroLocalLevel} else ActionParallelStart \ {bSynchroLocal} \ {synchroBranch} \ {synchroSynapses} \ {synchroDistrLevel} end //- check for basket axon elif (action == 2) // give a discriptive message echo "Firing basket axon" //- fire basket axon ActionBasketStart {basketLevel} //- check for climbing fiber elif (action == 3) //- give a discriptive message echo "Firing climbing fiber" //- fire climbing fiber ActionClimbingStart {strength} //- else we have an unkown action else //- give a very discriptive message echo "Somebody has messed up the code" end end /// /// SH: ToggleMode /// /// PA: mode..: 1 change in vivo / vitro mode /// 2 change in current injection /// /// DE: toggle the simulation mode /// reflects changes in the toggle buttons /// calls UpdateToMode() to update the displayed forms /// to reflect the simulation mode /// function ToggleMode(mode) int mode //- if we have a change in vivo / vitro if (mode == 1) //- for vivo mode if (iVVMode == 1) //- give a discriptive message echo "Switching to vitro mode" //- set the control panel label setfield /control/vivoVitroToggle \ title "In vitro" //- show the no settings label xshow /control/noVitroSettings //- hide the settings button xhide /control/vivoSettings //- go to vitro mode iVVMode = 0 //- perform the switch in frequencies UpdateFrequencies //- else (for vitro mode) else //- give a discriptive message echo "Switching to vivo mode" //- set the control panel label setfield /control/vivoVitroToggle \ title "In vivo" //- hide the no settings label xhide /control/noVitroSettings //- show the settings button xshow /control/vivoSettings //- go to vivo mode iVVMode = 1 //- perform the switch in frequencies UpdateFrequencies end //- else if we have a change in current injection elif (mode == 2) //- if we are in current injection mode if (iCurrentMode == 1) //- give a discriptive message echo "Switching off current injection" //- switch off current mode iCurrentMode = 0 //- switch off pulse generator //! still interface with settings needed ActionIClampStop {getfield \ /settings/iClamp/pulse \ state} //- else (we are not in current injection mode) else //- give a discriptive message echo "Switching on current injection" //- switch on current mode iCurrentMode = 1 //- switch on pulse generator //! still interface with settings needed ActionIClampStart {getfield \ /settings/iClamp/pulse \ state} end //- else no mode is possible else //- give a very discriptive message echo "Somebody has messed up the code" end end /// /// SH: ControlRefresh /// /// DE: Refresh the control panel /// Does update for simulation time widget in the control panel /// function ControlRefresh //- set new label setfield /control/simulationTimeOutput \ title {substring {getstat -time}".000" 0 4} end /// /// SH: CurrentTimeSwitch /// /// DE: Switch simulation time display on/off /// function CurrentTimeSwitch //- if simulation time was off if ({getfield /control/simulationTime state} == 0) //- give diagnostics echo "Showing simulation time" //- enable refresh action setfield /control/refresh \ command "ControlRefresh" //- do RESET on refresh element call /control/refresh RESET //- set new state setfield /control/simulationTime \ state 1 //- else else //- give diagnostics echo "Hiding simulation time" //- set label for simulation time setfield /control/simulationTimeOutput \ title "off" //- disable refresh setfield /control/refresh \ command "" //- do RESET on refresh element call /control/refresh RESET //- set new state setfield /control/simulationTime \ state 0 end end /// /// SH: ControlPanelCreate /// /// DE: create the control panel with all buttons and dialogs /// All settings must already be created /// function ControlPanelCreate //- create form for control panel create xform /control [0, 490, 300, 340] //- make it the current element pushe /control //- create a label with a header create xlabel heading \ -label "Simulation control" //- create the reset button create xbutton reset \ -ygeom 0:heading \ -wgeom 25% \ -title "RESET" \ -script "PurkinjeReset" //- create the run button create xbutton run \ -xgeom 0:reset \ -ygeom 0:heading \ -wgeom 25% \ -title "RUN" \ -script "PurkinjeRun" //- create the stop button create xbutton stop \ -xgeom 0:run \ -ygeom 0:heading \ -wgeom 25% \ -title "STOP" \ -script "echo Stopping simulation ; stop" //- create the quit button create xbutton quit \ -xgeom 0:stop \ -ygeom 0:heading \ -wgeom 25% \ -title "QUIT" \ -script "PurkinjeExit" //- create the time dialog create xdialog time \ -value {runtime} \ -title "Time (msec) : " \ -script "SetRunTime <v>" //- create the time step dialog create xdialog outputRate \ -value {outputRate} \ -title "Output rate : " \ -script "SetOutputRate <v>" //- create label for simulation time create xlabel simulationTimeLabel \ -wgeom 70% \ -title "Simulation time (s) :" //- create label for output of simulation time create xlabel simulationTimeOutput \ -xgeom 0:last.right \ -ygeom 0:outputRate.bottom \ -wgeom 30% \ -title "0.0000" //- create a simulation mode label create xlabel mode \ -label "Simulation mode" //- create the vivo/vitro toggle create xtoggle vivoVitroToggle \ -wgeom 70% \ -title "In Vitro" \ -script "ToggleMode 1" //- create vivo settings button create xbutton vivoSettings \ -xgeom 0:last.right \ -ygeom 0:mode \ -wgeom 30% \ -title "Settings" \ -script "SettingsVivo" //- hide this button xhide vivoSettings //- create a no vitro settings label create xlabel noVitroSettings \ -xgeom 0:vivoVitroToggle \ -ygeom 2:mode \ -wgeom 30% \ -title "No settings" //- create the injection clamp toggle button create xtoggle iClamp \ -ygeom 0:vivoSettings \ -wgeom 70% \ -state {iCurrentMode} \ -title "" \ -script "ToggleMode 2" //- set on/off labels for current injection setfield iClamp \ offlabel "Current injection off" \ onlabel "Current injection on" //- create settings button create xbutton iClampSettings \ -xgeom 0:last.right \ -ygeom 0:vivoVitroToggle \ -wgeom 30% \ -title "Settings" \ -script "SettingsIClamp" //- create the parallel fiber button create xbutton parallel \ -wgeom 70% \ -title "Activate parallel fibers" \ -script "ToggleAction 1" //- create settings button create xbutton parallelSettings \ -xgeom 0:last.right \ -ygeom 0:iClamp \ -wgeom 30% \ -title "Settings" \ -script "SettingsParallel" //- create the basket fiber button create xbutton basket \ -wgeom 70% \ -title "Activate basket axon" \ -script "ToggleAction 2" //- create the settings button create xbutton basketSettings \ -xgeom 0:last.right \ -ygeom 0:parallel \ -wgeom 30% \ -title "Settings" \ -script "SettingsBasket" //- create the climbing fiber button create xbutton climbing \ -wgeom 70% \ -title "Activate climbing fiber" \ -script "ToggleAction 3" //- create settings button create xbutton climbingSettings \ -xgeom 0:last.right \ -ygeom 0:basket \ -wgeom 30% \ -title "Settings" \ -script "SettingsClimbing" //- create information label create xlabel info \ -title "Simulation information" //- create help button create xbutton help \ -ygeom 0:info.bottom \ -wgeom 50% \ -title "Help" \ -script "InfoHelp" //- create the credits button create xbutton credits \ -xgeom 0:last.right \ -ygeom 0:info.bottom \ -wgeom 50% \ -title "Credits" \ -script "InfoCredits" //- show the control panel xshow /control //- create refresh funtionality for control panel CreateRefresh /control/ ControlRefresh //- pop previous current element from stack pope end end