The code below shows a demonstration of Brian in action with a simple graphical interface. Run the cell below by clicking on it and hitting CTRL+ENTER
. You can change the parameters of the model with the sliders, and immediately see the change in behaviour.
The model is a group of $N$ source neurons that fire Poisson spikes with a rate $R_\mathrm{max}(1+\sin(2\pi f t))/2$, connected via synapses to a target neuron. Each source neuron has a probability $p$ of being connected, and synapses have a certain fixed weight $w$. The target neuron has two variables, the membrane potential $V$ and the adaptation potential $V_t$ that evolve according to the differential equations:
$$\tau\frac{\mathrm{d}V}{\mathrm{dt}}=-V$$$$\tau_t\frac{\mathrm{d}V_t}{\mathrm{dt}}=1-V_t$$Each time the event $V>V_t$ occurs, the neuron spikes and $V$ is reset to 0, while $V_t$ increases by $\delta_t$.
This model is implemented with the following code:
G = PoissonGroup(N, rates='R_max*0.5*(1+sin(2*pi*f*t))')
eqs = '''
dV/dt = -V/tau : 1
dVt/dt = (1-Vt)/tau_t : 1
'''
H = NeuronGroup(1, eqs, threshold='V>Vt', reset='V=0; Vt += delta_t', method='linear')
H.Vt = 1
S = Synapses(G, H, on_pre='V += w')
S.connect(p=p)
%matplotlib inline
from brian2 import *
from brian2tools import *
import ipywidgets as ipw
prefs.codegen.target = 'numpy'
def model(N=20, R_max=150, f=10, w=0.1, p=0.5, tau=5, tau_t=50, delta_t=0.1):
# Get parameters
R_max = R_max*Hz
f = f*Hz
tau = tau*ms
tau_t = tau_t*ms
duration = 200*ms
# Simulation code
G = PoissonGroup(N, rates='R_max*0.5*(1+sin(2*pi*f*t))')
eqs = '''
dV/dt = -V/tau : 1
dVt/dt = (1-Vt)/tau_t : 1
'''
H = NeuronGroup(1, eqs, threshold='V>Vt', reset='V=0; Vt += delta_t', method='linear')
H.Vt = 1
S = Synapses(G, H, on_pre='V += w')
S.connect(p=p)
# Run it
MG = SpikeMonitor(G)
MH = StateMonitor(H, ('V', 'Vt'), record=True)
run(duration)
# Plotting code
figure(figsize=(15, 4))
subplot(131)
brian_plot(MG)
title('Source neurons (Poisson)')
subplot(132)
plot(zeros(N), arange(N), 'ob')
plot([0, 1], [S.i, ones(len(S.i))*N/2.], '-k')
plot([1], [N/2.], 'og')
xlim(-0.1, 1.1)
ylim(-1, N)
axis('off')
title('Synapses')
subplot(133)
plot(MH.t, MH.V[0], label='V')
plot(MH.t, MH.Vt[0], label='Vt')
legend(loc='upper left')
title('Target neuron')
layout = ipw.Layout(width='100%')
style = {'description_width': 'initial'}
ipw.interact(model,
N=ipw.IntSlider(value=20, min=5, max=100, step=5, continuous_update=False,
description="Number of source neurons", style=style, layout=layout),
R_max=ipw.FloatSlider(value=300, min=0, max=500, step=10, continuous_update=False,
description=r"Source neuron max firing rate (Hz)", style=style, layout=layout),
f=ipw.FloatSlider(value=10, min=1, max=50, step=1, continuous_update=False,
description=r"Source neuron frequency (Hz)", style=style, layout=layout),
p=ipw.FloatSlider(value=0.5, min=0, max=1, step=0.01, continuous_update=False,
description=r"Synapse probability", style=style, layout=layout),
w=ipw.FloatSlider(value=0.3, min=0, max=1, step=0.01, continuous_update=False,
description=r"Synapse weight", style=style, layout=layout),
tau=ipw.FloatSlider(value=5, min=1, max=50, step=1, continuous_update=False,
description=r"Target neuron membrane time constant (ms)", style=style, layout=layout),
tau_t=ipw.FloatSlider(value=30, min=5, max=500, step=5, continuous_update=False,
description=r"Target neuron adaptation constant (ms)", style=style, layout=layout),
delta_t=ipw.FloatSlider(value=1.0, min=0, max=20, step=0.1, continuous_update=False,
description=r"Target neuron adaptation strength", style=style, layout=layout),
);