Source code for jaxley.pumps.nernstreversal
# This file is part of Jaxley, a differentiable neuroscience simulator. Jaxley is
# licensed under the Apache License Version 2.0, see <https://www.apache.org/licenses/>
from typing import Optional
import jax.numpy as jnp
from jaxley.pumps import Pump
[docs]
class CaNernstReversal(Pump):
"""Compute Calcium reversal from inner and outer concentration of calcium."""
def __init__(
self,
name: Optional[str] = None,
):
self.current_is_in_mA_per_cm2 = True
super().__init__(name)
self.channel_constants = {
"F": 96485.3329, # C/mol (Faraday's constant)
"T": 279.45, # Kelvin (temperature)
"R": 8.314, # J/(mol K) (gas constant)
}
self.channel_params = {}
self.channel_states = {"eCa": 0.0, "CaCon_i": 5e-05, "CaCon_e": 2.0}
# Note that the `self.ion_name` does not matter here, because `compute_current`
# returns 0.0 (and `self.ion_name` only sets which ion concentration the
# current should be added to).
self.ion_name = "CaCon_i"
self.current_name = f"i_Ca"
self.META = {"ion": "Ca"}
def update_states(self, u, dt, voltages, params):
"""Update internal calcium concentration based on calcium current and decay."""
R, T, F = (
self.channel_constants["R"],
self.channel_constants["T"],
self.channel_constants["F"],
)
Cai = u["CaCon_i"]
Cao = u["CaCon_e"]
C = R * T / (2 * F) * 1000 # mV
vCa = C * jnp.log(Cao / Cai)
return {"eCa": vCa, "CaCon_i": Cai, "CaCon_e": Cao}
def compute_current(self, u, voltages, params):
"""This dynamics model does not directly contribute to the membrane current."""
return 0
def init_state(self, states, voltages, params, delta_t):
"""Initialize the state at fixed point of gate dynamics."""
return {}