COMMENT
BDNF kinetics
Includes extracellular and intracellular mechanisms.
Based on data provided by V. Lessmann and Kurt ???
Developers: Solinas & Migliore 2017
BDNF release
The proBDNF-containing vesicles are released with 100 s delay
after an increase of cai. To model this we must explicity model BDNF vesicles
as events triggered by a cai thereshold that execute a net_send with a probability
that is proportional to the inverse of the time step.
ENDCOMMENT
NEURON {
POINT_PROCESS BDNF
USEION ca READ cai : Weight update requires cai
: USEION bdnf READ bdnfi WRITE bdnfi VALENCE 0
RANGE max_BDNF_rel_delay, theta_cai_BDNF, max_cai_BDNF, BDNF_prel, fused_vesicles, duration_BDNF_release
RANGE proBDNF_uptake,PC_uptake,mBDNF_uptake, TrkB, proBDNF_fraction
RANGE tau_LTP14, theta_gAMPA, sigma_gAMPA, alpha_gAMPA, shift_gAMPA, v_BDNF, is, intracell_signaling
POINTER randObjPtr
POINTER gAMPA
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(uS) = (microsiemens)
(molar) = (1/liter)
(mM) = (millimolar)
FARADAY = (faraday) (coulomb)
R = (k-mole) (joule/degC)
}
PARAMETER {
cai (mM)
dt (ms)
:BDNF
: [Ca]i threshold for BDNF vesicle release
theta_cai_BDNF = 0.11 (mM)
max_cai_BDNF = 0.13 (mM)
max_BDNF_rel_delay = 400e3 (ms)
duration_BDNF_release = 1800e3 :1800e3 (ms) :30*60*1e3 = 30 min
proBDNF_uptake = 0.00001 (mM/ms)
mBDNF_uptake = 0.00001 (mM/ms)
PC_uptake = 0.00001 (mM/ms)
: Time step for BDNF vesicle release
cai_integration_time_step = 1 (ms)
: Normalisation factor to convert [Ca]i * cai_integration_time_step to a unitless number
alpha_dt_cai = 1.2 (1/mM 1/ms)
: Vesicles
n_vesicles = 300 (1)
v_BDNF = 0.002 (mM)
proBDNF_fraction = 0.7
v_PC = 0.002 (mM)
: Cleavage
tau_cleave = 10000.0 (ms/mM) : alpha_cleave = 1e-4 (mM/ms)
:rb_BDNF = 0 : uncleaving is not allowd ??
:TrkB
tau_LTP14 = 180e3 :1800e3 (ms) : 1 min = 60e3 ms, 30 min = 1800e3 ms
theta_TrkB = 0.0002 (mM)
sigma_TrkB = 0.00001 (mM)
gbar_AMPA = 1 (nS)
scale_AMPA = 100 (1)
alpha_gAMPA = 0.5
theta_gAMPA = 0.5
sigma_gAMPA = 0.1
shift_gAMPA = 0
: intracell signaling is udes to have a decay of [Ca]i efficacy on BDNF release
: so that only stimuli given at 0.5 Hz are effective on triggering BDNF release
: while stimuli given at 0.05 Hz are not effective
is_decay = 0.1e-3 (/ms) : tau = 10 sec, decay rate of intracell_signaling (is)
: max_fused_vesicles = 0
}
ASSIGNED {
BDNF_prel (1)
randObjPtr
cai_th_crossed (1)
gAMPA (nS)
gAMPA_g
alpha_LTP14 (mM/ms)
mBDNF_fraction
fusion_delay (ms)
v_prel_norm (1)
n_avail_vesicles (1)
cai_factor (1)
: alpha_cleave = 1 / tau_cleave
}
STATE {
: v_proBDNF (mM)
: v_PC (mM)
fused_vesicles (1)
proBDNF (mM)
mBDNF (mM)
ppBDNF (mM)
PC (mM) : tPA in paper, PC in Lessman sketch
proBDNF_PC (mM)
TrkB (mM)
proBDNF_removed (mM)
mBDNF_removed (mM)
PC_removed (mM)
is (1)
intracell_decay (1)
intracell_signaling (mM)
}
INITIAL {
fused_vesicles = 0
cai_th_crossed = 0
proBDNF = 0
mBDNF = 0
ppBDNF = 0
PC = 0
proBDNF_removed = 0
mBDNF_removed = 0
ppBDNF = 0
PC_removed = 0
is = 0
intracell_decay = 0
intracell_signaling = 0
mBDNF_fraction = 1 - proBDNF_fraction
alpha_LTP14 = 1/tau_LTP14
TrkB = 0 (mM)
: v_prel_norm = 1/(n_vesicles * alpha_dt_cai * cai_integration_time_step * theta_cai_BDNF)
n_avail_vesicles = n_vesicles
}
BREAKPOINT {
SOLVE kstates METHOD sparse
: gAMPA = gbar_AMPA * TrkB
: gAMPA = gAMPA_g
}
KINETIC kstates {
: if (t/60e3 > 0.1) {
: if (t/60e3 < 4) {
: fused_vesicles = max_fused_vesicles
: : printf("fused %g maxfu %g\n",fused_vesicles,max_fused_vesicles)
: }
: }
~ is <-> intracell_decay (is_decay,0)
: printf("isk %g\n",is)
: Release the proBDNF, mBDNF, and PC
: Release is mantianed for a time of x
: Protracted vesicular release
: printf("BDNF curr: %g\n",v_BDNF * proBDNF_fraction * fused_vesicles / duration_BDNF_release)
~ proBDNF << (v_BDNF * proBDNF_fraction * fused_vesicles / duration_BDNF_release)
~ mBDNF << (v_BDNF * mBDNF_fraction * fused_vesicles / duration_BDNF_release)
~ PC << (v_PC * fused_vesicles / duration_BDNF_release)
: proBDNF cleavage
~ proBDNF + PC <-> proBDNF_PC (1/tau_cleave,0)
~ proBDNF_PC <-> ppBDNF + mBDNF + PC (1/tau_cleave,0)
: Uptake or diffusion from synaptic cleft
~ proBDNF <-> proBDNF_removed (proBDNF_uptake, 0)
~ mBDNF <-> mBDNF_removed (mBDNF_uptake, 0)
~ PC <-> PC_removed (PC_uptake, 0)
~ fused_vesicles <-> fused_vesicles (0,0)
: TrkB activation
TrkB = mBDNF * sigh(mBDNF, theta_TrkB, sigma_TrkB)
~ TrkB <-> intracell_signaling (alpha_LTP14, 0)
:gAMPA_g = gbar_AMPA * TrkB/scale_AMPA
gAMPA = 1 + alpha_gAMPA * sigh(intracell_signaling, theta_gAMPA, sigma_gAMPA) + shift_gAMPA
}
FUNCTION sigh(x (mM), theta (mM), sigma (mM)) {
: LOCAL e
: e = (x - theta) / sigma
: if ( -e > 700 ) {
: printf("%f\t",(-(x - theta) / sigma))
: }
sigh = 1 / (1 + exp((theta - x) / sigma))
}
VERBATIM
#ifndef NRN_VERSION_GTEQ_8_2_0
double nrn_random_pick(void* r);
void* nrn_random_arg(int argpos);
#define RANDCAST
#else
#define RANDCAST (Rand*)
#endif
ENDVERBATIM
FUNCTION randGen() {
VERBATIM
if (_p_randObjPtr) {
/*
:Supports separate independent but reproducible streams for
: each instance. However, the corresponding hoc Random
: distribution MUST be set to Random.uniform(0,1)
*/
_lrandGen = nrn_random_pick(RANDCAST _p_randObjPtr);
}else{
hoc_execerror("Random object ref not set correctly for randObjPtr"," only via hoc Random");
}
ENDVERBATIM
}
PROCEDURE setRandObjRef() {
VERBATIM
void** pv4 = (void**)(&_p_randObjPtr);
if (ifarg(1)) {
*pv4 = nrn_random_arg(1);
}else{
*pv4 = (void*)0;
}
ENDVERBATIM
}
FUNCTION min(x,y) { if (x<=y){ min = x }else{ min = y } }
NET_RECEIVE (weight (1)) { LOCAL prel, is_effect
if ((flag == 0) && (cai_th_crossed == 0) ) { : the netcon is indicating that the theta_cai_BDNF was crossed
cai_th_crossed = 1
: step increase of intracell signaling caused by [Ca]i LTP14 threshold crossing
is = is + 0.1
: printf("is %g\n",is)
: printf("Cai crossed th at t %g\n",t)
: Calculate a probability of release proportional to cai e to dt only if there are vesicles for fusion
if (n_avail_vesicles > 0) {
net_send(cai_integration_time_step,2) : keep on watching cai
}
}
if (flag == 2 && n_avail_vesicles > 0) {
: Calculate a probability of release proportional to cai, cai_dt, :and number of available vesicles
cai_factor = (cai - theta_cai_BDNF) / (max_cai_BDNF - theta_cai_BDNF)
if (is > 0.15) {
is_effect = 1
} else {
is_effect = 0
}
prel = alpha_dt_cai * cai_integration_time_step * min(1,cai_factor) * is_effect: * n_avail_vesicles/n_vesicles
: prel = (1-((n_vesicles-n_avail_vesicles)/n_vesicles)^2) * alpha_dt_cai * cai_integration_time_step * cai
: printf("Prel: vesicles, constant, cai_ratio %g\t%g\t%g\n", n_avail_vesicles/n_vesicles, alpha_dt_cai * cai_integration_time_step, (cai - theta_cai_BDNF) / (max_cai_BDNF - theta_cai_BDNF))
if ( randGen() < prel ) {
BDNF_prel = prel
: Relase one BDNF vesicle in the future
: printf("Release bdnf t %g\n",t)
: Calc the delay of vesicle fusion, :when many vesicles are available the delay is shorter
fusion_delay = max_BDNF_rel_delay * (1 - min(1,cai_factor)) * randGen()
net_send(fusion_delay, 3)
n_avail_vesicles = n_avail_vesicles - 1
: printf("future: dt %g\t%g\t%g\t%g\n", t+fusion_delay, max_BDNF_rel_delay, max_BDNF_rel_delay * (1 - min(1,cai_factor)), (cai - theta_cai_BDNF) / (max_cai_BDNF - theta_cai_BDNF))
: printf("Trigger bdnf release in the future: dt %g\t%g\t%g\t%g\n",BDNF_prel, t+fusion_delay, max_BDNF_rel_delay, n_avail_vesicles)
:printf("Trigger bdnf release in the future: dt %g\t%g\t%g\n",BDNF_prel, cai, dt)
}
: Continue releasing each ms till cai is above threshold only if there are vesicles available for fusion
if (cai > theta_cai_BDNF) {
if (n_avail_vesicles > 0) {
net_send(cai_integration_time_step,2) : keep on watching cai
}
} else {
cai_th_crossed = 0
}
}
if (flag == 3) {
: Increase counter of fused vesicles
fused_vesicles = fused_vesicles + 1
: printf("Fusing a vesicle %g\t%g\n",fused_vesicles,t)
net_send(duration_BDNF_release,4)
}
if (flag == 4) {
: Decrease counter of fused vesicles
fused_vesicles = fused_vesicles - 1
}
}