Ex16: Input Types

Various input types — Izhikevich 2007 RS cells with 13 different NeuroML input generators

Model: Input Types

Demonstrates all NeuroML2 input generator types applied to Izhikevich 2007 RS cells. 13 cells each receive a different input: pulse, sine, ramp, voltage clamp, spike array, spike generators (regular, random, Poisson, refractory Poisson), Poisson firing synapse, compound input, transient Poisson firing synapse, and timed synaptic input.


1. Define Full Network in TVBO

from tvbo import SimulationExperiment

exp = SimulationExperiment.from_string("""
label: "NeuroML Ex16: Input Types"
dynamics:
  name: RS
  iri: neuroml:izhikevich2007Cell
  parameters:
    v0:    { value: -60, unit: mV }
    C:     { value: 100, unit: pF }
    k:     { value: 0.7, unit: nS_per_mV }
    vr:    { value: -60, unit: mV }
    vt:    { value: -40, unit: mV }
    vpeak: { value: 35, unit: mV }
    a:     { value: 0.03, unit: per_ms }
    b:     { value: -2, unit: nS }
    c:     { value: -50, unit: mV }
    d:     { value: 100, unit: pA }
network:
  dynamics:
    # ── Synapse used by spike sources ──
    syn1:
      name: syn1
      iri: neuroml:expTwoSynapse
      parameters:
        gbase: { value: 1, unit: nS }
        erev:  { value: 20, unit: mV }
        tauRise: { value: 0.1, unit: ms }
        tauDecay: { value: 3, unit: ms }
    # ── Synapses used by poissonFiringSynapse / transientPoisson / timedSynapticInput ──
    synInput:
      name: synInput
      iri: neuroml:expTwoSynapse
      parameters:
        gbase: { value: 8, unit: nS }
        erev:  { value: 20, unit: mV }
        tauRise: { value: 1, unit: ms }
        tauDecay: { value: 5, unit: ms }
    synInputFast:
      name: synInputFast
      iri: neuroml:expTwoSynapse
      parameters:
        gbase: { value: 1, unit: nS }
        erev:  { value: 20, unit: mV }
        tauRise: { value: 0.2, unit: ms }
        tauDecay: { value: 1, unit: ms }
    synInputFastTwo:
      name: synInputFastTwo
      iri: neuroml:expThreeSynapse
      parameters:
        gbase1: { value: 1.5, unit: nS }
        tauRise: { value: 0.1, unit: ms }
        tauDecay1: { value: 0.7, unit: ms }
        gbase2: { value: 0.5, unit: nS }
        tauDecay2: { value: 2.5, unit: ms }
        erev: { value: 0, unit: mV }
    # ── Current input generators ──
    pulseGen0:
      name: pulseGen0
      iri: neuroml:pulseGenerator
      parameters:
        delay: { value: 50, unit: ms }
        duration: { value: 200, unit: ms }
        amplitude: { value: 1, unit: nA }
    sg0:
      name: sg0
      iri: neuroml:sineGenerator
      parameters:
        phase: { value: 0 }
        delay: { value: 50, unit: ms }
        duration: { value: 200, unit: ms }
        amplitude: { value: 1.4, unit: nA }
        period: { value: 50, unit: ms }
    rg0:
      name: rg0
      iri: neuroml:rampGenerator
      parameters:
        delay: { value: 50, unit: ms }
        duration: { value: 200, unit: ms }
        startAmplitude: { value: 0.5, unit: nA }
        finishAmplitude: { value: 4, unit: nA }
        baselineAmplitude: { value: 0, unit: nA }
    vClamp0:
      name: vClamp0
      iri: neuroml:voltageClampTriple
      parameters:
        active: { value: 1 }
        delay: { value: 50, unit: ms }
        duration: { value: 200, unit: ms }
        conditioningVoltage: { value: -70, unit: mV }
        testingVoltage: { value: -50, unit: mV }
        returnVoltage: { value: -70, unit: mV }
        simpleSeriesResistance: { value: 1.0e6, unit: ohm }
    # ── Event sources (become populations + synapticConnection) ──
    spkArr:
      name: spkArr
      iri: neuroml:spikeArray
      events:
        spikes:
          event_type: preset_time
          trigger_times: [50, 100, 150, 155, 250]
    spikeGenRegular:
      name: spikeGenRegular
      iri: neuroml:spikeGenerator
      parameters:
        period: { value: 20, unit: ms }
    spikeGenRandom:
      name: spikeGenRandom
      iri: neuroml:spikeGeneratorRandom
      parameters:
        minISI: { value: 10, unit: ms }
        maxISI: { value: 30, unit: ms }
    spikeGenPoisson:
      name: spikeGenPoisson
      iri: neuroml:spikeGeneratorPoisson
      parameters:
        averageRate: { value: 50, unit: Hz }
    spikeGenRefPoisson:
      name: spikeGenRefPoisson
      iri: neuroml:spikeGeneratorRefPoisson
      parameters:
        averageRate: { value: 50, unit: Hz }
        minimumISI: { value: 10, unit: ms }
    # ── Firing synapse inputs (current inputs with built-in synapse) ──
    poissonFiringSyn:
      name: poissonFiringSyn
      iri: neuroml:poissonFiringSynapse
      parameters:
        averageRate: { value: 10, unit: Hz }
        synapse: { description: synInput }
        spikeTarget: { description: "./synInput" }
    ci0:
      name: ci0
      iri: neuroml:compoundInput
      components:
        pg1:
          name: pg1
          iri: neuroml:pulseGenerator
          parameters:
            delay: { value: 50, unit: ms }
            duration: { value: 200, unit: ms }
            amplitude: { value: 0.8, unit: nA }
        pg2:
          name: pg2
          iri: neuroml:pulseGenerator
          parameters:
            delay: { value: 100, unit: ms }
            duration: { value: 100, unit: ms }
            amplitude: { value: 0.4, unit: nA }
        sg0:
          name: sg0
          iri: neuroml:sineGenerator
          parameters:
            phase: { value: 0 }
            delay: { value: 125, unit: ms }
            duration: { value: 50, unit: ms }
            amplitude: { value: 0.4, unit: nA }
            period: { value: 25, unit: ms }
    transPoissonFiringSyn:
      name: transPoissonFiringSyn
      iri: neuroml:transientPoissonFiringSynapse
      parameters:
        delay: { value: 50, unit: ms }
        duration: { value: 50, unit: ms }
        averageRate: { value: 300, unit: Hz }
        synapse: { description: synInputFast }
        spikeTarget: { description: "./synInputFast" }
    synTrain:
      name: synTrain
      iri: neuroml:timedSynapticInput
      parameters:
        synapse: { description: synInputFastTwo }
        spikeTarget: { description: "./synInputFastTwo" }
      events:
        spikes:
          event_type: preset_time
          trigger_times: [2, 15, 27, 40, 45, 50, 52, 54, 54.5, 54.6, 54.7, 54.8, 54.9, 55, 55.1, 55.2]
  nodes:
    - {id: 0, dynamics: RS}
    - {id: 1, dynamics: RS}
    - {id: 2, dynamics: RS}
    - {id: 3, dynamics: RS}
    - {id: 4, dynamics: RS}
    - {id: 5, dynamics: RS}
    - {id: 6, dynamics: RS}
    - {id: 7, dynamics: RS}
    - {id: 8, dynamics: RS}
    - {id: 9, dynamics: RS}
    - {id: 10, dynamics: RS, record: false}
    - {id: 11, dynamics: RS, record: false}
    - {id: 12, dynamics: RS, record: false}
    # Input source nodes
    - {id: 100, dynamics: pulseGen0, record: false}
    - {id: 101, dynamics: sg0, record: false}
    - {id: 102, dynamics: rg0, record: false}
    - {id: 103, dynamics: vClamp0, record: false}
    - {id: 104, dynamics: spkArr, record: false}
    - {id: 105, dynamics: spikeGenRegular, record: false}
    - {id: 107, dynamics: spikeGenPoisson, record: false}
    - {id: 112, dynamics: spikeGenRefPoisson, record: false}
    - {id: 106, dynamics: spikeGenRandom, record: false}
    - {id: 108, dynamics: poissonFiringSyn, record: false}
    - {id: 109, dynamics: ci0, record: false}
    - {id: 110, dynamics: transPoissonFiringSyn, record: false}
    - {id: 111, dynamics: synTrain, record: false}
  edges:
    # Current inputs → explicitInput
    - {source: 100, target: 0}
    - {source: 101, target: 1}
    - {source: 102, target: 2}
    - {source: 103, target: 3}
    - {source: 108, target: 8}
    - {source: 109, target: 9}
    - {source: 110, target: 10}
    - {source: 111, target: 11}
    # Spike sources → synapticConnection via syn1
    - {source: 104, target: 4, coupling: syn1}
    - {source: 105, target: 5, coupling: syn1}
    - { source: 106, target: 6, coupling: syn1 }
    - { source: 107, target: 7, coupling: syn1 }
    - { source: 112, target: 12, coupling: syn1 }
integration:
  method: euler
  step_size: 0.001
  duration: 300.0
  time_scale: ms
  parameters:
    seed: { value: 123 }
""")
print(f"Model: {exp.dynamics.name if exp.dynamics else 'network'}")
print(f"Network nodes: {len(exp.network.nodes)}")
Model: RS
Network nodes: 26

2. Render LEMS XML

xml = exp.render("lems")
print(xml[:2000])
<Lems>
  <Target component="sim_NeuroML_Ex16__Input_Types"/>

  <Include file="Cells.xml"/>
  <Include file="Networks.xml"/>
  <Include file="Inputs.xml"/>
  <Include file="Simulation.xml"/>

    <izhikevich2007Cell id="RS" C="100 pF" a="0.03 per_ms" b="-2 nS" c="-50 mV" d="100 pA" k="0.7 nS_per_mV" v0="-60 mV" vpeak="35 mV" vr="-60 mV" vt="-40 mV"/>

    <pulseGenerator id="pulseGen0" amplitude="1.0 nA" delay="50.0 ms" duration="200.0 ms"/>

    <sineGenerator id="sg0" amplitude="1.4 nA" delay="50.0 ms" duration="200.0 ms" period="50.0 ms" phase="0.0"/>

    <rampGenerator id="rg0" baselineAmplitude="0.0 nA" delay="50.0 ms" duration="200.0 ms" finishAmplitude="4.0 nA" startAmplitude="0.5 nA"/>

    <voltageClampTriple id="vClamp0" active="1.0" conditioningVoltage="-70.0 mV" delay="50.0 ms" duration="200.0 ms" returnVoltage="-70.0 mV" simpleSeriesResistance="1000000.0 ohm" testingVoltage="-50.0 mV"/>

    <spikeArray id="spkArr">
        <spike id="0" time="50.0 ms"/>
        <spike id="1" time="100.0 ms"/>
        <spike id="2" time="150.0 ms"/>
        <spike id="3" time="155.0 ms"/>
        <spike id="4" time="250.0 ms"/>
    </spikeArray>

    <spikeGenerator id="spikeGenRegular" period="20.0 ms"/>

    <spikeGeneratorPoisson id="spikeGenPoisson" averageRate="50.0 Hz"/>

    <spikeGeneratorRefPoisson id="spikeGenRefPoisson" averageRate="50.0 Hz" minimumISI="10.0 ms"/>

    <spikeGeneratorRandom id="spikeGenRandom" maxISI="30.0 ms" minISI="10.0 ms"/>

    <poissonFiringSynapse id="poissonFiringSyn" averageRate="10.0 Hz" spikeTarget="./synInput" synapse="synInput"/>

    <compoundInput id="ci0">
        <pulseGenerator id="pg1" amplitude="0.8 nA" delay="50 ms" duration="200 ms"/>
        <pulseGenerator id="pg2" amplitude="0.4 nA" delay="100 ms" duration="100 ms"/>
        <sineGenerator id="sg0" amplitude="0.4 nA" delay="125 ms" duration="50 ms" period="25 ms" phase="0"/>
    </compoundInput>

    <transientPoissonFiringSynapse id="transPoissonFiringSyn" averageR

3. Run Reference

from tvbo.adapters.neuroml import run_lems_example

ref_outputs = run_lems_example("LEMS_NML2_Ex16_Inputs.xml")
for name, arr in ref_outputs.items():
    print(f"  {name}: shape={arr.shape}")
  ex16_v.dat: shape=(300001, 11)

4. Run TVBO

result = exp.run("neuroml")
da = result.integration.data
print(f"TVBO: {da.dims}, shape={da.shape}")
TVBO: ('time', 'quantity'), shape=(300001, 10)

5. Compare & Plot

from tvbo.adapters.neuroml import plot_lems_comparison
plot_lems_comparison("LEMS_NML2_Ex16_Inputs.xml", ref_outputs, result.integration.data, title_prefix="Ex16")