Interoperability · NeuroML / LEMS
NML2_SynapseTypes.nml
Catalog of all NeuroML2 built-in synapse types:
expOneSynapse
Single-exponential decay
gbase, erev, tauDecay
expTwoSynapse
Rise + decay
gbase, erev, tauRise, tauDecay
expThreeSynapse
Rise + two decay phases
gbase, erev, tauRise, tauDecay1, tauDecay2
alphaSynapse
Alpha function
gbase, erev, tau
blockingPlasticSynapse
With voltage block + plasticity
+ blockConcentration, blockMechanism
doubleSynapse
Two conductance components
gbase1, gbase2, …
import urllib.request
url = "https://raw.githubusercontent.com/NeuroML/NeuroML2/master/examples/NML2_SynapseTypes.nml"
with urllib.request.urlopen(url) as resp:
text = resp.read().decode()
for line in text.split(' \n ' ):
stripped = line.strip()
if 'Synapse' in stripped and stripped.startswith('<' ) and 'id=' in stripped:
print (stripped[:120 ])
<alphaSynapse id="synalpha" gbase="0.5nS" erev="0mV" tau="2ms" >
<expOneSynapse id="sy1" gbase="0.5nS" erev="0mV" tauDecay="3ms" >
<expTwoSynapse id="SimpleSynapse" gbase="0.5nS" erev="0mV"
<expThreeSynapse id="AMPA" gbase1="1.5nS" tauRise="0.1ms" tauDecay1="0.7ms"
<blockingPlasticSynapse id="stpSynDep" gbase="1nS" erev="0mV" tauRise="0.1ms" tauDecay="2ms">
<blockingPlasticSynapse id="stpSynDepFac" gbase="1nS" erev="0mV"
<blockingPlasticSynapse id="blockStpSynDep" gbase="1nS" erev="0mV"
<blockingPlasticSynapse id="blockStpSynDepFac" gbase="1nS" erev="0mV"
<blockingPlasticSynapse id="NMDA" gbase="0.5nS"
<doubleSynapse id="AMPA_NMDA" synapse1="AMPA" synapse1Path="./AMPA" synapse2="NMDA" synapse2Path="./NMDA">
TVBO Representation: IaF Cell (Synapse Target)
from tvbo import SimulationExperiment
exp = SimulationExperiment.from_string("""
label: "NML2 SynapseTypes: IaF Cell"
dynamics:
name: IntegrateAndFire
parameters:
leakReversal: { value: -50.0 }
tau: { value: 30.0 }
thresh: { value: -55.0 }
reset: { value: -70.0 }
state_variables:
v:
equation: { rhs: "(leakReversal - v) / tau" }
initial_value: -50.0
variable_of_interest: true
events:
spike:
condition: { rhs: "v > thresh" }
affect: { rhs: "v = reset" }
network:
number_of_nodes: 1
integration:
method: euler
step_size: 0.005
duration: 300.0
time_scale: ms
""" )
xml = exp.render("lems" )
print (xml[:800 ])
* Owlready2 * Warning: ignoring cyclic subclass of/subproperty of, involving:
http://uri.interlex.org/tgbugs/uris/readable/atlas/Space
<Lems>
<!-- Tell jLEMS/jNeuroML which component is the simulation entry point. -->
<Target component="sim_NML2_SynapseTypes__IaF_Cell"/>
<Include file="Cells.xml"/>
<Include file="Networks.xml"/>
<Include file="Simulation.xml"/>
<!-- ════════════════════════════════════════════════════════════════
Dynamics ComponentType & Component instances
════════════════════════════════════════════════════════════════ -->
<!-- ════════════════════════════════════════════════════════════════
ComponentType: IntegrateAndFire
Generated from TVBO Dynamics: IntegrateAndFire
════════════════════════════════════════════════════════════════ -->
<ComponentType name="IntegrateAndFire">
<!-- Parameters -->
<Parameter name="leakReversal" dimension="non
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 SynapseTypes: IaF Cell via TVBO" )
ax.grid(True , alpha= 0.3 )
plt.tight_layout()
plt.show()
pyNeuroML >>> 13:09:26 - INFO - Loading LEMS file: tvbo_lems_sim.xml and running with jNeuroML
pyNeuroML >>> 13:09:26 - 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/tmp5pndcww2
pyNeuroML >>> 13:09:27 - INFO - Command completed successfully!