//genesis // // $Id: xgraph.g 1.13.1.1.1.1.2.1.2.1.2.1.1.3 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 //' ////////////////////////////////////////////////////////////////////////////// // xgraph.g : xgraph functionality int include_xgraph if ( {include_xgraph} == 0 ) include_xgraph = 1 //v default color for plots int iDefaultPlotColor = 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: XGraphNextPlotMode /// /// PA: mode..: next plotting mode /// /// RE: 1 if mode is changed /// 0 if mode is same /// /// DE: Notify graph of switched output units /// {mode} is one of (Gk,Ik,E,Vm,Ca,E). /// Updates warning info widget in 'Add plot' window /// function XGraphNextPlotMode(mode) str mode //v result of function int bResult //- if registered output value is different from given mode if ({mode} != {getfield /xgraphs outputValue}) //- set field for warning info widget setfield /xgraphs/addPlotForm/info4 \ title "Adding plots will remove all current plots" //- set result : mode is changed bResult = 1 //- else else //- erase field for warning info widget setfield /xgraphs/addPlotForm/info4 \ title "" //- set result : mode is same bResult = 0 end //- return result return {bResult} 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 xcell output str xcOutput = {getfield /xcell output} //- 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 the registered xcell output description str xcOutputDescription = {getfield /xcell outputDescription} //- get the registered xcell channel mode str xcChannelMode = {getfield /xcell channelMode} //- get xcell field for registering boundary element str xcBoundElement = {getfield /xcell boundElement} //- if registered output value is different from xcell 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 if flags say spiny Vm output elif (xcOutputFlags == 4) //- get the spine that gives messages to the element str spine = {getmsg {comp} -outgoing -destination 7} //- get tail of spine str spineTail = {getpath {spine} -tail} //- 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 //- give an informational message echo "Adding plot for "{comp}", " \ "source is '"{source}"', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {path}/{source} \ {xcOutputValue}} \ *{plotTitle} \ *{color} //- else inform the user 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 //- else if flags say excitatory channel output elif (xcOutputFlags == 3) //- get the spine that gives messages to the element str spine = {getmsg {comp} -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 str 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 //- give an informational message echo "Adding plot for "{comp}", " \ "source is '"{spineHead}{source}"', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {spineHead}{source} \ {xcOutputValue}} \ *{plotTitle} \ *{color} //- else if we can find a climbing fiber input elif ( {exists {comp}/climb} ) //- give an informational message echo "Adding plot for "{comp}", " \ "source is 'climb', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {comp}/climb \ {xcOutputValue}} \ *{plotTitle} \ *{color} //- else inform the user 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 //- else if flags say inhibitory channel output elif (xcOutputFlags == 7) //- if we can find a stellate cell if ( {exists {comp}/stell} ) //- give an informational message echo "Adding plot for "{comp}", " \ "source is 'stell', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {comp}/stell \ {xcOutputValue}} \ *{plotTitle} \ *{color} //- else if we can find a stellate 1 cell elif ( {exists {comp}/stell1} ) //- give an informational message echo "Adding plot for "{comp}", " \ "source is 'stell1', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {comp}/stell1 \ {xcOutputValue}} \ *{plotTitle} \ *{color} //- else if we can find a basket cell elif ( {exists {comp}/basket} ) //- give an informational message echo "Adding plot for "{comp}", " \ "source is 'basket', " \ "value is '"{xcOutputValue}"'." //- add message from solver to graph addmsg {path}/solve /xgraphs/graph \ PLOT \ {findsolvefield \ {path}/solve \ {comp}/basket \ {xcOutputValue}} \ *{plotTitle} \ *{color} //- else inform the user 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 //- 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: XGraphResetAxes /// /// DE: Reset the axes to registered values if any /// /// NO: This functions is obsoleted because of normalized boundary /// handling /// function XGraphResetAxes // call XGraphReset //callfunc "XGraphReset" //- get registered boundary element str bound = {getfield /xgraphs boundElement} //- set boundaries callfunc XGraphSetBoundaries {bound} end /// /// SH: XGraphCancelScales /// /// DE: Hide the set scales window /// function XGraphCancelScales //- hide the set scales window xhide /xgraphs/setscales end /// /// SH: XGraphSetScales /// /// DE: Set the scales as in the set scales window /// function XGraphSetScales //- set x min setfield /xgraphs/graph \ xmin {getfield /xgraphs/setscales/xmin value} //- set x max setfield /xgraphs/graph \ xmax {getfield /xgraphs/setscales/xmax value} //- set y min setfield /xgraphs/graph \ ymin {getfield /xgraphs/setscales/ymin value} //- set y max setfield /xgraphs/graph \ ymax {getfield /xgraphs/setscales/ymax value} //- hide the set scales window xhide /xgraphs/setscales end /// /// SH: XGraphUpdateScales /// /// DE: Update scales window with registered xgraph values /// Values come from xmin, xmax, ymin and ymax fields from xgraph /// function XGraphUpdateScales //- set x min value setfield /xgraphs/setscales/xmin \ value {getfield /xgraphs/graph xmin} //- set x max value setfield /xgraphs/setscales/xmax \ value {getfield /xgraphs/graph xmax} //- set y min value setfield /xgraphs/setscales/ymin \ value {getfield /xgraphs/graph ymin} //- set y max value setfield /xgraphs/setscales/ymax \ value {getfield /xgraphs/graph ymax} end /// /// SH: XGraphShowScales /// /// DE: Popup set scales window /// function XGraphShowScales //- update values for scales window XGraphUpdateScales //- pop up the scales form xshow /xgraphs/setscales end /// /// SH: XGraphHideAddPlot /// /// DE: Hide the add plot window /// Resets the xcell call back /// function XGraphHideAddPlot //- restore field for xcell script setfield /xcell/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 = {{cellpath} @ "/" @ {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 /xcell/draw/xcell1 script} //- set field for xcell script setfield /xcell/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) /// Sets the update clock to clock 8 /// function XGraphCreate //- create container form create xform /xgraphs [500, 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 {runtime / 1000} \ ymin -0.1 \ ymax 0.05 \ bg white \ XUnits "t (sec)" //- 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 a button to set the axes create xbutton scales \ -xgeom 0:last.right \ -ygeom 0:graph \ -wgeom 20% \ -title "Set scales" \ -script "XGraphShowScales" //- add a button to reset the axes create xbutton axes \ -xgeom 0:last.right \ -ygeom 0:graph \ -wgeom 20% \ -title "Reset axes" \ -script "XGraphResetAxes" //- 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 9 //- create a form for setting scales create xform setscales [600,150,300,210] //- make it the current element pushe ^ //- create label with header create xlabel heading \ -label "Axes limits" //- create x min dialog create xdialog xmin \ -title "X minimum : " //- create x max dialog create xdialog xmax \ -title "X maximum : " //- create y min dialog create xdialog ymin \ -title "Y minimum : " //- create y max dialog create xdialog ymax \ -title "Y maximum : " //- create done button create xbutton done \ -title "Done" \ -script "XGraphSetScales" //- create cancel button create xbutton cancel \ -title "Cancel" \ -script "XGraphCancelScales" //- pop previous element pope //- 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 Purkinje 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 name below :" create xdialog compartmentname \ -wgeom 100% \ -label "Compartment name 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 //- go to previous current 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 xcell output str xcOutput = {getfield /xcell output} //- 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 the registered xcell output description str xcOutputDescription = {getfield /xcell outputDescription} //- get the registered xcell channel mode str xcChannelMode = {getfield /xcell channelMode} //- get xcell field for registering boundary element str xcBoundElement = {getfield /xcell 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" //- else if output is channel with IGE elif (xcOutputFlags == 2) //- set title setfield /xgraphs/graph \ title {xcOutputValue} //- else if the output is excitatory channel with IGE elif (xcOutputFlags == 3) //- set title setfield /xgraphs/graph \ title {xcOutputValue} //- else if the output is spine comp. Vm elif (xcOutputFlags == 4) //- set title setfield /xgraphs/graph \ title {xcOutputSource}" spine "{xcOutputValue} //- else if the output is nernst E elif (xcOutputFlags == 5) //- set title setfield /xgraphs/graph \ title {xcOutputSource}" nernst potential" //- else if the output is Calcium concen Ca elif (xcOutputFlags == 6) //- set title setfield /xgraphs/graph \ title {xcOutputSource}" Calcium concentration" //- else if the output is inhibitory channel with IGE elif (xcOutputFlags == 7) //- set title setfield /xgraphs/graph \ title {xcOutputValue} 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 /// /// SH: XGraphSetBoundaries /// /// PA: bound.: boundary element /// /// RE: Success of operation /// /// DE: Set boundaries for the xgraph /// function XGraphSetBoundaries(bound) str bound //v result var int bResult //- if the boundary element exists if ( {exists {bound}} ) //- give diagnostics echo "Setting xgraph boundaries from "{bound} //- set the axes values setfield /xgraphs/graph \ xmin 0 \ xmax {runtime / 1000} \ ymin {getfield {bound} xgraphmin} \ ymax {getfield {bound} xgraphmax} //- update scales in widgets XGraphUpdateScales //- set result : ok bResult = 1 //- else else //- set result : failure bResult = 0 end //- return result return {bResult} end /// /// SH: XGraphSwitchChanMode /// /// PA: state.: 0 for absolute chanmode (chanmode 4) /// 1 for normalized chanmode (chanmode 5) /// /// DE: Switch between normalized and absolute channel mode /// Sets the min/max color values for the xgraph display /// function XGraphSwitchChanMode(state) int state //- get name for boundary element str bound = {BoundElementName \ {getfield /xgraphs outputSource} \ {getfield /xgraphs outputValue} \ {iChanMode}} //- set new boundaries from element callfunc XGraphSetBoundaries {bound} //- set field for boundaries setfield /xgraphs \ boundElement {bound} end end