Module nlisim.modules.molecules

Expand source code
from attr import attrs
import numpy as np
from scipy.sparse import csr_matrix

from nlisim.diffusion import periodic_discrete_laplacian
from nlisim.module import ModuleModel, ModuleState
from nlisim.state import State


@attrs(kw_only=True, repr=False)
class MoleculesState(ModuleState):
    turnover_rate: float  # units: proportion
    cyt_bind_t: float  # units: min
    rel_cyt_bind_unit_t: float
    diffusion_constant: float  # units: µm^2 * min^-1
    laplacian: csr_matrix  # units: µm^-2


class Molecules(ModuleModel):
    name = 'molecules'
    StateClass = MoleculesState

    # noinspection SpellCheckingInspection
    def initialize(self, state: State):
        from nlisim.util import TissueType

        molecules: MoleculesState = state.molecules

        molecules.cyt_bind_t = self.config.getfloat('cyt_bind_t')  # units: min
        # molecules.turnover_rate = self.config.getfloat('turnover_rate') # units: hours^-1
        molecules.diffusion_constant = self.config.getfloat(
            'diffusion_constant'
        )  # units: µm^2 * min^-1

        # NOTE: there is an implicit assumption, below, that all molecules are on the
        #  same time step and that time step is 2 minutes. This is true on Sept 13, 2021.

        # Computed values
        molecules.rel_cyt_bind_unit_t = (
            self.time_step / molecules.cyt_bind_t
        )  # units: (min/step) / (min) = 1/step
        molecules.turnover_rate = 1 - np.log(1.2) / int(
            30 / 2
        )  # TODO: still hardcoding the 2, move to individual molecules?

        # construct the laplacian
        molecules.laplacian = periodic_discrete_laplacian(
            grid=state.grid, mask=state.lung_tissue != TissueType.AIR
        )  # units: µm^-2

        return state

Classes

class Molecules (config: SimulationConfig)
Expand source code
class Molecules(ModuleModel):
    name = 'molecules'
    StateClass = MoleculesState

    # noinspection SpellCheckingInspection
    def initialize(self, state: State):
        from nlisim.util import TissueType

        molecules: MoleculesState = state.molecules

        molecules.cyt_bind_t = self.config.getfloat('cyt_bind_t')  # units: min
        # molecules.turnover_rate = self.config.getfloat('turnover_rate') # units: hours^-1
        molecules.diffusion_constant = self.config.getfloat(
            'diffusion_constant'
        )  # units: µm^2 * min^-1

        # NOTE: there is an implicit assumption, below, that all molecules are on the
        #  same time step and that time step is 2 minutes. This is true on Sept 13, 2021.

        # Computed values
        molecules.rel_cyt_bind_unit_t = (
            self.time_step / molecules.cyt_bind_t
        )  # units: (min/step) / (min) = 1/step
        molecules.turnover_rate = 1 - np.log(1.2) / int(
            30 / 2
        )  # TODO: still hardcoding the 2, move to individual molecules?

        # construct the laplacian
        molecules.laplacian = periodic_discrete_laplacian(
            grid=state.grid, mask=state.lung_tissue != TissueType.AIR
        )  # units: µm^-2

        return state

Ancestors

Inherited members

class MoleculesState (*, global_state: State)

Base type intended to store the state for simulation modules.

This class contains serialization support for basic types (float, int, str, bool) and numpy arrays of those types. Modules containing more complicated state must override the serialization mechanism with custom behavior.

Method generated by attrs for class MoleculesState.

Expand source code
class MoleculesState(ModuleState):
    turnover_rate: float  # units: proportion
    cyt_bind_t: float  # units: min
    rel_cyt_bind_unit_t: float
    diffusion_constant: float  # units: µm^2 * min^-1
    laplacian: csr_matrix  # units: µm^-2

Ancestors

Class variables

var cyt_bind_t : float
var diffusion_constant : float
var laplacian : scipy.sparse.csr.csr_matrix
var rel_cyt_bind_unit_t : float
var turnover_rate : float

Inherited members