.. currentmodule:: brian2

.. Jansen_Rit_1995_single_column:

Example: Jansen_Rit_1995_single_column
======================================


        .. only:: html

            .. |launchbinder| image:: file:///usr/share/doc/python-brian-doc/docs/badge.svg
            .. _launchbinder: https://mybinder.org/v2/gh/brian-team/brian2-binder/master?filepath=examples/frompapers/Jansen_Rit_1995_single_column.ipynb

            .. note::
               You can launch an interactive, editable version of this
               example without installing any local files
               using the Binder service (although note that at some times this
               may be slow or fail to open): |launchbinder|_

        

[Jansen and Rit 1995 model](https://link.springer.com/content/pdf/10.1007/BF00199471.pdf) (Figure 3) in Brian2.

Equations are the system of differential equations number (6) in the original paper. 
The rate parameters $a=100 s^{-1}$ and $b=200 s^{-1}$ were changed to excitatory $\tau_e = 1000ms/a =10ms$  and inhibitory $\tau_i = 1000ms/b =20ms$ time constants as in 
[Thomas Knosche review](https://link.springer.com/referenceworkentry/10.1007%2F978-1-4614-6675-8_65), 
[Touboul et al. 2011](https://direct.mit.edu/neco/article-abstract/23/12/3232/7717/Neural-Mass-Activity-Bifurcations-and-Epilepsy?redirectedFrom=fulltext), or 
[David & Friston 2003](https://www.sciencedirect.com/science/article/pii/S1053811903004579). 
Units were removerd from parameters $e_0$, $v_0$, $r_0$, $A$, $B$, and $p$ to stop Brian's confusion.

Ruben Tikidji-Hamburyan 2021 (rth@r-a-r.org)

::

    
    
    
    from numpy import *
    from numpy import random as rnd
    from matplotlib.pyplot import *
    from brian2 import *
    
    defaultclock.dt = .1*ms   #default time step
    
    te,ti    = 10.*ms, 20.*ms #taus for excitatory and inhibitory populations
    e0       = 5.             #max firing rate
    v0       = 6.             #(max FR)/2 input
    r0       = 0.56           #gain rate
    A,B,C    = 3.25, 22., 135 #standard parameters as in the set (7) of the original paper
    P,deltaP = 120, 320.-120  #random input uniformly distributed between 120 and
                              #320 pulses per second
    
    # Random noise
    nstim = TimedArray(rnd.rand(70000),2*ms)
    
    # Equations as in the system (6) of the original paper
    equs = """
    dy0/dt = y3                             /second : 1
    dy3/dt = (A        * Sp -2*y3 -y0/te*second)/te : 1
    dy1/dt = y4                             /second : 1
    dy4/dt = (A*(p+ C2 * Se)-2*y4 -y1/te*second)/te : 1
    dy2/dt = y5                             /second : 1
    dy5/dt = (B   * C4 * Si -2*y5 -y2/ti*second)/ti : 1
    p  = P0+nstim(t)*dlP                   : 1
    Sp = e0/(1+exp(r0*(v0 - (y1-y2)    ))) : 1
    Se = e0/(1+exp(r0*(v0 -  C1*y0     ))) : 1
    Si = e0/(1+exp(r0*(v0 -  C3*y0     ))) : 1
    C1            : 1
    C2 = 0.8 *C1  : 1
    C3 = 0.25*C1  : 1
    C4 = 0.25*C1  : 1
    P0            : 1
    dlP           : 1
    """
    
    n = NeuronGroup(6,equs,method='euler') #creates 6 JR models for different connectivity parameters
    
    #set parameters as for different traces on figure 3 of the original paper
    n.C1[0]  = 68
    n.C1[1]  = 128
    n.C1[2]  = C
    n.C1[3]  = 270
    n.C1[4]  = 675
    n.C1[5]  = 1350
    #set stimulus offset and noise magnitude
    n.P0     = P
    n.dlP    = deltaP
    
    #just record everything
    sm = StateMonitor(n,['y4','y1','y3','y0','y5','y2'],record=True)
    
    #Runs for 5 second
    run(5*second,report='text')
    
    
    #This code goes over all models with different parameters and plot activity of each population.
    
    figure(1,figsize=(22,16))
    idx1 = where(sm.t/second>2.)[0]
    
    o = 0
    for p in [0,1,2,3,4,5]:
        if o == 0: ax = subplot(6,3,1)
        else     :subplot(6,3,1+o,sharex=ax)
        if o == 0: title("E")
        plot(sm.t[idx1]/second, sm[p].y1[idx1],'g-')
        ylabel(f"C={n[p].C1[0]}")
        if o == 15: xlabel("Time (seconds)")
        subplot(6,3,2+o,sharex=ax)
        if o == 0: title("P")
        plot(sm.t[idx1]/second, sm[p].y0[idx1],'b-')
        if o == 15: xlabel("Time (seconds)")
        subplot(6,3,3+o,sharex=ax)
        if o == 0: title("I")
        plot(sm.t[idx1]/second, sm[p].y2[idx1],'r-')
        if o == 15: xlabel("Time (seconds)")
        o += 3
    
    show()
    
    

