From 709e94511aeb0517d1670e1af28275152c91d1e6 Mon Sep 17 00:00:00 2001 From: Sebastian Schmitt Date: Tue, 8 Feb 2022 10:42:15 +0100 Subject: [PATCH 1/3] Firing patterns in the adaptive exponential integrate-and-fire model --- .../Naud_et_al_2008_adex_firing_patterns.py | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100755 examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py diff --git a/examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py b/examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py new file mode 100755 index 000000000..6a6bd50f7 --- /dev/null +++ b/examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python +""" +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() From 4b3c33afae040cd1e252a65215765922ffef766d Mon Sep 17 00:00:00 2001 From: Marcel Stimberg Date: Tue, 8 Feb 2022 15:47:11 +0100 Subject: [PATCH 2/3] Only call plt.show() once --- examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py b/examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py index 6a6bd50f7..fc35bec50 100755 --- a/examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py +++ b/examples/frompapers/Naud_et_al_2008_adex_firing_patterns.py @@ -175,4 +175,4 @@ def sim(ax_vm, ax_w, ax_vm_w, parameters): ax_vm_w = fig.add_subplot(gs[:, 1]) sim(ax_vm, ax_w, ax_vm_w, parameters) - plt.show() +plt.show() From 1e9dbd882509b01f5d5272f3fe9793de5dbe3f4c Mon Sep 17 00:00:00 2001 From: Marcel Stimberg Date: Tue, 8 Feb 2022 15:49:56 +0100 Subject: [PATCH 3/3] Update resources link --- docs_sphinx/resources | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_sphinx/resources b/docs_sphinx/resources index 7d829f47b..3925abc4b 160000 --- a/docs_sphinx/resources +++ b/docs_sphinx/resources @@ -1 +1 @@ -Subproject commit 7d829f47b5200545ecdc7be25c045420941a22f0 +Subproject commit 3925abc4b96e07da7a2fdd192a82ec675dc364eb