"""Configuration parsing."""
# Copyright 2020-2022 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.
from configparser import ConfigParser
from enum import Enum
from emodelrunner.configuration.subgroups import (
HocPaths,
ProtArgs,
SynMechArgs,
MorphArgs,
PresynStimArgs,
)
[docs]class PackageType(Enum):
"""Enumerator for the emodel package types."""
sscx = "sscx"
thalamus = "thalamus"
synplas = "synplas"
[docs]class EModelConfigParser(ConfigParser):
"""Built-in ConfigParser annotated with package type."""
def __init__(self):
"""Constructor."""
super().__init__()
@property
def package_type(self):
"""Package type as a property."""
return PackageType[self.get("Package", "type")]
[docs] def hoc_paths_args(self):
"""Get the config data subgroup containing the paths to the hoc files."""
return HocPaths(
hoc_dir=self.get("Paths", "memodel_dir"),
cell_hoc_filename=self.get("Paths", "cell_hoc_file"),
simul_hoc_filename=self.get("Paths", "simul_hoc_file"),
run_hoc_filename=self.get("Paths", "run_hoc_file"),
syn_dir=self.get("Paths", "syn_dir"),
syn_dir_for_hoc=self.get("Paths", "syn_dir_for_hoc"),
syn_hoc_filename=self.get("Paths", "syn_hoc_file"),
main_protocol_filename=self.get("Paths", "main_protocol_file"),
)
[docs] def prot_args(self):
"""Get the subgroup containing protocols configuration data."""
return ProtArgs(
emodel=self.get("Cell", "emodel"),
apical_point_isec=self.getint("Protocol", "apical_point_isec"),
mtype=self.get("Morphology", "mtype"),
prot_path=self.get("Paths", "prot_path"),
features_path=self.get("Paths", "features_path"),
)
[docs] def syn_mech_args(self, add_synapses=None, seed=None, rng_settings_mode=None):
"""Get the data from config used when loading synapse mechanisms."""
if add_synapses is None:
add_synapses = self.getboolean("Synapses", "add_synapses")
if seed is None:
seed = self.getint("Synapses", "seed")
if rng_settings_mode is None:
rng_settings_mode = self.get("Synapses", "rng_settings_mode")
return SynMechArgs(
add_synapses=add_synapses,
seed=seed,
rng_settings_mode=rng_settings_mode,
syn_conf_file=self.get("Paths", "syn_conf_file"),
syn_data_file=self.get("Paths", "syn_data_file"),
syn_dir=self.get("Paths", "syn_dir"),
)
[docs] def morph_args(self):
"""Get morphology arguments for SSCX from the configuration object."""
morph_args = {}
morph_args["morph_path"] = self.get("Paths", "morph_path")
morph_args["do_replace_axon"] = self.getboolean("Morphology", "do_replace_axon")
if self.package_type == PackageType.sscx:
morph_args["axon_hoc_path"] = self.get("Paths", "replace_axon_hoc_path")
return MorphArgs(**morph_args)
[docs] def synplas_morph_args(self, precell=False):
"""Get morphology arguments for Synplas from the configuration object.
Args:
precell (bool): True to load precell morph. False to load usual morph.
"""
# load morphology path
if precell:
morph_path = self.get("Paths", "precell_morph_path")
else:
morph_path = self.get("Paths", "morph_path")
morph_args = {
"morph_path": morph_path,
"do_replace_axon": self.getboolean("Morphology", "do_replace_axon"),
}
return MorphArgs(**morph_args)
[docs] def presyn_stim_args(self, pre_spike_train):
"""Get the pre-synaptic stimulus config data.
Args:
pre_spike_train (list): times at which the synapses fire (ms)
"""
# spikedelay is the time between the start of the stimulus
# and the precell spike time
spike_delay = self.getfloat("Protocol", "precell_spikedelay")
# stim train is the times at which to stimulate the precell
return PresynStimArgs(
stim_train=pre_spike_train - spike_delay,
amp=self.getfloat("Protocol", "precell_amplitude"),
width=self.getfloat("Protocol", "precell_width"),
)