.. currentmodule:: brian

.. index::
   pair: example usage; IdentityConnection
   pair: example usage; NeuronGroup
   pair: example usage; run
   pair: example usage; raster_plot
   pair: example usage; Connection
   pair: example usage; Current
   pair: example usage; PoissonGroup
   pair: example usage; SpikeMonitor

.. _example-misc_expIF_network:

Example: expIF_network (misc)
=============================

A network of exponential IF models with synaptic conductances

::

    from brian import *
    from brian.library.IF import *
    from brian.library.synapses import *
    import time
    
    C = 200 * pF
    taum = 10 * msecond
    gL = C / taum
    EL = -70 * mV
    VT = -55 * mV
    DeltaT = 3 * mV
    
    # Synapse parameters
    Ee = 0 * mvolt
    Ei = -80 * mvolt
    taue = 5 * msecond
    taui = 10 * msecond
    
    eqs = exp_IF(C, gL, EL, VT, DeltaT)
    # Two different ways of adding synaptic currents:
    eqs += Current('''
    Ie=ge*(Ee-vm) : amp
    dge/dt=-ge/taue : siemens
    ''')
    eqs += exp_conductance('gi', Ei, taui) # from library.synapses
    
    P = NeuronGroup(4000, model=eqs, threshold= -20 * mvolt, reset=EL, refractory=2 * ms)
    Pe = P.subgroup(3200)
    Pi = P.subgroup(800)
    we = 1.5 * nS # excitatory synaptic weight
    wi = 2.5 * we # inhibitory synaptic weight
    Ce = Connection(Pe, P, 'ge', weight=we, sparseness=0.05)
    Ci = Connection(Pi, P, 'gi', weight=wi, sparseness=0.05)
    # Initialization
    P.vm = randn(len(P)) * 10 * mV - 70 * mV
    P.ge = (randn(len(P)) * 2 + 5) * we
    P.gi = (randn(len(P)) * 2 + 5) * wi
    
    # Excitatory input to a subset of excitatory and inhibitory neurons
    # Excitatory neurons are excited for the first 200 ms
    # Inhibitory neurons are excited for the first 100 ms
    input_layer1 = Pe.subgroup(200)
    input_layer2 = Pi.subgroup(200)
    input1 = PoissonGroup(200, rates=lambda t: (t < 200 * ms and 2000 * Hz) or 0 * Hz)
    input2 = PoissonGroup(200, rates=lambda t: (t < 100 * ms and 2000 * Hz) or 0 * Hz)
    input_co1 = IdentityConnection(input1, input_layer1, 'ge', weight=we)
    input_co2 = IdentityConnection(input2, input_layer2, 'ge', weight=we)
    
    # Record the number of spikes
    M = SpikeMonitor(P)
    
    print "Simulation running..."
    start_time = time.time()
    run(500 * ms)
    duration = time.time() - start_time
    print "Simulation time:", duration, "seconds"
    print M.nspikes / 4000., "spikes per neuron"
    raster_plot(M)
    show()
    

