Ex2: Izhikevich

Izhikevich 2003 spiking neuron — tonic, bursting, mixed, and class-1 modes

Model: Izhikevich 2003

The Izhikevich (2003) model is a computationally efficient spiking neuron with four firing modes from different parameter sets.

Reference: NeuroML2 LEMS_NML2_Ex2_Izh.xml


1. Define Network in TVBO

from tvbo import SimulationExperiment

exp = SimulationExperiment.from_string("""
label: "NeuroML Ex2: Izhikevich"
dynamics:
  name: izBurst
  iri: neuroml:izhikevichCell
network:
  dynamics:
    izBurst:
      name: izBurst
      iri: neuroml:izhikevichCell
      parameters:
        v0: {value: -70, unit: mV}
        thresh: {value: 30, unit: mV}
        a: {value: 0.02}
        b: {value: 0.2}
        c: {value: -50}
        d: {value: 2}
    izTonic:
      name: izTonic
      iri: neuroml:izhikevichCell
      parameters:
        v0: {value: -70, unit: mV}
        thresh: {value: 30, unit: mV}
        a: {value: 0.02}
        b: {value: 0.2}
        c: {value: -65}
        d: {value: 6}
    izMixed:
      name: izMixed
      iri: neuroml:izhikevichCell
      parameters:
        v0: {value: -70, unit: mV}
        thresh: {value: 30, unit: mV}
        a: {value: 0.02}
        b: {value: 0.2}
        c: {value: -55}
        d: {value: 4}
    izClass1:
      name: izClass1
      iri: neuroml:izhikevichCell
      parameters:
        v0: {value: -60, unit: mV}
        thresh: {value: 30, unit: mV}
        a: {value: 0.02}
        b: {value: -0.1}
        c: {value: -55}
        d: {value: 6}
    i0:
      name: i0
      iri: neuroml:pulseGeneratorDL
      parameters:
        delay: {value: 22, unit: ms}
        duration: {value: 2000, unit: ms}
        amplitude: {value: 15}
    i1:
      name: i1
      iri: neuroml:pulseGeneratorDL
      parameters:
        delay: {value: 20, unit: ms}
        duration: {value: 2000, unit: ms}
        amplitude: {value: 14}
    i2:
      name: i2
      iri: neuroml:pulseGeneratorDL
      parameters:
        delay: {value: 20, unit: ms}
        duration: {value: 2000, unit: ms}
        amplitude: {value: 10}
    rg0:
      name: rg0
      iri: neuroml:rampGeneratorDL
      parameters:
        delay: {value: 30, unit: ms}
        duration: {value: 170, unit: ms}
        startAmplitude: {value: -32}
        finishAmplitude: {value: 50}
        baselineAmplitude: {value: -32}
  nodes:
    - {id: 0, dynamics: izBurst}
    - {id: 1, dynamics: izTonic}
    - {id: 2, dynamics: izMixed}
    - {id: 3, dynamics: izClass1}
    - {id: 10, dynamics: i0, record: false}
    - {id: 11, dynamics: i1, record: false}
    - {id: 12, dynamics: i2, record: false}
    - {id: 13, dynamics: rg0, record: false}
  edges:
    - {source: 10, target: 0}
    - {source: 11, target: 1}
    - {source: 12, target: 2}
    - {source: 13, target: 3}
integration:
  method: euler
  step_size: 0.005
  duration: 200.0
  time_scale: ms
""")
print(f"Network dynamics: {list(exp.network.dynamics.keys())}")
Network dynamics: ['i0', 'i1', 'i2', 'izBurst', 'izClass1', 'izMixed', 'izTonic', 'rg0']
* Owlready2 * Warning: ignoring cyclic subclass of/subproperty of, involving:
  http://uri.interlex.org/tgbugs/uris/readable/atlas/Space

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_Ex2__Izhikevich"/>

  <!-- ════════════════════════════════════════════════════════════════
       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: izBurst ── -->
  <ComponentType name="izBurst" extends="baseCellMembPot">
    <Parameter name="a" dimension="none"/>
    <Parameter name="b" dimension="none"/>
    <Parameter name="c" dimension="none"/>
    <Parameter name="d" dimension="none"/>
    <Parameter name="thresh" dimension="voltage"/>
    <Parameter name="I_amp" dimension="none"/>
    <Parameter name="pulse_delay" dimension="time"/>
    <Parameter name="pulse_duration" dimension="time"/>
    <Parameter name="v0" dimension="voltage"/>
    <Parameter name="refract" dimension="time"/>
    <Parameter name="v_0" dimension="none" />
    <Parameter name="U_0" dimension="none" />
    <Constant name="SEC" dimension="time" value="1ms"/>
    <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="pulse_delay .leq. t .and. t .lt. pul

3. Run Reference

from tvbo.adapters.neuroml import run_lems_example

ref_outputs = run_lems_example("LEMS_NML2_Ex2_Izh.xml")
for name, arr in ref_outputs.items():
    print(f"  {name}: shape={arr.shape}")
  auto.dat: shape=(40001, 10)

4. Run TVBO

result = exp.run("neuroml")
da = result.integration.data
print(f"TVBO: {da.dims}, shape={da.shape}")
pyNeuroML >>> 13:07:09 - INFO - Loading LEMS file: tvbo_lems_sim.xml and running with jNeuroML
pyNeuroML >>> 13:07:09 - 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/tmpz8cp6qru
pyNeuroML >>> 13:07:10 - INFO - Command completed successfully!
TVBO: ('time', 'quantity'), shape=(40001, 4)

5. Compare & Plot

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