Example: poisson_synapses (synapses)ΒΆ

This example shows how to efficiently simulate neurons with a large number of Poisson inputs targetting arbitrarily complex synapses. The approach is very similiar to what the PoissonInput class does internally, but PoissonInput cannot be combined with the Synapses class. You could also just use many PoissonGroup objects as inputs, but this is very slow and memory consuming.

from brian import *

# Poisson inputs
M = 1000 # number of Poisson inputs
max_rate = 100

# Neurons
N = 50 # number of neurons
tau = 10 * ms
E_exc = 0 * mV
E_L = -70 * mV
G = NeuronGroup(N, model='dvm/dt = -(vm - E_L)/tau : mV')
G.rest()

# Dummy neuron group
P = NeuronGroup(1, 'v : 1', threshold= -1, reset=0) # spikes every timestep

# time varying rate
def varying_rate(t):
    return defaultclock.dt * max_rate * (0.5 + 0.5 * sin(2 * pi * 5 * t))

# Synaptic connections: binomial(cellM, varying_rate(t)) gives the number of
# events per timestep. The synapse model is a conductance-based instanteneous
# jump in postsynaptic membrane potential
S = Synapses(P, G, model='''
                            J : 1
                            cellM : 1
                        ''',
             pre='vm += binomial(cellM, varying_rate(t)) * J * (E_exc - vm)')
S[:, :] = True
S.cellM = M #we need one value for M per cell, so that binomial is vectorized
S.J = 0.0005

mon = StateMonitor(G, 'vm', record=True)
run(1 * second, report='text')

mon.plot()
show()