Endocannabinoid dynamics gate spike-timing dependent depression and potentiation (Cui et al 2016)

 Download zip file 
Help downloading and running models
Accession:187605
The endocannabinoid (eCB) system is considered involved in synaptic depression. Recent reports have also linked eCBs to synaptic potentiation. However it is not known how eCB signaling may support such bidirectionality. To question the mechanisms of this phenomena in spike-timing dependent plasticity (STDP) at corticostriatal synapses, we combined electrophysiology experiments with biophysical modeling. We demonstrate that STDP is controlled by eCB levels and dynamics: prolonged and moderate levels of eCB lead to eCB-mediated long-term depression (eCB-tLTD) while short and large eCB transients produce eCB-mediated long-term potentiation (eCB-tLTP). Therefore, just like neurotransmitters glutamate or GABA, eCB form a bidirectional system.
Reference:
1 . Cui Y, Prokin I, Xu H, Delord B, Genet S, Venance L, Berry H (2016) Endocannabinoid dynamics gate spike-timing dependent depression and potentiation. Elife 5:e13185 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Synapse; Channel/Receptor;
Brain Region(s)/Organism:
Cell Type(s): Neostriatum medium spiny direct pathway GABA cell; Neostriatum medium spiny indirect pathway GABA cell; Neostriatum spiny neuron;
Channel(s): I L high threshold; I Calcium; I_SERCA; I Cl, leak; Ca pump;
Gap Junctions:
Receptor(s): AMPA; NMDA; mGluR; Glutamate; IP3;
Gene(s):
Transmitter(s):
Simulation Environment: FORTRAN; Python;
Model Concept(s): Ion Channel Kinetics; Coincidence Detection; Parameter Fitting; Synaptic Plasticity; Long-term Synaptic Plasticity; Signaling pathways; STDP; Calcium dynamics; Parameter sensitivity; G-protein coupled; Neuromodulation;
Implementer(s):
Search NeuronDB for information about:  Neostriatum medium spiny direct pathway GABA cell; Neostriatum medium spiny indirect pathway GABA cell; AMPA; NMDA; mGluR; Glutamate; IP3; I L high threshold; I Calcium; I_SERCA; I Cl, leak; Ca pump;
#!/usr/bin/env python2

# (c) 2016 - Ilya Prokin - isprokin@gmail.com - https://sites.google.com/site/ilyaprokin
# INRIA Rhone-Alpes
# STDP model : script that solves equations and produces plots

import numpy as np
import matplotlib
matplotlib.use('Agg') # to be able to generate plots without X server
import matplotlib.pylab as plt

from copy import deepcopy
import solve_py
from functions import nesteddict_to_lists_r, find_for_cnd, find_STDP, interpolate_and_gsmooth
from ST_vars_and_ic import ST_vars_and_ic, CaMKII_ic, si
from paramets import paramets as pars
import os

y0 = np.hstack([CaMKII_ic, ST_vars_and_ic.values()])

lv, lk = nesteddict_to_lists_r(pars)
t = np.arange(pars['integration']['t_start'], pars['integration']['t_end'], pars['integration']['t_step'])

fig_out_dir='./pngs/'
if not os.path.isdir(fig_out_dir):
    os.mkdir(fig_out_dir)

######################
##### time series ####
######################


def compute_and_plot_ca_dt(dt):
    lv1 = deepcopy(lv)
    lv1[lk.index('stimulation, dt_stim')] = dt
    y, ISTATE = solve_py.lsoda_calc(y0, lv1, t)

    fig, axs = plt.subplots(1, 2, figsize=(15, 5), sharey=True)
    for ax in axs:
        ax.plot(t, y[si('Ca_cyt'), :], 'k')
        ax.set_xlabel('Time, s')
        ax.set_title('$\Delta t_{STDP}$ = %g ms' % (lv1[lk.index('stimulation, dt_stim')]*1000))
    axs[0].set_ylabel('Calcium, $\mu M$')
    axs[0].set_xlim([0, 120])
    axs[1].set_xlim([0, 1])
    fig.savefig(fig_out_dir+'Fig_ca_dt{}ms.png'.format(dt*1000), bbox_inches='tight', pad_inches=0.1)
    plt.close(fig)

dts = [0.015, 0.03, 0.2]
dts = dts + list(-np.array(dts))
for dt in dts:
    compute_and_plot_ca_dt(dt)



cnds = map(
        dict,
        zip(
            zip(['stimulation, num_stim']*4, [10, 50, 75, 100][::-1])*2,
            zip(['stimulation, dt_stim']*4, [-0.015]*4) + zip(['stimulation, dt_stim']*4, [0.015]*4)
            )
        )

def funcs(y, lv):
    return {
            'ctrl1': pars['ECb']['kCB1R']*y.T[:, si('o_CB1R')] + pars['DA']['gamma1DA']*pars['DA']['DA'],
            'CaMKIIpho': solve_py.extras.camkiipho(y.T[:, :13]),
#            'CaM': solve_py.extras.cam_conc_func(y.T[:, si('Ca_cyt')], lv)
            }

extras = [None]*len(cnds)
for i, cnd in enumerate(cnds):
    y, lv1 = find_for_cnd(lv, lk, y0, t, cnd)
    extras[i] = funcs(y, lv1)

fig, axs0 = plt.subplots(1, 2, figsize=(12,5))
axs = dict(zip([-0.015, 0.015], axs0))
cc = map(plt.get_cmap('copper'), np.linspace(0, 1, 4))
for i, cnd in enumerate(cnds):
    ax = axs[cnd['stimulation, dt_stim']]
    ax.set_color_cycle(cc)
    ax.plot(t, extras[i]['CaMKIIpho'], label="$N_{pairings}$=%i" % cnd['stimulation, num_stim'], alpha=0.5)
    ax.set_title('$\Delta t_{STDP}$ = %g ms' % (cnd['stimulation, dt_stim']*1000))
    ax.set_xlabel('Time, s')
axs0[0].set_ylabel('CaMKII act., $\mu M$')
plt.legend()
fig.savefig(fig_out_dir+'Fig_CaMKII.png', bbox_inches='tight', pad_inches=0.1)
plt.close(fig)

fig, axs0 = plt.subplots(1, 2, figsize=(12,5))
axs = dict(zip([-0.015, 0.015], axs0))
for i, cnd in enumerate(cnds):
    ax = axs[cnd['stimulation, dt_stim']]
    ax.plot(t, extras[i]['ctrl1'], label="$N_{pairings}$=%i" % cnd['stimulation, num_stim'], alpha=0.5)
    ax.set_title('$\Delta t_{STDP}$ = %g ms' % (cnd['stimulation, dt_stim']*1000))
    ax.set_xlabel('Time, s')
axs0[0].set_ylabel('CB1R activation ($y_{CB1R}$) (a.u.)')
plt.legend()
fig.savefig(fig_out_dir+'Fig_yCB1R.png', bbox_inches='tight', pad_inches=0.1)
plt.close(fig)


######################
##### STDP curve #####
######################


def stdp_n(n, lv, dts, dts_new):
    t = np.arange(0.0, 150.0+n/pars['stimulation']['Freq'], pars['integration']['t_step'])
    # raw STDP
    dstdp = find_STDP(t, y0, si('fpre'), lv, lk.index('stimulation, dt_stim'), dts, parallel=True)
    # smoothing
    ftot = interpolate_and_gsmooth(dts, dstdp['ftot'], dts_new, 0.003)
    # clip to 3
    ftot = np.clip(ftot, 0, 3)
    return ftot

fig, axs = plt.subplots(1, 2, figsize=(12, 5), sharey=True, sharex=True)

dts = np.linspace(-0.04, 0.04, 80)
dts_new = np.linspace(-0.04, 0.04, 300)
lv1 = deepcopy(lv)
for i, n in enumerate([10, 100]):
    lv1[lk.index('stimulation, num_stim')] = n
    ftot = stdp_n(n, lv1, dts, dts_new)
    axs[i].plot(dts_new*1000, ftot*100)
    axs[i].set_title("$N_{pairings}$=%i" % n)

axs[0].set_xlabel('$\Delta t_{STDP}$ (ms)')
axs[0].set_ylabel('$W_{total}$ (%)')
fig.savefig(fig_out_dir+'Fig_STDP.png', bbox_inches='tight', pad_inches=0.1)
plt.close(fig)

Loading data, please wait...