kact = 0.4 ip3rtau = 2000 h.CVode().active(1) h.cvode.atol(1e-10) # define the regions for the rxd cyt = rxd.Region(h.allsec(), nrn_region='i', geometry=rxd.FractionalVolume(fc, surface_fraction=1)) er = rxd.Region(h.allsec(), geometry=rxd.FractionalVolume(fe)) cyt_er_membrane = rxd.Region(h.allsec(), geometry=rxd.FixedPerimeter(1)) # the species and other states ca = rxd.Species([cyt, er], d=caDiff, name='ca', charge=2, initial=cac_init) ip3 = rxd.Species(cyt, d=ip3Diff, initial=ip3_init) ip3r_gate_state = rxd.State(cyt_er_membrane, initial=0.8) h_gate = ip3r_gate_state[cyt_er_membrane] # pumps and channels between ER and Cytosol serca = rxd.MultiCompartmentReaction(ca[cyt] > ca[er], gserca / ((kserca / (1000. * ca[cyt]))**2 + 1), membrane=cyt_er_membrane, custom_dynamics=True) leak = rxd.MultiCompartmentReaction(ca[er] != ca[cyt], gleak, gleak, membrane=cyt_er_membrane) minf = ip3[cyt] * 1000. * ca[cyt] / (ip3[cyt] + kip3) / (1000. * ca[cyt] +
def __init__(self, x, y, z, rec=False): self.x = x self.y = y self.z = z self.soma = h.Section(name="soma", cell=self) # add 3D points to locate the neuron in the ECS self.soma.pt3dadd(x, y, z + somaR, 2.0 * somaR) self.soma.pt3dadd(x, y, z - somaR, 2.0 * somaR) # Where? -- define the intracellular space and membrane self.cyt = rxd.Region(self.soma, name="cyt", nrn_region="i") self.mem = rxd.Region(self.soma, name="mem", geometry=rxd.membrane()) cell = [self.cyt, self.mem] # Who? -- the relevant ions and gates self.k = rxd.Species(cell, name="k", d=2.62, charge=1, initial=125) self.na = rxd.Species(cell, name="na", d=1.78, charge=1, initial=10) self.n = rxd.State(cell, name="n", initial=0.25512) self.ki, self.nai = self.k[self.cyt], self.na[self.cyt] # What? -- gating variables and ion currents self.n_gate = rxd.Rate(self.n, phin * (ninf - self.n) / taun) # Nernst potentials ena = 1e3 * h.R * (h.celsius + 273.15) * log( nao / self.nai) / h.FARADAY ek = 1e3 * h.R * (h.celsius + 273.15) * log(ko / self.ki) / h.FARADAY # Persistent Na current self.nap_current = rxd.MultiCompartmentReaction( self.nai, nao, gnap * nap_minf * nap_hinf * (v - ena), mass_action=False, membrane=self.mem, membrane_flux=True, ) # Na current self.na_current = rxd.MultiCompartmentReaction( self.nai, nao, gna * minf**3 * (1.0 - self.n) * (v - ena), mass_action=False, membrane=self.mem, membrane_flux=True, ) # K current self.k_current = rxd.MultiCompartmentReaction( self.ki, ko, gk * self.n**4 * (v - ek), mass_action=False, membrane=self.mem, membrane_flux=True, ) # K leak self.k_leak = rxd.MultiCompartmentReaction( self.ki, ko, gl * (v - ek), mass_action=False, membrane=self.mem, membrane_flux=True, ) # passive leak self.soma.insert("pas") self.soma(0.5).pas.g = pas_gl self.soma(0.5).pas.e = pas_el if rec: # record membrane potential (shown in figure 1C) self.somaV = h.Vector() self.somaV.record(self.soma(0.5)._ref_v, rec)
k[ecs], na[cyt], na[ecs], cl[cyt], cl[ecs], glial_na[gcyt], glial_k[gcyt], ) # i = in cytosol (cyt) o = in extracellular (ecs) # extracellular oxygen concentration o2ecs = rxd.Species([ecs], name="o2ecs", initial=oa_bath) # STATES------------------------------------------------------------------------------------------------------------------------- # gating variables (m, h, n) mgate = rxd.State([cyt, mem], name="mgate", initial=0.00787013592322398) hgate = rxd.State([cyt, mem], name="hgate", initial=0.9981099795551048) ngate = rxd.State([cyt, mem], name="ngate", initial=0.02284760152971809) # ALL EQUATIONS------------------------------------------------------------------------------------------------------------------ gna = gnabar * mgate**3 * hgate gk = gkbar * ngate**4 fko = 1.0 / (1.0 + exp(16.0 - ko)) nkcc1 = unkcc1 * fko * (log((ki * cli) / (ko * clo)) + log( (nai * cli) / (nao * clo))) kcc2 = ukcc2 * log((ki * cli) / (ko * clo)) ena = 26.64 * log(nao / nai) # nerst equation - reversal potentials ek = 26.64 * log(ko / ki) # ^^^^^ ecl = 26.64 * log(cli / clo) # ^^^ p = p_max / (1.0 + exp((20.0 - oa_bath * alpha) / 3))
ca = rxd.Species([cyt, er], d=caDiff, name='ca', charge=2, initial=dconf['cacytinit']) caexinit = dconf['caexinit'] caextrude = rxd.Rate(ca, (caexinit - ca[cyt]) / taurcada, regions=cyt, membrane_flux=False) ip3 = rxd.Species(cyt, d=0.283, name='ip3', initial=0.0) # action of IP3 receptor Kip3 = 0.13 Kact = 0.4 minf = ip3[cyt] * 1000. * ca[cyt] / (ip3[cyt] + Kip3) / (1000. * ca[cyt] + Kact) ip3r_gate_state = rxd.State(cyt_er_membrane, initial=0.8) h_gate = ip3r_gate_state[cyt_er_membrane] k = dconf['gip3'] * (minf * h_gate)**3 ip3r = rxd.MultiCompartmentReaction(ca[er] <> ca[cyt], k, k, membrane=cyt_er_membrane) # IP3 receptor gating ip3rg = rxd.Rate(h_gate, (1. / (1 + 1000. * ca[cyt] / (0.4)) - h_gate) / 400.0) # IP3 degradation - moves towards baseline level (ip3_init) ip3degTau = 1000 # 1000 ms ip3deg = rxd.Rate(ip3, (0.0 - ip3[cyt]) / ip3degTau, regions=cyt, membrane_flux=False) ### RYR - based on Sneyd et al, 2003