TITLE Calcium ion accumulation without diffusion and buffering and calcium induced calcium release NEURON { SUFFIX cabalcicr USEION ca READ cai, ica WRITE cai USEION cask READ caski, icask WRITE caski VALENCE 2 USEION cacicr READ cacicri, icacicr WRITE cacicri VALENCE 2 :USEION adp READ adpi WRITE adpi VALENCE 0 THREADSAFE :but we make it so (this SHOULD not be a problem so long as each neuron or compartment is handled by one thread) RANGE cainit, icapump,icapumpmax,km, TotalBuffer, k1buf, k2buf, SCALE, DCa, basal, cac, cast, tog, dsk, dcicr, constrict, dense,cacicri,caski RANGE imetamax, proxy, kadp, castore POINTER ju_p, jcicr_p } DEFINE NCOMP 3 UNITS { (molar) = (1/liter) (mM) = (millimolar) (um) = (micron) (mA) = (milliamp) FARADAY = (faraday) (coulomb) PI = (pi) (1) } PARAMETER { cainit = 0.0001 (mM) dt (ms) :celsius = 35 (degC) icapumpmax = 0.00191 (mA/cm2) : 191 km = 0.000500 (mM) DCa = 0.6 (um2/ms) : diffusion constant for calcium, set to 0 to remove radial diffusion k1buf = 100 (/mM-ms) : Yamada et al k2buf = 0.1 (/ms) TotalBuffer = 0.03 (mM) basal = 0 (mM) SCALE = 1 tog = 1 constrict = 0.5 cas = 2 (mM) dsk = 0.1 dcicr = 0.01 dense = 10 : nano domains per unit length proxy = 1 : upscaling/downscaling of adp creation using ca-atpase activity as proxy. imetamax = 0.00191 (mA/cm2) : technically not amps kadp = 0.0005 (mM) } ASSIGNED { diam (um) ica (mA/cm2) icapump (mA/cm2) icask (mA/cm2) icacicr (mA/cm2) Kd (/mM) B0 (mM) cai (mM) caski (mM) cacicri (mM) frat[NCOMP] vrat[NCOMP] :castore (mM) imeta (mA/cm2) : its not actually a current, but its easier to treat as one :adpi (mM) cast (mM) :cac (mM) ju_p jcicr_p } STATE { ca[NCOMP] (mM) <1e-10> CaBuffer[NCOMP] (mM) <1e-10> Buffer[NCOMP] (mM) <1e-10> castore (mM) <1e-10> :adp (mM) <1e-8> } BREAKPOINT { SOLVE states METHOD sparse } INITIAL{ factors() cai=cainit caski = cai cacicri = cai Kd = k1buf B0 = TotalBuffer/(1+Kd*cainit) FROM i=0 TO NCOMP-1 { ca[i] = cai Buffer[i] = B0 CaBuffer[i] = TotalBuffer - B0 } castore = cas :adpi = 0 } :LOCAL frat[Nanp2] PROCEDURE factors() { frat[0] = 0: dsk*PI/4.0 : vrat[0] = constrict*diam*diam*PI/4.0 : constrict is the fraction of the compartment that is not occupied by orgenelles frat[1] = diam*dense*dsk*PI/2.0 : note smaller diam = higher concentrations vrat[1] = diam*dense*dsk*dsk*PI/8.0 : semicircle of diam dsk : dense is the number of microdomains per unit length frat[2] = diam*dense*dcicr*PI/2.0 : surface area multiplied by number vrat[2] = dense*diam*dcicr*dcicr*PI/8.0 : semicircle of diam dcicr } LOCAL dsq, dsqvol, casq, juinf, jcinf KINETIC states { COMPARTMENT i, vrat[i] {ca CaBuffer Buffer} COMPARTMENT vrat[0] {castore} COMPARTMENT vrat[0] {adp} icapump = icapumpmax*(1/(1 + km/ca[0])) :calcium only exits from outer layer FROM i = 0 TO NCOMP-2 { ~ca[i] <-> ca[i+1] (DCa*frat[i+1], DCa*frat[i+1]) : shell-shell diffusion } :~ca[0] <-> ca[1] (DCa*frat[1], DCa*frat[1]) :~ca[0] <-> ca[2] (DCa*frat[2], DCa*frat[2]) : shell-shell diffusion FROM i=0 TO NCOMP-1 { : may want to consider not buffering the nano-domain with CaT dsqvol = vrat[i] : scaling is in ~ca[i] + Buffer[i] <-> CaBuffer[i] (k1buf*dsqvol, k2buf*dsqvol) :~ca[i] <-> castore (tog*ju_p*dsqvol,tog*jcicr_p*dsqvol) : release, reuptake from ER stores } dsqvol = vrat[2] ~ca[2] + Buffer[2] <-> CaBuffer[2] (k1buf*dsqvol, k2buf*dsqvol) : ica is the non-interacting calcium component ~ca[0] << (-SCALE*(ica+icapump)*PI*diam*(1e4)/(2*FARADAY)) : this is correct because the current is going in to the dendrite with d=diam ~ca[1] << (-SCALE*(icask)*PI*diam*(1e4)/(2*FARADAY)) ~ca[2] << (-SCALE*(icacicr)*PI*diam*(1e4)/(2*FARADAY)) : this is correct because the current is going in to the dendrite with d=diam if (tog > 0) { ~castore <-> ca[2] (tog*jcicr_p*vrat[2],tog*ju_p*vrat[2]) : cicr nanodomain :~castore <-> ca[1] (0.01*tog*jcicr_p*vrat[1],tog*ju_p*vrat[1]) :~castore <-> ca[0] (0,tog*ju_p*vrat[0]) } else { castore = castore } :~adp << ((proxy*icapump-imeta)*PI*diam*(1e4)/(2*FARADAY)) : while the adp current is actually 0, it still 'works' here as if it were valence 2 FROM i=0 TO NCOMP-1 { : protect against integration edge cases that can lead to non-physiological states if(ca[i] < 0){ca[i] = 1e-8} if(Buffer[i] < 0){Buffer[i] = 1e-10} if(CaBuffer[i] < 0){CaBuffer[i] = 1e-10} } :if (adp < 0) {adp = 1e-12} :adpi = adp cai = ca[0] caski = ca[1] cacicri = ca[2] :castore = cas : don't actually change stores }