Source code for l2l.utils.groups

from sdict.sdict import sdictm
import logging

logging = logging.getLogger("util.groups")


[docs]class ParameterGroup: """ This class is a Dictionary which can be used to store parameters. It is used to fit the pypet already existing interface with the trajectory """ def __init__(self): self.params = {}
[docs] def f_add_parameter(self, key, val, comment=""): """ Adds parameter with name key and value val. The comment is ignored for the moment but kept for compatibility with the pypet groups :param key: Name of the parameter :param val: Value of the parameter :param comment: Ignores for the moment """ self.params[key] = val
def __str__(self): return str(self.params) def __getstate__(self): return self.__dict__ def __setstate__(self, d): self.__dict__.update(d)
class ResultGroup(sdictm): """ ResultGroup is a class derived from sdictm, which is a dictorary with parameters accessible using . (dot) Used to keep the interface with pypet trajectory result groups """ def __init__(self): self._data = {} def f_add_result_group(self, name, comment=""): """ Adds a new results group to this dictionary :param name: Name of the new result group :param comment: Ignored for the moment """ self._data[name] = ResultGroup() def f_add_result(self,key, val, comment=""): """ Adds a result in a result group. The name of the result group precedes the name of the result name and they are split by a . (dot) In case this result is not to be part of a result group, it is added to the root level of the dictionary. :param key: the name of the result to add. Preceded by a result group name if it is to be added to an existing group. Produces an error if the value is to be added to a non existent result group. :param val: Value of the result to be added :exception: Produces an exception if the value is to be added to a non existent result group. """ if '.' in str(key): subkey = key.split('.') if subkey[0] in self._data.keys(): self._data[subkey[0]].f_add_result(subkey[1], val) else: logging.exception("Key not found when adding to result group") raise Exception("Group name not found when adding value to result group") else: self._data[key] = val def f_add_result_to_group(self, group_name, key, val, comment=""): """ Adds a result in a group. :param group_name: name of the group :param key: the name of the result to add. :param val: :exception Produces an exception if the value is to be added to an inexistent result group. """ if group_name in self._data.keys(): self._data[group_name].f_add_result(key, val) else: logging.exception("Key not found when adding to result group") raise Exception("Group name not found when adding value to result group") def __str__(self): return str(self.results) def __getstate__(self): return self.__dict__ def __setstate__(self, d): self.__dict__.update(d) class ParameterDict(sdictm): """ ParameterDict is a class derived from sdictm which takes care of holding parameters in the trajectory The interface was kept to match the one from pypet parameters. """ def __init__(self, traj): super(ParameterDict, self).__init__({}) self.trajectory = traj def __getattr__(self, attr): """ This function has been overwritten in order to allow a particular access to values in the dictionary. If attr is ind_idx, it returns the id from the current result with index trajectory.v_idx :param attr: Contains the attribute name to be accessed :return: the value of the attribute name indicated by attr """ if attr == '__getstate__': raise AttributeError() if attr == 'ind_idx': return [i[0] for i in self.trajectory.current_results].index(self.trajectory.v_idx) if attr in self._INSTANCE_VAR_LIST: return object.__getattribute__(self, attr) if '.' in attr: # This is triggered exclusively in the case where __getattr__ is called from __getitem__ attrs = attr.split('.') ret = self._data.get(attrs[0]) for at in attrs[1:]: ret = ret[at] else: ret = self._data.get(attr) if ret is None: new_val = self.__class__({}) self._data[attr] = new_val ret = new_val return ret def __getstate__(self): return self.__dict__ def __setstate__(self, d): self.__dict__.update(d)