123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <neuroml xmlns="http://www.neuroml.org/schema/neuroml2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.neuroml.org/schema/neuroml2 https://raw.github.com/NeuroML/NeuroML2/development/Schemas/NeuroML2/NeuroML_v2.3.xsd" id="GfluctDoc">
- <!-- Note that order of different LEMS types matters for validation, since the schema defines what order they should appear in -->
- <!--
- Fluctuating conductance model for synaptic bombardment
- ======================================================
- THEORY
- Synaptic bombardment is represented by a stochastic model containing
- two fluctuating conductances g_e(t) and g_i(t) descibed by:
- Isyn = g_e(t) * [V - E_e] + g_i(t) * [V - E_i]
- d g_e / dt = -(g_e - g_e0) / tau_e + sqrt(D_e) * Ft
- d g_i / dt = -(g_i - g_i0) / tau_i + sqrt(D_i) * Ft
- where E_e, E_i are the reversal potentials, g_e0, g_i0 are the average
- conductances, tau_e, tau_i are time constants, D_e, D_i are noise diffusion
- coefficients and Ft is a gaussian white noise of unit standard deviation.
- g_e and g_i are described by an Ornstein-Uhlenbeck (OU) stochastic process
- where tau_e and tau_i represent the "correlation" (if tau_e and tau_i are
- zero, g_e and g_i are white noise). The estimation of OU parameters can
- be made from the power spectrum:
- S(w) = 2 * D * tau^2 / (1 + w^2 * tau^2)
- and the diffusion coeffient D is estimated from the variance:
- D = 2 * sigma^2 / tau
- NUMERICAL RESOLUTION
- The numerical scheme for integration of OU processes takes advantage
- of the fact that these processes are gaussian, which led to an exact
- update rule independent of the time step dt (see Gillespie DT, Am J Phys
- 64: 225, 1996):
- x(t+dt) = x(t) * exp(-dt/tau) + A * N(0,1)
- where A = sqrt( D*tau/2 * (1-exp(-2*dt/tau)) ) and N(0,1) is a normal
- random number (avg=0, sigma=1)
- IMPLEMENTATION
- This mechanism is implemented as a nonspecific current defined as a
- point process.
- PARAMETERS
- The mechanism takes the following parameters:
- E_e = 0 (mV) : reversal potential of excitatory conductance
- E_i = -75 (mV) : reversal potential of inhibitory conductance
- g_e0 = 0.0121 (umho) : average excitatory conductance
- g_i0 = 0.0573 (umho) : average inhibitory conductance
- std_e = 0.0030 (umho) : standard dev of excitatory conductance
- std_i = 0.0066 (umho) : standard dev of inhibitory conductance
- tau_e = 2.728 (ms) : time constant of excitatory conductance
- tau_i = 10.49 (ms) : time constant of inhibitory conductance
- Gfluct2: conductance cannot be negative
- REFERENCE
- Destexhe, A., Rudolph, M., Fellous, J-M. and Sejnowski, T.J.
- Fluctuating synaptic conductances recreate in-vivo-like activity in
- neocortical neurons. Neuroscience 107: 13-24 (2001).
- (electronic copy available at http://cns.iaf.cnrs-gif.fr)
- A. Destexhe, 1999
- Reference:
- https://doi.org/10.1016/S0306-4522(01)00344-X
- Original mod source: https://modeldb.science/8115
- -->
- <ComponentType name="Gfluct"
- extends="baseVoltageDepPointCurrent"
- description="Fluctuating conductance model for synaptic bombardment: Destexhe et al 2001"
- >
- <Parameter name="start" dimension="time" description="start time"/>
- <Parameter name="stop" dimension="time" description="stop time"/>
- <Parameter name="dt" dimension="time" description="simulation time step"/>
- <Parameter name="E_e" dimension="voltage" description="Excitatory conductance reversal potential"/>
- <Parameter name="E_i" dimension="voltage" description="Inhibitory conductance reversal potential"/>
- <Parameter name="g_e0" dimension="conductance" description="Average excitatory conductance"/>
- <Parameter name="g_i0" dimension="conductance" description="Average inhibitory conductance"/>
- <Parameter name="std_e" dimension="conductance" description="Std dev of excitatory conductance"/>
- <Parameter name="std_i" dimension="conductance" description="Std dev of inhibitory conductance"/>
- <Parameter name="tau_e" dimension="time" description="Time constant of excitatory conductance"/>
- <Parameter name="tau_i" dimension="time" description="Time constant of inhibitory conductance"/>
- <Constant name="zeroms" value="0 ms" dimension="time" />
- <EventPort name="in" direction="in" description="Note this is not used here. Will be removed in future"/>
- <DerivedParameter name="exp_e" dimension="none" value="exp(-dt/tau_e)" />
- <DerivedParameter name="amp_e" dimension="conductance" value="std_e * sqrt((1 - exp(-2 * (dt/tau_e))))" />
- <DerivedParameter name="exp_i" dimension="none" value="exp(-dt/tau_i)" />
- <DerivedParameter name="amp_i" dimension="conductance" value="std_i * sqrt((1 - exp(-2 * (dt/tau_i))))" />
- <Exposure name="g_e" dimension="conductance" />
- <Exposure name="g_i" dimension="conductance" />
- <Exposure name="g_e1" dimension="conductance" />
- <Exposure name="g_i1" dimension="conductance" />
- <Exposure name="i" dimension="current" />
- <Dynamics>
- <!-- total conductances -->
- <StateVariable name="g_e" exposure="g_e" dimension="conductance" />
- <StateVariable name="g_i" exposure="g_i" dimension="conductance" />
- <!-- fluctuating conductances -->
- <StateVariable name="g_e1" exposure="g_e1" dimension="conductance" />
- <StateVariable name="g_i1" exposure="g_i1" dimension="conductance" />
- <!-- track old value of g_e1: LEMS doesn't seem to like it if the same variable is used -->
- <StateVariable name="g_e1_old" dimension="conductance" />
- <StateVariable name="g_i1_old" dimension="conductance" />
- <StateVariable name="i" exposure="i" dimension="current" />
- <StateVariable name="r1" dimension="none" />
- <StateVariable name="r2" dimension="none" />
- <StateVariable name="randn" dimension="none" />
- <OnEvent port="in"><!--TODO: remove, see above...
- <StateAssignment variable="i" value="0"/>-->
- </OnEvent>
- <!-- required ? -->
- <OnStart>
- <StateAssignment variable="i" value="0"/>
- <StateAssignment variable="g_e" value="0"/>
- <StateAssignment variable="g_i" value="0"/>
- <StateAssignment variable="g_e1" value="0" />
- <StateAssignment variable="g_e1_old" value="0" />
- <StateAssignment variable="g_i1_old" value="0" />
- </OnStart>
- <!-- before start -->
- <OnCondition test="t .lt. start">
- <StateAssignment variable="i" value="0"/>
- <StateAssignment variable="g_e" value="0"/>
- <StateAssignment variable="g_i" value="0"/>
- <StateAssignment variable="g_e1" value="0" />
- <StateAssignment variable="g_i1" value="0" />
- <StateAssignment variable="g_e1_old" value="0" />
- <StateAssignment variable="g_i1_old" value="0" />
- </OnCondition>
- <!-- generate gaussian random number -->
- <OnCondition test="t .geq. start .and. t.lt. stop">
- <StateAssignment variable="r1" value="random(1)"/>
- <StateAssignment variable="r2" value="random(1)"/>
- <StateAssignment variable="randn" value="sqrt(-2*log(r1))*cos(2*3.14159265359*r2)"/>
- </OnCondition>
- <!-- oup()-->
- <OnCondition test="(t .geq. start .and. t .lt. stop) .and. (tau_e .neq. zeroms)" >
- <StateAssignment variable="g_e1" value="(exp_e * g_e1_old) + (amp_e * randn)" />
- <StateAssignment variable="g_e1_old" value="g_e1" />
- </OnCondition>
- <OnCondition test="(t .geq. start .and. t .lt. stop) .and. (tau_i .neq. zeroms)" >
- <StateAssignment variable="g_i1" value="(exp_i * g_i1_old) + (amp_i * randn)" />
- <StateAssignment variable="g_i1_old" value="g_i1" />
- </OnCondition>
- <OnCondition test="(t .geq. start .and. t .lt. stop) .and. (tau_e .eq. zeroms)" >
- <StateAssignment variable="g_e1" value="std_e * randn" />
- </OnCondition>
- <OnCondition test="(t .geq. start .and. t .lt. stop) .and. (tau_i .eq. zeroms)" >
- <StateAssignment variable="g_i1" value="std_i * randn" />
- </OnCondition>
- <OnCondition test="t .geq. start .and. t .lt. stop">
- <StateAssignment variable="g_e" value="g_e0 + g_e1" />
- <StateAssignment variable="g_i" value="g_i0 + g_i1" />
- </OnCondition>
- <OnCondition test="g_e .lt. 0">
- <StateAssignment variable="g_e" value="0" />
- </OnCondition>
- <OnCondition test="g_i .lt. 0">
- <StateAssignment variable="g_i" value="0" />
- </OnCondition>
- <OnCondition test="t .geq. start .and. t .lt. stop">
- <StateAssignment variable="i" value="-1 * g_e * (v - E_e) - g_i * (v - E_i)" />
- </OnCondition>
- <!-- after end -->
- <OnCondition test="t .geq. stop">
- <StateAssignment variable="i" value="0"/>
- <StateAssignment variable="g_e" value="0"/>
- <StateAssignment variable="g_i" value="0"/>
- <StateAssignment variable="g_e1" value="0" />
- <StateAssignment variable="g_i1" value="0" />
- </OnCondition>
- </Dynamics>
- </ComponentType>
- </neuroml>
|