Example #1
0
def model(time, time_stim, rate_stim, w_e, w_i, w_ie, I_e, I_i_sigma=0.01,
        seed=None):
    """Model some BRAINS!"""

    time = time * second
    time_stim = time_stim * second

    # Network
    N = 1000
    N_e = int(N * 0.8)
    N_i = int(N * 0.2)
    N_stim = int(N * 0.2)

    r_e = 10 * Hz
    r_i = r_e

    cdelay = 2 * ms

    w_e = w_e * msiemens
    w_i = w_i * msiemens
    w_ie = w_ie / N_i * msiemens

    w_ee = 0 / N_e * msiemens
    w_ii = 0.1 / N_i * msiemens
    w_m = 0 / N_e * msiemens  # Read ref 47 to get value

    # --
    # Model
    np.random.seed(seed)
    time_step = 0.1 * ms
    decimals = 4

    # --
    # cell biophysics
    # WB (I)
    I_i = 1.1  # * uamp
    I_i = np.random.normal(I_i, I_i_sigma, N_i) * uamp
    if I_e is None:
        I_e = (0.25, .25)

    # After-hyperpolaization (AHP)
    ahp = 5

    area_wb = 1 * cm ** 2
    Cm_wb = (1 * ufarad * cm ** -2) * area_wb
    Cm = 1 * uF  # /cm2

    gL_wb = (0.1 * msiemens * cm ** -2) * area_wb
    EL_wb = -70 * mV
    Vt_wb = -52 * mV
    ENa_wb = 55 * mV
    gNa_wb = (35 * msiemens * cm ** -2) * area_wb
    EK_wb = -90 * mV
    gK_wb = 9 * msiemens

    ESyn_wb = -75 * mV
    gSyn_wb = (0.1 / N_i) * msiemens

    # E
    taue_hh = 5 * ms
    taui_hh = 10 * ms
    win_hh = 26 * nsiemens

    # HH (E)
    Cm = 1 * uF  # /cm2

    g_Na = 100 * msiemens
    g_K = 80 * msiemens
    g_l = 0.1 * msiemens

    V_Na = 50 * mV
    V_K = -100 * mV
    V_l = -67 * mV
    V_thresh = 20 * mV

    # synapse biophysics
    tau_r_ampa = 0.2 * ms
    tau_d_ampa = 2 * ms
    tau_r_gaba = 0.5 * ms
    tau_d_gaba = 10 * ms
    tau_r_nmda = 1 * ms
    tau_d_nmda = 100 * ms

    V_i = -80 * mV
    V_e = 0 * mV

    # --
    # Eqs
    wb = """
    dv/dt = (-INa - IK - IL - I_syn + I) / Cm_wb : volt
    """ + """
    INa    = gNa_wb * m**3 * h * (v-ENa_wb) : amp
    m      = alpham / (alpham + betam) : 1
    dh/dt  = ahp * (alphah * (1 - h) - betah * h) : 1
    alpham = (-0.1/mV) * (v + 35*mV) / 
        (exp(-0.1/mV * (v + 35*mV)) - 1)/ms : Hz
    betam  = 4 * exp(-(v + 60*mV) / (18*mV))/ms : Hz
    alphah = 0.07 * exp(-(v + 58*mV) / (20*mV))/ms : Hz
    betah  = 1.0 / (exp(-0.1/mV * (v + 28*mV)) + 1)/ms : Hz
    """ + """
    IK     = gK_wb * n**4 * (v - EK_wb) : amp
    dn/dt  = ahp * (alphan * (1 - n) - (betan * n)) : 1
    alphan = -0.01/mV * (v + 34*mV) / 
        (exp(-0.1/mV * (v + 34*mV)) - 1)/ms : Hz
    betan  = 0.125 * exp(-(v + 44*mV) / (80*mV))/ms : Hz
    """ + """
    IL   = gL_wb * (v - EL_wb) : amp
    """ + """
    I_syn = g_e * (v - V_e) +
        g_i * (v - ESyn_wb) : amp
    g_e : siemens
    g_i : siemens
    """ + """
    I : amp
    theta : 1
    """

    hh = """
    dV/dt = (I_Na + I_K + I_l + I_m + I_syn + I) / Cm : volt
    """ + """
    I_Na = g_Na * (m ** 3) * h * (V_Na - V) : amp
    m = a_m / (a_m + b_m) : 1
    a_m = (0.32 * (54 + V/mV)) / 
        (1 - exp(-0.25 * (V/mV + 54))) / ms : Hz
    b_m = (0.28 * (27 + V/mV)) / (exp(0.2 * (V/mV + 27)) - 1) / ms : Hz
    h = clip(1 - 1.25 * n, 0, inf) : 1
    """ + """
    I_K = g_K * n ** 4 * (V_K - V) : amp
    dn/dt = (a_n - (a_n * n)) - b_n * n : 1
    a_n = (0.032 * (52 + V/mV)) / 
        (1 - exp(-0.2 * (V/mV + 52))) / ms : Hz
    b_n = 0.5 * exp(-0.025 * (57 + V/mV)) / ms : Hz
    """ + """
    I_l = g_l * (V_l - V) : amp
    """ + """
    I_m = w_m * w * (V_K - V) : amp
    dw/dt = (w_inf - w) / tau_w/ms : 1
    w_inf = 1 / (1 + exp(-1 * (V/mV + 35) / 10)) : 1
    tau_w = 400 / ((3.3 * exp((V/mV + 35)/20)) + 
        (exp(-1 * (V/mV + 35) / 20))) : 1
    """ + """
    I_syn = g_e * (V_e - V) +
        g_i * (V_i - V) : amp
    g_e : siemens
    g_i : siemens
    """ + """
    I_stim = g_s * (V_e - V) : amp
    g_s : siemens
    """ + """
    I : amp
    """

    syn_e_in = """
    dg/dt = -g / tau_d_ampa : siemens
    g_e_post = g : siemens (summed)
    """

    syn_e_stim = """
    dg/dt = -g / tau_d_ampa : siemens
    g_s_post = g : siemens (summed)
    """

    syn_e = """
    dg/dt = -g  * 1 / (tau_d_ampa - tau_r_ampa): siemens
    g_e_post = g : siemens (summed)
    """

    syn_i = """
    dg/dt = -g * 1 / (tau_d_gaba - tau_r_gaba) : siemens
    g_i_post = g : siemens (summed)
    """

    # --
    # Build networks
    P_i = NeuronGroup(
        N_i,
        model=wb,
        threshold='v >= V_thresh',
        refractory=2 * ms,
        method='exponential_euler'
    )
    P_e = NeuronGroup(
        N_e, model=hh,
        threshold='V >= V_thresh',
        refractory=3 * ms,
        method='exponential_euler'
    )
    P_i.I = I_i
    P_e.I = np.random.uniform(I_e[0], I_e[1], N_e) * uamp
    P_e.V = V_l
    P_i.v = EL_wb

    P_e_back = PoissonGroup(N_e, rates=r_e)

    # --
    # Stimulus
    time_stim = time_stim / second
    window = 500 / 1000.
    t_min = time_stim - window / 2
    t_max = time_stim + window / 2
    stdev = 100 / 1000.  # 100 ms

    # rate = 5  # Hz
    k = N_stim * int(rate_stim / 2)

    ts, idxs = gaussian_impulse(time_stim, t_min,
                                t_max, stdev, N_stim, k,
                                decimals=decimals)
    P_stim = SpikeGeneratorGroup(N_stim, idxs, ts * second)

    # --
    # Connections
    # External
    C_stim_e = Synapses(
        P_stim, P_e, model=syn_e_stim,
        pre='g += w_e', connect='i == j'
    )
    C_back_e = Synapses(
        P_e_back, P_e, model=syn_e_in,
        pre='g += w_e', connect='i == j'
    )

    # Internal
    C_ie = Synapses(P_i, P_e, model=syn_i, pre='g += w_ie', delay=cdelay)
    C_ie.connect(True, p=0.4)
    C_ii = Synapses(P_i, P_i, model=syn_i, pre='g += gSyn_wb', connect=True)

    # --
    # Record
    spikes_i = SpikeMonitor(P_i)
    spikes_e = SpikeMonitor(P_e)
    spikes_stim = SpikeMonitor(P_stim)
    pop_e = PopulationRateMonitor(P_e)
    pop_i = PopulationRateMonitor(P_i)
    voltages_e = StateMonitor(P_e, ('V', 'g_e', 'g_i', 'g_s'), record=range(11, 31))
    voltages_i = StateMonitor(P_i, ('v', 'g_i'), record=range(11, 31))

    # --
    # Go!
    defaultclock.dt = time_step
    run(time, report='text')

    return {
        'spikes_i': spikes_i,
        'spikes_e': spikes_e,
        'spikes_stim': spikes_stim,
        'pop_e': pop_e,
        'pop_i': pop_i,
        'voltages_e': voltages_e,
        'voltages_i': voltages_i
    }
Example #2
0
def model(time, time_stim, rate_stim, w_e, w_i, w_ei, w_ie, seed=None):
    # def model(time, stim, w_e, w_i, w_ei, w_ie, seed=None):
    """Model some BRAINS!"""

    time = time * second
    time_stim = time_stim * second

    # Network
    N = 1000
    N_e = int(N * 0.8)
    N_i = int(N * 0.2)
    N_stim = int(N * 0.2)

    r_e = 10 * Hz
    r_i = r_e

    delay = 2 * ms
    p_ei = 0.4
    p_ie = 0.4
    p_ii = 1.0

    w_e = w_e * msiemens
    w_i = w_i * msiemens
    w_ei = w_ei / (p_ei * N_e) * msiemens
    w_ie = w_ie / (p_ie * N_i) * msiemens

    w_ii = 0.0 / N_i * msiemens
    w_m = 0.0 * msiemens  # Read ref 47 to get value

    # --
    # Model
    np.random.seed(seed)
    time_step = 0.1 * ms
    decimals = 4

    # --
    # cell biophysics
    I_e = [0.01, 0.1]
    I_i = [0.01, 0.1]

    Cm = 1 * uF  # /cm2

    g_Na = 100 * msiemens
    g_K = 80 * msiemens
    g_l = 0.1 * msiemens

    V_Na = 50 * mV
    V_K = -100 * mV
    V_l = -67 * mV
    V_thresh = 20 * mV

    # synapse biophysics
    tau_r_ampa = 0.2 * ms
    tau_d_ampa = 2 * ms
    tau_r_gaba = 0.5 * ms
    tau_d_gaba = 10 * ms
    tau_r_nmda = 1 * ms
    tau_d_nmda = 100 * ms
    V_i = -80 * mV
    V_e = 0 * mV

    # --
    # Eqs
    hh = """
        dV/dt = (I_Na + I_K + I_l + I_m + I_syn + I) / Cm : volt
    """ + """
        I_Na = g_Na * (m ** 3) * h * (V_Na - V) : amp
        m = a_m / (a_m + b_m) : 1
        a_m = (0.32 * (54 + V/mV)) / (1 - exp(-0.25 * (V/mV + 54))) / ms : Hz
        b_m = (0.28 * (27 + V/mV)) / (exp(0.2 * (V/mV + 27)) - 1) / ms : Hz
        h = clip(1 - 1.25 * n, 0, inf) : 1
    """ + """
        I_K = g_K * n ** 4 * (V_K - V) : amp
        dn/dt = (a_n - (a_n * n)) - b_n * n : 1
        a_n = (0.032 * (52 + V/mV)) / (1 - exp(-0.2 * (V/mV + 52))) / ms : Hz
        b_n = 0.5 * exp(-0.025 * (57 + V/mV)) / ms : Hz
    """ + """
        I_l = g_l * (V_l - V) : amp
    """ + """
        I_m = w_m * w * (V_K - V) : amp
        dw/dt = (w_inf - w) / tau_w/ms : 1
        w_inf = 1 / (1 + exp(-1 * (V/mV + 35) / 10)) : 1
        tau_w = 400 / ((3.3 * exp((V/mV + 35)/20)) + (exp(-1 * (V/mV + 35) / 20))) : 1
    """ + """
    I_syn = g_e * (V_e - V) +
            g_i * (V_i - V) : amp
    g_e : siemens
    g_i : siemens
    """ + """
    I_stim = g_s * (V_e - V) : amp
    g_s : siemens
    """ + """
    I : amp
    """

    syn_e_in = """
    dg/dt = -g / tau_d_ampa : siemens
    g_e_post = g : siemens (summed)
    """

    syn_e_stim = """
    dg/dt = -g / tau_d_ampa : siemens
    g_s_post = g : siemens (summed)
    """

    syn_e = """
        dg/dt = -g  * 1 / (tau_d_ampa - tau_r_ampa): siemens
        g_e_post = g : siemens (summed)
    """

    syn_i = """
        dg/dt = -g * 1 / (tau_d_gaba - tau_r_gaba) : siemens
        g_i_post = g : siemens (summed)
    """

    # --
    # Build networks
    P_e = NeuronGroup(
        N_e, model=hh,
        threshold='V >= V_thresh',
        refractory=3 * ms,
        method='exponential_euler'
    )

    P_i = NeuronGroup(
        N_i,
        model=hh,
        threshold='V >= V_thresh',
        refractory=3 * ms,
        method='exponential_euler'
    )
    P_e.V = V_l
    P_i.V = V_l
    P_e.I = np.random.uniform(I_e[0], I_e[1], N_e) * uamp
    P_i.I = np.random.uniform(I_i[0], I_i[1], N_i) * uamp

    P_e_back = PoissonGroup(N_e, rates=r_e)
    P_i_back = PoissonGroup(N_i, rates=r_i)

    # --
    # Stimulus
    time_stim = time_stim / second
    window = 500 / 1000.
    t_min = time_stim - window / 2
    t_max = time_stim + window / 2
    stdev = 100 / 1000.  # 100 ms

    rate = 5  # Hz
    k = N_stim * int(rate / 2)

    ts, idxs = gaussian_impulse(time_stim, t_min, t_max, stdev, N_stim, k,
                                decimals=decimals)
    P_stim = SpikeGeneratorGroup(N_stim, idxs, ts * second)

    # --
    # Connections
    # External
    C_stim_e = Synapses(P_stim, P_e, model=syn_e_stim,
                        pre='g += w_e', connect='i == j')
    C_back_e = Synapses(P_e_back, P_e, model=syn_e_in, pre='g += w_e',
                        connect='i == j')
    C_back_i = Synapses(P_i_back, P_i, model=syn_e_in, pre='g += w_i',
                        connect='i == j')

    # Internal
    C_ei = Synapses(P_e, P_i, model=syn_e, pre='g += w_ei', delay=delay)
    C_ei.connect(True, p=p_ei)

    C_ie = Synapses(P_i, P_e, model=syn_i, pre='g += w_ie', delay=delay)
    C_ie.connect(True, p=p_ie)

    C_ii = Synapses(P_i, P_i, model=syn_i, pre='g += w_ii', delay=delay)
    C_ii.connect(True, p=p_ii)

    # --
    # Record
    spikes_i = SpikeMonitor(P_i)
    spikes_e = SpikeMonitor(P_e)
    spikes_stim = SpikeMonitor(P_stim)
    pop_e = PopulationRateMonitor(P_e)
    pop_i = PopulationRateMonitor(P_i)
    voltages_e = StateMonitor(
        P_e, ('V', 'g_e', 'g_i', 'g_s'), record=range(11, 31))
    voltages_i = StateMonitor(P_i, ('V', 'g_e', 'g_i'), record=range(11, 31))

    # --
    # Go!
    defaultclock.dt = time_step
    run(time, report='text')

    return {
        'spikes_i': spikes_i,
        'spikes_e': spikes_e,
        'spikes_stim': spikes_stim,
        'pop_e': pop_e,
        'pop_i': pop_i,
        'voltages_e': voltages_e,
        'voltages_i': voltages_i
    }
Example #3
0
def model(time, time_stim, rate_stim, 
          w_e, w_i, w_ei, w_ie, w_ee, w_ii,
          I_e, I_i, I_i_sigma, I_e_sigma,
          stdp, seed=None):
    """Model some BRAINS!"""

    time = time * second
    time_stim = time_stim * second

    # Network
    N = 400
    N_e = int(N * 0.8)
    N_i = int(N * 0.2)
    N_stim = N_e # int(N * 0.2)

    r_e = 0 * Hz
    r_i = r_e

    delay = 2 * ms
    p_ei = 0.1
    p_ie = 0.1
    p_ee = 0.1
    p_ii = 0.6

    w_e = w_e / (p_ee * N_e) * msiemens
    w_i = w_i * msiemens
    w_ei = w_ei / (p_ei * N_e) * msiemens
    w_ie = w_ie / (p_ie * N_i) * msiemens

    w_ee = w_ee / (p_ee * N_e) * msiemens
    w_ii = w_ii / (p_ii * N_i) * msiemens

    w_m = 0 / N_e * msiemens  # Read ref 47 to get value

    # --
    # Model
    np.random.seed(seed)
    time_step = 0.01 * ms
    decimals = 4

    # --
    # Fixed
    # cell
    Cm = 1 * uF  # /cm2

    g_Na = 100 * msiemens
    g_K = 80 * msiemens
    g_l = 0.1 * msiemens

    V_Na = 50 * mV
    V_K = -100 * mV
    V_l = -67 * mV

    # syn
    tau_r_ampa = 0.2 * ms
    tau_d_ampa = 2 * ms
    tau_r_gaba = 0.5 * ms
    tau_d_gaba = 10 * ms
    tau_r_nmda = 1 * ms
    tau_d_nmda = 100 * ms

    V_thresh = 20 * mV
    V_i = -80 * mV
    V_e = 0 * mV

    hh = """
    dV/dt = (I_Na + I_K + I_l + I_m + I_syn + I) / Cm : volt
    """ + """
    I_Na = g_Na * (m ** 3) * h * (V_Na - V) : amp
    m = a_m / (a_m + b_m) : 1
    a_m = (0.32 * (54 + V/mV)) / (1 - exp(-0.25 * (V/mV + 54))) / ms : Hz
    b_m = (0.28 * (27 + V/mV)) / (exp(0.2 * (V/mV + 27)) - 1) / ms : Hz
    h = clip(1 - 1.25 * n, 0, inf) : 1
    """ + """
    I_K = g_K * n ** 4 * (V_K - V) : amp
    dn/dt = (a_n - (a_n * n)) - b_n * n : 1
    a_n = (0.032 * (52 + V/mV)) / (1 - exp(-0.2 * (V/mV + 52))) / ms : Hz
    b_n = 0.5 * exp(-0.025 * (57 + V/mV)) / ms : Hz
    """ + """
    I_l = g_l * (V_l - V) : amp
    """ + """
    I_m = w_m * w * (V_K - V) : amp
    dw/dt = (w_inf - w) / tau_w/ms : 1
    w_inf = 1 / (1 + exp(-1 * (V/mV + 35) / 10)) : 1
    tau_w = 400 / ((3.3 * exp((V/mV + 35)/20)) + (exp(-1 * (V/mV + 35) / 20))) : 1
    """ + """
    I_syn = g_e * (V_e - V) +
        g_ee * (V_e - V) +
        g_i * (V_i - V)  + 
        g_s * (V_e - V) : amp
    dg_e/dt = -g_e / tau_d_ampa : siemens
    dg_ee/dt = -g_ee / tau_d_ampa : siemens
    dg_i/dt = -g_i / tau_d_gaba : siemens
    dg_s/dt = -g_s / tau_d_ampa : siemens
    I : amp
    """

    P_e = NeuronGroup(
        N_e, model=hh,
        threshold='V >= V_thresh',
        refractory=3 * ms
    )
    
    P_i = NeuronGroup(
        N_i,
        model=hh,
        threshold='V >= V_thresh',
        refractory=3 * ms
    )

    P_e.V = 'randn() * 0.1 * V_l'
    P_i.V = 'randn() * 0.1 * V_l'
    
    P_e.g_e = 'randn() * 0.1 * w_e'
    P_e.g_ee = 'randn() * 0.1 * w_ee'
    P_e.g_i = 'randn() * 0.1 * w_ie'
    P_i.g_i = 'randn() * 0.1 * w_ii'

    if np.allclose(I_e_sigma, 0.0):
        P_e.I = I_e * uamp
    else:
        P_e.I = np.random.normal(I_e, I_e_sigma, N_e) * uamp 

    if np.allclose(I_i_sigma, 0.0):
        P_i.I = I_i * uamp
    else:
        P_i.I = np.random.normal(I_i, I_i_sigma, N_i) * uamp 
  
    P_e_back = PoissonGroup(N_e, rates=r_e)
    P_i_back = PoissonGroup(N_i, rates=r_i)

    # --
    # Stimulus
    time_stim = time_stim / second
    window = 500 / 1000.
    t_min = time_stim - window / 2
    t_max = time_stim + window / 2
    stdev = 100 / 1000.  # 100 ms

    k = N_stim * int(rate_stim / 2)
    ts, idxs = gaussian_impulse(
        time_stim, t_min,
        t_max, stdev, N_stim, k,
        decimals=decimals
    )
    P_stim = SpikeGeneratorGroup(N_stim, idxs, ts * second)

    # --
    # Syn
    # External
    C_stim_e = Synapses(P_stim, P_e, pre='g_s += w_e')
    C_stim_e.connect(True, p=p_ee)

    # Internal
    C_ei = Synapses(P_e, P_i, pre='g_e += w_ei', delay=delay)
    C_ei.connect(True, p=p_ei)

    C_ie = Synapses(P_i, P_e, pre='g_i += w_ie', delay=delay)
    C_ie.connect(True, p=p_ie)

    C_ii = Synapses(P_i, P_i, pre='g_i += w_ii', delay=delay)
    C_ii.connect(True, p=p_ii)

    C_ee = Synapses(P_e, P_e, pre='g_ee += w_ee', delay=delay)
    C_ee.connect(True, p=p_ee)
 
    if stdp:
        # params        
        tau_pre = 20 * ms
        tau_post = tau_pre

        gmax = w_ee * 10
        delta_pre = 0.005 
        delta_post = -delta_pre * tau_pre / tau_post * 1.05
        delta_pre *= gmax
        delta_post *= gmax
        
        C_ee = Synapses(
            P_e, P_e,
            """
            w_stdp : siemens
            dApre/dt = -Apre / tau_pre : siemens (event-driven)
            dApost/dt = -Apost / tau_post : siemens (event-driven)
            """,
            pre="""
            g_ee += w_stdp
            Apre += delta_pre
            w_stdp = clip(w_stdp + delta_pre, 0, gmax)
            """,
            post="""
            Apost += delta_post
            w_stdp = clip(w_stdp + delta_pre, 0, gmax)
            """
        )
        C_ee.connect(True, p=p_ee)

    # --
    # Record
    spikes_i = SpikeMonitor(P_i)
    spikes_e = SpikeMonitor(P_e)
    spikes_stim = SpikeMonitor(P_stim)
    pop_stim = PopulationRateMonitor(P_stim)
    pop_e = PopulationRateMonitor(P_e)
    pop_i = PopulationRateMonitor(P_i)
    voltages_e = StateMonitor(P_e, 
            ('V', 'g_e', 'g_i', 'g_s', 'g_ee'), record=True)
    voltages_i = StateMonitor(P_i, ('V', 'g_e', 'g_i'), record=range(11, 31))

    # --
    # Go!
    defaultclock.dt = time_step
    run(time, report='text')

    return {
        'spikes_i': spikes_i,
        'spikes_e': spikes_e,
        'spikes_stim': spikes_stim,
        'pop_e': pop_e,
        'pop_stim' : pop_stim,
        'pop_i': pop_i,
        'voltages_e': voltages_e,
        'voltages_i': voltages_i
    }