.. currentmodule:: brian

.. index::
   pair: example usage; NeuronGroup
   pair: example usage; run
   pair: example usage; SpikeMonitor
   pair: example usage; StateMonitor

.. _example-frompapers_Brette_Gerstner_2005:

Example: Brette_Gerstner_2005 (frompapers)
==========================================

Adaptive exponential integrate-and-fire model.
http://www.scholarpedia.org/article/Adaptive_exponential_integrate-and-fire_model

Introduced in Brette R. and Gerstner W. (2005), Adaptive Exponential
Integrate-and-Fire Model as an Effective Description of Neuronal Activity,
J. Neurophysiol. 94: 3637 - 3642. 

::

    from brian import *
    
    # Parameters
    C = 281 * pF
    gL = 30 * nS
    taum = C / gL
    EL = -70.6 * mV
    VT = -50.4 * mV
    DeltaT = 2 * mV
    Vcut = VT + 5 * DeltaT
    
    # Pick an electrophysiological behaviour
    tauw, a, b, Vr = 144 * ms, 4 * nS, 0.0805 * nA, -70.6 * mV # Regular spiking (as in the paper)
    #tauw,a,b,Vr=20*ms,4*nS,0.5*nA,VT+5*mV # Bursting
    #tauw,a,b,Vr=144*ms,2*C/(144*ms),0*nA,-70.6*mV # Fast spiking
    
    eqs = """
    dvm/dt=(gL*(EL-vm)+gL*DeltaT*exp((vm-VT)/DeltaT)+I-w)/C : volt
    dw/dt=(a*(vm-EL)-w)/tauw : amp
    I : amp
    """
    
    neuron = NeuronGroup(1, model=eqs, threshold=Vcut, reset="vm=Vr;w+=b", freeze=True)
    neuron.vm = EL
    trace = StateMonitor(neuron, 'vm', record=0)
    spikes = SpikeMonitor(neuron)
    
    run(20 * ms)
    neuron.I = 1 * nA
    run(100 * ms)
    neuron.I = 0 * nA
    run(20 * ms)
    
    # We draw nicer spikes
    vm = trace[0]
    for _, t in spikes.spikes:
        i = int(t / defaultclock.dt)
        vm[i] = 20 * mV
    
    plot(trace.times / ms, vm / mV)
    show()
    

