Source code for bluecellulab.simulation.neuron_globals

# Copyright 2023-2024 Blue Brain Project / EPFL

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Module that handles the global NEURON parameters."""

import logging
from typing import Optional
from typing import NamedTuple
import neuron
from bluecellulab.circuit.config.sections import Conditions, MechanismConditions
from bluecellulab.exceptions import error_context

logger = logging.getLogger(__name__)


[docs] def set_global_condition_parameters(condition_parameters: Conditions) -> None: """Sets the global condition parameters in NEURON objects if GluSynapse is available.""" if condition_parameters.extracellular_calcium is not None and hasattr( neuron.h, "cao_CR_GluSynapse" ): cao_cr_glusynapse = condition_parameters.extracellular_calcium with error_context("mechanism/s for cao_CR_GluSynapse need to be compiled"): neuron.h.cao_CR_GluSynapse = cao_cr_glusynapse mechanism_conditions = condition_parameters.mech_conditions if mechanism_conditions is not None: set_minis_single_vesicle_values(mechanism_conditions) set_init_depleted_values(mechanism_conditions) # Apply all mechanism variables generically (matching neurodamus behavior) if condition_parameters.mechanisms: for suffix, variables in condition_parameters.mechanisms.items(): for var_name, value in variables.items(): global_name = f"{var_name}_{suffix}" if hasattr(neuron.h, global_name): setattr(neuron.h, global_name, value) logger.debug("Set NEURON global %s = %s", global_name, value)
[docs] def set_init_depleted_values(mech_conditions: MechanismConditions) -> None: """Set the init_depleted values in NEURON.""" with error_context("mechanism/s for init_depleted need to be compiled"): if ( mech_conditions.glusynapse and mech_conditions.glusynapse.init_depleted is not None ): neuron.h.init_depleted_GluSynapse = mech_conditions.glusynapse.init_depleted if ( mech_conditions.ampanmda and mech_conditions.ampanmda.init_depleted is not None ): neuron.h.init_depleted_ProbAMPANMDA_EMS = ( mech_conditions.ampanmda.init_depleted ) if mech_conditions.gabaab and mech_conditions.gabaab.init_depleted is not None: neuron.h.init_depleted_ProbGABAAB_EMS = mech_conditions.gabaab.init_depleted
[docs] def set_minis_single_vesicle_values(mech_conditions: MechanismConditions) -> None: """Set the minis_single_vesicle values in NEURON.""" with error_context("mechanism/s for minis_single_vesicle need to be compiled"): if ( mech_conditions.ampanmda and mech_conditions.ampanmda.minis_single_vesicle is not None ): neuron.h.minis_single_vesicle_ProbAMPANMDA_EMS = ( mech_conditions.ampanmda.minis_single_vesicle ) if ( mech_conditions.gabaab and mech_conditions.gabaab.minis_single_vesicle is not None ): neuron.h.minis_single_vesicle_ProbGABAAB_EMS = ( mech_conditions.gabaab.minis_single_vesicle ) if ( mech_conditions.glusynapse and mech_conditions.glusynapse.minis_single_vesicle is not None ): neuron.h.minis_single_vesicle_GluSynapse = ( mech_conditions.glusynapse.minis_single_vesicle )
[docs] class NeuronGlobalParams(NamedTuple): temperature: float v_init: float
class NeuronGlobals: _instance = None def __init__(self): raise RuntimeError("Call get_instance() instead") @classmethod def get_instance(cls): if cls._instance is None: cls._instance = cls.__new__(cls) # Initialize default values cls._instance._temperature = 34.0 # Default temperature cls._instance.v_init = neuron.h.v_init # Set the default values in NEURON neuron.h.celsius = cls._instance._temperature return cls._instance @property def temperature(self): return self._temperature @temperature.setter def temperature(self, value): self._temperature = value neuron.h.celsius = value @property def v_init(self): return self._v_init @v_init.setter def v_init(self, value): self._v_init = value neuron.h.v_init = value def export_params(self) -> NeuronGlobalParams: return NeuronGlobalParams(self.temperature, self.v_init) def load_params(self, params: NeuronGlobalParams) -> None: self.temperature = params.temperature self.v_init = params.v_init
[docs] def set_neuron_globals( temperature: Optional[float] = 34.0, v_init: Optional[float] = -80.0 ) -> None: """Set the global NEURON parameters.""" if temperature is None and v_init is None: return neuron_globals = NeuronGlobals.get_instance() if temperature is not None: neuron_globals.temperature = temperature if v_init is not None: neuron_globals.v_init = v_init