Post-Inhibitory Rebound Bursting#

Thalamic relay neurons can fire a rebound burst after a period of hyperpolarization. The low-threshold T-type calcium current inactivates at rest, but a sustained hyperpolarizing input removes that inactivation. When the hyperpolarization ends, the T-current activates transiently and drives a brief burst of spikes — even though the net input is now zero.

import brainstate
import braintools
import brainunit as u
import numpy as np
import matplotlib.pyplot as plt
import braincell
An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.

A cell with a T-type calcium current#

The key ingredient is the low-threshold T-type calcium channel (CaT_HM1992); HCN_HM1992 (the H-current) sets a realistic resting potential, and the high-threshold calcium current shapes the burst.

class ThalamicCell(braincell.SingleCompartment):
    """Thalamic-relay-style cell with a low-threshold T-type Ca current."""
    def __init__(self, size, solver='ind_exp_euler'):
        super().__init__(size, V_initializer=braintools.init.Constant(-65. * u.mV),
                         V_th=20. * u.mV, solver=solver)
        self.na = braincell.ion.SodiumFixed(size, E=50. * u.mV)
        self.na.add(INa=braincell.channel.Na_Ba2002(size, V_sh=-30 * u.mV))
        self.k = braincell.ion.PotassiumFixed(size, E=-90. * u.mV)
        self.k.add(IKL=braincell.channel.K_Leak(size, g_max=0.01 * (u.mS / u.cm ** 2)))
        self.k.add(IDR=braincell.channel.KDR_Ba2002(size, V_sh=-30. * u.mV, q10=2.0, temp=u.celsius2kelvin(16.)))
        self.ca = braincell.ion.CalciumDetailed(size, C_rest=5e-5 * u.mM,
                                                tau=10. * u.ms, d=0.5 * u.um)
        self.ca.add(ICaT=braincell.channel.CaT_HM1992(size, g_max=2.1 * (u.mS / u.cm ** 2)))
        self.ca.add(ICaHT=braincell.channel.CaHT_HM1992(size, g_max=3.0 * (u.mS / u.cm ** 2)))
        self.Ih = braincell.channel.HCN_HM1992(size, g_max=0.01 * (u.mS / u.cm ** 2), E=-43 * u.mV)
        self.IL = braincell.channel.IL(size, g_max=0.0075 * (u.mS / u.cm ** 2), E=-70 * u.mV)

Apply a hyperpolarizing step, then release#

We inject a hyperpolarizing current density of -2 uA/cm^2 for the first 200 ms, then switch to zero. The current is a function of time t, selected with u.math.where.

cell = ThalamicCell(1)
cell.init_state()

def I_of_t(t):
    return u.math.where(t < 200. * u.ms,
                        -2. * u.uA / u.cm ** 2,
                        0. * u.uA / u.cm ** 2)

def step(t):
    with brainstate.environ.context(t=t):
        cell.update(I_of_t(t))
    return cell.V.value, cell.spike.value

with brainstate.environ.context(dt=0.01 * u.ms):
    times = u.math.arange(0. * u.ms, 500. * u.ms, brainstate.environ.get_dt())
    vs, spikes = brainstate.transform.for_loop(step, times)

spike_times = np.asarray(times[u.math.squeeze(spikes) > 0] / u.ms)
rebound = spike_times[spike_times > 200.]
print('spikes after release (ms):', np.round(rebound[:10], 1).tolist())
spikes after release (ms): [266.5, 277.79998779296875, 282.6000061035156, 289.20001220703125, 300.20001220703125]

Visualize the rebound burst#

During the hyperpolarizing step the cell is silent and below rest; on release it overshoots and fires a short, high-frequency burst before settling.

plt.figure(figsize=(8, 3))
plt.plot(times / u.ms, u.math.squeeze(vs) / u.mV, linewidth=0.8)
plt.axvline(200., color='k', linestyle=':', label='release')
plt.xlabel('Time (ms)'); plt.ylabel('Membrane potential (mV)')
plt.title('Post-inhibitory rebound burst (T-type Ca current)')
plt.legend(); plt.tight_layout(); plt.show()
../_images/1c2542bba6ecd87ca12a90258c4f0661c26b418461907523716acf608243cd35.png