//genesis
//
// $Id: settings.g 1.8.2.2.1.1.1.1.1.1.3.4.1.1.1.2 Thu, 04 Apr 2002 12:46:38 +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
//'
//////////////////////////////////////////////////////////////////////////////
// settings.g : control panel settings
int include_settings
if ( {include_settings} == 0 )
include_settings = 1
include actions.g
//v normal path for xcell script
str cbXCell
///
/// SH: SettingsBasket
///
/// DE: display and handle settings for basket firing
/// synaptic strength
///
function SettingsBasket
//- give an informational message
echo "Settings for basket axon"
//- show settings form
xshow /settings/basket
end
///
/// SH: SettingsBasketHide
///
/// DE: Hide settings form for basket axon experiment
///
function SettingsBasketHide
//- give an informational message
echo "Hiding settings for basket axons"
//- show settings form
xhide /settings/basket
end
///
/// SH: SettingsBasketSetStrength
///
/// PA: value.: new strength/level for synapses
///
/// DE: Set the strength/level for basket synapses
///
function SettingsBasketSetStrength(value)
float value
//- give an informational message
echo "Setting strength for basket synapses to "{value}
//- set global variable
basketLevel = {value}
end
///
/// SH: SettingsBasketCreate
///
/// PA: path..: path of parent to contain the form
///
/// DE: create the form for the settings for basket axon firing
///
function SettingsBasketCreate(path)
str path
//- give an informational message
echo "Creating form for basket axons"
//- retreive registered values for geometry
int xgeom = {getfield /settings/globals xgeom}
int ygeom = {getfield /settings/globals ygeom}
int wgeom = {getfield /settings/globals wgeom}
int hgeom = {getfield /settings/globals hgeom}
//- create form
create xform {path}basket [{xgeom},{ygeom},350,95]
//- make it the current element
pushe {path}basket
//- create title label
create xlabel heading \
-label "Basket axon settings"
//- create dialog for synaptic strength
create xdialog strength \
-value {basketLevel} \
-title "Relative synaptic strength" \
-script "SettingsBasketSetStrength <v>"
//- create a button for closing the window
create xbutton close \
-title "Done" \
-script "SettingsBasketHide"
//- go to previous current element
pope
end
///
/// SH: SettingsClimbing
///
/// DE: display and handle settings for climbing fiber firing
/// delay parameter
/// synaptic strength
///
function SettingsClimbing
//- give an informational message
echo "Settings for climbing fiber"
//- show settings form
xshow /settings/climbing
end
///
/// SH: SettingsClimbingHide
///
/// DE: Hide settings form for climbing fiber experiment
///
function SettingsClimbingHide
//- give an informational message
echo "Hiding settings for climbing fiber"
//- show settings form
xhide /settings/climbing
end
///
/// SH: SettingsClimbingSetDelay
///
/// PA: value.: new delay between synapses (in msec)
///
/// DE: Set the delay between consecutive synapses for climbing fiber volley
///
function SettingsClimbingSetDelay(value)
float value
//- give an informational message
echo "Setting delay between climbing fiber synapses to "{value}" msec"
//- set global variable
delay = {value * 1.0e-3}
end
///
/// SH: SettingsClimbingSetStrength
///
/// PA: value.: new strength for synapses
///
/// DE: Set the strength for climbing fiber synapses
///
function SettingsClimbingSetStrength(value)
float value
//- give an informational message
echo "Setting strength for climbing fiber synapses to "{value}
//- set global variable
strength = {value}
end
///
/// SH: SettingsClimbingCreate
///
/// PA: path..: path of parent to contain the form
///
/// DE: create the form for the settings for climbing fiber firing
///
function SettingsClimbingCreate(path)
str path
//- give an informational message
echo "Creating form for climbing fiber"
//- retreive registered values for geometry
int xgeom = {getfield /settings/globals xgeom}
int ygeom = {getfield /settings/globals ygeom}
int wgeom = {getfield /settings/globals wgeom}
int hgeom = {getfield /settings/globals hgeom}
//- create form
create xform {path}climbing [{xgeom},{ygeom},350,120]
//- make it the current element
pushe {path}climbing
//- create title label
create xlabel heading \
-label "Climbing fiber settings"
//- create dialog for delay between synapses
create xdialog delay \
-value {delay * 1000} \
-title "Delay between synapses (msec) : " \
-script "SettingsClimbingSetDelay <v>"
//- create dialog for synaptic strength
create xdialog strength \
-value {strength} \
-title "Relative synaptic strength" \
-script "SettingsClimbingSetStrength <v>"
//- create a button for closing the window
create xbutton close \
-title "Done" \
-script "SettingsClimbingHide"
//- go to previous current element
pope
end
///
/// SH: SettingsIClamp
///
/// DE: display and handle settings for current clamp
///
function SettingsIClamp
//- give an informational message
echo "Settings for current clamp experiment"
//- show the form for current clamping
//! this still uses a hard coded path
xshow /settings/iClamp
end
///
/// SH: SettingsIClampSetGenerator
///
/// DE: Set the generator settings to respect the global variables
/// vars : {iClampCurrentBase}
/// {iClampCurrentOffset}
/// {iClampCurrentWidth}
/// {iClampCurrentPeriod}
///
/// NO: This function has become obsolete, it has been recoded in actions.g .
///
// function SettingsIClampSetGenerator
// //- set fields of generator
// setfield /settings/iClamp/current \
// level1 {{iClampCurrentBase + iClampCurrentOffset} * 1.0e-9} \
// baselevel {iClampCurrentBase * 1.0e-9} \
// width1 {iClampCurrentWidth * 1.0e-3} \
// delay2 {iClampCurrentPeriod * 1.0e-3} \
// ctecurrent {iClampCurrentBase * 1.0e-9} \
// delay1 0 \
// level2 0 \
// width2 0 \
// trig_mode 0
// end
///
/// SH: SettingsIClampCreateGenerator
///
/// PA: path..: path of parent to contain the object
///
/// DE: create the pulse generator for current injection experiments
/// A message to the soma of the cell is created, so the solver
/// must not yet be set up.
///
/// NO: This function has become obsolete, it has been recoded in actions.g .
///
// function SettingsIClampCreateGenerator(path)
// str path
// //- go to the given element
// pushe {path}
// //- create the pulsegen object
// create pulsegen current
// //- set fields for pulse generator
// setfield ^ \
// level1 2.0e-9 \
// width1 30 \
// delay1 0 \
// level2 0 \
// width2 0 \
// delay2 0 \
// baselevel 0 \
// trig_mode 0
// //- add a field for a constant current
// addfield ^ ctecurrent \
// -description "Constant current"
// //- set this field to something sensefull
// setfield ^ ctecurrent 2.0e-9
// //- create a disabled compartment for messaging the solver
// create compartment messenger
// //- add a message from the messenger to the soma of the cell
// addmsg messenger {cellpath}/soma INJECT inject
// //- set the fields for current clamp to registered globals
// //SettingsIClampSetGenerator
// ActionIClampSetGenerator /actions/iClamp/
// //- go to previous current element
// pope
// end
///
/// SH: SettingsIClampHide
///
/// DE: hide the IClamp settings window
///
function SettingsIClampHide
//- hide the window
//! this uses still a hard coded path
xhide /settings/iClamp
end
///
/// SH: SettingsIClampSetCurrent
///
/// PA: level.: value in nA for current
///
/// DE: set the current for the pulse generator and for cte current
///
function SettingsIClampSetCurrent(level)
float level
if (level <= 10)
//- give diagnostics
echo "Setting base current to "{level}" nA"
//- set global variable
iClampCurrentBase = {level}
//- set the fields for current clamp to registered globals
ActionIClampSetGenerator /actions/iClamp/
else
//- give diagnostics
echo "Base current above 10 nA not allowed."
//- reset dialog
setfield /settings/iClamp/level \
value {iClampCurrentBase}
end
end
///
/// SH: SettingsIClampSetOffset
///
/// PA: offset: value in nA for pulse offset
///
/// DE: set offset for current pulses
///
function SettingsIClampSetOffset(offset)
float period
if (offset <= 10)
//- give diagnostics
echo "Setting pulse offset to "{offset}" nA"
//- set global variable
iClampCurrentOffset = {offset}
//- set the fields for current clamp to registered globals
ActionIClampSetGenerator /actions/iClamp/
else
//- give diagnostics
echo "Pulse Amplitude above 10 nA not allowed."
//- reset dialog
setfield /settings/iClamp/offset \
value {iClampCurrentOffset}
end
end
///
/// SH: SettingsIClampSetPeriod
///
/// PA: period: value in msec for period
///
/// DE: set period for current pulses
///
function SettingsIClampSetPeriod(period)
float period
//- give diagnostics
echo "Setting pulse period to "{period}" msec"
//- if the period is smaller than the width
if (iClampCurrentWidth <= period)
//- set global variable
iClampCurrentPeriod = {period}
//- set the fields for current clamp to registered globals
ActionIClampSetGenerator /actions/iClamp/
//- else period is greater than width
else
//- notice the user
echo "Period must be greater than width"
end
end
///
/// SH: SettingsIClampSetTarget
///
/// PA: width.: value in msec for width of pulses
///
/// DE: set width for width of pulses
///
function SettingsIClampSetTarget(target)
str target
//- give diagnostics
echo "Setting current clamp target to compartment" \
{cellpath}"/"{target}
//- if exists
if ( {exists {{cellpath} @ "/" @ {target}}} )
//- set global variable
iClampCurrentTarget = {target}
//- set the fields for current clamp to registered globals
ActionIClampSetGenerator /actions/iClamp/
//- else
else
//- notice the user
echo "Compartment not found"
end
end
///
/// SH: SettingsIClampSetWidth
///
/// PA: width.: value in msec for width of pulses
///
/// DE: set width for width of pulses
///
function SettingsIClampSetWidth(width)
float width
//- give diagnostics
echo "Setting pulse width to "{width}" msec"
//- if the period is smaller than the width
if (width <= iClampCurrentPeriod)
//- set global variable
iClampCurrentWidth = {width}
//- set the fields for current clamp to registered globals
ActionIClampSetGenerator /actions/iClamp/
//- else period is greater than width
else
//- notice the user
echo "Period must be greater than width"
end
end
///
/// SH: SettingsIClampSwitch
///
/// DE: Enable/disable current clamp according to {iCurrentMode}
/// Enabling the current clamp mode means adding a message from the pulse
/// generator to the soma of the Purkinje cell. A look is made to the
/// state of the toggle button to make difference between constant current
/// and current pulses
///
/// NO: This function has become obsolete, current switching is now done in
/// in actions.g .
///
function SettingsIClampSwitch
//- if current clamp is enabled
if (iCurrentMode != 0)
//- if pulse train toggle button is clicked
if ( {getfield /settings/iClamp/pulse state} == 1)
//- give some info
echo "Switching to current pulses"
//- add message from generator to soma
//- for current pulses
addmsg /settings/iClamp/current \
/settings/iClamp/messenger \
INJECT output
//- else
else
//- give some info
echo "Switching to constant current"
//- from generator to soma for constant current
addmsg /settings/iClamp/current \
/settings/iClamp/messenger \
INJECT ctecurrent
end
//- reset the pulse generator
call /settings/iClamp/current RESET
//- else current clamp is disabled
else
//- give some info
echo "Switching off current injection"
//- delete outgoing message from the pulse generator
deletemsg /settings/iClamp/current 0 -outgoing
//- clear the inject field of the messenger object
setfield /settings/iClamp/messenger \
inject 0
end
end
///
/// SH: SettingsIClampToggleMode
///
/// DE: toggle pulse mode for the current injection
/// If the current mode is not active (iCurrentMode is zero),
/// nothing is done
///
function SettingsIClampToggleMode
//- get state of toggle button
int state = {getfield /settings/iClamp/pulse state}
//- check if current mode is enabled
if ( {iCurrentMode} != 0)
//- stop current mode
ActionIClampStop
//- start new current with appropriate state
ActionIClampStart {state}
end
//- check state of toggle button
if ( {state} == 1)
//- hide the offset, width and period labels
xhide /settings/iClamp/nooffset
xhide /settings/iClamp/nowidth
xhide /settings/iClamp/noperiod
//- show the offset, width and period dialogs
xshow /settings/iClamp/offset
xshow /settings/iClamp/width
xshow /settings/iClamp/period
else
//- hide the offset, width and period dialogs
xhide /settings/iClamp/offset
xhide /settings/iClamp/width
xhide /settings/iClamp/period
//- show the offset, width and period labels
xshow /settings/iClamp/nooffset
xshow /settings/iClamp/nowidth
xshow /settings/iClamp/noperiod
end
end
///
/// SH: SettingsIClampCreate
///
/// PA: path..: path of parent to contain the form (ending in /)
///
/// DE: create the form for the settings for current clamp
/// create the pulse generator for current clamp
///
function SettingsIClampCreate(path)
str path
//- give an informational message
echo "Creating form for current clamping"
//- retreive registered values for geometry
int xgeom = {getfield /settings/globals xgeom}
int ygeom = {getfield /settings/globals ygeom}
int wgeom = {getfield /settings/globals wgeom}
int hgeom = {getfield /settings/globals hgeom}
//- create form
create xform {path}iClamp [{xgeom},{ygeom},{wgeom},{hgeom}]
//- make it the current element
pushe {path}iClamp
//- create title label
create xlabel heading \
-label "Current clamp settings"
//- create dialog for current injection
create xdialog level \
-value {iClampCurrentBase} \
-title "Level (nA) : " \
-script "SettingsIClampSetCurrent <v>"
// // create dialog for target element
// create xdialog target \
// -value {iClampCurrentTarget} \
// -title "Target comp : " \
// -script "SettingsIClampSetTarget <v>"
//- create toggle button for pulse or constant
create xtoggle pulse \
-title ""
//- set fields for on/off state
setfield pulse \
onlabel "Current pulses" \
offlabel "Constant current"
//- set script for toggle button
setfield pulse \
script "SettingsIClampToggleMode"
//- create dialog for pulse offset
create xdialog offset \
-value {iClampCurrentOffset} \
-title "Pulse amplitude (nA) : " \
-script "SettingsIClampSetOffset <v> "
//- create dialog for pulse width
create xdialog width \
-value {iClampCurrentWidth} \
-title "Pulse width (msec) : " \
-script "SettingsIClampSetWidth <v>"
//- create dialog for period between pulses
create xdialog period \
-value {iClampCurrentPeriod} \
-title "Pulse period (msec) : " \
-script "SettingsIClampSetPeriod <v>"
//- create a button for closing the window
create xbutton close \
-title "Done" \
-script "SettingsIClampHide"
//- create a label for no offset
create xlabel nooffset \
-ygeom 3:pulse \
-title "Amplitude not available"
//- hide the offset dialog
xhide offset
//- create a label for no width
create xlabel nowidth \
-ygeom 3:offset \
-title "Width not available"
//- hide the width dialog
xhide width
//- create label for no period
create xlabel noperiod \
-ygeom 3:width \
-title "Period not available"
//- hide the period dialog
xhide period
//- pop previous current element
pope
end
///
/// SH: SettingsParallel
///
/// DE: display and handle settings for parallel synchro firing
/// handles localization within xcell
/// handles settings for uniform distribution
/// handles amplitude (strength of synapses)
///
function SettingsParallel
//- give an informational message
echo "Settings for synchronous parallel fiber firing"
//- show the form for current clamping
//! this still uses a hard coded path
xshow /settings/parallel
end
///
/// SH: SettingsParallelHide
///
/// DE: hide the parallel settings window
///
function SettingsParallelHide
//- hide the window
//! this uses still a hard coded path
xhide /settings/parallel
end
///
/// SH: SettingsParallelLocalSet
///
/// PA: branch: dendrite clicked on within xcell
///
/// DE: Set local dendrites for synchronous firing
/// Resets script field for xcell widget
///
function SettingsParallelLocalSet(branch)
//- default we give a popup
int bPopup = 1
//- reset field for xcell script
setfield /xcell/draw/xcell1 \
script {cbXCell}
//- isolate tail from clicked membrane
str branchTail = {getpath {branch} -tail}
//- find opening brace for array
int openBrace = {findchar {branchTail} "["}
//- if the argument is from an array
if (openBrace != -1)
//- cut off the index and set global variable
str branchNoIndex = {substring {branchTail} 0 {openBrace - 1}}
//- if the branch has an associated mapping
if ({exists /mappings/{branchNoIndex}})
//- set synchro global
synchroBranch = {branchNoIndex}
//- update the label field
setfield /settings/parallel/labelArea \
label "Branch : "{synchroBranch}
//- we should not give a popup
bPopup = 0
//- give diagnostics
echo \
"Synchronous parallel fiber set to" \
{synchroBranch}
end
end
//- if we should give a popup
if (bPopup)
//- show the popup
xshow /settings/localFailed
//- else the action completed
else
//- hide the local set action window
xhide /settings/localSet
end
end
///
/// SH: SettingsParallelLocalChoose
///
/// DE: Initiate choose branch for local synchronous firing
/// This function messes with the xcell call back script
///
function SettingsParallelLocalChoose
//- store field for xcell script
cbXCell = {getfield /xcell/draw/xcell1 script}
//- set field for xcell script
setfield /xcell/draw/xcell1 \
script "SettingsParallelLocalSet <v>"
//- show the local set action window
//! this still uses a hard coded path
xshow /settings/localSet
end
///
/// SH: SettingsParallelLocalCancel
///
/// DE: Cancel an choose area for local activation
///
function SettingsParallelLocalCancel
//- hide the local set action window
//! this still uses a hard coded path
xhide /settings/localSet
//- restore field for xcell script
setfield /xcell/draw/xcell1 \
script {cbXCell}
end
///
/// SH: SettingsParallelLocalFail
///
/// DE: Hide the popup and action window for parallel activation
///
function SettingsParallelLocalFail
//- hide the popup
//! this still uses a hard coded path
xhide /settings/localFailed
//- hide the local set action window
//! this still uses a hard coded path
xhide /settings/localSet
end
///
/// SH: SettingsParallelSetLevel
///
/// PA: level.: new level for synchro activation
///
/// DE: Set the level for synchronous parallel activation
///
function SettingsParallelSetLevel(level)
float level
//- if setting local activation
if (bSynchroLocal)
//- give descriptive message
echo "Setting local parallel fiber activation level to "{level}
//- set new activation level
synchroLocalLevel = {level}
//- else setting distributed activation
else
//- give descriptive message
echo "Setting distributed parallel fiber activation level to "{level}
//- set new activation level
synchroDistrLevel = {level}
end
end
///
/// SH: SettingsParallelUpdateLevel
///
/// DE: Update parallel activation level according to mode of synchro firing
///
function SettingsParallelUpdateLevel
//- if we are in local parallel fiber mode
if (bSynchroLocal)
//- set value to local activation strength
setfield /settings/parallel/level \
value {synchroLocalLevel}
//- else distributed firing
else
//- set value to distributed activation strength
setfield /settings/parallel/level \
value {synchroDistrLevel}
end
end
///
/// SH: SettingsParallelUpdateWindow
///
/// DE: Update the settings window after a change in distributed / local mode
///
function SettingsParallelUpdateWindow
//- if local mode is active
if (bSynchroLocal)
//- hide the number dialog
xhide /settings/parallel/number
//- show the cte number label
xshow /settings/parallel/ctenumber
//- set label of distributed / local
setfield /settings/parallel/labelLocalDistr \
label "Local"
//- else distributed mode is active
else
//- show the number dialog
xshow /settings/parallel/number
//- hide the cte number label
xhide /settings/parallel/ctenumber
//- set label of distributed / local
setfield /settings/parallel/labelLocalDistr \
label "Distributed"
end
//- update parallel activation strength
SettingsParallelUpdateLevel
end
///
/// SH: SettingsParallelToggleMode
///
/// DE: Toggle the mode for parallel fiber synchro firing
///
function SettingsParallelToggleMode
//- if local mode is active
if (bSynchroLocal)
//- give descriptive message
echo "Setting parallel fiber mode to distributed firing"
//- switch to distributed mode
bSynchroLocal = 0
else
//- give descriptive message
echo "Setting parallel fiber mode to local firing"
//- switch to local mode
bSynchroLocal = 1
end
//- update the settings window
SettingsParallelUpdateWindow
end
///
/// SH: SettingsParallelSetSynapses
///
/// PA: number: number of synapses to activate
///
/// DE: Set the number of synapses for synchronous parallel activation
///
function SettingsParallelSetSynapses(number)
int level
//- give descriptive message
echo "Setting number of synchronous parallel fibers to "{number}
//- set new activation level
synchroSynapses = {number}
end
///
/// SH: SettingsParallelCreate
///
/// PA: path..: path of parent to contain the form
///
/// DE: create the form for the settings for synchro parallel fiber firing
///
function SettingsParallelCreate(path)
str path
//- give an informational message
echo "Creating form for parallel fiber settings"
//- retreive registered values for geometry
int xgeom = {getfield /settings/globals xgeom}
int ygeom = {getfield /settings/globals ygeom}
int wgeom = {getfield /settings/globals wgeom}
int hgeom = {getfield /settings/globals hgeom}
//- create form
create xform {path}parallel [{xgeom},{ygeom},350,170]
//- make it the current element
pushe {path}parallel
//- create title label
create xlabel heading \
-label "Synchronous parallel fiber firing settings"
//- create dialog for distributed synaptic activation
create xdialog number \
-title "Number of synapses : " \
-value {synchroSynapses} \
-script "SettingsParallelSetSynapses <v>"
//- create label for local synaptic activation
create xlabel ctenumber \
-ygeom 3:heading \
-title "Number of synapses is set to 20"
//- hide the label
xhide ctenumber
//- create dialog for synaptic activation strength
//! value will be updated later on
create xdialog level \
-ygeom 0:number \
-title "Relative synaptic strength : " \
-script "SettingsParallelSetLevel <v>"
//- create button for local/distribute firing
create xbutton localDistr \
-wgeom 60% \
-title "Toggle distributed/local" \
-script "SettingsParallelToggleMode"
//! the label field in follwing widget is not relevant,
//! it will be updated later on
//- create label to indicate current state of firing
create xlabel labelLocalDistr \
-xgeom 0:localDistr \
-ygeom 1:level \
-wgeom 40% \
-title "Distributed"
//- create button to user choose an area in the xcell
create xbutton chooseArea \
-ygeom 0:localDistr \
-wgeom 60% \
-title "Change area from xcell" \
-script "SettingsParallelLocalChoose"
//- create a label to show the local branch
create xlabel labelArea \
-xgeom 0:chooseArea \
-ygeom 1:localDistr \
-wgeom 40% \
-title "Branch : "{synchroBranch}
//- create a button for closing the window
create xbutton close \
-ygeom 0:chooseArea \
-title "Done" \
-script "SettingsParallelHide"
//- update the status of the local / distr label
SettingsParallelUpdateWindow
//- pop previous current element
pope
//- create form for when local set is active
create xform {path}localSet [500,250,350,110]
//- make it the current element
pushe {path}localSet
//- create title label
create xlabel heading1 \
-label "Click on Purkinje cell dendrite "
create xlabel heading2 \
-label "to select next activation site"
create xlabel heading3 \
-label "for local parallel fiber input"
//- create a button to cancel the action
create xbutton cancel \
-title "Cancel" \
-script "SettingsParallelLocalCancel"
//- pop previous current element
pope
//- create form for when local set failed
create xform {path}localFailed [100,250,350,90]
//- make it the current element
pushe {path}localFailed
//- create title label
create xlabel heading \
-label "This branch does not contain enough synapses"
//- create label with question
create xlabel question \
-label "Do you want to choose another branch ?"
// following code would read better with the '@' operator but
// that does not work very well
// perhaps if surrounded with '{', '}' ?
//- create 'Yes' button
create xbutton yes \
-wgeom 50% \
-title "Yes" \
-script "SettingsParallelLocalFail;SettingsParallelLocalChoose"
//- create 'No' button
create xbutton no \
-xgeom 0:yes \
-ygeom 0:question \
-wgeom 50% \
-title "No" \
-script "SettingsParallelLocalFail"
//- pop previous current element
pope
end
///
/// SH: SettingsVivo
///
/// DE: display and handle settings for vivo mode
/// is dependent on vivo / vitro mode as registered in /mode element
/// vitro :
/// no parameters
/// vivo :
/// firing rate in Hz for parallel fibers
/// firing rate in Hz for basket cells
///
function SettingsVivo
//- give an informational message
echo "Settings for vivo simulation"
//- show the form for current clamping
//! this still uses a hard coded path
xshow /settings/vivoVitro
end
///
/// SH: SettingsVivoHide
///
/// DE: hide the vivo settings window
///
function SettingsVivoHide
//- hide the window
//! this uses still a hard coded path
xhide /settings/vivoVitro
end
///
/// SH: UpdateFrequencies
///
/// DE: update the frequencies for parallel fibers and stellate axons
/// The new frequencies depend on the global {iVVMode} for setting
/// or deleting the frequencies and the globals {phertz} and {ihertz}
///
/// NO: This function uses hsolve's HSAVE / HRESTORE actions to update
/// the internals of hsolve. This means that fields of all compartments
/// and concentrations should be consistent between
/// hsolve - normal elements.
///
function UpdateFrequencies
//- give diagnostics
if (iVVMode == 0)
echo "New firing frequencies are "
echo " parallel fibers : "{0}
echo " stellate cells : "{0}
else
echo "New firing frequencies are "
echo " parallel fibers : "{phertz}
echo " stellate cells : "{ihertz}
end
echo "Updating synaptic firing frequencies..." -n
//- show message to user
xshow /settings/updateFrequencies
//- update the update freq form
xupdate /settings/updateFrequencies
//- synchronize X events
xflushevents
echo "..." -n
//- put the state of the solve element into the originals
call {cellpath}/solve HSAVE
//- loop over all channels that should be adjusted
str element
foreach element ( {el {cellpath}/##[][TYPE=synchan]} )
//- for vitro mode
if (iVVMode == 0)
//- set element frequency to zero
setfield {element} frequency 0
//- for vivo mode
else
//- for excitatory synaptic channel
if ( {getfield {element} synmode} == "ex")
//- change frequency for vivo mode
setfield {element} frequency {phertz}
//- for inhibitory synaptic channel
elif ( {getfield {element} synmode} == "in")
//- change frequency for vivo mode
setfield {element} frequency {ihertz}
end
end
end
//- update the solve object
call {cellpath}/solve HRESTORE
//- hide the message to the user (if it has ever been shown)
xhide /settings/updateFrequencies
//- update the update freq form
xupdate /settings/updateFrequencies
//- synchronize X events
xflushevents
echo "..." -n
//- give diagnostics
echo "done"
end
///
/// SH: SettingsVivoPfFrequencies
///
/// PA: paraHz: new parallel firing frequency
///
/// DE: set the average firing frequency in Hz for asynchronous parallel
/// firing
/// sets the globals {phertz} and calls UpdateFrequencies
///
function SettingsVivoPfFrequencies(paraHz)
float paraHz
//- set phertz variable
phertz = {paraHz}
//- update the firing frequencies
UpdateFrequencies
end
///
/// SH: SettingsVivoScFrequencies
///
/// PA: stelHz: new stellate firing frequency
///
/// DE: sets global {ihertz} and calls UpdateFrequencies
///
function SettingsVivoScFrequencies(stelHz)
float stelHz
//- set ihertz variable
ihertz = {stelHz}
//- update the firing frequencies
UpdateFrequencies
end
///
/// SH: SettingsVivoCreate
///
/// PA: path..: path of parent to contain the form
///
/// DE: create the form for the settings for vivo mode.
/// Create the form for update frequencies message.
///
function SettingsVivoCreate(path)
str path
//- give an informational message
echo "Creating form for vivo settings"
//- retreive registered values for geometry
int xgeom = {getfield /settings/globals xgeom}
int ygeom = {getfield /settings/globals ygeom}
int wgeom = {getfield /settings/globals wgeom}
int hgeom = {getfield /settings/globals hgeom}
//- set values for geometry
wgeom = 300
hgeom = 120
//- create form
create xform {path}vivoVitro [{xgeom},{ygeom},{wgeom},{hgeom}]
//- make it the current element
pushe {path}vivoVitro
//- create title label
create xlabel heading \
-label " In vivo settings"
//- create dialog for parallel fiber firing rate
create xdialog parallel \
-value {phertz} \
-title "Parallel fiber rate (Hz) : " \
-script "SettingsVivoPfFrequencies <v> "
//- create dialog for stellate cell firing rate
create xdialog stellate \
-value {ihertz} \
-title "Stellate cell rate (Hz) : " \
-script "SettingsVivoScFrequencies <v>"
create xbutton close \
-title "Done" \
-script "SettingsVivoHide"
//- pop previous current element
pope
//- create update frequencies form
create xform {path}updateFrequencies [150,180,200,60]
//- make it the current element
pushe {path}updateFrequencies
//- create title label
create xlabel heading \
-label "Reconfiguring setup"
//- create additional message
create xlabel message \
-label "Please wait..."
//- pop previous current element
pope
end
///
/// SH: SettingsCreate
///
/// DE: create all settings forms but keep them hidden
/// creates a neutral element named globals that has fields for all
/// settings forms
///
function SettingsCreate
//- give an informational message
echo "Creating all setting forms"
//- create a parent for all setting forms
create neutral /settings
//- create globals element
create neutral /settings/globals
//- add fields for positions
addfield ^ xgeom
addfield ^ ygeom
addfield ^ wgeom
addfield ^ hgeom
//- give some reasonable defaults for positions
setfield ^ \
xgeom 500 \
ygeom 430 \
wgeom 250 \
hgeom 210
// hgeom 240
//- create the form for the basket axon firing settings
SettingsBasketCreate /settings/
//- create the form for the climbing fiber firing settings
SettingsClimbingCreate /settings/
//- create the form for current clamping
SettingsIClampCreate /settings/
//- create the form for parallel fiber firing settings
SettingsParallelCreate /settings/
//- create the form for vivo settings
SettingsVivoCreate /settings/
end
end
|