Ex10: Q10 Temperature Dependence

Temperature scaling of ion channel rates via Q10 coefficient

Model: Q10 Temperature Dependence

Demonstrates how ion channel rate constants scale with temperature using the Q10 coefficient: \(k(T) = k(T_{\text{ref}}) \cdot Q_{10}^{(T - T_{\text{ref}})/10}\).

At network temperature \(T = 22°C\) with \(T_{\text{ref}} = 32°C\) and \(Q_{10} = 3\):

\[\text{factor} = 3^{(22 - 32)/10} = 3^{-1} \approx 0.333\]

All gating rates are slowed by a factor of 3 compared to reference temperature. The cell is otherwise standard HH with the same conductances as Ex1/Ex5.


1. Define in TVBO

from tvbo import SimulationExperiment

# Q10 factor = 3^((22-32)/10) = 1/3
# All standard HH rates multiplied by Q10_factor = 0.3333
# Same conductances as Ex1/Ex5: g_Na=1200nS, g_K=360nS, g_L=3nS, C=10pF

exp = SimulationExperiment.from_string("""
label: "NeuroML Ex10: Q10 Temperature Dependence"
dynamics:
  name: HodgkinHuxley_Q10
  iri: neuroml:pointCellCondBased
  description: >
    HH cell with Q10 temperature scaling on all gates.
    Network at 22°C, experimental temp 32°C → Q10 = 3^(-1) ≈ 0.333.
  parameters:
    C:              { value: 10, unit: pF }
    v0:             { value: -65, unit: mV }
    thresh:         { value: 20, unit: mV }
    pulse_delay:    { value: 100, unit: ms }
    pulse_duration: { value: 100, unit: ms }
    I_amp:          { value: 0.08, unit: nA }
    network_temperature: { value: 22, unit: degC }
  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:
            q10Settings:
              name: q10Settings
              iri: neuroml:q10ExpTemp
              parameters:
                q10Factor:        { value: 3 }
                experimentalTemp: { value: 32, unit: degC }
            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:
            q10Settings:
              name: q10Settings
              iri: neuroml:q10ExpTemp
              parameters:
                q10Factor:        { value: 3 }
                experimentalTemp: { value: 32, unit: degC }
            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:
            q10Settings:
              name: q10Settings
              iri: neuroml:q10ExpTemp
              parameters:
                q10Factor:        { value: 3 }
                experimentalTemp: { value: 32, unit: degC }
            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 }
integration:
  step_size: 0.01
  duration: 300.0
  time_scale: ms
""")
print(f"Model: {exp.dynamics.name if exp.dynamics else 'network'}")
print(f"Q10 scaling: rates × {1/3:.4f}")
Model: HodgkinHuxley_Q10
Q10 scaling: rates × 0.3333

2. Render LEMS XML

xml = exp.render("lems")
print(xml[:1500])

<Lems>
  <Target component="sim_NeuroML_Ex10__Q10_Temperature_Dependence"/>

  <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"/>
            <q10Settings type="q10ExpTemp" experimentalTemp="32 degC" q10Factor="3"/>
            <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"/>
            <q10Settings type="q10ExpTemp" experimentalTemp="32 degC" q10Factor="3"/>
            <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"/>
            <q10Settings type="q10ExpTemp" experimentalTemp="32 degC" q10Factor="3"/>
            <reverseRate type="HHExpRate" midpoint="-65 mV" rate="4 per_ms" scale="-18 mV"/>
        </gateHHrates>
    </ionChannelHH>

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

    <pointCellCondBased id="HodgkinHuxley_Q10" C="10 pF" v0="-

3. Run Reference

from tvbo.adapters.neuroml import run_lems_example

ref_outputs = run_lems_example("LEMS_NML2_Ex10_Q10.xml")
for name, arr in ref_outputs.items():
    print(f"  {name}: shape={arr.shape}")
  hhq10_v.dat: shape=(30001, 2)

4. Run TVBO Version

result = exp.run("neuroml")
da = result.integration.data
print(f"TVBO: {da.dims}, shape={da.shape}")
TVBO: ('time', 'variable'), shape=(30001, 1)

5. Compare & Plot

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