//genesis // // $Id: xcell.g 1.1.1.6.1.5.2.6.1.1.2.1.2.2.1.2 Thu, 04 Apr 2002 12:35:02 +0200 hugo $ // ////////////////////////////////////////////////////////////////////////////// //' //' LDS 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 //' ////////////////////////////////////////////////////////////////////////////// // xcell.g : xcell functionality //v bool to indicate first toggle for tabchannel has been created int bButtonsCreated = 0 //v bool for communication between XCellAddElectrode and XCellCBAddPlot int bXCellAddElectrodeResult = 0 //v basename for library file of all channels str strXCLibrary = "XCLib" /// /// SH: XCellElectrodeName /// /// PA: path..: path to the clicked compartment /// /// RE: name for electrode /// /// DE: Associate an electrode name with {path} for registered xcell parameters /// The electrode name will have a fairly descriptive name (ie from the /// electrode name you can make out which field from which compartment is /// recorded. /// function XCellElectrodeName(path) str path //- get the registered LDS output source str xcOutputSource = {getfield /LDS outputSource} //- get the registered LDS output value str xcOutputValue = {getfield /LDS outputValue} //- get the registered LDS output flags int xcOutputFlags = 1 // {getfield /LDS outputFlags} //- get the electrode name str electrode = {XGraphPlotTitle \ {path} \ {xcOutputSource} \ {xcOutputValue} \ {xcOutputFlags}} //- return electrode name return {electrode} end /// /// SH: XCellAddElectrode /// /// PA: path..: path to the clicked compartment /// name..: name for electrode /// color.: color for the electrode /// /// RE: 1 if successfull /// 0 if failed (the electrode already exists) /// /// DE: Associate an electrode with {path} for registered xcell parameters /// /// Electrode prototype is /electrodes/draw/proto {xshape} /// /// The electrode is created within /// /electrodes/draw/{name}.......: always /// /LDS/draw/{name}............: when electrodes visible /// in xcell display /// function XCellAddElectrode(path,name,color) str path str name int color //- set default result int bResult = 0 //- give diagnostics echo "Adding electrode for "{name} //- copy the prototype electrode copy /electrodes/draw/proto /electrodes/draw/{name} //- set field for identification and color setfield ^ \ ident "record" \ pixcolor {color} //- set the translation of the electrode setfield ^ \ tx {getfield {path} x} \ ty {getfield {path} y} \ tz {getfield {path} z} //- if the electrodes toggle is set if ( {getfield /LDS/electrodes state} ) //- copy the electrode to the xcell window copy ^ /LDS/draw/{name} end //- set success bResult = 1 //- set the result in a global bXCellAddElectrodeResult = {bResult} //- return result return {bResult} end /// /// SH: XCellPrepareElectrodes /// /// DE: Prepare electrodes /// function XCellPrepareElectrodes //- create a container create xform /electrodes //- disable the form disable ^ //- create a draw create xdraw /electrodes/draw //- create an electrode prototype shape create xshape /electrodes/draw/proto \ -linewidth 1 \ -textmode nodraw \ -pixcolor red \ -coords [-20e-4,-40e-4,45e-4][0,0,0][-10e-4,-40e-4,50e-4][-15e-4,-40e-4,45e-4][-20e-4,-40e-4,75e-4][-30e-4,-40e-4,100e-4] //- add a field for identification addfield ^ \ ident -description "Identification" //- set the field setfield ^ \ ident "prototype" end /// /// SH: XCellRemoveElectrode /// /// PA: path..: path to the clicked compartment /// /// DE: Remove the electrode associated with {path} /// function XCellRemoveElectrode(path) str path //- get the registered LDS output source str xcOutputSource = {getfield /LDS outputSource} //- get the registered LDS output value str xcOutputValue = {getfield /LDS outputValue} //- get the registered LDS output flags int xcOutputFlags = {getfield /LDS outputFlags} //- get the electrode title str plotTitle = {XGraphPlotTitle \ {path} \ {xcOutputSource} \ {xcOutputValue} \ {xcOutputFlags}} //- if the electrode exists if ( {exists /electrodes/draw/{plotTitle}} ) //- give diagnostics echo "Removing electrode "{plotTitle} //- remove the electrode delete /electrodes/draw/{plotTitle} //- if the electrodes toggle is set if ( {getfield /LDS/electrodes state} ) //- delete the electrode from the xcell window delete /LDS/draw/{plotTitle} //- update the draw widget //xflushevents xupdate /LDS/draw //! to get around a bug that does not update //! the deleted electrodes : //! hide and show the parent form xhide /LDS xshow /LDS end //- else else //- give diagnostics echo "No electrode named "{plotTitle} end end /// /// SH: XCellRemoveElectrodes /// /// DE: Remove all electrodes /// function XCellRemoveElectrodes //- give diagnostics echo "Removing all electrodes" //- loop over all registered electrode str electr foreach electr ( {el /electrodes/draw/#[][ident=record]} ) //! because of a bug in the wildcard parsing //! we can stil get the prototype here. //! we must check this by name of the element //- if it is not the prototype if ( {getpath {electr} -tail} != "proto" ) //- delete the electrode to the xcell window delete {electr} end end //- update the state of the electrodes callfunc XCellSetupElectrodes {getfield /LDS/electrodes state} end /// /// SH: XCellSetupElectrodes /// /// PA: state.: 0 if electrodes should be invisible /// 1 if electrodes should be visible /// /// DE: Show/hide the electrodes /// function XCellSetupElectrodes(state) int state //- loop over all electrodes in the xcell window str electr foreach electr ( {el /LDS/draw/#[][ident=record]} ) //- remove the electrode delete {electr} end //- if the electrodes should be visible if (state) //- give diagnostics echo "Showing electrodes" //- loop over all registered electrode foreach electr ( {el /electrodes/draw/#[][ident=record]} ) //- get the tail of the name str tail = {getpath {electr} -tail} //! because of a bug in the wildcard parsing //! we can stil get the prototype here. //! we must check this by name of the element if ( {tail} != "proto" ) //- copy the electrode to the xcell window copy {electr} /LDS/draw/{tail} end end //- else else //- give diagnostics echo "Hiding electrodes" end //- update the draw widget xflushevents xupdate /LDS/draw //! to get around a bug that does not update the deleted electrodes : //! hide and show the parent form //! for some reason it is not necessary here, but it is above //! (removal of electrodes). // xhide /LDS // xshow /LDS end /// /// SH: XCellSetupGraph /// /// PA: state.: 0 if graph should be invisible /// 1 if graph should be visible /// /// DE: Show/hide the graph /// function XCellSetupGraph(state) int state //- if the graph should be visible if (state) //- show the graph xshow /xgraphs //- else else //- hide the graph xhide /xgraphs end end /// /// SH: XCellSwitchChanMode /// /// PA: state.: 0 for absolute chanmode (chanmode 4) /// 1 for normalized chanmode (chanmode 5) /// /// DE: Switch between normalized and absolute channel mode /// Sets the solver in {cellpath}/solve in chanmode 4 or 5. /// Sets the min/max color values for the xcell display /// Notifies graph for new chanmode /// /*function XCellSwitchChanMode(state) int state //- if state is not zero if (state) //- switch to chanmode 5 iChanMode = 5 setfield {cellpath}/solve \ chanmode {iChanMode} //- else else //- switch to chanmode 4 iChanMode = 4 setfield {cellpath}/solve \ chanmode {iChanMode} end //- get name for boundary element str bound = {BoundElementName \ {getfield /LDS outputSource} \ {getfield /LDS outputValue} \ {iChanMode}} //- set field for boundaries setfield /LDS \ boundElement {bound} //- set new boundaries from element callfunc XCellSetBoundaries {bound} //- notify graph new chanmode XGraphSwitchChanMode {state} end */ /// /// SH: XCellDeleteMessages /// /// DE: Delete the messages from the xcell /// If no messages are setup, none will be deleted and the function /// will cleanly return. /// function XCellDeleteMessages //- count the number of incoming messages int iCount = {getmsg /LDS/draw/xcell1 -incoming -count} //- if the count is not zero if (iCount) //- retreive the number of elements from the config int iElements = {getfield /config xCellElements} //- loop for the number of elements / messages int i for (i = 0; i < iElements; i = i + 1) //- delete the first message deletemsg /LDS/draw/xcell1 {0} -incoming end end end /// /// SH: XCellSetupMessages /// /// PA: source: message source in {cellpath} /// value.: message value within {source} /// /// DE: Setup the messages between the solver and xcell /// The solver is assumed to be {cellpath}/solve . /// function XCellSetupMessages(source,value) str source str value //- retreive the wildcard from the config file str wPath = "/cell/soma[TYPE=compartment],/cell/dend[][TYPE=compartment]" //{getfield /config xCellPath} //- give diagnostics echo "Setting up messages to LDS for "{source}", "{value} str element // // foreach element ( { el { wPath } } ) // if ( {exists {element}/{source}} ) // echo Exists : {element}/{source} // else // echo Non existent : {element}/{source} // end // break // end //- loop over all elements in the xcell object str element foreach element ( { el { wPath } } ) //- if the source elements exists if ( {exists {element}/{source}} ) //echo Exists : {element}/{source} //- find solve field and add the message addmsg /cell/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ {cellpath}/solve \ {element}/{source} \ {value}} //- else the element does not exist else //echo Non existent : {element}/{source} //- add a dummy message addmsg /config /LDS/draw/xcell1 COLOR z end end //- set number of compartments in the xcell object setfield /LDS/draw/xcell1 \ nfield {getfield /config xCellElements} //- give diagnostics echo "Messages to LDS ok." end /// /// SH: XCellSetupCompMessages /// /// PA: source: message source in {cellpath} (not used) /// value.: message value within {source} /// /// DE: Setup the messages between the solver and xcell for compartments /// The solver is assumed to be {cellpath}/solve . /// function XCellSetupCompMessages(source,value) str source str value //- retreive the wildcard from the config file str wPath = "/cell/soma[TYPE=compartment],/cell/dend[][TYPE=compartment]" //{getfield /config xCellPath} //- give diagnostics echo "Setting up messages to LDS for (compartments), "{value} //- loop over all elements in the xcell object str element foreach element ( { el { wPath } } ) //- if the source elements exists if ( {exists {element}} ) //echo Exists : {element} //- find solve field and add the message addmsg /cell/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ /cell/solve \ {element} \ {value}} //- else the element does not exist else //echo Non existent : {element} //- add a dummy message addmsg /config /LDS/draw/xcell1 COLOR z end end //- set number of compartments in the xcell object setfield /LDS/draw/xcell1 nfield 493 //{getfield /config xCellElements} //- give diagnostics echo "Messages to LDS ok." end /// /// SH: XCellSetupExcIGEMessages /// /// PA: source: message source in {cellpath} /// value.: message value within {source} /// /// DE: Setup the messages between the solver and xcell /// The solver is assumed to be {cellpath}/solve . /// /*function XCellSetupExcIGEMessages(source,value) str source str value //- retreive the wildcard from the config file str wPath = {getfield /config xCellPath} //- give diagnostics echo "Setting up messages to xcell for " \ {source}", "{value} //- loop over all elements in the xcell object str element foreach element ( { el { wPath } } ) //- get the spine that gives messages to the element str spine = {getmsg {element} -outgoing -destination 7} //- get tail of spine str spineTail = {getpath {spine} -tail} //- get head of spine for use with solver's flat space str spineHead = {getpath {spine} -head} //- if we are handling a spine if ( {strncmp {spineTail} "spine" 5} == 0 ) //- default index is zero source = "head[0]/par" //- if an index is available if ( {strlen {spineTail}} != 5 ) //- get index of synapse int synapseIndex \ = {substring \ {spineTail} \ 6 \ {{strlen {spineTail}} - 1}} //- make source string with index source = "head[" @ {synapseIndex} @ "]/par" end //- find solve field and add the message addmsg {cellpath}/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ {cellpath}/solve \ {spineHead}{source} \ {value}} //- else if we can find a climbing fiber input elif ( {exists {element}/climb } ) //- find solve field and add the message addmsg {cellpath}/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ {cellpath}/solve \ {element}/climb \ {value}} //- else the element does not exist else //- add a dummy message addmsg /config /LDS/draw/xcell1 COLOR z end end //- set number of compartments in the xcell object setfield /LDS/draw/xcell1 \ nfield {getfield /config xCellElements} //- give diagnostics echo "Messages to LDS ok." end */ /// /// SH: XCellSetupInhIGEMessages /// /// PA: source: message source in {cellpath} /// value.: message value within {source} /// /// DE: Setup the messages between the solver and xcell /// The solver is assumed to be {cellpath}/solve . /// /*function XCellSetupInhIGEMessages(source,value) str source str value //- retreive the wildcard from the config file str wPath = {getfield /config xCellPath} //- give diagnostics echo "Setting up messages to xcell for " \ {source}", "{value} //- loop over all elements in the xcell object str element foreach element ( { el { wPath } } ) //- if we are handling a stellate cell if ( {exists {element}/stell} ) //- find solve field and add the message addmsg {cellpath}/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ {cellpath}/solve \ {element}/stell \ {value}} //- else if we can find a stellate 1 cell elif ( {exists {element}/stell1 } ) //- find solve field and add the message addmsg {cellpath}/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ {cellpath}/solve \ {element}/stell1 \ {value}} //- else if we can find a basket cell elif ( {exists {element}/basket } ) //- find solve field and add the message addmsg {cellpath}/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ {cellpath}/solve \ {element}/basket \ {value}} //- else no inhibitory channel exists else //- add a dummy message addmsg /config /LDS/draw/xcell1 COLOR z end end //- set number of compartments in the xcell object setfield /LDS/draw/xcell1 \ nfield {getfield /config xCellElements} //- give diagnostics echo "Messages to LDS ok." end */ /// /// SH: XCellSetupSpineVmMessages /// /// PA: source: message source in {cellpath} /// value.: message value within {source} /// /// DE: Setup the messages between the solver and xcell /// The solver is assumed to be {cellpath}/solve . /// /*function XCellSetupSpineVmMessages(source,value) str source str value //- retreive the wildcard from the config file str wPath = {getfield /config xCellPath} //- give diagnostics echo "Setting up spine compartment messages to LDS for " \ {source}", "{value} //- loop over all elements in the xcell object str element foreach element ( { el { wPath } } ) //- get the spine that gives messages to the element str spine = {getmsg {element} -outgoing -destination 7} //- get tail of spine str spineTail = {getpath {spine} -tail} //- get head of spine for use with solver's flat space str spineHead = {getpath {spine} -head} //- if we are handling a spine if ( {strncmp {spineTail} "spine" 5} == 0 ) //- default index is zero source = "head[0]" //- if an index is available if ( {strlen {spineTail}} != 5 ) //- get index of synapse int synapseIndex \ = {substring \ {spineTail} \ 6 \ {{strlen {spineTail}} - 1}} //- make source string with index source = "head[" @ {synapseIndex} @ "]" end //echo {spineHead}{source} {value} //- find solve field and add the message addmsg {cellpath}/solve /LDS/draw/xcell1 \ COLOR {findsolvefield \ {cellpath}/solve \ {spineHead}{source} \ {value}} //- else the element does not exist else //- add a dummy message addmsg /config /LDS/draw/xcell1 COLOR z end end //- set number of compartments in the xcell object setfield /LDS/draw/xcell1 \ nfield {getfield /config xCellElements} //- give diagnostics echo "Messages to xcell ok." end */ /// /// SH: XCellSetupButtons /// /// PA: widget: name of toggled widget /// mode..: output mode of xcell /// 1 comp. Vm /// 2 channel with IGE /// 3 excitatory channel with IGE /// 4 spine comp. Vm /// 5 nernst E /// 6 Calcium concen Ca /// 7 inhibitory channel with IGE /// /// DE: Display the buttons according to the output mode /// /*function XCellSetupButtons(widget,mode) str widget int mode //echo setupbuttons : {widget} {mode} //- set the heading for the xcell form setfield /LDS/heading \ title {getfield /LDS outputDescription} //- comp. Vm //- or spine comp. Vm //- or nernst E //- or Calcium concen Ca if (mode == 1 || mode == 4 || mode == 5 || mode == 6) //- hide I,G toggles xhide /LDS/Ik xhide /LDS/Gk //- show I,G labels xshow /LDS/noIk xshow /LDS/noGk //- show E label xhide /LDS/Ek xshow /LDS/noEk //- channel with IGE //- or excitatory channel with IGE //- or inhibitory channel with IGE elif (mode == 2 || mode == 3 || mode == 7) //- hide I,G labels xhide /LDS/noIk xhide /LDS/noGk //- show I,G toggles xshow /LDS/Ik xshow /LDS/Gk //- get widget tail str channel = {getpath {widget} -tail} //- for a calcium channel if ( {channel} == "CaP" || {channel} == "CaT") //- show Ek toggle xhide /LDS/noEk xshow /LDS/Ek //- else else //- hide Ek toggle xshow /LDS/noEk xhide /LDS/Ek end //- else there is something wrong else //- give diagnostics echo "XCellSetupButtons : Wrong output mode for XCell" end //- loop over all toggle buttons in the xcell str toggle foreach toggle ( {el /LDS/#[][TYPE=xtoggle]} ) //- isolate the tail str toggleTail = {getpath {toggle} -tail} //- if the toggle is not for graph, //- electrodes or abs/norm output if (toggleTail != "graph" \ && toggleTail != "electrodes" \ && toggleTail != "chanmode") //- unset the toggle setfield {toggle} \ state 0 end end //- set the toggle that has been pressed setfield {widget} \ state 1 //- set the toggle for the channel mode // setfield /LDS/{getfield /LDS channelMode} \ // state 1 end */ /// /// SH: XCellSetOutput /// /// PA: widget: name of toggled widget /// /// RE: output mode /// 1 comp. Vm /// 2 channel with IGE /// 3 excitatory channel with IGE /// 4 spine comp. Vm /// 5 nernst E /// 6 Calcium concen Ca /// 7 inhibitory channel with IGE /// /// DE: Setup messages for update of xcell, setup buttons, do a reset /// /*function XCellSetOutput(widget) str widget //- set the field for output setfield /LDS \ output {widget} //- delete all messages from the xcell XCellDeleteMessages //- default we should not continue int bContinue = 0 //v strings for construction of messages str msgSource str msgValue str msgDescription //= mode for setting up buttons //= //= 1 comp. Vm //= 2 channel with IGE //= 3 excitatory channel with IGE //= 4 spine comp. Vm //= 5 nernst E //= 6 Calcium concen Ca //= 7 inhibitory channel with IGE int flButtons = 0 //- get the parameter attribute for the widget str parameters = {getfield {widget} parameters} //- if we are dealing with compartments if (parameters == "Vm") //- the description is compartmental voltage msgDescription = "Compartmental voltage" //- the source is empty msgSource = "" //- the value is Vm msgValue = "Vm" //- remember to continue bContinue = 1 //- set flags for buttons flButtons = 1 //- if we are dealing with spine compartments elif (parameters == "spineVm") //- the description is spiny voltage msgDescription = "Spiny voltage" //- the source is the head of the spine msgSource = "head" //- the value is Vm msgValue = "Vm" //- remember to continue bContinue = 1 //- set flags for buttons flButtons = 4 //- if we are dealing with nernst elif (parameters == "E") //- the description is Nernst msgDescription = "Nernst" //- the source is Ca_nernst msgSource = "Ca_nernst" //- the value is E msgValue = "E" //- remember to continue bContinue = 1 //- set flags for buttons flButtons = 5 //- if we are dealing with concentration elif (parameters == "Ca") //- the description is compartmental Ca conc. msgDescription = "Compartmental [Ca2+]" //- the source is Ca_pool msgSource = "Ca_pool" //- the value is Ca msgValue = "Ca" //- remember to continue bContinue = 1 //- set flags for buttons flButtons = 6 //- if we are dealing with channels elif (parameters == "IGE") //- the description is the channel with registered mode msgDescription \ = {getpath {widget} -tail} \ @ " " \ @ {getfield \ /LDS/{getfield /LDS channelMode} \ description} //- the source is slash + the widget tail msgSource = {getpath {widget} -tail} //- the value is registered in /LDS msgValue = {getfield /LDS channelMode} //- remember to continue bContinue = 1 //- set flags for buttons flButtons = 2 //- if we are dealing with exc channels elif (parameters == "excIGE") //- the description is the channel with registered mode msgDescription \ = "Excitatory " \ @ {getfield \ /LDS/{getfield /LDS channelMode} \ description} //- the source is not relevant msgSource = "excitatory" //- the value is registered in /LDS msgValue = {getfield /LDS channelMode} //- remember to continue bContinue = 1 //- set flags for buttons flButtons = 3 //- if we are dealing with inh channels elif (parameters == "inhIGE") //- the description is the channel with registered mode msgDescription \ = "Inhibitory " \ @ {getfield \ /LDS/{getfield /LDS channelMode} \ description} //- the source is not relevant msgSource = "inhibitory" //- the value is registered in /LDS msgValue = {getfield /LDS channelMode} //- remember to continue bContinue = 1 //- set flags for buttons flButtons = 7 //- else somebody messed up the code else //- give diagnostics echo "Somebody messed up the code" echo "XCell module bug" end //- if we should continue if (bContinue) //- if we are handling compartments if (flButtons == 1) //- setup messages for compartments XCellSetupCompMessages {msgSource} {msgValue} //- else if we are handling spine compartments elif (flButtons == 4) //- setup messages for spines XCellSetupSpineVmMessages {msgSource} {msgValue} //- else if we are handling exc channels elif (flButtons == 3) //- setup messages for those channels XCellSetupExcIGEMessages {msgSource} {msgValue} //- else if we are handling inh channels elif (flButtons == 7) //- setup messages for those channels XCellSetupInhIGEMessages {msgSource} {msgValue} //- else we are handling normal messages else //- setup messages XCellSetupMessages {msgSource} {msgValue} end end //- register output description setfield /LDS \ outputDescription {msgDescription} //- set up buttons correctly XCellSetupButtons {widget} {flButtons} //- get name of boundary element str bound = " " //{BoundElementName {msgSource} {msgValue} {iChanMode}} //- register the output parameters and boundary element setfield /LDS \ outputSource {msgSource} \ outputValue {msgValue} \ outputFlags {flButtons} \ outputDescription {msgDescription} \ boundElement {bound} //- set boundaries for xcell callfunc XCellSetBoundaries {bound} //- reset the simulation reset //- notify graph of switched output units callfunc XGraphNextPlotMode {msgValue} //- return the output mode return {flButtons} end */ /// /// SH: XCellSetBoundaries /// /// PA: bound.: boundary element /// /// RE: Success of operation /// /// DE: Set boundaries from the given element, update color widgets /// function XCellSetBoundaries(bound) str bound //v result var int bResult //- if the element with the boundaries exists if ( {exists {bound}} ) //- give diagnostics echo "Setting xcell color boundaries from "{bound} //- set the fields for dimensions setfield /LDS/draw/xcell1 \ colmin {getfield {bound} xcellmin} \ colmax {getfield {bound} xcellmax} //- set config values in color widgets callfunc XCellShowConfigure //- set result : ok bResult = 1 //- else else //- set result : failure bResult = 0 end //- return result return {bResult} end /// /// SH: XCellSetChannelMode /// /// PA: widget: name of toggled widget /// /// DE: Set the channel mode /// /*function XCellSetChannelMode(widget) str widget //- isolate the tail of the toggled widget str widgetTail = {getpath {widget} -tail} //- set the channelmode field setfield /LDS \ channelMode {widgetTail} //- update the output messages XCellSetOutput {getfield /LDS output} end */ /// /// SH: XCellCancelConfigure /// /// DE: Hide the configure window /// function XCellCancelConfigure //- hide the configure window xhide /LDS/configure end /// /// SH: XCellSetConfigure /// /// DE: Set xcell config as in the configuration window /// function XCellSetConfigure //- set color min setfield /LDS/draw/xcell1 \ colmin {getfield /LDS/colormin value} //- set color max setfield /LDS/draw/xcell1 \ colmax {getfield /LDS/colormax value} end /// /// SH: XCellShowConfigure /// /// DE: Show configuration window for xcell /// function XCellShowConfigure //- set color min value setfield /LDS/colormin \ value {getfield /LDS/draw/xcell1 colmin} //- set color max value setfield /LDS/colormax \ value {getfield /LDS/draw/xcell1 colmax} /* //- pop up the configuration window xshow /LDS/configure */ end /// /// SH: XCellCreateToggle /// /// PA: name..: name of widget to create /// /// DE: Create a channel toggle button in the xcell form. /// The button is only created if it does not exist yet. /// /*function XCellCreateToggle(name) str name //- if the widget does not exist yet if ( ! {exists /LDS/{name}} ) //- if there are already channels created if (bButtonsCreated) //- create a toggle button beneath previous create xtoggle /LDS/{name} \ -xgeom 90% \ -wgeom 10% \ -script "XCellSetOutput <w>" //- else else //- create toggle button at upper right create xtoggle /LDS/{name} \ -xgeom 90% \ -ygeom 5% \ -wgeom 10% \ -script "XCellSetOutput <w>" //- remember that buttons are created bButtonsCreated = 1 end //- add field for parameters addfield ^ \ parameters -description "parameters for messages" //- set the parameter field to channels setfield ^ \ parameters "IGE" end end */ /// /// SH: XCellCreateChannelLibrary /// /// DE: Create library of Purkinje channels in /library /// /*function XCellCreateChannelLibrary //v number of channels int iChannels = 0 //- create neutral container create neutral /tmp //- loop over all purkinje channels found in the library str channel foreach channel ( {el /library/Purk_#/#[][TYPE=tabchannel]} ) //- isolate the name of the channel str tail = {getpath {channel} -tail} //- if the element does not exist if ( ! {exists /tmp/{tail}} ) //- create library element create neutral /tmp/{tail} //- increment number of channels iChannels = {iChannels + 1} end end //- open the library file openfile {strXCLibrary}".u" w //- loop over all create elements foreach channel ( {el /tmp/#[]} ) //- write tail of channel to the lib file writefile {strXCLibrary}".u" {getpath {channel} -tail} //- delete the neutral element delete {channel} end //- close the lib file closefile {strXCLibrary}".u" //- sort the lib file sh "sort <"{strXCLibrary}".u >"{strXCLibrary}".s" //- open the library file openfile {strXCLibrary}".s" r //- loop over all channels int i for (i = 0; i < iChannels; i = i + 1) //- read a channel channel = {readfile {strXCLibrary}".s" -linemode} //- create a neutral element create neutral /tmp/{channel} end //- close the lib file closefile {strXCLibrary}".s" end */ /// /// SH: XCellCreateButtons /// /// DE: Create the xcell buttons and toggles. /// Looks at the library to check which tabchannels are present /// function XCellCreateButtons //- create toggle buttons per compartment /* create xtoggle /LDS/comp \ -xgeom 70% \ -ygeom 5% \ -wgeom 20% \ -title "Comp. Vm" \ -script "XCellSetOutput <w>" addfield ^ \ parameters -description "parameters for messages" setfield ^ \ parameters "Vm" create xtoggle /LDS/Caconcen \ -title "Comp. Ca" \ -xgeom 70% \ -wgeom 20% \ -script "XCellSetOutput <w>" addfield ^ \ parameters -description "parameters for messages" setfield ^ \ parameters "Ca" create xtoggle /LDS/channelSpines \ -xgeom 70% \ -wgeom 20% \ -title "Exc. chan." \ -script "XCellSetOutput <w>" addfield ^ \ parameters -description "parameters for messages" setfield ^ \ parameters "excIGE" create xtoggle /LDS/channelSpinesInh \ -xgeom 70% \ -wgeom 20% \ -title "Inh. chan." \ -script "XCellSetOutput <w>" addfield ^ \ parameters -description "parameters for messages" setfield ^ \ parameters "inhIGE" // create xtoggle /LDS/compSpines \ // -xgeom 70% \ // -wgeom 20% \ // -title "Spine comp." \ // -script "XCellSetOutput <w>" // addfield ^ \ // parameters -description "parameters for messages" // setfield ^ \ // parameters "spineVm" // create xtoggle /LDS/nernst \ // -xgeom 70% \ // -wgeom 20% \ // -script "XCellSetOutput <w>" // addfield ^ \ // parameters -description "parameters for messages" // setfield ^ \ // parameters "E" //- create a label as seperator create xlabel /LDS/sep1 \ -xgeom 70% \ -ygeom 3:last.bottom \ -wgeom 20% \ -title "" //- create toggle buttons for Ik,Gk,Ek create xtoggle /LDS/Ik \ -xgeom 70% \ -ygeom 1:sep1 \ -wgeom 20% \ -script "XCellSetChannelMode <w>" create xtoggle /LDS/Gk \ -xgeom 70% \ -wgeom 20% \ -script "XCellSetChannelMode <w>" create xtoggle /LDS/Ek \ -xgeom 70% \ -wgeom 20% \ -script "XCellSetChannelMode <w>" //- add descriptions addfield /LDS/Ik \ description -description "Description of output" addfield /LDS/Gk \ description -description "Description of output" addfield /LDS/Ek \ description -description "Description of output" //- set descriptions setfield /LDS/Ik \ description "current" setfield /LDS/Gk \ description "conductance" setfield /LDS/Ek \ description "reversal potential" create xlabel /LDS/noIk \ -xgeom 70% \ -ygeom 4:sep1 \ -wgeom 20% \ -title "No Ik" create xlabel /LDS/noGk \ -xgeom 70% \ -ygeom 3:last.bottom \ -wgeom 20% \ -title "No Gk" create xlabel /LDS/noEk \ -xgeom 70% \ -ygeom 3:last.bottom \ -wgeom 20% \ -title "No Ek" //- create a library of all channels XCellCreateChannelLibrary //- loop over all purkinje channels found in the library str channel foreach channel ( {el /tmp/#[]} ) //- isolate the name of the channel str tail = {getpath {channel} -tail} //- create a toggle if necessary XCellCreateToggle {tail} end */ /* //- create a label as seperator create xlabel /LDS/sep2 \ -xgeom 70% \ -ygeom 3:Ek \ -wgeom 20% \ -title "" */ //- create toggle to show graph create xtoggle /LDS/graph \ -xgeom 70% \ -ygeom 6:draw.bottom \ -wgeom 30% */ \ -title "" \ -onlabel "Graph" \ -offlabel "No Graph" \ -script "XCellSetupGraph <v>" //- create toggle to show recording electrodes create xtoggle /LDS/electrodes \ -xgeom 70% \ -ygeom 4:last.bottom \ -wgeom 30% \ -title "" \ -onlabel "Electrodes" \ -offlabel "No Electrodes" \ -script "XCellSetupElectrodes <v>" //- create label as seperator /* create xlabel /LDS/sep3 \ -xgeom 70% \ -ygeom 6:graph.top \ -wgeom 30% \ -title "" //- create toggle to change normalized / absolute output create xtoggle /LDS/chanmode \ -xgeom 70% \ -ygeom 6:last.top \ -wgeom 30% \ -title "" \ -onlabel "Normalized" \ -offlabel "Absolute" \ -script "XCellSwitchChanMode <v>" //- create label with normalized / absolute description create xlabel /LDS/chanlabel \ -xgeom 70% \ -ygeom 6:chanmode.top \ -wgeom 30% \ -title "Output mode :" */ /* //- create a label as seperator create xbutton /LDS/config \ -xgeom 70% \ -wgeom 30% \ -title "Configure" \ -script "XCellShowConfigure" */ end /// /// SH: XCellCreateColorDialogs /// /// DE: Create the xcell color dialogs at the bottom /// /*function XCellCreateColorDialogs //- create color min dialog create xdialog /LDS/colormax \ -xgeom 0:parent.left \ -ygeom 5:draw.bottom \ -wgeom 70% \ -value 20 \ -title "Color maximum (red) : " \ -script "XCellSetConfigure" //- create color max dialog create xdialog /LDS/colormin \ -xgeom 0:parent.left \ -ygeom 0:last.bottom \ -wgeom 70% \ -value -80 \ -title "Color minimum (blue) : " \ -script "XCellSetConfigure" end */ /// /// SH: XCellCreateHeadings /// /// DE: Create the xcell headings for the draw and buttons /// function XCellCreateHeadings //- create header label create xlabel /LDS/heading [0,0,100%,5%] \ -title "LDS Morph" //- create buttons label /* create xlabel /LDS/outputs \ -xgeom 0:last.right \ -ygeom 0 \ -wgeom 30% \ -hgeom 5% \ -title "Possible outputs" */ end /// /// SH: XCellCreateDraw /// /// DE: Create the xcell draw /// function XCellCreateDraw //- create draw within form create xdraw /LDS/draw [0,5%,100%,75%] \ -wx 1e-3 \ -wy 1e-3 \ -transform ortho3d \ -bg white //- set dimensions for draw setfield /LDS/draw \ xmin -5e-2 \ xmax 3e-2 \ ymin -3.1e-2 \ ymax 4.5e-2 //- set projection mode setfield /LDS/draw \ transform z //- retreive the wildcard from the config file // str wPath = {getfield /config xCellPath} //- create cell display create xcell /LDS/draw/xcell1 \ -path /cell/soma[TYPE=compartment],/cell/dend[][TYPE=compartment] \ -colmin -80 /* -0.09 */ \ -colmax 200 /* 0.02 */ \ -diarange -10 //- set clock to use useclock /LDS/draw/xcell1 2 end /// /// SH: XCellReset /// /// DE: Set the default state for the xcell /// /*function XCellReset //- default output is compartmental Vm setfield /LDS \ output "/LDS/comp" //- default channel mode is conductance setfield /LDS \ channelMode "Gk" //- if chanmode is 5 if (iChanMode == 5) //- set widget to normalized output setfield /LDS/chanmode \ state 1 //- else else //- set widget to absolute output setfield /LDS/chanmode \ state 0 end //- default : graph is not visible setfield /LDS/graph \ state 0 //- default : electrodes are not visible setfield /LDS/electrodes \ state 0 //- update all output (buttons, colors) //! this just simulates a click on the comp. volt. button XCellSetOutput {getfield /LDS output} end */ /// /// SH: XCellCBAddPlot /// /// PA: path..: path to the clicked compartment /// /// DE: Callback to add compartment to graph /// function XCellCBAddPlot(path) str path //echo "XCellCBAddPlot : "{path} //- allocate next color callfunc "XGraphNextColor" //! the field cNextColor should be considered private, //! but read the comments below to understand why I had to //! read it as if it is public. //! //! With this public read it becomes more difficult to decide if the //! graph should do a reset (and skipping back to the default color) //! Modularity with genesis scripts can be tough... //- get allocated color int color = {getfield /xgraphs/graph cNextColor} //! genesis callfunc cannot handle strings nor can it handle ints //! so the return value gets lost for the if statement //- get name of electrode str electrode = {XCellElectrodeName {path}} //- if the electrode exists if ( {exists /electrodes/draw/{electrode}} ) //- give diagnostics echo {electrode}" is already a recording site" //- else else //- add plot for clicked compartment callfunc "XGraphPlotCompartment" /cell {path} {color} if ( {bXGraphPlotCompartmentResult} ) //- add electrode for the compartment XCellAddElectrode {path} {electrode} {color} end end end /// /// SH: XCellCBRemovePlot /// /// PA: path..: path to the clicked compartment /// /// DE: Callback to remove compartment from graph /// function XCellCBRemovePlot(path) str path //- remove the electrode callfunc XCellRemoveElectrode {path} //- remove plot from the clicked compartment callfunc "XGraphRemoveCompartment" /cell {path} end /// /// SH: XCellCreate /// /// DE: Create the xcell display widget with all buttons /// set the update clock to clock 9 /// function XCellCreate //- create form container create xform /LDS [300,0, 400, 450] //- add field for output addfield /LDS \ output -description "Output (toggled widget)" //- add field for output source addfield /LDS \ outputSource -description \ "Output source (compartment subelement)" //- add field for output value addfield /LDS \ outputValue -description "Output value (Vm, Ik, Gk, Ek, Ca)" //- add field for output flags addfield /LDS \ outputFlags -description "Output flags (1-7)" //- add field for output description addfield /LDS \ outputDescription -description "Output description (Title)" //- add field for channel mode addfield /LDS \ channelMode -description "Channel display mode (Ik, Gk, Ek)" //- add field for registering boundary element addfield /LDS \ boundElement -description "Element with display boundaries" //- create the heading at the top XCellCreateHeadings //- create the draw XCellCreateDraw //- create color dialog widgets at the bottom // XCellCreateColorDialogs //- create the buttons and toggles XCellCreateButtons //- prepare the electrodes XCellPrepareElectrodes // create a form for configuration create xform /LDS/configure [250,250,300,150] // make it the current element pushe /LDS/configure // create label with header create xlabel heading \ -label "Color configuration" // create color min dialog create xdialog colormin \ -title "Color minimum : " // create color max dialog create xdialog colormax \ -title "Color maximum : " // create done button create xbutton done \ -title "Done" \ -script "XCellSetConfigure" // create cancel button create xbutton cancel \ -title "Cancel" \ -script "XCellCancelConfigure" // pop previous element pope // link the xcell and the graph for button clicks setfield /LDS/draw/xcell1 \ script "XCellCBAddPlot.d1 <v>// ; XCellCBRemovePlot.d3 <v>" /* setfield /LDS/draw/xcell1 \ script "XCellCBRemovePlot.d3 <v>" //- show the output form */ xshow /LDS end //end