Tutorial 1g: Recording membrane potentials

In the previous part of this tutorial, we plotted a raster plot of the firing times of the network. In this tutorial, we introduce a way to record the value of the membrane potential for a neuron during the simulation, and plot it. We continue as before:

from brian import *

tau = 20 * msecond        # membrane time constant
Vt = -50 * mvolt          # spike threshold
Vr = -60 * mvolt          # reset value
El = -49 * mvolt          # resting potential (same as the reset)
psp = 0.5 * mvolt         # postsynaptic potential size

G = NeuronGroup(N=40, model='dV/dt = -(V-El)/tau : volt',
              threshold=Vt, reset=Vr)

C = Connection(G, G)
C.connect_random(sparseness=0.1, weight=psp)

This time we won’t record the spikes.

Recording states

Now we introduce a second type of monitor, the StateMonitor. The first argument is the group to monitor, and the second is the state variable to monitor. The keyword record can be an integer, list or the value True. If it is an integer i, the monitor will record the state of the variable for neuron i. If it’s a list of integers, it will record the states for each neuron in the list. If it’s set to True it will record for all the neurons in the group.

M = StateMonitor(G, 'V', record=0)

And then we continue as before:

G.V = Vr + rand(40) * (Vt - Vr)

But this time we run it for a shorter time so we can look at the output in more detail:

run(200 * msecond)

Having run the simulation, we plot the results using the plot command from PyLab which has the same syntax as the Matlab plot` command, i.e. plot(xvals,yvals,...). The StateMonitor monitors the times at which it monitored a value in the array M.times, and the values in the array M[0]. The notation M[i] means the array of values of the monitored state variable for neuron i.

In the following lines, we scale the times so that they’re measured in ms and the values so that they’re measured in mV. We also label the plot using PyLab’s xlabel, ylabel and title functions, which again mimic the Matlab equivalents.

plot(M.times / ms, M[0] / mV)
xlabel('Time (in ms)')
ylabel('Membrane potential (in mV)')
title('Membrane potential for neuron 0')

You can clearly see the leaky integration exponential decay toward the resting potential, as well as the jumps when a spike was received.