Source code for bluecellulab.circuit.validate
# 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.
"""Functionality for validation the simulation configuration."""
import re
import pandas as pd
from bluecellulab import BLUEPY_AVAILABLE
from bluecellulab.circuit.circuit_access import CircuitAccess
from bluecellulab.circuit.synapse_properties import SynapseProperty
from bluecellulab.exceptions import ConfigError, TargetDoesNotExist, ExtraDependencyMissingError
[docs]
class SimulationValidator:
"""Validates the simulation configuration, should be called before
simulation."""
def __init__(self, circuit_access: CircuitAccess) -> None:
if not BLUEPY_AVAILABLE:
raise ExtraDependencyMissingError("bluepy")
self.circuit_access = circuit_access
def validate(self) -> None:
self.check_connection_entries()
self.check_cao_cr_glusynapse_value()
self.check_spike_location()
[docs]
def check_connection_entries(self):
"""Check all connection entries at once."""
gid_pttrn = re.compile("^a[0-9]+")
for entry in self.circuit_access.config.connection_entries():
for target in (entry.source, entry.target):
if not (self.circuit_access.is_valid_group(target) or gid_pttrn.match(target)):
raise TargetDoesNotExist("%s target does not exist" % target)
[docs]
def check_cao_cr_glusynapse_value(self):
"""Make sure cao_CR_GluSynapse is equal to ExtracellularCalcium."""
condition_parameters = self.circuit_access.config.condition_parameters()
if condition_parameters.extracellular_calcium is not None:
cao_cr_glusynapse = condition_parameters.extracellular_calcium
if cao_cr_glusynapse != self.circuit_access.config.extracellular_calcium:
raise ConfigError("cao_CR_GluSynapse is not equal to ExtracellularCalcium")
[docs]
def check_spike_location(self):
"""Allow only accepted spike locations."""
if 'SpikeLocation' in self.circuit_access.config.impl.Run:
spike_location = self.circuit_access.config.impl.Run['SpikeLocation']
if spike_location not in ["soma", "AIS"]:
raise ConfigError(
"Possible options for SpikeLocation are 'soma' and 'AIS'")
[docs]
def check_nrrp_value(synapses: pd.DataFrame) -> None:
"""Assures the nrrp values fits the conditions.
Args:
synapses: synapse description
Raises:
ValueError: when NRRP is <= 0
ValueError: when NRRP cannot ve cast to integer
"""
# remove nan ones, don't check them they're an artifact of pd Join
nrrp_series = synapses[~synapses[SynapseProperty.NRRP].isna()][SynapseProperty.NRRP]
if any(nrrp_series <= 0):
raise ValueError(
'Value smaller than 0.0 found for Nrrp: '
f'in {nrrp_series}.'
)
if any(nrrp_series != nrrp_series.astype(int)):
raise ValueError(
'Non-integer value for Nrrp found: '
f'{synapses[SynapseProperty.NRRP]} at synapse {synapses}.'
)