Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Destexhe 2001 Gfluct OU conductance based input source, tests, notebook showing conductances and distributions #9

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions NeuroML2/.test.gfluct.jnml.omt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Script for running automated tests on OSB using Travis-CI, see https://github.com/OpenSourceBrain/osb-model-validation

target: LEMS_Gfluct_test.xml
engine: jNeuroML

5 changes: 5 additions & 0 deletions NeuroML2/.test.gfluct.jnmlnrn.omt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Script for running automated tests on OSB using Travis-CI, see https://github.com/OpenSourceBrain/osb-model-validation

target: LEMS_Gfluct_test.xml
engine: jNeuroML_NEURON

223 changes: 223 additions & 0 deletions NeuroML2/Gfluct.nml
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
<?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>
110 changes: 110 additions & 0 deletions NeuroML2/LEMS_Gfluct_test.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<Lems>

<!-- Specify which component to run -->
<Target component="simnet1"/>

<!-- Include core NeuroML2 ComponentType definitions -->
<Include file="PyNN.xml"/>
<Include file="Cells.xml"/>
<Include file="Networks.xml"/>
<Include file="Simulation.xml"/>


<Include file="Gfluct.nml"/>


<IF_curr_exp id="IF_curr_exp" cm="10.0" i_offset="0" tau_m="20.0" tau_refrac="5.0"
tau_syn_E="0.5" tau_syn_I="0.5" v_init="-65" v_reset="-65.0" v_rest="-65.0" v_thresh="-55.0"/>


<Gfluct id="both" start="500ms" stop="2500ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0121 uS" g_i0="0.0573 uS" std_e="0.0030 uS" std_i="0.0066 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>
<Gfluct id="only_e" start="500ms" stop="2500ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0121 uS" g_i0="0.0 uS" std_e="0.0030 uS" std_i="0.00 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>
<Gfluct id="only_i" start="500ms" stop="2500ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0 uS" g_i0="0.0573 uS" std_e="0.00 uS" std_i="0.0066 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>
<Gfluct id="steady_e" start="500ms" stop="2500ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0121 uS" g_i0="0.0 uS" std_e="0.00 uS" std_i="0.00 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>
<Gfluct id="steady_i" start="500ms" stop="2500ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0 uS" g_i0="0.0573 uS" std_e="0.00 uS" std_i="0.00 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>

<network id="net1">
<population component="IF_curr_exp" id="Pop0" type="populationList" size="5">
<instance id="0">
<location x="120" y="230" z="567"/>
</instance>
<instance id="1">
<location x="270" y="450" z="56"/>
</instance>
<instance id="2">
<location x="54" y="234" z="89"/>
</instance>
<instance id="3">
<location x="154" y="1234" z="89"/>
</instance>
<instance id="4">
<location x="114" y="14" z="889"/>
</instance>
</population>


<inputList id="Gfluct0" component="both" population="Pop0">
<input id="0" target="../Pop0/0/IF_curr_exp" destination="synapses"/>
</inputList>
<inputList id="Gfluct1" component="only_e" population="Pop0">
<input id="0" target="../Pop0/1/IF_curr_exp" destination="synapses"/>
</inputList>
<inputList id="Gfluct2" component="only_i" population="Pop0">
<input id="0" target="../Pop0/2/IF_curr_exp" destination="synapses"/>
</inputList>
<inputList id="Gfluct3" component="steady_e" population="Pop0">
<input id="0" target="../Pop0/3/IF_curr_exp" destination="synapses"/>
</inputList>
<inputList id="Gfluct4" component="steady_i" population="Pop0">
<input id="0" target="../Pop0/4/IF_curr_exp" destination="synapses"/>
</inputList>

</network>

<Simulation id="simnet1" length="3000ms" step="0.05ms" target="net1" seed="54320">

<Display id="display_voltages" title="Voltages" timeScale="1ms" xmin="-200" xmax="3400.0" ymin="-67" ymax="-60">
<Line id="both: Vm" quantity="Pop0/0/IF_curr_exp/v" scale="1mV" color="#0000ff" timeScale="1ms"/>
<Line id="only e: Vm" quantity="Pop0/1/IF_curr_exp/v" scale="1mV" color="#00ffff" timeScale="1ms"/>
<Line id="only i: Vm" quantity="Pop0/2/IF_curr_exp/v" scale="1mV" color="#ff00ff" timeScale="1ms"/>
<Line id="steady e: Vm" quantity="Pop0/3/IF_curr_exp/v" scale="1mV" color="#ffffff" timeScale="1ms"/>
<Line id="steady i: Vm" quantity="Pop0/4/IF_curr_exp/v" scale="1mV" color="#00ff00" timeScale="1ms"/>
</Display>
<!--
<Display id="display_currents" title="Currents" timeScale="1ms" xmin="-200" xmax="3400.0" ymin="-0.2" ymax="2.5">
<Line id="Pop0/0: i" quantity="Pop0/0/IF_curr_exp/synapses:noisyCurrentSource1:0/i" scale="1nA" color="#00ff00" timeScale="1ms"/>
</Display>

<Display id="display_conds_e" title="Conductances_e" timeScale="1ms" xmin="-200" xmax="3400.0" ymin="-0.015" ymax="0.025">
<Line id="g_e" quantity="Pop0/0/IF_curr_exp/synapses:noisyCurrentSource1:0/g_e" scale="1uS" color="#00ff00" timeScale="1ms"/>
<Line id="g_e1" quantity="Pop0/0/IF_curr_exp/synapses:noisyCurrentSource1:0/g_e1" scale="1uS" color="#ffff00" timeScale="1ms"/>
</Display>

<Display id="display_conds_i" title="Conductances_i" timeScale="1ms" xmin="-200" xmax="3400.0" ymin="-0.03" ymax="0.09">
<Line id="g_i" quantity="Pop0/0/IF_curr_exp/synapses:noisyCurrentSource1:0/g_i" scale="1uS" color="#00ff00" timeScale="1ms"/>
<Line id="g_i1" quantity="Pop0/0/IF_curr_exp/synapses:noisyCurrentSource1:0/g_i1" scale="1uS" color="#ffff00" timeScale="1ms"/>
</Display> -->


<!-- works for jLEMS -->
<OutputFile id="Volts_file" fileName="v_gfluct.dat">
<OutputColumn id="v0" quantity="Pop0/0/IF_curr_exp/v"/>
<OutputColumn id="v1" quantity="Pop0/1/IF_curr_exp/v"/>
<OutputColumn id="v2" quantity="Pop0/2/IF_curr_exp/v"/>
<OutputColumn id="v3" quantity="Pop0/3/IF_curr_exp/v"/>
<OutputColumn id="v4" quantity="Pop0/4/IF_curr_exp/v"/>
</OutputFile>
<OutputFile id="Currents_file" fileName="i_gfluct.dat">
<OutputColumn id="i" quantity="Pop0/0/IF_curr_exp/synapses:both:0/i"/>
</OutputFile>
<OutputFile id="Conductance_file" fileName="g_gfluct.dat">
<OutputColumn id="g_e" quantity="Pop0/0/IF_curr_exp/synapses:both:0/g_e"/>
<OutputColumn id="g_e1" quantity="Pop0/0/IF_curr_exp/synapses:both:0/g_e1"/>
<OutputColumn id="g_i" quantity="Pop0/0/IF_curr_exp/synapses:both:0/g_i"/>
<OutputColumn id="g_i1" quantity="Pop0/0/IF_curr_exp/synapses:both:0/g_i1"/>
</OutputFile>
<!-- bug: input properties cannot currently be recorded using neuron -->

</Simulation>

</Lems>
Loading