Skip to content

Commit

Permalink
wip: gfluct
Browse files Browse the repository at this point in the history
  • Loading branch information
sanjayankur31 committed Aug 23, 2023
1 parent 0e2d538 commit aaad187
Show file tree
Hide file tree
Showing 2 changed files with 196 additions and 0 deletions.
102 changes: 102 additions & 0 deletions NeuroML2/Gfluct.nml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?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="ProbUDFSynDoc">

<!-- Note that order of different LEMS types matters for validation, since the schema defines what order they should appear in -->

<!-- Reference:
https://doi.org/10.1016/S0306-4522(01)00344-X
Destexhe, A.; Rudolph, M.; Fellous, J.-M. & Sejnowski, T. J. Fluctuating synaptic conductances recreate in vivo-like activity in neocortical neurons Neuroscience, 2001, 107, 13-24
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"/>

<EventPort name="in" direction="in" description="Note this is not used here. Will be removed in future"/>

<Exposure name="g_e" dimension="conductance" />
<Exposure name="g_i" dimension="conductance" />

<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" dimension="conductance" />
<StateVariable name="g_i1" dimension="conductance" />
<StateVariable name="i" exposure="i" dimension="current" />

<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_i1" 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"/>
</OnCondition>

<!-- oup()-->
<OnCondition test="tau_e .neq. 0" >
<!-- let exp_e and std_e be computed for each step: we can't have conditionals inside OnStart, although I could use H etc. to hack it -->
<StateAssignment variable="g_e" value="exp(-dt/tau_e) * g_e1 + ((std_e * sqrt(1 - exp(-2 * dt/tau_e))) * random(1))" />
</OnCondition>

<OnCondition test="tau_i .neq. 0" >
<StateAssignment variable="g_i" value="exp(-dt/tau_i) * g_i1 + ((std_i * sqrt(1 - exp(-2 * dt/tau_i))) * random(1))" />
</OnCondition>

<!-- original mod says g_e = std_e * grand() but that would immediately get overwritten in the next bit, so we think it's the fluctuating current that is calculated here, g_e1 -->
<OnCondition test="tau_e .eq. 0" >
<StateAssignment variable="g_e1" value="std_e * random(1)" />
</OnCondition>
<OnCondition test="tau_i .eq. 0" >
<StateAssignment variable="g_i1" value="std_i * random(1)" />
</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" />
<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"/>
</OnCondition>
</Dynamics>

</ComponentType>

</neuroml>
94 changes: 94 additions & 0 deletions NeuroML2/LEMS_Gfluct_test.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<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="1.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"/>


<pulseGenerator id="pulseGen0" delay="0ms" duration="30000ms" amplitude="0.15 nA" />

<Gfluct id="noisyCurrentSource1" start="0ms" stop="30000ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0121 uS" g_i0="0.573 uS" std_e="0.003 uS" std_i="0.0066 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>
<Gfluct id="noisyCurrentSource2" start="0ms" stop="30000ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0121 uS" g_i0="0.573 uS" std_e="0.003 uS" std_i="0.0066 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>
<Gfluct id="noisyCurrentSource3" start="0ms" stop="30000ms" dt="0.05ms" E_e="0mV" E_i="-75mV" g_e0="0.0121 uS" g_i0="0.573 uS" std_e="0.003 uS" std_i="0.0066 uS" tau_e="2.728 ms" tau_i="10.49 ms"/>

<network id="net1">
<population component="IF_curr_exp" id="Pop0" type="populationList" size="3">
<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="1" y="2" z="3"/>
</instance>
</population>


<inputList id="stimInput" component="pulseGen0" population="Pop0">
<input id="0" target="../Pop0/0/IF_curr_exp" destination="synapses"/>
</inputList>

<inputList id="noisy1" component="noisyCurrentSource1" population="Pop0">
<input id="0" target="../Pop0/1/IF_curr_exp" destination="synapses"/>
</inputList>

<inputList id="noisy2" component="noisyCurrentSource2" population="Pop0">
<input id="0" target="../Pop0/2/IF_curr_exp" destination="synapses"/>
</inputList>

<inputList id="noisy3" component="noisyCurrentSource3" population="Pop0">
<input id="0" target="../Pop0/3/IF_curr_exp" destination="synapses"/>
</inputList>

</network>

<Simulation id="simnet1" length="30000ms" step="0.05ms" target="net1">

<Display id="display_voltages" title="Voltages" timeScale="1ms" xmin="-2.0" xmax="10020.0" ymin="-68" ymax="-47">
<Line id="Pop0/0: Vm" quantity="Pop0/0/IF_curr_exp/v" scale="1mV" color="#0000ff" timeScale="1ms"/>
<Line id="Pop0/1: Vm" quantity="Pop0/1/IF_curr_exp/v" scale="1mV" color="#00ff00" timeScale="1ms"/>
<Line id="Pop0/2: Vm" quantity="Pop0/2/IF_curr_exp/v" scale="1mV" color="#ff0000" timeScale="1ms"/>
<Line id="Pop0/3: Vm" quantity="Pop0/3/IF_curr_exp/v" scale="1mV" color="#00ffff" timeScale="1ms"/>
</Display>

<Display id="display_currents" title="Voltages" timeScale="1ms" xmin="-2.0" xmax="10020.0" ymin="-0.05" ymax="0.6">
<Line id="Pop0/0: i" quantity="Pop0/0/IF_curr_exp/pulseGen0/i" scale="1nA" color="#0000ff" timeScale="1ms"/>
<Line id="Pop0/1: i" quantity="Pop0/1/IF_curr_exp/noisyCurrentSource1/i" scale="1nA" color="#00ff00" timeScale="1ms"/>
<Line id="Pop0/2: i" quantity="Pop0/2/IF_curr_exp/noisyCurrentSource2/i" scale="1nA" color="#ff0000" timeScale="1ms"/>
<Line id="Pop0/3: i" quantity="Pop0/3/IF_curr_exp/noisyCurrentSource3/i" scale="1nA" color="#00ffff" timeScale="1ms"/>
</Display>

<OutputFile id="Volts_file" fileName="v_ou.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"/>
</OutputFile>

<OutputFile id="Currents_file" fileName="i_ou.dat">
<OutputColumn id="i0" quantity="Pop0/0/IF_curr_exp/pulseGen0/i"/>
<OutputColumn id="i1" quantity="Pop0/1/IF_curr_exp/noisyCurrentSource1/i"/>
<OutputColumn id="i2" quantity="Pop0/2/IF_curr_exp/noisyCurrentSource2/i"/>
<OutputColumn id="i3" quantity="Pop0/3/IF_curr_exp/noisyCurrentSource3/i"/>
</OutputFile>

</Simulation>

</Lems>

0 comments on commit aaad187

Please sign in to comment.