Source code for emodelrunner.factsheets.experimental_features

"""Functionality to fetch the experimental features and parameters from the json files."""

# 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.

import logging
from emodelrunner.factsheets.units import feature_units

logger = logging.getLogger(__name__)


[docs] def morphology_used_in_fitting(optimized_params_dict, emodel): """Returns the morphology name from finals.json used in model fitting. Args: optimized_params_dict (dict): contains the optimized parameters, as well as the original morphology path emodel (str): name of the emodel Returns: str: the original morphology name used in model fitting """ emodel_params = optimized_params_dict[emodel] morph_path = emodel_params["morph_path"] morph_name = morph_path.split("/")[-1] return morph_name
[docs] def get_feature_dict(feature, morphology_prefix, stimulus, location, fitness): """Return dict containing one feature. Args: feature (dict): contains feature name and mean and std of feature morphology_prefix (str): prefix used in the fitness key to the feature stimulus (str): name of the stimulus used for this feature location (str): name of the location for which the feature is calculated fitness (dict): contains the fitness of the feature Returns: dict containing name, values, unit and model fitness of the feature """ feature_name = feature["feature"] mean = feature["val"][0] std = feature["val"][1] try: unit = feature_units[feature_name] except KeyError: logger.warning( "%s was not found in units file. Setting unit to ''.", feature_name ) unit = "" key_fitness = ".".join((morphology_prefix, stimulus, location, feature_name)) try: fit = fitness[key_fitness] except KeyError: logger.warning( "%s was not found in fitness dict. Setting fitness model fitness value to ''.", key_fitness, ) fit = "" return { "name": feature_name, "values": [{"mean": mean, "std": std}], "unit": unit, "model fitness": fit, }
[docs] def get_exp_features_data( emodel, morphology_prefix, features_dict, optimized_params_dict ): """Returns a dict containing mean and std of experimental features and model fitness. Args: emodel (str): name of the emodel morphology_prefix (str): prefix used in the fitness key to the feature features_dict (dict): contains the features optimized_params_dict (dict): contains the optimized parameters, as well as the original morphology path Returns: dict containing the output feature dicts and the original morph name used in model fitting """ # pylint: disable=too-many-locals # it is hard to reduce number of locals without reducing readibility fitness = optimized_params_dict[emodel]["fitness"] values_dict = {} for stimulus, stim_data in features_dict.items(): stim_dict = {} for location, loc_data in stim_data.items(): features_list = [] for feature in loc_data: features_list.append( get_feature_dict( feature, morphology_prefix, stimulus, location, fitness ) ) loc_dict = {"features": features_list} stim_dict[location] = loc_dict values_dict[stimulus] = stim_dict values = [values_dict] fitted_morphology_name = morphology_used_in_fitting(optimized_params_dict, emodel) return { "name": "Experimental features", "values": values, "morphology": fitted_morphology_name, }