NML2: Simple Morphology

Cell morphology definitions with segments and segment groups

NML2_SimpleMorphology.nml

Demonstrates NeuroML morphology specification:

  • <segment> elements with proximal/distal 3D points and diameter
  • <segmentGroup> for grouping segments (soma, axon, dendrite)
  • Parent-child relationships for branching
from pathlib import Path

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

# Show morphology elements
for line in text.split('\n'):
    stripped = line.strip()
    if '<morphology' in stripped or '<segment ' in stripped or \
       '<segmentGroup' in stripped or '<proximal' in stripped or \
       '<distal' in stripped or '</morphology' in stripped:
        print(stripped[:120])
<morphology id="SimpleCell_Morphology">
<segment id ="0" name="Soma">    <!-- name is optional-->
<proximal x="0" y="0" z="0" diameter="10"/>
<distal x="10" y="0" z="0" diameter="10"/>
<segment id ="1" name="MainDendrite1" >
<proximal x="10" y="0" z="0" diameter="3"/>
<distal x="20" y="0" z="0" diameter="3"/>
<segment id ="2" name="MainDendrite2">
<distal x="30" y="0" z="0" diameter="1"/>
<segment id ="3" name="Spine" >
<proximal x="25" y="0" z="0" diameter="0.2"/>
<distal x="25" y="1" z="0" diameter="0.2"/>
<segmentGroup id="soma_group" neuroLexId="sao1044911821">    <!-- Reserved/special name of a group -->
<segmentGroup id="thick_dendrites">
<segmentGroup id="spines" neuroLexId="sao1145756102">
<segmentGroup id="dendrite_group" neuroLexId="sao1211023249">     <!-- Reserved/special name of a group -->
<segmentGroup id="middle">            <!-- group defined between 2 segs -->
<segmentGroup id="tip">              <!-- group defined between 2 segs -->
</morphology>

TVBO Representation

TVBO represents point neurons — morphology is abstracted away into a single compartment. The dynamics (HH, IaF, etc.) are the same regardless of spatial extent.

from tvbo import SimulationExperiment

exp = SimulationExperiment.from_string("""
label: "NML2 SimpleMorphology: HH Point Neuron"
dynamics:
  name: HodgkinHuxley
  parameters:
    C:     { value: 10.0 }
    g_Na:  { value: 1200.0 }
    g_K:   { value: 360.0 }
    g_L:   { value: 3.0 }
    E_Na:  { value: 50.0 }
    E_K:   { value: -77.0 }
    E_L:   { value: -54.3 }
    I_ext: { value: 0.08 }
  derived_variables:
    alpha_m:
      equation:
        rhs: "Piecewise((1.0, Eq(v, -40.0)), (0.1*(v + 40.0)/(1.0 - exp(-(v + 40.0)/10.0)), True))"
    beta_m:
      equation: { rhs: "4.0*exp(-(v + 65.0)/18.0)" }
    alpha_h:
      equation: { rhs: "0.07*exp(-(v + 65.0)/20.0)" }
    beta_h:
      equation: { rhs: "1.0/(1.0 + exp(-(v + 35.0)/10.0))" }
    alpha_n:
      equation:
        rhs: "Piecewise((0.1, Eq(v, -55.0)), (0.01*(v + 55.0)/(1.0 - exp(-(v + 55.0)/10.0)), True))"
    beta_n:
      equation: { rhs: "0.125*exp(-(v + 65.0)/80.0)" }
  state_variables:
    v:
      equation:
        rhs: "(-g_Na*m**3*h*(v - E_Na) - g_K*n**4*(v - E_K) - g_L*(v - E_L) + I_ext*1000) / C"
      initial_value: -65.0
      variable_of_interest: true
    m:
      equation: { rhs: "alpha_m*(1 - m) - beta_m*m" }
      initial_value: 0.05
    h:
      equation: { rhs: "alpha_h*(1 - h) - beta_h*h" }
      initial_value: 0.6
    n:
      equation: { rhs: "alpha_n*(1 - n) - beta_n*n" }
      initial_value: 0.32
network:
  number_of_nodes: 1
integration:
  method: euler
  step_size: 0.01
  duration: 150.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_SimpleMorphology__HH_Point_Neuron"/>

  <!-- ════════════════════════════════════════════════════════════════
       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"

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 SimpleMorphology: HH Point Neuron via TVBO")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()