.. currentmodule:: brian

.. index::
   pair: example usage; subplot
   pair: example usage; plot
   pair: example usage; run
   pair: example usage; xlim
   pair: example usage; show
   pair: example usage; SpikeMonitor
   pair: example usage; linspace
   pair: example usage; exp
   pair: example usage; ylabel
   pair: example usage; xlabel
   pair: example usage; NeuronGroup
   pair: example usage; StateMonitor

.. _example-frompapers-computing with neural synchrony-duration selectivity_Fig1A_rebound_neurons:

Example: Fig1A_rebound_neurons (frompapers/computing with neural synchrony/duration selectivity)
================================================================================================

Brette R (2012). Computing with neural synchrony. PLoS Comp Biol. 8(6): e1002561. doi:10.1371/journal.pcbi.1002561
------------------------------------------------------------------------------------------------------------------
Figure 1A, B.

Caption (Fig. 1A,B) A, When neuron A is
hyperpolarized by an inhibitory input (top), its low-voltage-activated
K channels slowly close (bottom), which makes the neuron fire when
inhibition is released (neuron models are used in this and other figures).
B, Spike latency is negatively correlated with the duration of inhibition
(black line).

::

    from brian import *
    
    # Parameters and equations of the rebound neurons
    Vt=-55*mV
    Vr=-70*mV
    El=-35*mV
    EK=-90*mV
    Va=Vr
    ka=5*mV
    gmax=1
    gmax2=2
    tau=20*ms
    ginh_max=5.
    tauK=400*ms
    tauK2=100*ms
    N=100 # number of neurons (= different durations, for plot 1B)
    plotted_neuron=N/4
    rest_time=1*second # initial time (to start at equilibrium)
    tmin=rest_time-20*ms # for plots
    tmax=rest_time+600*ms
    
    eqs='''
    dv/dt=(El-v+(gmax*gK+gmax2*gK2+ginh)*(EK-v))/tau : volt
    dgK/dt=(gKinf-gK)/tauK : 1 # IKLT
    dgK2/dt=-gK2/tauK2 : 1 # Delayed rectifier
    gKinf=1./(1+exp((Va-v)/ka)) : 1
    duration : second # duration of inhibition, varies across neurons
    ginh = ginh_max*((t>rest_time) & (t<(rest_time+duration))) : 1
    '''
    
    neurons=NeuronGroup(N,model=eqs,threshold='v>Vt',reset='v=Vr;gK2=1')
    neurons.v=Vr
    neurons.gK=1./(1+exp((Va-El)/ka))
    neurons.duration=linspace(100*ms,1*second,N)
    M=StateMonitor(neurons,'v',record=plotted_neuron)
    Mg=StateMonitor(neurons,'gK',record=plotted_neuron)
    spikes=SpikeMonitor(neurons)
    
    run(rest_time+1.1*second)
    
    M.insert_spikes(spikes) # draw spikes for a nicer display
    
    # Figure
    subplot(221) # Fig. 1A, top
    plot((M.times-tmin)/ms,M[plotted_neuron]/mV,'k')
    xlim(0,(tmax-tmin)/ms)
    ylabel('V (mV)')
    subplot(223) # Fig. 1A, bottom
    plot((Mg.times-tmin)/ms,Mg[plotted_neuron],'k')
    xlim(0,(tmax-tmin)/ms)
    xlabel('Time (ms)')
    ylabel('g/gmax')
    
    subplot(122) # Fig. 1B
    times=array([t-neurons.duration[i]*second-rest_time for i,t in spikes.spikes])
    duration=array([neurons.duration[i]*second for i,_ in spikes.spikes])
    plot(duration/ms,times/ms,'k')
    xlabel('Duration (ms)')
    ylabel('Latency (ms)')
    show()
    

