.. currentmodule:: brian2

.. Naud_et_al_2008_adex_firing_patterns:

Example: Naud_et_al_2008_adex_firing_patterns
=============================================


        .. only:: html

            .. |launchbinder| image:: file:///usr/share/doc/python-brian-doc/docs/badge.svg
            .. _launchbinder: https://mybinder.org/v2/gh/brian-team/brian2-binder/master?filepath=examples/frompapers/Naud_et_al_2008_adex_firing_patterns.ipynb

            .. note::
               You can launch an interactive, editable version of this
               example without installing any local files
               using the Binder service (although note that at some times this
               may be slow or fail to open): |launchbinder|_

        

Firing patterns in the adaptive exponential integrate-and-fire model
-----------------------
Naud R et al. (2008): Firing patterns in the adaptive exponential integrate-and-fire model.
Biol Cybern. 2008; 99(4): 335–347.
doi:10.1007/s00422-008-0264-7

Parameters adapted by P. Müller to match figures, cf. http://www.kip.uni-heidelberg.de/Veroeffentlichungen/details.php?id=3445.

Sebastian Schmitt, Sebastian Billaudelle, 2022

::

    from brian2 import *
    import matplotlib.pyplot as plt
    
    
    def sim(ax_vm, ax_w, ax_vm_w, parameters):
        """
        simulate with parameters and plot to axes
        """
    
        # taken from Touboul_Brette_2008
        eqs = """
        dvm/dt = (g_l*(e_l - vm) + g_l*d_t*exp((vm-v_t)/d_t) + i_stim - w)/c_m : volt
        dw/dt  = (a*(vm - e_l) - w)/tau_w : amp
        """
    
        neuron = NeuronGroup(
            1,
            model=eqs,
            threshold="vm > 0*mV",
            reset="vm = v_r; w += b",
            method="euler",
            namespace=parameters,
        )
    
        neuron.vm = parameters["e_l"]
        neuron.w = 0
    
        states = StateMonitor(neuron, ["vm", "w"], record=True, when="thresholds")
    
        defaultclock.dt = 0.1 * ms
        run(0.6 * second)
    
        # clip membrane voltages to threshold (0 mV)
        vms = np.clip(states[0].vm / mV, a_min=None, a_max=0)
    
        ax_vm.plot(states[0].t / ms, vms)
        ax_w.plot(states[0].t / ms, states[0].w / nA)
        ax_vm_w.plot(vms, states[0].w / nA)
    
        ax_w.sharex(ax_vm)
        ax_vm.tick_params(labelbottom=False)
    
        ax_vm.set_ylabel("V [mV]")
    
        ax_w.set_xlabel("t [ms]")
        ax_w.set_ylabel("w [nA]")
    
        ax_vm_w.set_xlabel("V [mV]")
        ax_vm_w.set_ylabel("w [nA]")
    
        ax_vm_w.yaxis.tick_right()
        ax_vm_w.yaxis.set_label_position("right")
    
    
    patterns = {
        "tonic spiking": {
            "c_m": 200 * pF,
            "g_l": 10 * nS,
            "e_l": -70.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": 2.0 * nS,
            "tau_w": 30.0 * ms,
            "b": 0.0 * pA,
            "v_r": -58.0 * mV,
            "i_stim": 500 * pA,
        },
        "adaptation": {
            "c_m": 200 * pF,
            "g_l": 12 * nS,
            "e_l": -70.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": 2.0 * nS,
            "tau_w": 300.0 * ms,
            "b": 60.0 * pA,
            "v_r": -58.0 * mV,
            "i_stim": 500 * pA,
        },
        "initial burst": {
            "c_m": 130 * pF,
            "g_l": 18 * nS,
            "e_l": -58.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": 4.0 * nS,
            "tau_w": 150.0 * ms,
            "b": 120.0 * pA,
            "v_r": -50.0 * mV,
            "i_stim": 400 * pA,
        },
        "regular bursting": {
            "c_m": 200 * pF,
            "g_l": 10 * nS,
            "e_l": -58.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": 2.0 * nS,
            "tau_w": 120.0 * ms,
            "b": 100.0 * pA,
            "v_r": -46.0 * mV,
            "i_stim": 210 * pA,
        },
        "delayed accelerating": {
            "c_m": 200 * pF,
            "g_l": 12 * nS,
            "e_l": -70.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": -10.0 * nS,
            "tau_w": 300.0 * ms,
            "b": 0.0 * pA,
            "v_r": -58.0 * mV,
            "i_stim": 300 * pA,
        },
        "delayed regular bursting": {
            "c_m": 100 * pF,
            "g_l": 10 * nS,
            "e_l": -65.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": -10.0 * nS,
            "tau_w": 90.0 * ms,
            "b": 30.0 * pA,
            "v_r": -47.0 * mV,
            "i_stim": 110 * pA,
        },
        "transient spiking": {
            "c_m": 100 * pF,
            "g_l": 10 * nS,
            "e_l": -65.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": 10.0 * nS,
            "tau_w": 90.0 * ms,
            "b": 100.0 * pA,
            "v_r": -47.0 * mV,
            "i_stim": 180 * pA,
        },
        "irregular spiking": {
            "c_m": 100 * pF,
            "g_l": 12 * nS,
            "e_l": -60.0 * mV,
            "v_t": -50.0 * mV,
            "d_t": 2.0 * mV,
            "a": -11.0 * nS,
            "tau_w": 130.0 * ms,
            "b": 30.0 * pA,
            "v_r": -48.0 * mV,
            "i_stim": 160 * pA,
        },
    }
    
    # loop over all patterns and plot
    for pattern, parameters in patterns.items():
    
        fig = plt.figure(figsize=(10, 5))
        fig.suptitle(pattern)
        gs = fig.add_gridspec(2, 2)
    
        ax_vm = fig.add_subplot(gs[0, 0])
        ax_w = fig.add_subplot(gs[1, 0])
        ax_vm_w = fig.add_subplot(gs[:, 1])
    
        sim(ax_vm, ax_w, ax_vm_w, parameters)
    plt.show()
    

