Model: Current-Based Synapses
Current-based synapses inject a fixed current waveform (alpha kernel) on spike arrival, independent of membrane voltage. Uses iafRefCell (IaF with refractory period) and alphaCurrentSynapse with spikeArray input.
Reference: NeuroML2 LEMS_NML2_Ex21_CurrentBasedSynapses.xml
1. Define Network in TVBO
from tvbo import SimulationExperiment
exp = SimulationExperiment.from_string("""
label: "NeuroML Ex21: IaF with Current-Based Synapses"
dynamics:
name: iafRefCell
iri: neuroml:iafRefCell
network:
dynamics:
iaf:
name: iaf
iri: neuroml:iafRefCell
parameters:
C: {value: 250, unit: pF}
thresh: {value: 1, unit: mV}
reset: {value: -1, unit: mV}
leakConductance: {value: 12.5, unit: nS}
leakReversal: {value: 0, unit: mV}
refract: {value: 2, unit: ms}
spks:
name: spks
iri: neuroml:spikeArray
events:
spikes:
event_type: preset_time
trigger_times: [100, 120, 126, 135]
nodes:
- {id: 0, dynamics: iaf}
- {id: 1, dynamics: spks}
edges:
- source: 1
target: 0
coupling: alphaCurrentSynapse
parameters:
tau: {value: 1.0, unit: ms}
ibase: {value: 1, unit: nA}
weight: {value: 0.05}
delay: {value: 1, unit: ms}
integration:
method: euler
step_size: 0.001
duration: 300.0
time_scale: ms
""" )
print (f"Model: { exp. dynamics. name if exp. dynamics else 'network' } " )
2. Render LEMS XML
xml = exp.render("lems" )
print (xml[:1500 ])
<Lems>
<Target component="sim_NeuroML_Ex21__IaF_with_Current_Based_Synapses"/>
<Include file="Cells.xml"/>
<Include file="Networks.xml"/>
<Include file="Inputs.xml"/>
<Include file="Simulation.xml"/>
<iafRefCell id="iaf" C="250 pF" leakConductance="12.5 nS" leakReversal="0 mV" refract="2 ms" reset="-1 mV" thresh="1 mV"/>
<spikeArray id="spks">
<spike id="0" time="100.0 ms"/>
<spike id="1" time="120.0 ms"/>
<spike id="2" time="126.0 ms"/>
<spike id="3" time="135.0 ms"/>
</spikeArray>
<alphaCurrentSynapse id="alphaCurrentSynapse" ibase="1.0 nA" tau="1.0 ms"/>
<network id="net1">
<population id="iaf_pop" component="iaf" size="1"/>
<population id="spks_pop" component="spks" size="1"/>
<synapticConnectionWD from="spks_pop[0]" to="iaf_pop[0]" synapse="alphaCurrentSynapse" destination="synapses" weight="0.05" delay="1.0 ms"/>
</network>
<Simulation id="sim_NeuroML_Ex21__IaF_with_Current_Based_Synapses" length="300.0ms" step="0.001ms" target="net1">
<OutputFile id="of0" fileName="results/iaf.dat">
<OutputColumn id="iaf_pop_0_v" quantity="iaf_pop[0]/v"/>
</OutputFile>
</Simulation>
</Lems>
3. Run Reference
from tvbo.adapters.neuroml import run_lems_example
ref_outputs = run_lems_example("LEMS_NML2_Ex21_CurrentBasedSynapses.xml" )
for name, arr in ref_outputs.items():
print (f" { name} : shape= { arr. shape} " )
ex21_v.dat: shape=(300001, 2)
4. Run TVBO
result = exp.run("neuroml" )
da = result.integration.data
print (f"TVBO: { da. dims} , shape= { da. shape} " )
TVBO: ('time', 'quantity'), shape=(300001, 1)
5. Compare & Plot
from tvbo.adapters.neuroml import plot_lems_comparison
plot_lems_comparison("LEMS_NML2_Ex21_CurrentBasedSynapses.xml" , ref_outputs, result.integration.data, title_prefix= "Ex21" )