Source code for coolest.template.classes.lensing_entity_list

__author__ = 'aymgal'

from typing import Tuple

from coolest.template.classes.base import APIBaseObject
from coolest.template.classes.lensing_entity import LensingEntity
from coolest.template.classes.parameter import Parameter
from coolest.template.classes import util


[docs] class LensingEntityList(list, APIBaseObject): """The list of components that define the lensing system. In COOLEST, a `LensingEntity` is an instance Galaxy or a MassField. Note that unique identifiers (IDs) for each profile and parameters will be generated at instantiation time. - A given profile has a unique IDs with the following pattern: `{entity index}-{{massfield} or {galaxy}}-{{mass} or {light}}-{profile index}_{profile name}` - A given parameter has the same ID as above, just with the parameter name at the end: `{entity index}-{{massfield} or {galaxy}}-{{mass} or {light}}-{profile index}_{profile name}-{parameter name}` Parameters ---------- *entities : LensingEntity instances As many LensingEntity instances as required """ def __init__(self, *entities: Tuple[LensingEntity]): list.__init__(self, entities) APIBaseObject.__init__(self) self._create_all_ids()
[docs] def get_parameters(self, with_name=None, with_fixed=True): """Returns the list of either all parameters in the model, or only a subset of them for parameters with a specific name. Parameters ---------- with_name : str, optional Parameter for which we want to get all corresponding IDs (default: None). with_fixed : bool, optional If True, includes also fixed parameters (default: True). Returns ------- list List of parameter instances """ def _selected(param_name, param): # below we check that `param` is a Parameter instance because Grid-like parameters # do not have (yet) the possibility to be fixed (no fixed attribute). is_fixed = False if not isinstance(param, Parameter) else param.fixed ignored_if_fixed = not with_fixed and is_fixed if (with_name is None) or (param_name == with_name): return False if ignored_if_fixed else True else: return False param_list = [] for entity in self: for model_type in ('light', 'mass'): model = getattr(entity, f'{model_type}_model', None) if model is not None: for profile in model: for param_name, param in profile.parameters.items(): if _selected(param_name, param): param_list.append(param) return param_list
[docs] def get_parameter_ids(self, with_name=None, with_fixed=True): """Returns the list of either all parameter IDs in the model, or only a subset of them for parameters with a specific name. Parameters ---------- with_name : str, optional Parameter for which we want to get all corresponding IDs (default: None). with_fixed : bool, optional If True, includes also fixed parameters (default: True). Returns ------- list List of IDs (strings) """ return [p.id for p in self.get_parameters(with_name=with_name, with_fixed=with_fixed)]
[docs] def get_parameter_from_id(self, param_id): """Returns the Parameter instance that has the given parameter ID, or None. Parameters ---------- param_id : str Parameter ID Returns ------- coolest.template.classes.parameters.Parameter or None Instance of a Parameter with ID equal to `param_ID` """ # NOTE: it can be very inefficient for a large number of lensing entities for entity in self: for model_type in ('light', 'mass'): model = getattr(entity, f'{model_type}_model', None) if model is not None: for profile in model: for param in profile.parameters.values(): if param.id == param_id: return param # if the following line is reached, then no ID has been found return None
#raise ValueError("Parameter with ID '{param_id}' not found in any lensing entity.") def _create_all_ids(self): for i, entity in enumerate(self): for model_type in ('light', 'mass'): model = getattr(entity, f'{model_type}_model', None) if model is not None: for j, profile in enumerate(model): if entity.type == 'Galaxy': profile_id = util.galaxy_profile_to_id(model_type, profile.type, j, i) elif entity.type == 'MassField': profile_id = util.mass_field_profile_to_id(profile.type, j, i) profile.id = profile_id for param_name, parameter in profile.parameters.items(): param_id = util.parameter_to_id(param_name, profile.id) parameter.id = param_id