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>

  <!-- Tell jLEMS/jNeuroML which component is the simulation entry point. -->
  <Target component="sim_NeuroML_Ex16__Input_Types"/>

  <!-- ════════════════════════════════════════════════════════════════
       Standard NeuroML2 type includes for network mode.
       Provides all standard dimensions, units, synapse types, input
       types, network infrastructure, and simulation types.
       ════════════════════════════════════════════════════════════════ -->
  <Include file="Cells.xml"/>
  <Include file="Networks.xml"/>
  <Include file="Simulation.xml"/>

  <!-- ════════════════════════════════════════════════════════════════
       Dynamics ComponentType & Component instances
       ════════════════════════════════════════════════════════════════ -->


  <!-- ── ComponentType: RS ── -->
  <ComponentType name="RS" extends="baseCellMembPot">
    <Parameter name="C" dimension="capacitance"/>
    <Parameter name="k" dimension="none"/>
    <Parameter name="vr" dimension="voltage"/>
    <Parameter name="vt" dimension="voltage"/>
    <Parameter name="vpeak" dimension="voltage"/>
    <Parameter name="a" dimension="per_time"/>
    <Parameter name="b" dimension="conductance"/>
    <Parameter name="c" dimension="voltage"/>
    <Parameter name="d" dimension="current"/>
    <Parameter name="v0" dimension="voltage"/>
    <Parameter name="refract" dimension="time"/>
    <Parameter name="v_0" dimension="none" />
    <Parameter name="u_0" dimension="none" />
    <Exposure name="u" dimension="none" />
    <!-- Dynamically attached synapses/inputs from network connections -->
    <Attachments name="synapses" type="basePointCurrent"/>

    <Dynamics>
      <StateVariable name="v" dimension="none" exposure="v"/>
      <StateVariable name="u" dimension="none" exposure="u"/>
      <StateVariable name="lastSpikeTime" dimension="time"/>
      <ConditionalDerivedVariable name="I_ext" dimension="none">
        <Case condition="t .geq. 0.05 .and. t .lt. 0.25" value="1000.000000000
/Users/leonmartin_bih/tools/tvbo/tvbo/adapters/neuroml.py:3082: UserWarning: NeuroML type 'poissonFiringSynapse' (component 'poissonFiringSyn') requires a 'synapse' reference to a 'baseSynapse' component, but none was given. Declare it as a parameter, e.g. synapse: {value: <DynamicsName>}.
  net_ctx = _build_network_context(experiment)
/Users/leonmartin_bih/tools/tvbo/tvbo/adapters/neuroml.py:3082: UserWarning: NeuroML type 'transientPoissonFiringSynapse' (component 'transPoissonFiringSyn') requires a 'synapse' reference to a 'baseSynapse' component, but none was given. Declare it as a parameter, e.g. synapse: {value: <DynamicsName>}.
  net_ctx = _build_network_context(experiment)
/Users/leonmartin_bih/tools/tvbo/tvbo/adapters/neuroml.py:3082: UserWarning: NeuroML type 'timedSynapticInput' (component 'synTrain') requires a 'synapse' reference to a 'baseSynapse' component, but none was given. Declare it as a parameter, e.g. synapse: {value: <DynamicsName>}.
  net_ctx = _build_network_context(experiment)

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}")
pyNeuroML >>> 17:02:27 - INFO - Loading LEMS file: tvbo_lems_sim.xml and running with jNeuroML
pyNeuroML >>> 17:02:27 - INFO - Executing: (java -Xmx400M  -Djava.awt.headless=true -jar  "/Users/leonmartin_bih/tools/tvbo/.venv/lib/python3.12/site-packages/pyneuroml/utils/./../lib/jNeuroML-0.14.0-jar-with-dependencies.jar"  tvbo_lems_sim.xml  -nogui -I '') in directory: /var/folders/ym/9kw1g21j1nd7kwfn8c0z3st40000gn/T/tmpnl8qyj20
pyNeuroML >>> 17:02:32 - INFO - Command completed successfully!
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")