Ex21: Current-Based Synapses

Current-based (as opposed to conductance-based) synaptic models

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'}")
Model: iafRefCell

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")