Ex14: PyNN Cells

Full PyNN network — 7 cell types, 4 targets, 2 spike sources, 4 projections

Model: PyNN Cell Types Network

NeuroML2 includes PyNN-compatible cell types. This example creates the full netAll network from LEMS_NML2_Ex14_PyNN.xml:

  • 7 PyNN cell populations (IF_curr_alpha, IF_curr_exp, IF_cond_alpha, IF_cond_exp, EIF_cond_exp_isfa_ista, EIF_cond_alpha_isfa_ista, HH_cond_exp)
  • 4 silent target cells (IF_cond_alpha with i_offset=0)
  • 2 SpikeSourcePoisson inputs (50 Hz and 80 Hz)
  • 4 projections with PyNN synapse types and weight/delay

1. Define Network in TVBO

from tvbo import SimulationExperiment

exp = SimulationExperiment.from_string("""
label: "NeuroML Ex14: PyNN Cells"
dynamics:
  name: IF_curr_alpha
  iri: neuroml:IF_curr_alpha
network:
  dynamics:
    IF_curr_alpha:
      name: IF_curr_alpha
      iri: neuroml:IF_curr_alpha
      parameters:
        cm: {value: 1.0}
        i_offset: {value: 0.9}
        tau_m: {value: 20.0}
        tau_refrac: {value: 10.0}
        tau_syn_E: {value: 0.5}
        tau_syn_I: {value: 0.5}
        v_init: {value: -65}
        v_reset: {value: -62.0}
        v_rest: {value: -65.0}
        v_thresh: {value: -52.0}
    IF_curr_exp:
      name: IF_curr_exp
      iri: neuroml:IF_curr_exp
      parameters:
        cm: {value: 1.0}
        i_offset: {value: 1.0}
        tau_m: {value: 20.0}
        tau_refrac: {value: 8.0}
        tau_syn_E: {value: 5.0}
        tau_syn_I: {value: 5.0}
        v_init: {value: -65}
        v_reset: {value: -70.0}
        v_rest: {value: -65.0}
        v_thresh: {value: -50.0}
    IF_cond_alpha:
      name: IF_cond_alpha
      iri: neuroml:IF_cond_alpha
      parameters:
        cm: {value: 1.0}
        e_rev_E: {value: 0.0}
        e_rev_I: {value: -70.0}
        i_offset: {value: 0.9}
        tau_m: {value: 20.0}
        tau_refrac: {value: 5.0}
        tau_syn_E: {value: 0.3}
        tau_syn_I: {value: 0.5}
        v_init: {value: -65}
        v_reset: {value: -65.0}
        v_rest: {value: -65.0}
        v_thresh: {value: -50.0}
    silent_cell:
      name: silent_cell
      iri: neuroml:IF_cond_alpha
      parameters:
        cm: {value: 1.0}
        e_rev_E: {value: 0.0}
        e_rev_I: {value: -70.0}
        i_offset: {value: 0}
        tau_m: {value: 20.0}
        tau_refrac: {value: 5.0}
        tau_syn_E: {value: 5}
        tau_syn_I: {value: 10}
        v_init: {value: -65}
        v_reset: {value: -65.0}
        v_rest: {value: -65.0}
        v_thresh: {value: -50.0}
    IF_cond_exp:
      name: IF_cond_exp
      iri: neuroml:IF_cond_exp
      parameters:
        cm: {value: 1.0}
        e_rev_E: {value: 0.0}
        e_rev_I: {value: -70.0}
        i_offset: {value: 1.0}
        tau_m: {value: 20.0}
        tau_refrac: {value: 5.0}
        tau_syn_E: {value: 5.0}
        tau_syn_I: {value: 5.0}
        v_init: {value: -65}
        v_reset: {value: -68.0}
        v_rest: {value: -65.0}
        v_thresh: {value: -52.0}
    EIF_cond_exp_isfa_ista:
      name: EIF_cond_exp_isfa_ista
      iri: neuroml:EIF_cond_exp_isfa_ista
      parameters:
        a: {value: 0.0}
        b: {value: 0.0805}
        cm: {value: 0.281}
        delta_T: {value: 2.0}
        e_rev_E: {value: 0.0}
        e_rev_I: {value: -80.0}
        i_offset: {value: 0.6}
        tau_m: {value: 9.3667}
        tau_refrac: {value: 5}
        tau_syn_E: {value: 5.0}
        tau_syn_I: {value: 5.0}
        tau_w: {value: 144.0}
        v_init: {value: -65}
        v_reset: {value: -68.0}
        v_rest: {value: -70.6}
        v_spike: {value: -40.0}
        v_thresh: {value: -52.0}
    EIF_cond_alpha_isfa_ista:
      name: EIF_cond_alpha_isfa_ista
      iri: neuroml:EIF_cond_alpha_isfa_ista
      parameters:
        a: {value: 0.0}
        b: {value: 0.0805}
        cm: {value: 0.281}
        delta_T: {value: 0}
        e_rev_E: {value: 0.0}
        e_rev_I: {value: -80.0}
        i_offset: {value: 0.6}
        tau_m: {value: 9.3667}
        tau_refrac: {value: 5}
        tau_syn_E: {value: 5.0}
        tau_syn_I: {value: 5.0}
        tau_w: {value: 144.0}
        v_init: {value: -65}
        v_reset: {value: -68.0}
        v_rest: {value: -70.6}
        v_spike: {value: -40.0}
        v_thresh: {value: -52.0}
    HH_cond_exp:
      name: HH_cond_exp
      iri: neuroml:HH_cond_exp
      parameters:
        cm: {value: 0.2}
        e_rev_E: {value: 0.0}
        e_rev_I: {value: -80.0}
        e_rev_K: {value: -90.0}
        e_rev_Na: {value: 50.0}
        e_rev_leak: {value: -65.0}
        g_leak: {value: 0.01}
        gbar_K: {value: 6.0}
        gbar_Na: {value: 20.0}
        i_offset: {value: 0.2}
        tau_syn_E: {value: 0.2}
        tau_syn_I: {value: 2.0}
        v_init: {value: -65}
        v_offset: {value: -63.0}
    spikes1:
      name: spikes1
      iri: neuroml:SpikeSourcePoisson
      parameters:
        start: {value: 50, unit: ms}
        duration: {value: 400, unit: ms}
        rate: {value: 50, unit: Hz}
    spikes2:
      name: spikes2
      iri: neuroml:SpikeSourcePoisson
      parameters:
        start: {value: 50, unit: ms}
        duration: {value: 300, unit: ms}
        rate: {value: 80, unit: Hz}
    syn1:
      name: syn1
      iri: neuroml:expCondSynapse
      parameters:
        tau_syn: {value: 5}
        e_rev: {value: 0}
    syn2:
      name: syn2
      iri: neuroml:alphaCondSynapse
      parameters:
        tau_syn: {value: 5}
        e_rev: {value: 0}
    syn3:
      name: syn3
      iri: neuroml:expCurrSynapse
      parameters:
        tau_syn: {value: 5}
    syn4:
      name: syn4
      iri: neuroml:alphaCurrSynapse
      parameters:
        tau_syn: {value: 5}
  nodes:
    # 7 cell populations (1 each) — only 4 are recorded in reference output
    - {id: 0, dynamics: IF_curr_alpha, record: false}
    - {id: 1, dynamics: IF_curr_exp}
    - {id: 2, dynamics: IF_cond_alpha}
    - {id: 3, dynamics: IF_cond_exp, record: false}
    - {id: 4, dynamics: EIF_cond_exp_isfa_ista}
    - {id: 5, dynamics: EIF_cond_alpha_isfa_ista, record: false}
    - {id: 6, dynamics: HH_cond_exp}
    # 4 silent target cells
    - {id: 10, dynamics: silent_cell}
    - {id: 11, dynamics: silent_cell}
    - {id: 12, dynamics: silent_cell}
    - {id: 13, dynamics: silent_cell}
    # 2 spike sources (standalone, no connections)
    - {id: 20, dynamics: spikes1, record: false}
    - {id: 21, dynamics: spikes2, record: false}
  edges:
    # EIF_cond_exp_isfa_ista → target[0] via expCondSynapse
    - {source: 4, target: 10, coupling: syn1, parameters: {weight: {value: 0.01}, delay: {value: 10, unit: ms}}}
    # EIF_cond_alpha_isfa_ista → target[1] via alphaCondSynapse
    - {source: 5, target: 11, coupling: syn2, parameters: {weight: {value: 0.005}, delay: {value: 20, unit: ms}}}
    # IF_curr_alpha → target[2] via expCurrSynapse
    - {source: 0, target: 12, coupling: syn3, parameters: {weight: {value: 1}, delay: {value: 30, unit: ms}}}
    # IF_cond_exp → target[3] via alphaCurrSynapse
    - {source: 3, target: 13, coupling: syn4, parameters: {weight: {value: 0.5}, delay: {value: 40, unit: ms}}}
integration:
  method: euler
  step_size: 0.01
  duration: 500.0
  time_scale: ms
""")
dyn_name = next(iter(exp.network.dynamics)) if exp.network and exp.network.dynamics else 'network'
print(f"TVBO model: {dyn_name}  (source var: exp)")
TVBO model: EIF_cond_alpha_isfa_ista  (source var: exp)

2. Render LEMS XML

xml = exp.render("lems")
print(xml[:3000])
<Lems>

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

  <!-- ════════════════════════════════════════════════════════════════
       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: IF_curr_alpha ── -->
  <ComponentType name="IF_curr_alpha" extends="baseCellMembPot">
    <Parameter name="cm" dimension="none"/>
    <Parameter name="i_offset" dimension="none"/>
    <Parameter name="tau_m" dimension="none"/>
    <Parameter name="tau_refrac" dimension="none"/>
    <Parameter name="tau_syn_E" dimension="none"/>
    <Parameter name="tau_syn_I" dimension="none"/>
    <Parameter name="v_init" dimension="none"/>
    <Parameter name="v_reset" dimension="none"/>
    <Parameter name="v_rest" dimension="none"/>
    <Parameter name="v_thresh" dimension="none"/>
    <Constant name="SEC" dimension="time" value="1ms"/>
    <!-- Dynamically attached synapses/inputs from network connections -->
    <Attachments name="synapses" type="basePointCurrent"/>

    <Dynamics>
      <!-- ── Flat dynamics ── -->
      <OnStart>
      </OnStart>
    </Dynamics>
  </ComponentType>

  <Component id="IF_curr_alpha_inst" type="IF_curr_alpha" cm="1.0" i_offset="0.9" tau_m="20.0" tau_refrac="10.0" tau_syn_E="0.5" tau_syn_I="0.5" v_init="-65" v_reset="-62.0" v_rest="-65.0" v_thresh="-52.0"/>

  <!-- ── ComponentType: IF_curr_exp ── -->
  <ComponentType name="IF_curr_exp" extends="baseCellMembPot">
    <Parameter name="cm" dimension="none"/>
    <Parameter name="i_offset" dimension="none"/>
    <Parameter name="tau_m" dimension="none"/>
    <Parameter name="tau_refrac" dimension="none"/>
    <Parameter name="tau_syn_E" dimension="none"/>
    <Parameter name="tau_syn_I" dimension="none"/>
    <Parameter name="v_init" dimension="none"/>
    <Parameter name="v_reset" dimension="none"/>
    <Parameter name="v_rest" dimension="none"/>
    <Parameter name="v_thresh" dimension="none"/>
    <Constant name="SEC" dimension="time" value="1ms"/>
    <!-- Dynamically attached synapses/inputs from network connections -->
    <Attachments name="synapses" type="basePointCurrent"/>

    <Dynamics>
      <!-- ── Flat dynamics ── -->
      <OnStart>
      </OnStart>
    </Dynamics>
  </ComponentType>

  <Component id="IF_curr_exp_inst" type="IF_curr_exp" cm="1.0" i_offset="1.0" tau_m="20.0" tau_refrac="8.0" tau_syn_E="5.0" tau_syn_I="5.0" v_init="-65" v_reset="-70.0" v_rest="-65.0" v_thresh="-50.

3. Run Reference

from tvbo.adapters.neuroml import run_lems_example

ref_outputs = run_lems_example("LEMS_NML2_Ex14_PyNN.xml")
for name, arr in ref_outputs.items():
    print(f"  {name}: shape={arr.shape}")
  ex14.dat: shape=(50001, 9)
  ex14_g.dat: shape=(50001, 3)

4. Run TVBO

result = exp.run("neuroml")
da = result.integration.data
print(f"TVBO: {da.dims}, shape={da.shape}")
pyNeuroML >>> 16:51:22 - INFO - Loading LEMS file: tvbo_lems_sim.xml and running with jNeuroML
pyNeuroML >>> 16:51:22 - 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/tmpiiwl7si9
pyNeuroML >>> 16:51:23 - INFO - Command completed successfully!
TVBO: ('time', 'quantity'), shape=(50001, 8)

5. Compare & Plot

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