Interoperability · NeuroML / LEMS
Model: Current-Based Synapses
Current-based synapses inject a fixed current waveform (alpha kernel) on spike arrival, independent of membrane voltage. Uses iafRefCell (IaF with refractory period) and alphaCurrentSynapse with spikeArray input.
Reference: NeuroML2 LEMS_NML2_Ex21_CurrentBasedSynapses.xml
1. Define Network in TVBO
from tvbo import SimulationExperiment
exp = SimulationExperiment.from_string("""
label: "NeuroML Ex21: IaF with Current-Based Synapses"
dynamics:
name: iafRefCell
iri: neuroml:iafRefCell
network:
dynamics:
iaf:
name: iaf
iri: neuroml:iafRefCell
parameters:
C: {value: 250, unit: pF}
thresh: {value: 1, unit: mV}
reset: {value: -1, unit: mV}
leakConductance: {value: 12.5, unit: nS}
leakReversal: {value: 0, unit: mV}
refract: {value: 2, unit: ms}
spks:
name: spks
iri: neuroml:spikeArray
events:
spikes:
event_type: preset_time
trigger_times: [100, 120, 126, 135]
nodes:
- {id: 0, dynamics: iaf}
- {id: 1, dynamics: spks}
edges:
- source: 1
target: 0
coupling: alphaCurrentSynapse
parameters:
tau: {value: 1.0, unit: ms}
ibase: {value: 1, unit: nA}
weight: {value: 0.05}
delay: {value: 1, unit: ms}
integration:
method: euler
step_size: 0.001
duration: 300.0
time_scale: ms
""" )
print (f"Model: { exp. dynamics. name if exp. dynamics else 'network' } " )
* Owlready2 * Warning: ignoring cyclic subclass of/subproperty of, involving:
http://uri.interlex.org/tgbugs/uris/readable/atlas/Space
2. Render LEMS XML
xml = exp.render("lems" )
print (xml[:1500 ])
<Lems>
<!-- Tell jLEMS/jNeuroML which component is the simulation entry point. -->
<Target component="sim_NeuroML_Ex21__IaF_with_Current_Based_Synapses"/>
<!-- ════════════════════════════════════════════════════════════════
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: iaf ── -->
<ComponentType name="iaf" extends="baseCellMembPot">
<Parameter name="C" dimension="capacitance"/>
<Parameter name="leakConductance" dimension="conductance"/>
<Parameter name="leakReversal" dimension="voltage"/>
<Parameter name="refract" dimension="time"/>
<Parameter name="reset" dimension="voltage"/>
<Parameter name="thresh" dimension="voltage"/>
<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>
3. Run Reference
from tvbo.adapters.neuroml import run_lems_example
ref_outputs = run_lems_example("LEMS_NML2_Ex21_CurrentBasedSynapses.xml" )
for name, arr in ref_outputs.items():
print (f" { name} : shape= { arr. shape} " )
ex21_v.dat: shape=(300001, 2)
4. Run TVBO
result = exp.run("neuroml" )
da = result.integration.data
print (f"TVBO: { da. dims} , shape= { da. shape} " )
pyNeuroML >>> 13:05:59 - INFO - Loading LEMS file: tvbo_lems_sim.xml and running with jNeuroML
pyNeuroML >>> 13:05:59 - 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/tmpowqxpe6e
pyNeuroML >>> 13:06:00 - INFO - Command completed successfully!
TVBO: ('time', 'quantity'), shape=(300001, 1)
5. Compare & Plot
from tvbo.adapters.neuroml import plot_lems_comparison
plot_lems_comparison("LEMS_NML2_Ex21_CurrentBasedSynapses.xml" , ref_outputs, result.integration.data, title_prefix= "Ex21" )