NML2: Inputs

All input types — pulse, sine, ramp, voltage clamp, spike generators

NML2_Inputs.nml

Catalog of all NeuroML2 input generator types, with their XML declarations:

from pathlib import Path

nml_file = Path.home() / "work_data/toolboxes/NeuroML2/examples/NML2_Inputs.nml"
text = nml_file.read_text()

for line in text.split('\n'):
    stripped = line.strip()
    if stripped.startswith('<') and 'id=' in stripped and not stripped.startswith('</') \
       and not stripped.startswith('<!--'):
        print(stripped[:130])
<expTwoSynapse id="synInput" gbase="8nS" erev="20mV" tauRise="1ms" tauDecay="5ms"/><!-- Will be used below... -->
<expTwoSynapse id="synInputFast" gbase="1nS" erev="20mV" tauRise="0.2ms" tauDecay="1ms"/><!-- Will be used below... -->
<expThreeSynapse id="synInputFastTwo" gbase1="1.5nS" tauRise="0.1ms" tauDecay1="0.7ms" gbase2="0.5nS" tauDecay2="2.5ms"  erev="0mV
<pulseGenerator id="pulseGen0" delay="50ms" duration="200ms" amplitude="1 nA" />
<sineGenerator id="sg0" phase="0" delay="50ms" duration="200ms" amplitude="1.4nA" period="50ms"/>
<rampGenerator id="rg0" delay="50ms" duration="200ms" startAmplitude="0.5nA" finishAmplitude="4nA" baselineAmplitude="0nA"/>
<compoundInput id="ci0">
<pulseGenerator id="pg1" delay="50ms" duration="200ms" amplitude=".8 nA" />
<pulseGenerator id="pg2" delay="100ms" duration="100ms" amplitude=".4 nA" />
<sineGenerator id="sg0" phase="0" delay="125ms" duration="50ms" amplitude=".4nA" period="25ms"/>
<voltageClampTriple id="vClamp0"
<spikeArray id="spkArr">
<spike id="0" time="50 ms"/>
<spike id="1" time="100 ms"/>
<spike id="2" time="150 ms"/>
<spike id="3" time="155 ms"/>
<spike id="4" time="250 ms"/>
<timedSynapticInput id="synTrain" synapse="synInputFastTwo" spikeTarget="./synInputFastTwo">
<spike id="0" time="2 ms"/>
<spike id="1" time="15 ms"/>
<spike id="2" time="27 ms"/>
<spike id="3" time="40 ms"/>
<spike id="4" time="45 ms"/>
<spike id="5" time="50 ms"/>
<spike id="6" time="52 ms"/>
<spike id="7" time="54 ms"/>
<spike id="8" time="54.5 ms"/>
<spike id="9" time="54.6 ms"/>
<spike id="10" time="54.7 ms"/>
<spike id="11" time="54.8 ms"/>
<spike id="12" time="54.9 ms"/>
<spike id="13" time="55 ms"/>
<spike id="14" time="55.1 ms"/>
<spike id="15" time="55.2 ms"/>
<spikeGenerator id="spikeGenRegular" period="20 ms"/>
<spikeGeneratorRandom id="spikeGenRandom" minISI="10 ms"
<spikeGeneratorPoisson id="spikeGenPoisson" averageRate="50 Hz"/>
<spikeGeneratorRefPoisson id="spikeGenRefPoisson" averageRate="50 Hz" minimumISI="10 ms"/>
<poissonFiringSynapse id="poissonFiringSyn" averageRate="10 Hz" synapse="synInput" spikeTarget="./synInput"/>
<transientPoissonFiringSynapse id="transPoissonFiringSyn" delay="50ms" duration="50ms" averageRate="300 Hz" synapse="synInputFast"
<transientPoissonFiringSynapse id="transPoissonFiringSyn2" delay="50ms" duration="500ms" averageRate="10 Hz" synapse="synInputFast

TVBO Representation: IaF Cell with Inputs

from tvbo import SimulationExperiment

exp = SimulationExperiment.from_string("""
label: "NML2 Inputs: IaF Cell"
dynamics:
  name: IntegrateAndFire
  parameters:
    leakReversal: { value: -50.0 }
    tau:          { value: 30.0 }
    thresh:       { value: -55.0 }
    reset:        { value: -70.0 }
  state_variables:
    v:
      equation: { rhs: "(leakReversal - v) / tau" }
      initial_value: -50.0
      variable_of_interest: true
  events:
    spike:
      condition: { rhs: "v > thresh" }
      affect:    { rhs: "v = reset" }
network:
  number_of_nodes: 1
integration:
  method: euler
  step_size: 0.005
  duration: 300.0
  time_scale: ms
""")
xml = exp.render("lems")
print(xml[:800])

<Lems>

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

  <!-- ════════════════════════════════════════════════════════════════
       Dimensions & Units (inline — no external includes needed)
       ════════════════════════════════════════════════════════════════ -->

  <!-- Dimensions -->
  <Dimension name="none"/>
  <Dimension name="time" t="1"/>
  <Dimension name="voltage" m="1" l="2" t="-3" i="-1"/>
  <Dimension name="per_time" t="-1"/>
  <Dimension name="conductance" m="-1" l="-2" t="3" i="2"/>
  <Dimension name="capacitance" m="-1" l="-2" t="4" i="2"/>
  <Dimension name="current" i="1"/>
  <Dimension name="resistance" m="1" l="2" t="-3" i="-2"/>
  <Dimension name="concentration" l="-3" n="1"/>
  <Dimen

Run TVBO

import numpy as np
import matplotlib.pyplot as plt

result = exp.run("neuroml")
da = result.integration.data
t = da.coords['time'].values
v = da.values[:, 0]

fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(t, v)
ax.set_xlabel("Time (ms)")
ax.set_ylabel("Voltage (mV)")
ax.set_title("NML2 Inputs: IaF Cell via TVBO")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()