//genesis - TEST.g - GENESIS Version 2.1 // This file was developed by De Schutter, Cornelis and Maex // and modified by // Akira Takashima. // Department of Biological Sciences // Faculry of Science // Hokkaido University // Sapporo Japan // // Last update on 22 Jan. 2007 // xgraph.g : xgraph functionality //v default color for plots int iDefaultPlotColor = 19 //38 //v bool for communication between XGraphPlotCompartment and others int bXGraphPlotCompartmentResult = 0 //v normal path for xcell script str cbXCell /// /// SH: XGraphPlotColor /// /// RE: color for current plot /// /// DE: Give color for current plot /// function XGraphPlotColor //- get next color int color = {getfield /xgraphs/graph cNextColor} //- modulo 64 to get a legal value color = {color} % 64 //- return result return {color} end /// /// SH: XGraphNextColor /// /// RE: color for current plot /// /// DE: Give color for next plot /// function XGraphNextColor //- get next available color int color = {getfield /xgraphs/graph cNextColor} //- modulo 64 to get a legal value color = {color +19} % 64 //- increment the color count setfield /xgraphs/graph cNextColor {color} //- return result return {color} end /// /// SH: XGraphPlotTitle /// /// PA: comp..: compartment to be plotted /// source: registered output source /// value.: registered output value /// flags.: registered output flags /// /// RE: title for a plot /// /// DE: Give title for a plot for given parameters /// function XGraphPlotTitle(comp,source,value,flags) str comp str source str value int flags //- get tail of compartment str compTail = {getpath {comp} -tail} //- default plot title is without index str plotTitle = {compTail} //- default index is none str index = "" //- find beginning of index int iBegin = {findchar {compTail} "["} //- if compartment has an index if (iBegin != -1) //- get index from registered compartement index = {substring \ {compTail} \ {iBegin + 1} \ {{findchar {compTail} "]"} - 1}} //- set title for plot plotTitle = {substring {compTail} 0 {iBegin - 1}} \ @ "_" \ @ {index} end //- if output source is given if (source != "") //- if first char of output source is '/' if ({substring {source} 0 0} == "/") //- add output source minus '/' to plot title plotTitle = {plotTitle} \ @ "_" \ @ {substring {source} 1} //- else else //- add output source to plot title plotTitle = {{plotTitle} @ "_" @ {source}} end end // return plot title with added value return {plotTitle} @ "_" @ {value} //- return plot title return {plotTitle} end /// /// SH: XGraphPlotCompartment /// /// PA: path..: path with solver /// comp..: compartment to be plotted /// color.: color for new plot /// /// RE: 1 if successfull /// 0 if failed /// /// DE: Add a plot for the given compartment, reset the simulation /// The registered xcell output parameters are considered for setting up /// the message to the graph. /// function XGraphPlotCompartment(path,comp,color) str path str comp int color //- set default result : success int bResult = 1 //- get the registered LDS output str xcOutput = {getfield /LDS output} //- 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 registered LDS output description str xcOutputDescription = {getfield /LDS outputDescription} //- get the registered LDS channel mode str xcChannelMode = {getfield /LDS channelMode} //- get xcell field for registering boundary element str xcBoundElement = {getfield /LDS boundElement} //- if registered output value is different from LDS output value if ({xcOutputValue} != {getfield /xgraphs outputValue}) //- reset the graph callfunc XGraphReset end //- register new output setfield /xgraphs \ output {xcOutput} //- register new output source setfield /xgraphs \ outputSource {xcOutputSource} //- register new output value setfield /xgraphs \ outputValue {xcOutputValue} //- register new output flags setfield /xgraphs \ outputFlags {xcOutputFlags} //- register new output description setfield /xgraphs \ outputDescription {xcOutputDescription} //- register new channel mode setfield /xgraphs \ channelMode {xcChannelMode} //- register new boundary element setfield /xgraphs \ boundElement {xcBoundElement} // reset parameters to compartmental voltage xcOutputSource = "" xcOutputValue = "Vm" xcOutputFlags = 1 //- get tail of compartment str compTail = {getpath {comp} -tail} //- get a plot title str plotTitle = {XGraphPlotTitle \ {comp} \ {xcOutputSource} \ {xcOutputValue} \ {xcOutputFlags}} //- if flags say compartmental output if (xcOutputFlags == 1) //- if the specified element exists if ( {exists {comp} {xcOutputValue}} ) //- give an informational message echo "Adding plot for "{comp}", " \ "source is '(compartment)', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {comp} \ {xcOutputValue}} \ *{plotTitle} \ *{color} //echo {comp} {compTail} {index} //echo {plotTitle}"_"{xcOutputValue} //- else else //- give an informational message echo "No plot for "{comp}", " \ "source is '(compartment)', " \ "value is '"{xcOutputValue}"'." echo "The element or field does not exist." //- set result bResult = 0 end //- else we have 'normal' compartmental output else //- if the specified element exists if ( {exists {comp}/{xcOutputSource} {xcOutputValue}} ) //- give an informational message echo "Adding plot for "{comp}", " \ "source is '"{xcOutputSource}"', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {comp}/{xcOutputSource} \ {xcOutputValue}} \ *{plotTitle} \ *{color} //echo {comp} {compTail} {index} //echo {plotTitle}"_"{xcOutputValue} //- else else //- give an informational message echo "No plot for "{comp}", " \ "source is '"{xcOutputSource}"', " \ "value is '"{xcOutputValue}"'." echo "The element or field does not exist." //- set result bResult = 0 end end //- if adding plot was successfull /* if (bResult) //- reset added plot (makes it visible) call /xgraphs/graph/{plotTitle} RESET end */ //- set global result bXGraphPlotCompartmentResult = {bResult} //- return result return {bResult} end /// /// SH: XGraphRemoveCompartment /// /// PA: path..: path with solver /// comp..: compartment to be removed from plot list /// /// DE: Remove the plot for the given compartment /// function XGraphRemoveCompartment(path,comp) str path str comp //- get the registered xcell output source str xcOutputSource = {getfield /xcell outputSource} //- get the registered xcell output value str xcOutputValue = {getfield /xcell outputValue} //- get the registered xcell output flags int xcOutputFlags = {getfield /xcell outputFlags} //- get a plot title str plotTitle = {XGraphPlotTitle \ {comp} \ {xcOutputSource} \ {xcOutputValue} \ {xcOutputFlags}} //- if the plot exists if ( {exists /xgraphs/graph/{plotTitle}} ) //- give diagnostics echo "Removing plot "{plotTitle} //- remove the plot delete /xgraphs/graph/{plotTitle} //- reset the graph call /xgraphs/graph RESET //- else else //- give diagnostics echo "No plot named "{plotTitle} end end /// /// SH: XGraphClear /// /// PA: path..: parent element to clear all graphs for /// /// DE: clear all graphs within the given element tree /// function XGraphClear(path) str path //- give diagnostics echo "Removing all plots" //v old status of overlay int overlayOld //- loop over all plots in the given tree str plot foreach plot ( {el {path}/##[][TYPE=xplot]} ) //- delete the plot delete {plot} end //- loop over all graphs in the given tree str graph foreach graph ( {el {path}/##[][TYPE=xgraph]} ) //- push the element pushe {graph} //- remember status of overlay field overlayOld = {getfield . overlay} //- unset overlay field setfield . overlay 0 //echo RESET for {el .} with overlay {getfield . overlay} //- reset the graph call . RESET //- reset overlay field to previous state setfield . overlay {overlayOld} //- pop previous current element pope end //- remove all electrodes callfunc XCellRemoveElectrodes end /// /// SH: XGraphHideAddPlot /// /// DE: Hide the add plot window /// Resets the xcell call back /// function XGraphHideAddPlot //- restore field for xcell script setfield /LDS/draw/xcell1 \ script {cbXCell} //- hide add plot window xhide /xgraphs/addPlotForm end /// /// SH: XGraphSetAddPlot /// /// PA: name..: name of compartment to add plot for /// /// DE: Add plot for specified compartment name /// The field and subelement to output are taken from xgraph output mode /// If the function is successfull, the add plot window will hide. /// function XGraphSetAddPlot(name) str name //- for empty given name if ( {name} == "" ) //- just return return end //- if name is relative if ( {substring {name} 0 0} != "/" ) //- add cell path to compartment name name = {"/cell" @ "/" @ "dend["@{name} @ "]"} end //- get tail of string str tail = {getpath {name} -tail} //- find opening bracket int iOpen = {findchar {tail} "["} //- if name has index if ( iOpen != -1 ) //- find closing bracket int iClose = {findchar {tail} "]"} //- get index from tail of name int iIndex = {substring {tail} {iOpen + 1} {iClose - 1}} //- if index count of tail is zero if ( iIndex == 0 ) //- delete index of tail of name tail = {substring {tail} 0 {iOpen - 1}} //- construct new name name = {{getpath {name} -head} @ {tail}} end end // if specified compartment exists //if ( {exists {name}} ) //- call callback script for xcell callfunc XCellCBAddPlot {name} // else //else // should inform the user here //end end /// /// SH: XGraphShowAddPlot /// /// DE: Popup add plot window /// This function messes with the xcell call back script /// function XGraphShowAddPlot //- store field for xcell script cbXCell = {getfield /LDS/draw/xcell1 script} //- set field for xcell script setfield /LDS/draw/xcell1 \ script "XCellCBAddPlot <v>" //- pop add plot form xshow /xgraphs/addPlotForm end /// /// SH: XGraphToggleOverlay /// /// PA: widget: name of widget to toggle overlay for /// state.: new state for overlay field /// /// DE: Toggle the overlay field for the given widget /// function XGraphToggleOverlay(widget,state) str widget str state //- if xoverlay element exists if ({exists {widget}/xoverlay}) //- delete the xoverlay element delete {widget}/xoverlay end //- set the overlay field for the given widget setfield {widget} overlay {state} end /// /// SH: XGraphCreate /// /// DE: Creates a graph and parent from element. /// Adds a field for allocation of colors (named cNextColor) /// /// function XGraphCreate //- create container form create xform /xgraphs [750, 0, 500, 420] //- add field for output addfield /xgraphs \ output -description "Output (toggled widget)" //- add field for output source addfield /xgraphs \ outputSource -description "Output source" //- add field for output value addfield /xgraphs \ outputValue -description "Output value" //- add field for output flags addfield /xgraphs \ outputFlags -description "Output flags" //- add field for output description addfield /xgraphs \ outputDescription -description "Output description" //- add field for channel mode addfield /xgraphs \ channelMode -description "Channel display mode" //- add field for registering boundary element addfield /xgraphs \ boundElement -description "Element with display boundaries" //- make the form the current element pushe /xgraphs //- create graph within the form create xgraph graph [1%, 2%, 99%, 90%] \ -title "Membrane Potential" //- set appropriate dimensions for voltage setfield ^ \ xmin 0 \ xmax 100 \ ymin -100 \ ymax 0 \ bg white \ XUnits "Time (msec)" //- add a button to clear the graph create xbutton clear \ -xgeom 1% \ -ygeom 0:graph \ -wgeom 20% \ -title "Clear graph" \ -script "XGraphClear /xgraphs" //- add a button to add a plot create xbutton addPlot \ -xgeom 0:last.right \ -ygeom 0:graph \ -wgeom 20% \ -title "Add plot" \ -script "XGraphShowAddPlot" //- add toggle for overlay create xtoggle overlay \ -xgeom 0:last.right \ -ygeom 0:graph \ -wgeom 20% \ -title "" \ -script "XGraphToggleOverlay /xgraphs/graph <v>" //- set on/off labels setfield overlay \ offlabel "Overlay off" \ onlabel "Overlay on" //- add an initialized field for allocated colors addfield /xgraphs/graph cNextColor -descr "next color to allocate" setfield /xgraphs/graph cNextColor {iDefaultPlotColor} //- set clock to use for graph useclock /xgraphs/graph 3 //- create a form for setting scales create xform addPlotForm [600,150,350,190] //- make it the current element pushe ^ //- create label with header create xlabel heading \ -label "Add plot to graph" //- create labels with info msgs and dialog for compartment name input create xlabel info1 \ -ygeom 4:last.bottom \ -title "Select an area from the LDS cell" create xlabel info2 \ -ygeom 2:last.bottom \ -title "to plot its output value in the graph," create xlabel info3 \ -ygeom 2:last.bottom \ -wgeom 100% \ -title "or type a compartment number below :" create xdialog compartmentname \ -wgeom 100% \ -label "Compartment number to plot : " \ -script "XGraphSetAddPlot <v>" create xlabel info4 \ -ygeom 2:last.bottom \ -title "" //- create cancel button create xbutton done \ -title "Done" \ -script "XGraphHideAddPlot" //- pop previous element pope end /// /// SH: XGraphReset /// /// DE: Clear the graph and reset the title /// This functions relies on an xcell form /xcell that has fields for /// registering output source, value etc. /// function XGraphReset //- clear the graph XGraphClear /xgraphs //- get the registered LDS output str xcOutput = {getfield /LDS output} //- 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 registered LDS output description str xcOutputDescription = {getfield /LDS outputDescription} //- get the registered LDS channel mode str xcChannelMode = {getfield /LDS channelMode} //- get xcell field for registering boundary element str xcBoundElement = {getfield /LDS boundElement} //- register new output setfield /xgraphs \ output {xcOutput} //- register new output source setfield /xgraphs \ outputSource {xcOutputSource} //- register new output value setfield /xgraphs \ outputValue {xcOutputValue} //- register new output flags setfield /xgraphs \ outputFlags {xcOutputFlags} //- register new output description setfield /xgraphs \ outputDescription {xcOutputDescription} //- register new channel mode setfield /xgraphs \ channelMode {xcChannelMode} //- register new boundary element setfield /xgraphs \ boundElement {xcBoundElement} //- if output is comp. Vm if (xcOutputFlags == 1) //- set title setfield /xgraphs/graph \ title "Compartmental voltage" end //- set new axes callfunc XGraphSetBoundaries {xcBoundElement} //- register next output mode XGraphNextPlotMode {xcOutputValue} // reset next plot color //! don't do this, read the comments in XCellCBAddPlot why. //setfield /xgraphs/graph cNextColor {iDefaultPlotColor} end