Source code for scopesim.effects.effects_utils

import inspect
from copy import deepcopy, copy
from astropy.table import Table

from .. import effects as efs


[docs] def combine_surface_effects_OLD(surface_effects): surflist_list = [eff for eff in surface_effects if isinstance(eff, efs.SurfaceList)] surf_list = [eff for eff in surface_effects if isinstance(eff, efs.TERCurve)] if len(surflist_list) == 0: surf = empty_surface_list() surf.meta["name"] = "Radiometry Table" surflist_list += [surf] new_surflist = deepcopy(surflist_list[0]) for surflist in surflist_list[1:]: new_surflist.add_surface_list(surflist) for surf in surf_list: position = surf.meta["position"] if "position" in surf.meta else -1 new_surflist.add_surface(surf, surf.meta["name"], position=position) new_surflist.table = new_surflist.radiometry_table.table return new_surflist
[docs] def combine_surface_effects(surface_effects): surflist_list = [eff for eff in surface_effects if isinstance(eff, efs.SurfaceList)] surf_list = [eff for eff in surface_effects if isinstance(eff, (efs.TERCurve, efs.FilterWheel)) and not isinstance(eff, efs.SurfaceList)] if not surflist_list: surflist_list = [empty_surface_list(name="combined_surface_list")] new_surflist = copy(surflist_list[0]) for surflist in surflist_list[1:]: new_surflist.add_surface_list(surflist) # ..todo:: should read position from the list positions in surface_effects for surf in surf_list: position = surf.meta.get("position", -1) new_surflist.add_surface(surf, surf.meta["name"], position=position) return new_surflist
[docs] def get_all_effects(effects, effect_class): if isinstance(effect_class, (list, tuple)): my_effects = [] for eff_cls in effect_class: my_effects += get_all_effects(effects, eff_cls) else: my_effects = [eff for eff in effects if isinstance(eff, effect_class) and eff.include] return my_effects
[docs] def make_effect(effect_dict, **properties): effect_meta_dict = {key : effect_dict[key] for key in effect_dict if key not in ["class", "kwargs"]} effect_class_name = effect_dict["class"] effect_cls = getattr(efs, effect_class_name) # ..todo: add looking for custom effect class names from 3rd party packages effect_kwargs = {} effect_kwargs.update(effect_meta_dict) # effect name and description effect_kwargs.update(properties) # optical_element properties if "kwargs" in effect_dict: effect_kwargs.update(effect_dict["kwargs"]) # individual effect kwargs effect = effect_cls(**effect_kwargs) # effect.meta.update(effect_meta_dict) # is this needed? Seems redundant return effect
[docs] def is_spectroscope(effects): spec_classes = (efs.SpectralTraceList, efs.SpectralTraceListWheel) return any(isinstance(eff, spec_classes) for eff in effects)
[docs] def empty_surface_list(**kwargs): tbl = Table(names=["name", "outer", "inner", "angle", "temperature", "action", "filename"], data=[["test"], [0.], [0.], [0.], [0.], ["none"], ["none"]], meta={"outer_unit": "m", "inner_unit": "m", "angle_unit": "deg", "temperature_unit": "deg_C"}) return efs.SurfaceList(table=tbl[:0], **kwargs)
[docs] def scopesim_effect_classes(base_effect=efs.Effect): members = inspect.getmembers(efs) efs_dict = {".".join([cls.__module__, cls.__name__]).replace("scopesim.effects.", ""): cls for name, cls in members if hasattr(cls, "__mro__") and base_effect in cls.__mro__} sorted_effects = {key: efs_dict[key] for key in sorted(efs_dict)} return sorted_effects