//genesis // // $Id: actions.g 1.13.1.1.1.5 Thu, 04 Apr 2002 11:55:56 +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 //' ////////////////////////////////////////////////////////////////////////////// // actions.g : parallel fiber and climbing fiber actions int include_actions if ( {include_actions} == 0 ) include_actions = 1 include mapping.g //v climbing step delay while climbing fiber is firing int climbingDelaySteps = 0 //v climbing fiber active synapse int climbingSynapse = 0 /// /// SH: ActionBasket /// /// PA: level.: level of activation /// /// DE: Simulate a basket axon firing /// function ActionBasket(level) float level //- if the state is inactive if ({getfield {cellpath}/basket_presyn state} == "INACT") //- set the level of activation setfield {cellpath}/basket_presyn z {level} //- remember we the basket axon is active setfield {cellpath}/basket_presyn \ state "ACT" //- else the state is inactive else //- reset the level of activation setfield {cellpath}/basket_presyn z 0 //- remember we are inactive setfield {cellpath}/basket_presyn \ state "INACT" //- stop the action setfield /actions/basket \ command "" end end /// /// SH: ActionBasketInit /// /// PA: path..: path to contain action (ending in '/') /// /// DE: Initialize basket axons for firing /// function ActionBasketInit(path) str path //- create a script object create script_out {path}basket //- make basket axon presynaptic elements //- and add messages to appropriate channels create neutral {cellpath}/basket_presyn disable ^ setfield ^ z 0 addmsg {cellpath}/basket_presyn {cellpath}/#[]/basket \ ACTIVATION z //- add status field to the element addfield ^ \ state -description "Status of basket axon" //- initialize status setfield ^ \ state "INACT" end /// /// SH: ActionBasketStart /// /// PA: level.: level of activation /// /// DE: Fire basket axon /// function ActionBasketStart(level) float level //- set field in script object setfield /actions/basket \ command "ActionBasket "{level / dt} end /// /// SH: ActionClimbing /// /// DE: Simulate a climbing fiber firing /// function ActionClimbing(strength) float strength //- decrement the delay climbingDelaySteps = {climbingDelaySteps - 1} //- if there is no synapse active if (climbingSynapse == 0) //- activate the first climbing fiber synapse setfield {cellpath}/climb_presyn1 z {strength} //- set active synapse climbingSynapse = 1 //- if the first synapse is active elif (climbingSynapse == 1) //- if we are coming from the first synapse if (climbingDelaySteps == -1) //- unset activation of first synapse setfield {cellpath}/climb_presyn1 z 0 //- set delay climbingDelaySteps = {delaysteps} //- if we reached the next synapse elif (climbingDelaySteps == 0) //- activate second climbing fiber synapse setfield {cellpath}/climb_presyn2 z {strength} //- set active synapse climbingSynapse = 2 end //- if the second synapse is active elif (climbingSynapse == 2) //- check if we are coming from the first synapse if (climbingDelaySteps == -1) //- unset activation of second synapse setfield {cellpath}/climb_presyn2 z 0 //- set delay climbingDelaySteps = {delaysteps} //- if we reached the next synapse elif (climbingDelaySteps == 0) //- activate third climbing fiber synapse setfield {cellpath}/climb_presyn3 z {strength} //- set active synapse climbingSynapse = 3 end //- if the third synapse is active elif (climbingSynapse == 3) //- check if we are coming from the first synapse if (climbingDelaySteps == -1) //- unset activation of third synapse setfield {cellpath}/climb_presyn3 z 0 //- set delay climbingDelaySteps = {delaysteps} //- if we reached the next synapse elif (climbingDelaySteps == 0) //- activate fourth climbing fiber synapse setfield {cellpath}/climb_presyn4 z {strength} //- set active synapse climbingSynapse = 4 end //- if the fourth synapse is active elif (climbingSynapse == 4) //- check if we are coming from the first synapse if (climbingDelaySteps == -1) //- unset activation of fourth synapse setfield {cellpath}/climb_presyn4 z 0 //- set delay climbingDelaySteps = {delaysteps} //- if we reached the next synapse elif (climbingDelaySteps == 0) //- activate fifth climbing fiber synapse setfield {cellpath}/climb_presyn5 z {strength} //- set active synapse climbingSynapse = 5 end //- if the fifth synapse is active elif (climbingSynapse == 5) //- check if we are coming from the first synapse if (climbingDelaySteps == -1) //- unset activation of fourth synapse setfield {cellpath}/climb_presyn5 z 0 //- set delay climbingDelaySteps = {delaysteps} //- if we reached the next synapse (but there is none) elif (climbingDelaySteps == 0) //- initialize delay climbingDelaySteps = 1 //- unset active synapse climbingSynapse = 0 //- stop the action setfield /actions/climbing \ command "" end end end /// /// SH: ActionClimbingInit /// /// PA: path..: path to contain action (ending in '/') /// /// DE: Initialize climbing fiber messages /// function ActionClimbingInit(path) str path //- create a script object create script_out {path}climbing //- initialize number of delay steps climbingDelaySteps = 1 //- make climbing fiber presynaptic elements //- and add messages to appropriate channels create neutral {cellpath}/climb_presyn1 disable {cellpath}/climb_presyn1 setfield {cellpath}/climb_presyn1 z 0 addmsg {cellpath}/climb_presyn1 {cellpath}/main[0-2]/climb \ ACTIVATION z create neutral {cellpath}/climb_presyn2 disable {cellpath}/climb_presyn2 setfield {cellpath}/climb_presyn2 z 0 addmsg {cellpath}/climb_presyn2 {cellpath}/main[3-8]/climb \ ACTIVATION z create neutral {cellpath}/climb_presyn3 disable {cellpath}/climb_presyn3 setfield {cellpath}/climb_presyn3 z 0 addmsg {cellpath}/climb_presyn3 {cellpath}/br1[0-6]/climb \ ACTIVATION z addmsg {cellpath}/climb_presyn3 {cellpath}/br2[0-6]/climb \ ACTIVATION z create neutral {cellpath}/climb_presyn4 disable {cellpath}/climb_presyn4 setfield {cellpath}/climb_presyn4 z 0 addmsg {cellpath}/climb_presyn4 {cellpath}/br1[7-12]/climb \ ACTIVATION z addmsg {cellpath}/climb_presyn4 {cellpath}/br2[7-12]/climb \ ACTIVATION z addmsg {cellpath}/climb_presyn4 {cellpath}/br3[0-8]/climb \ ACTIVATION z create neutral {cellpath}/climb_presyn5 disable {cellpath}/climb_presyn5 setfield {cellpath}/climb_presyn5 z 0 addmsg {cellpath}/climb_presyn5 {cellpath}/br1[13-20]/climb \ ACTIVATION z addmsg {cellpath}/climb_presyn5 {cellpath}/br2[13-21]/climb \ ACTIVATION z addmsg {cellpath}/climb_presyn5 {cellpath}/br3[9-16]/climb \ ACTIVATION z end /// /// SH: ActionClimbingStart /// /// DE: Fire climbing fiber /// function ActionClimbingStart(strength) float strength //- set field in script object setfield /actions/climbing \ command "ActionClimbing "{strength / dt} end /// /// SH: ActionIClamp /// /// PA: elSource.: source element /// fiSource.: source field /// elTarget.: target element /// fiTarget.: target field /// /// DE: Simulate current injection /// /// Copies elSource->fiSource to elTarget->fiTarget. /// function ActionIClamp(elSource,fiSource,elTarget,fiTarget) str elSource str fiSource str elTarget str fiTarget //echo "current clamp : "{elTarget}"."{fiTarget}" = "{getfield {elSource} {fiSource}} //- set current injection as given in parameters setfield {elTarget} {fiTarget} {getfield {elSource} {fiSource}} end /// /// SH: ActionIClampSetGenerator /// /// PA: path..: path of parent to contain the object /// /// DE: Set the generator settings to respect the global variables /// vars : {iClampCurrentBase} /// {iClampCurrentOffset} /// {iClampCurrentWidth} /// {iClampCurrentPeriod} /// {iClampCurrentTarget} /// function ActionIClampSetGenerator(path) str path //- set fields of generator setfield {path}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} \ target {iClampCurrentTarget} \ delay1 0 \ level2 0 \ width2 0 \ trig_mode 0 end /// /// SH: ActionIClampCreateGenerator /// /// PA: path..: path of parent to contain the object /// /// DE: create the pulse generator for current injection experiments /// function ActionIClampCreateGenerator(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 sensible setfield ^ ctecurrent 2.0e-9 //- add a field for current target element addfield ^ target \ -description "Target element" //- set this field to something sensible setfield ^ target "soma" //- set the fields for current clamp to registered globals ActionIClampSetGenerator {path} //- go to previous current element pope end /// /// SH: ActionIClampInit /// /// PA: path..: path to contain action (ending in '/') /// /// DE: Create current injection elements and messages /// function ActionIClampInit(path) str path //- create a script object create script_out {path}iClamp //- create elements ActionIClampCreateGenerator {path}iClamp/ end /// /// SH: ActionIClampStart /// /// PA: mode..: 0 : constant current /// 1 : current pulses /// /// DE: Start injection of current with given parameters /// /// NO: This setup interferes with settings.g/UpdateFrequencies, see notes /// overthere to understand. /// function ActionIClampStart(mode) int mode //- if pulse train requested if (mode == 1) //- give some info echo "Switching to current pulses" //- set command for script object //! two commands : for hsolve and original element setfield /actions/iClamp \ command {"ActionIClamp " \ @ "/actions/iClamp/current " \ @ "output " \ @ {cellpath} \ @ "/solve " \ @ {findsolvefield \ {cellpath}/solve \ {getfield \ /actions/iClamp/current \ target} \ inject} \ @ " ; " \ @ "ActionIClamp " \ @ "/actions/iClamp/current " \ @ "output " \ @ {cellpath} \ @ "/" \ @ {getfield \ /actions/iClamp/current \ target} \ @ " inject" \ } //- if constant current requested elif (mode == 0) //- give some info echo "Switching to constant current" //- set command for script object //! two commands : for hsolve and original element setfield /actions/iClamp \ command {"ActionIClamp " \ @ "/actions/iClamp/current " \ @ "ctecurrent " \ @ {cellpath} \ @ "/solve " \ @ {findsolvefield \ {cellpath}/solve \ {getfield \ /actions/iClamp/current \ target} \ inject} \ @ " ; " \ @ "ActionIClamp " \ @ "/actions/iClamp/current " \ @ "ctecurrent " \ @ {cellpath} \ @ "/" \ @ {getfield \ /actions/iClamp/current \ target} \ @ " inject" \ } //- else (illegal mode) else //- give diagnostics echo "Somebody messed up the code" end //- reset the pulse generator call /actions/iClamp/current RESET end /// /// SH: ActionIClampStop /// /// DE: Stop ongoing current injection /// function ActionIClampStop //- set field in script object setfield /actions/iClamp \ command "" //- clear inject field of target compartment setfield \ {cellpath}/solve \ {findsolvefield \ {cellpath}/solve \ {getfield \ /actions/iClamp/current \ target} \ inject} \ 0 setfield {getfield \ /actions/iClamp/current \ target} \ inject 0 //! in earlier versions of the tutorial : //! after these commands the original soma->inject field can still //! be non-zero. Take care : hsolve uses that field to initialize its //! own compartment injection fields (e.g. during reset). end /// /// SH: ActionParallelCreateBigDistr /// /// DE: Create presynaptic neutral elements for distributed parallel activation /// Within {cellpath} neutral elements are created for distributed /// synchronous activation of parallel fibers /// function ActionParallelCreateBigDistr // 100 : 3,6,9,12 + 14 // 50 : 5 + 28 // 25 : 11 + 56 //- create neutral elements create neutral {cellpath}/ds100_synchro[0] create neutral {cellpath}/ds100_synchro[1] create neutral {cellpath}/ds100_synchro[2] create neutral {cellpath}/ds100_synchro[3] create neutral {cellpath}/ds050_synchro create neutral {cellpath}/ds025_synchro //- disable the elements from simulation disable {cellpath}/ds100_synchro[0] disable {cellpath}/ds100_synchro[1] disable {cellpath}/ds100_synchro[2] disable {cellpath}/ds100_synchro[3] disable {cellpath}/ds050_synchro disable {cellpath}/ds025_synchro //- set messaged value to zero setfield {cellpath}/ds100_synchro[0] \ z 0 setfield {cellpath}/ds100_synchro[1] \ z 0 setfield {cellpath}/ds100_synchro[2] \ z 0 setfield {cellpath}/ds100_synchro[3] \ z 0 setfield {cellpath}/ds050_synchro \ z 0 setfield {cellpath}/ds025_synchro \ z 0 //- add messages to elements int i for (i = 0; i < 100; i = i + 1) // calculate indices int i1 = {3+i*14} int i2 = {6+i*14} int i3 = {9+i*14} int i4 = {12+i*14} // genesis 2.1 // i1 = 0 // i2 = 0 // i3 = 0 // i4 = 0 addmsg {cellpath}/ds100_synchro[0] \ {cellpath}/spine[{i1}]/head[{i1}]/par \ ACTIVATION z addmsg {cellpath}/ds100_synchro[1] \ {cellpath}/spine[{i2}]/head[{i2}]/par \ ACTIVATION z addmsg {cellpath}/ds100_synchro[2] \ {cellpath}/spine[{i3}]/head[{i3}]/par \ ACTIVATION z addmsg {cellpath}/ds100_synchro[3] \ {cellpath}/spine[{i4}]/head[{i4}]/par \ ACTIVATION z if (i % 2 == 0) int i5 = {5+i*14} // genesis 2.1 // i5 = 0 addmsg {cellpath}/ds050_synchro \ {cellpath}/spine[{i5}]/head[{i5}]/par \ ACTIVATION z if (i % 4 == 0) int i6 = {11+i*14} // genesis 2.1 // i6 = 0 addmsg {cellpath}/ds025_synchro \ {cellpath}/spine[{i6}]/head[{i6}]/par \ ACTIVATION z end end end end /// /// SH: ActionParallelCreateSmallDistr /// /// DE: Create distributed activation msgs for small cell /// function ActionParallelCreateSmallDistr // 10 : 3,6,9,12 + 14 // 5 : 5 + 28 // 3 : 11 + 56 //- create neutral elements create neutral {cellpath}/ds010_synchro[0] create neutral {cellpath}/ds010_synchro[1] create neutral {cellpath}/ds010_synchro[2] create neutral {cellpath}/ds010_synchro[3] create neutral {cellpath}/ds005_synchro create neutral {cellpath}/ds003_synchro //- disable the elements from simulation disable {cellpath}/ds010_synchro[0] disable {cellpath}/ds010_synchro[1] disable {cellpath}/ds010_synchro[2] disable {cellpath}/ds010_synchro[3] disable {cellpath}/ds005_synchro disable {cellpath}/ds003_synchro //- set messaged value to zero setfield {cellpath}/ds010_synchro[0] \ z 0 setfield {cellpath}/ds010_synchro[1] \ z 0 setfield {cellpath}/ds010_synchro[2] \ z 0 setfield {cellpath}/ds010_synchro[3] \ z 0 setfield {cellpath}/ds005_synchro \ z 0 setfield {cellpath}/ds003_synchro \ z 0 //- add messages to elements int i for (i = 0; i < 10; i = i + 1) // calculate indices int i1 = {3+i*14} int i2 = {6+i*14} int i3 = {9+i*14} int i4 = {12+i*14} // genesis 2.1 // i1 = 0 // i2 = 0 // i3 = 0 // i4 = 0 addmsg {cellpath}/ds010_synchro[0] \ {cellpath}/spine[{i1}]/head[{i1}]/par \ ACTIVATION z addmsg {cellpath}/ds010_synchro[1] \ {cellpath}/spine[{i2}]/head[{i2}]/par \ ACTIVATION z addmsg {cellpath}/ds010_synchro[2] \ {cellpath}/spine[{i3}]/head[{i3}]/par \ ACTIVATION z addmsg {cellpath}/ds010_synchro[3] \ {cellpath}/spine[{i4}]/head[{i4}]/par \ ACTIVATION z if (i % 2 == 0) int i5 = {5+i*14} // genesis 2.1 // i5 = 0 addmsg {cellpath}/ds005_synchro \ {cellpath}/spine[{i5}]/head[{i5}]/par \ ACTIVATION z if (i % 4 == 0) int i6 = {11+i*14} // genesis 2.1 // i6 = 0 addmsg {cellpath}/ds003_synchro \ {cellpath}/spine[{i6}]/head[{i6}]/par \ ACTIVATION z end end end end /// /// SH: ActionParallelCreateDistr /// /// DE: Create presynaptic neutral elements for distributed parallel activation /// Within {cellpath} neutral elements are created for distributed /// synchronous activation of parallel fibers /// /// NO: Expanding a wildcard list with as result a very long string gives a /// segmentation fault. So we must use an entry in the config file to /// determine the number of spines in the read cell. /// function ActionParallelCreateDistr //- create status element create neutral {cellpath}/dssts_synchro //- disable the element from simulation disable {cellpath}/dssts_synchro //- add field for status addfield {cellpath}/dssts_synchro \ state -description "Status for distributed firing" //- default status is inactive setfield {cellpath}/dssts_synchro \ state "INACT" //- add field for number of firings addfield {cellpath}/dssts_synchro \ iFirings -description "Number of synchro activated synapses" //- determine number of spines // following line gives a segmentation fault //int iSpines = {NumberOfElements {cellpath}/spine} // that's why the number of spines is set up in the config int iSpines = {getfield /config iSpines} //- give diagnostics echo Setting up distribution for {iSpines} spines //- if we are working with the big model if (iSpines == 1474) //- setup distributions for big model ActionParallelCreateBigDistr //- if we are working with the small model elif (iSpines == 142) //- setup distributions for small model ActionParallelCreateSmallDistr end end /// /// SH: ActionParallelCreateLocal /// /// DE: Create presynaptic neutral elements for local parallel activation /// Searches /mappings/ for dendrites that need simultanous activation /// For every dendrite branch 20 messages are set up (so we need at least /// 20 spines per mapping). /// The neutral elements are created within {cellpath} and are named to /// the dendrite branchlets they activate. /// function ActionParallelCreateLocal //- loop over all elements that have been mapped str mappedDend foreach mappedDend ( {el /mappings/#} ) //- cut of path to element str mappedDendTail = {getpath {mappedDend} -tail} //- get number of synapses on this branch int synapses = {getfield {mappedDend} synapseCount} //- determine synapse interval float interval = {synapses / 20.0} //- create a neutral presynaptic element create neutral {cellpath}/{mappedDendTail}_synchro //- disable the element from calculations disable ^ //- set messaged value to zero setfield {cellpath}/{mappedDendTail}_synchro z 0 //- initialize synapse index float index = {getfield {mappedDend} synapseBegin} //- loop over required inputs (total of 20) int i for (i = 0; i < 20; i = i + 1) //- calculate rounded index int k = {round {index}} // genesis 2.1 // k = 0 //- setup message to spine with calculated index addmsg {cellpath}/{mappedDendTail}_synchro \ {cellpath}/spine[{k}]/head[{k}]/par \ ACTIVATION z //- increment the index with interval index = {index + interval} end end end /// /// SH: ActionParallelInit /// /// PA: path..: path to contain action (ending in '/') /// /// DE: Initialize parallel fiber synchronous firing action /// Initializes local synchronous firing /// Initializes distribute synchronous firing /// function ActionParallelInit(path) str path //- create a script object create script_out {path}parallel //- create mapping for the purkinje cell MappingCreate {cellpath} //- create elements for local activation ActionParallelCreateLocal //- create elements for distributed activation ActionParallelCreateDistr end /// /// SH: ActionParallelDistr /// /// PA: number: number of synapses to activate /// level.: level of activation /// /// RE: number of activated parallel fibers /// /// DE: Simulate distributed synchro parallel fiber firing /// Number of parallel fibers is rounded to 25 and has a maximum of /// 475 for the big model, 48 for the small model. /// function ActionParallelDistr(number,level) int number float level //v number of parallel firings int iFirings //echo ActionParallelDistr {number} {level} //- if state was inactivating if ( {getfield {cellpath}/dssts_synchro state} == "INACT") //- set state : activating setfield {cellpath}/dssts_synchro \ state "ACT" //- retrieve number of spines int iSpines = {getfield /config iSpines} //- for the big model if (iSpines == 1474) //- if number of spines is bigger than 475 if (number > 475) //- set number to 475 number = 475 end //- determine rest 100 int rest100 = {number % 100} //- determine times 100 int times100 = {{number - rest100} / 100} //- determine times 50 int times50 = {rest100 >= 50} //- determine times 25 int times25 = {rest100 - times50 * 50 >= 25} //- loop over number of 100 times int i for (i = 0; i < times100; i = i + 1) //- activate the synchro element setfield {cellpath}/ds100_synchro[{i}] \ z {level} end //- if we should activate the 50 element if (times50) //- activate the 50 element setfield {cellpath}/ds050_synchro \ z {level} end //- if we should activate the 25 element if (times25) //- activate the 25 element setfield {cellpath}/ds025_synchro \ z {level} end //- set number of parallel firings iFirings = {times100 * 100 \ + times50 * 50 \ + times25 * 25} //- for the small model elif (iSpines == 142) //- if number is bigger than 48 if (number > 48) //- set number to 48 number = 48 end //- determine rest 10 int rest10 = {number % 10} //- determine times 10 int times10 = {{number - rest10} / 10} //- determine times 5 int times5 = {rest10 >= 5} //- determine times 3 int times3 = {rest10 - times5 * 5 >= 3} //- loop over number of 10 times int i for (i = 0; i < times10; i = i + 1) //- activate the synchro element setfield {cellpath}/ds010_synchro[{i}] \ z {level} end //- if we should activate the 5 element if (times5) //- activate the 5 element setfield {cellpath}/ds005_synchro \ z {level} end //- if we should activate the 3 element if (times3) //- activate the 3 element setfield {cellpath}/ds003_synchro \ z {level} end //- set number of parallel firings iFirings = {times10 * 10 + times5 * 5 + times3 * 3} end //- else we are inactivating else //- set status to inactive setfield {cellpath}/dssts_synchro \ state "INACT" //- loop over all distr synchro elements str synchro foreach synchro ( {el {cellpath}/ds#_synchro[]} ) //echo clearing {synchro} //- clear messaged value setfield {synchro} z 0 end //- reset the script field setfield /actions/parallel \ command "" //- set number of parallel firings iFirings = 0 end //- set field in script object setfield {cellpath}/dssts_synchro \ iFirings {iFirings} //- return result return {iFirings} end /// /// SH: ActionParallelLocal /// /// PA: branch: branch for local activation /// level.: level of activation /// /// DE: Simulate local synchro parallel fiber firing /// function ActionParallelLocal(branch,level) str branch float level //- if we have no activation level if ({getfield {cellpath}/{branch}_synchro z} == 0) //- set activation level setfield {cellpath}/{branch}_synchro z {level} //! here we could retreive the number of synapses from a field //! from the branch's synchro element. //! The field should be set with a value that comes from the //! mapping's elements/procedures //- else (activation level is set on the previous time step) else //- reset the activation level setfield {cellpath}/{branch}_synchro z 0 //- reset the script field setfield /actions/parallel \ command "" //! set number of activated synapses to zero end //! set number of activated synapses to make it global end /// /// SH: ActionParallelStart /// /// PA: local.: 0 means distributed mode /// 1 means local mode /// branch: branch for local activation /// number: number of synapses to activate /// level.: level of activation /// /// DE: Start local synchro firing of parallel fibers /// function ActionParallelStart(local,branch,number,level) int local str branch int number float level //- if local mode is selected if (local) // give a discriptive message echo "Firing 20 synchronous parallel fibers on branch "{branch} //- set field of script object setfield /actions/parallel \ command "ActionParallelLocal "{branch}" "{level / dt} //- else distributed mode is asked else //! of course this does not work... //int iFirings = {getfield {cellpath}/dssts_synchro iFirings} //! It works if ActionParallelDistr is executed exactly once //! but I do not know how to figure this out in this proc to //! get the number of firings. //! As a result the code to calc. number of firings is //! replicated here. //- if number of spines is bigger than 475 if (number > 475) //- set number to 475 number = 475 end //- determine rest 100 int rest100 = {number % 100} //- determine times 100 int times100 = {{number - rest100} / 100} //- determine times 50 int times50 = {rest100 >= 50} //- determine times 25 int times25 = {rest100 - times50 * 50 >= 25} //- set number of parallel firings int iFirings = {times100 * 100 + times50 * 50 + times25 * 25} //- give a discriptive message echo "Firing "{iFirings}" synchronous parallel fibers" //- set field of script object setfield /actions/parallel \ command "ActionParallelDistr "{number}" "{level / dt} end end /// /// SH: ActionsInit /// /// DE: Initialize interactive actions module /// Initializes messages for climbing fiber and for synchronous firing /// of parallel fibers. /// function ActionsInit //- create a container create neutral /actions //- initialize basket axons ActionBasketInit /actions/ //- initialize climbing fiber synapses ActionClimbingInit /actions/ //- initialize current clamp ActionIClampInit /actions/ //- initialize synchronous parallel fiber ActionParallelInit /actions/ end end