Note
Go to the end to download the full example code.
Intrinsic currents spiking¶
Run this example as a Jupyter notebook:
See our guide for more information and troubleshooting.
This example illustrates a neuron receiving spiking input through
several different receptors (AMPA, NMDA, GABA_A, GABA_B), provoking
spike output. The model, ht_neuron
, also has intrinsic currents
(I_NaP
, I_KNa
, I_T
, and I_h
). It is a slightly simplified implementation of
neuron model proposed in [1].
The neuron is bombarded with spike trains from four Poisson generators, which are connected to the AMPA, NMDA, GABA_A, and GABA_B receptors, respectively.
References¶
See Also¶
Intrinsic currents subthreshold
We imported all necessary modules for simulation, analysis and plotting.
import matplotlib.pyplot as plt
import nest
Additionally, we set the verbosity using set_verbosity
to suppress info
messages. We also reset the kernel to be sure to start with a clean NEST.
nest.set_verbosity("M_WARNING")
nest.ResetKernel()
We define the simulation parameters:
The rate of the input spike trains
The weights of the different receptors (names must match receptor types)
The time to simulate
Note that all parameter values should be doubles, since NEST expects doubles.
rate_in = 100.0
w_recep = {"AMPA": 30.0, "NMDA": 30.0, "GABA_A": 5.0, "GABA_B": 10.0}
t_sim = 250.0
num_recep = len(w_recep)
We create
one neuron instance
one Poisson generator instance for each synapse type
one multimeter to record from the neuron:
# - membrane potential
# - threshold potential
# - synaptic conductances
# - intrinsic currents
#
# See :doc:`intrinsic_currents_subthreshold` for more details on ``multimeter``
# configuration.
nrn = nest.Create("ht_neuron")
p_gens = nest.Create("poisson_generator", 4, params={"rate": rate_in})
mm = nest.Create(
"multimeter",
params={
"interval": 0.1,
"record_from": ["V_m", "theta", "g_AMPA", "g_NMDA", "g_GABA_A", "g_GABA_B", "I_NaP", "I_KNa", "I_T", "I_h"],
},
)
We now connect each Poisson generator with the neuron through a different receptor type.
First, we need to obtain the numerical codes for the receptor types from
the model. The receptor_types
entry of the default dictionary for the
ht_neuron
model is a dictionary mapping receptor names to codes.
In the loop, we use Python’s tuple unpacking mechanism to unpack dictionary entries from our w_recep dictionary.
Note that we need to pack the pg variable into a list before
passing it to Connect
, because iterating over the p_gens list
makes pg a “naked” node ID.
receptors = nest.GetDefaults("ht_neuron")["receptor_types"]
for index, (rec_name, rec_wgt) in enumerate(w_recep.items()):
nest.Connect(p_gens[index], nrn, syn_spec={"receptor_type": receptors[rec_name], "weight": rec_wgt})
We then connect the multimeter
. Note that the multimeter is connected to
the neuron, not the other way around.
nest.Connect(mm, nrn)
We are now ready to simulate.
nest.Simulate(t_sim)
We now fetch the data recorded by the multimeter. The data are returned as
a dictionary with entry times
containing timestamps for all
recorded data, plus one entry per recorded quantity.
All data is contained in the events
entry of the status dictionary
returned by the multimeter.
data = mm.events
t = data["times"]
The following function turns a name such as I_NaP
into proper TeX code
\(I_{\mathrm{NaP}}\) for a pretty label.
def texify_name(name):
return r"${}_{{\mathrm{{{}}}}}$".format(*name.split("_"))
The next step is to plot the results. We create a new figure, and add one subplot each for membrane and threshold potential, synaptic conductances, and intrinsic currents.
fig = plt.figure()
Vax = fig.add_subplot(311)
Vax.plot(t, data["V_m"], "b", lw=2, label=r"$V_m$")
Vax.plot(t, data["theta"], "g", lw=2, label=r"$\Theta$")
Vax.set_ylabel("Potential [mV]")
try:
Vax.legend(fontsize="small")
except TypeError:
Vax.legend() # work-around for older Matplotlib versions
Vax.set_title("ht_neuron driven by Poisson processes")
Gax = fig.add_subplot(312)
for gname in ("g_AMPA", "g_NMDA", "g_GABA_A", "g_GABA_B"):
Gax.plot(t, data[gname], lw=2, label=texify_name(gname))
try:
Gax.legend(fontsize="small")
except TypeError:
Gax.legend() # work-around for older Matplotlib versions
Gax.set_ylabel("Conductance [nS]")
Iax = fig.add_subplot(313)
for iname, color in (("I_h", "maroon"), ("I_T", "orange"), ("I_NaP", "crimson"), ("I_KNa", "aqua")):
Iax.plot(t, data[iname], color=color, lw=2, label=texify_name(iname))
try:
Iax.legend(fontsize="small")
except TypeError:
Iax.legend() # work-around for older Matplotlib versions
Iax.set_ylabel("Current [pA]")
Iax.set_xlabel("Time [ms]")