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>
  <Target component="sim_NeuroML_Ex14__PyNN_Cells"/>

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

    <IF_curr_alpha id="IF_curr_alpha" cm="1" i_offset="0.9" tau_m="20" tau_refrac="10" tau_syn_E="0.5" tau_syn_I="0.5" v_init="-65" v_reset="-62" v_rest="-65" v_thresh="-52"/>

    <IF_curr_exp id="IF_curr_exp" cm="1" i_offset="1" tau_m="20" tau_refrac="8" tau_syn_E="5" tau_syn_I="5" v_init="-65" v_reset="-70" v_rest="-65" v_thresh="-50"/>

    <IF_cond_alpha id="IF_cond_alpha" cm="1" e_rev_E="0" e_rev_I="-70" i_offset="0.9" tau_m="20" tau_refrac="5" tau_syn_E="0.3" tau_syn_I="0.5" v_init="-65" v_reset="-65" v_rest="-65" v_thresh="-50"/>

    <IF_cond_exp id="IF_cond_exp" cm="1" e_rev_E="0" e_rev_I="-70" i_offset="1" tau_m="20" tau_refrac="5" tau_syn_E="5" tau_syn_I="5" v_init="-65" v_reset="-68" v_rest="-65" v_thresh="-52"/>

    <EIF_cond_exp_isfa_ista id="EIF_cond_exp_isfa_ista" a="0" b="0.0805" cm="0.281" delta_T="2" e_rev_E="0" e_rev_I="-80" i_offset="0.6" tau_m="9.3667" tau_refrac="5" tau_syn_E="5" tau_syn_I="5" tau_w="144" v_init="-65" v_reset="-68" v_rest="-70.6" v_spike="-40" v_thresh="-52"/>

    <EIF_cond_alpha_isfa_ista id="EIF_cond_alpha_isfa_ista" a="0" b="0.0805" cm="0.281" delta_T="0" e_rev_E="0" e_rev_I="-80" i_offset="0.6" tau_m="9.3667" tau_refrac="5" tau_syn_E="5" tau_syn_I="5" tau_w="144" v_init="-65" v_reset="-68" v_rest="-70.6" v_spike="-40" v_thresh="-52"/>

    <HH_cond_exp id="HH_cond_exp" cm="0.2" e_rev_E="0" e_rev_I="-80" e_rev_K="-90" e_rev_Na="50" e_rev_leak="-65" g_leak="0.01" gbar_K="6" gbar_Na="20" i_offset="0.2" tau_syn_E="0.2" tau_syn_I="2" v_init="-65" v_offset="-63"/>

    <IF_cond_alpha id="silent_cell" cm="1" e_rev_E="0" e_rev_I="-70" i_offset="0" tau_m="20" tau_refrac="5" tau_syn_E="5" tau_syn_I="10" v_init="-65" v_reset="-65" v_rest="-65" v_thresh="-50"/>

    <SpikeSourcePoisson id="spikes1" duration="400.0 ms" rate="50.0 Hz" start="50.0 ms"/>

    <SpikeSourcePoisson id="spikes2" duration="300.0 ms" rate="80.0 Hz" start="50.0 ms"/>

    <expCondSynapse id="syn1" e_rev="0" tau_syn="5"/>

    <alphaCondSynapse id="syn2" e_rev="0" tau_syn="5"/>

    <expCurrSynapse id="syn3" tau_syn="5"/>

    <alphaCurrSynapse id="syn4" tau_syn="5"/>

    <network id="net1">
        <population id="IF_curr_alpha_pop" component="IF_curr_alpha" size="1"/>
        <population id="IF_curr_exp_pop" component="IF_curr_exp" size="1"/>
        <population id="IF_cond_alpha_pop" component="IF_cond_alpha" size="1"/>
        <population id="IF_cond_exp_pop" component="IF_cond_exp" size="1"/>
        <population id="EIF_cond_exp_isfa_ista_pop" component="EIF_cond_exp_isfa_ista" size="1"/>
        <population id="EIF_cond_alpha_isfa_ista_pop" component="EIF_cond_alpha_isfa_ista" size="1"/>
        <population id="HH_cond_exp_pop" component="HH_cond_exp" size="1"/>
        <population id="silent_cell_pop" component="sile

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}")
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")