Ex3: HH Network with Synapses

Network of HH cells connected by expOneSynapse, expTwoSynapse, and alphaSynapse

Model: HH Network

This example connects a pre-synaptic HH cell to three post-synaptic passive cells via different synapse types (expOneSynapse, expTwoSynapse, alphaSynapse).

Cell types use standard NeuroML types (pointCellCondBased) with hierarchical components: composition trees. Synapses use standard NeuroML synapse types on network edges. This gives exact numerical identity with the reference jNeuroML simulation.


1. Define Network in TVBO

from tvbo import SimulationExperiment

exp = SimulationExperiment.from_string("""
label: "NeuroML Ex3: HH Network"
dynamics:
  name: hhcell_1
  iri: neuroml:pointCellCondBased
  parameters:
    C:      { value: 10, unit: pF }
    v0:     { value: -65, unit: mV }
    thresh: { value: 20, unit: mV }
  components:
    passive:
      name: passive
      iri: neuroml:ionChannelPassive
      parameters:
        conductance: { value: 10, unit: pS }
        number:      { value: 300 }
        erev:        { value: -54.3, unit: mV }
    na:
      name: na
      iri: neuroml:ionChannelHH
      parameters:
        conductance: { value: 10, unit: pS }
        number:      { value: 120000 }
        erev:        { value: 50, unit: mV }
      components:
        m:
          name: m
          iri: neuroml:gateHHrates
          parameters: { instances: { value: 3 } }
          components:
            forwardRate:
              name: forwardRate
              iri: neuroml:HHExpLinearRate
              parameters:
                rate:     { value: 1, unit: per_ms }
                midpoint: { value: -40, unit: mV }
                scale:    { value: 10, unit: mV }
            reverseRate:
              name: reverseRate
              iri: neuroml:HHExpRate
              parameters:
                rate:     { value: 4, unit: per_ms }
                midpoint: { value: -65, unit: mV }
                scale:    { value: -18, unit: mV }
        h:
          name: h
          iri: neuroml:gateHHrates
          parameters: { instances: { value: 1 } }
          components:
            forwardRate:
              name: forwardRate
              iri: neuroml:HHExpRate
              parameters:
                rate:     { value: 0.07, unit: per_ms }
                midpoint: { value: -65, unit: mV }
                scale:    { value: -20, unit: mV }
            reverseRate:
              name: reverseRate
              iri: neuroml:HHSigmoidRate
              parameters:
                rate:     { value: 1, unit: per_ms }
                midpoint: { value: -35, unit: mV }
                scale:    { value: 10, unit: mV }
    k:
      name: k
      iri: neuroml:ionChannelHH
      parameters:
        conductance: { value: 10, unit: pS }
        number:      { value: 36000 }
        erev:        { value: -77, unit: mV }
      components:
        n:
          name: n
          iri: neuroml:gateHHrates
          parameters: { instances: { value: 4 } }
          components:
            forwardRate:
              name: forwardRate
              iri: neuroml:HHExpLinearRate
              parameters:
                rate:     { value: 0.1, unit: per_ms }
                midpoint: { value: -55, unit: mV }
                scale:    { value: 10, unit: mV }
            reverseRate:
              name: reverseRate
              iri: neuroml:HHExpRate
              parameters:
                rate:     { value: 0.125, unit: per_ms }
                midpoint: { value: -65, unit: mV }
                scale:    { value: -80, unit: mV }

network:
  number_of_nodes: 5
  dynamics:
    hhcell_1:
      name: hhcell_1
      iri: neuroml:pointCellCondBased
      parameters:
        C:      { value: 10, unit: pF }
        v0:     { value: -65, unit: mV }
        thresh: { value: 20, unit: mV }
      components:
        passive:
          name: passive
          iri: neuroml:ionChannelPassive
          parameters:
            conductance: { value: 10, unit: pS }
            number:      { value: 300 }
            erev:        { value: -54.3, unit: mV }
        na:
          name: na
          iri: neuroml:ionChannelHH
          parameters:
            conductance: { value: 10, unit: pS }
            number:      { value: 120000 }
            erev:        { value: 50, unit: mV }
          components:
            m:
              name: m
              iri: neuroml:gateHHrates
              parameters: { instances: { value: 3 } }
              components:
                forwardRate:
                  name: forwardRate
                  iri: neuroml:HHExpLinearRate
                  parameters:
                    rate:     { value: 1, unit: per_ms }
                    midpoint: { value: -40, unit: mV }
                    scale:    { value: 10, unit: mV }
                reverseRate:
                  name: reverseRate
                  iri: neuroml:HHExpRate
                  parameters:
                    rate:     { value: 4, unit: per_ms }
                    midpoint: { value: -65, unit: mV }
                    scale:    { value: -18, unit: mV }
            h:
              name: h
              iri: neuroml:gateHHrates
              parameters: { instances: { value: 1 } }
              components:
                forwardRate:
                  name: forwardRate
                  iri: neuroml:HHExpRate
                  parameters:
                    rate:     { value: 0.07, unit: per_ms }
                    midpoint: { value: -65, unit: mV }
                    scale:    { value: -20, unit: mV }
                reverseRate:
                  name: reverseRate
                  iri: neuroml:HHSigmoidRate
                  parameters:
                    rate:     { value: 1, unit: per_ms }
                    midpoint: { value: -35, unit: mV }
                    scale:    { value: 10, unit: mV }
        k:
          name: k
          iri: neuroml:ionChannelHH
          parameters:
            conductance: { value: 10, unit: pS }
            number:      { value: 36000 }
            erev:        { value: -77, unit: mV }
          components:
            n:
              name: n
              iri: neuroml:gateHHrates
              parameters: { instances: { value: 4 } }
              components:
                forwardRate:
                  name: forwardRate
                  iri: neuroml:HHExpLinearRate
                  parameters:
                    rate:     { value: 0.1, unit: per_ms }
                    midpoint: { value: -55, unit: mV }
                    scale:    { value: 10, unit: mV }
                reverseRate:
                  name: reverseRate
                  iri: neuroml:HHExpRate
                  parameters:
                    rate:     { value: 0.125, unit: per_ms }
                    midpoint: { value: -65, unit: mV }
                    scale:    { value: -80, unit: mV }
    hhcell_2:
      name: hhcell_2
      iri: neuroml:pointCellCondBased
      parameters:
        C:      { value: 10, unit: pF }
        v0:     { value: -55, unit: mV }
        thresh: { value: 20, unit: mV }
      components:
        leak:
          name: leak
          iri: neuroml:ionChannelPassive
          parameters:
            conductance: { value: 10, unit: pS }
            number:      { value: 300 }
            erev:        { value: -54.3, unit: mV }
  nodes:
    - id: 0
      dynamics: hhcell_1
      record: false
    - id: 1
      dynamics: hhcell_2
    - id: 2
      dynamics: hhcell_2
    - id: 3
      dynamics: hhcell_2
    - id: 100
      dynamics: pulseGenerator
      parameters:
        delay:     { value: 25, unit: ms }
        duration:  { value: 50, unit: ms }
        amplitude: { value: 0.065, unit: nA }
  edges:
    - source: 100
      target: 0
    - source: 0
      target: 1
      coupling: expOneSynapse
      parameters:
        gbase:    { value: 0.5, unit: nS }
        erev:     { value: 0, unit: mV }
        tauDecay: { value: 3, unit: ms }
    - source: 0
      target: 2
      coupling: expTwoSynapse
      parameters:
        gbase:    { value: 0.5, unit: nS }
        erev:     { value: 0, unit: mV }
        tauRise:  { value: 1, unit: ms }
        tauDecay: { value: 2, unit: ms }
    - source: 0
      target: 3
      coupling: alphaSynapse
      parameters:
        gbase: { value: 0.5, unit: nS }
        erev:  { value: 0, unit: mV }
        tau:   { value: 2, unit: ms }

integration:
  method: euler
  step_size: 0.005
  duration: 100.0
  time_scale: ms
""")
print(f"Model: {exp.dynamics.name if exp.dynamics else 'network'}")
print(f"Network nodes: {len(exp.network.nodes)}")
Model: hhcell_1
Network nodes: 5

2. Render LEMS XML

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

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

    <ionChannelHH id="k" conductance="10 pS">
        <gateHHrates id="n" instances="4">
            <forwardRate type="HHExpLinearRate" midpoint="-55 mV" rate="0.1 per_ms" scale="10 mV"/>
            <reverseRate type="HHExpRate" midpoint="-65 mV" rate="0.125 per_ms" scale="-80 mV"/>
        </gateHHrates>
    </ionChannelHH>

    <ionChannelHH id="na" conductance="10 pS">
        <gateHHrates id="h" instances="1">
            <forwardRate type="HHExpRate" midpoint="-65 mV" rate="0.07 per_ms" scale="-20 mV"/>
            <reverseRate type="HHSigmoidRate" midpoint="-35 mV" rate="1 per_ms" scale="10 mV"/>
        </gateHHrates>
        <gateHHrates id="m" instances="3">
            <forwardRate type="HHExpLinearRate" midpoint="-40 mV" rate="1 per_ms" scale="10 mV"/>
            <reverseRate type="HHExpRate" midpoint="-65 mV" rate="4 per_ms" scale="-18 mV"/>
        </gateHHrates>
    </ionChannelHH>

    <ionChannelPassive id="passive" conductance="10 pS"/>

    <pointCellCondBased id="hhcell_1" C="10 pF" v0="-65 mV" thresh="20 mV">
        <channelPopulation id="k_pop" ionChannel="k" number="36000" erev="-77 mV"/>
        <channelPopulation id="na_pop" ionChannel="na" number="120000" erev="50 mV"/>
        <channelPopulation id="passive_pop" ionChannel="passive" number="300" erev="-54.3 mV"/>
    </pointCellCondBased>

    <ionChannelPassive id="leak" conductance="10 pS"/>

    <pointCellCondBased id="hhcell_2" C="10 pF" v0="-55 mV" thresh="20 mV">
        <channelPopulation id="leak_pop" ionChannel="leak" number="300" erev="-54.3 mV"/>
    </pointCellCondBased>

    <pulseGenerator id="pulseGenerator" amplitude="0.065 nA" delay="25.0 ms" duration="50.0 ms"/>

    <expOneSynapse id="expOneSynapse" erev="0.0 mV" gbase="0.5 nS" tauDecay="3.0 ms"/>

    <expTwoSynapse id="expTwoSynapse" erev="0.0 mV" gbase="0.5 nS" tauDecay="2.0 ms" tauRise="1.0 ms"/>

    <alphaSynapse id="alphaSynapse" erev="0.0 mV" gbase="0.5 nS" tau="2.0 ms"/>

    <network id="net1">
        <population id="hhcell_1_pop" component="hhcell_1" size="1"/>
        <population id="hhcell_2_pop" component="hhcell_2" size="3"/>
        <synapticConnection from="hhcell_1_pop[0]" to="hhcell_2_pop[0]" synapse="expOneSynapse" destination="synapses"/>
        <synapticConnection from="hhcell_1_pop[0]" to="hhcell_2_pop[1]" synapse="expTwoSynapse" destination="synapses"/>
        <synapticConnection from="hhcell_1_pop[0]" to="hhcell_2_pop[2]" synapse="alphaSynapse" destination="synapses"/>
        <explicitInput target="hhcell_1_pop[0]" input="pulseGenerator" destination="synapses"/>
    </network>

    <Simulation id="sim_NeuroML_Ex3__HH_Network" length="100.0ms" step="0.005ms" target="net1">
        <OutputFile id="of0" fileName="results/hhcell_2.dat">
            <OutputColumn id="hhcell_2_pop_0_v" qua

3. Run Reference

from tvbo.adapters.neuroml import run_lems_example

ref_outputs = run_lems_example("LEMS_NML2_Ex3_Net.xml")
for name, arr in ref_outputs.items():
    print(f"  {name}: shape={arr.shape}")
  ex3_v.dat: shape=(20001, 4)

4. Run TVBO

result = exp.run("neuroml")
da = result.integration.data
print(f"TVBO: {da.dims}, shape={da.shape}")
TVBO: ('time', 'quantity'), shape=(20001, 3)

5. Compare & Plot

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