Source code for threeML.utils.photometry.filter_library


from pathlib import Path

import astropy.units as u
import h5py
import speclite.filters as spec_filter
import yaml
from threeML.utils.progress_bar import tqdm

from threeML.io.package_data import get_path_of_data_dir
from threeML.io.logging import setup_logger


log = setup_logger(__name__)

[docs] def get_speclite_filter_path() -> Path: return get_path_of_data_dir() / "optical_filters"
[docs] def get_speclite_filter_library() -> Path: return get_speclite_filter_path() / "filter_library.h5"
[docs] class ObservatoryNode(object): def __init__(self, sub_dict): self._sub_dict = sub_dict def __repr__(self): return yaml.dump(self._sub_dict, default_flow_style=False)
[docs] class FilterLibrary(object): def __init__(self): """ holds all the observatories/instruments/filters :param library_file: """ # get the filter file with h5py.File(get_speclite_filter_library(), "r") as f: self._instruments = [] for observatory in tqdm(f.keys(), desc="Loading photometric filters"): log.debug(f"loading {observatory}") sub_dict = {} for instrument in f[observatory].keys(): sub_dict[instrument] = instrument # create a node for the observatory this_node = ObservatoryNode(sub_dict) # attach it to the object if observatory == "2MASS": xx = "TwoMass" else: xx = observatory setattr(self, xx, this_node) # now get the instruments for instrument in f[observatory].keys(): # update the instruments self._instruments.append(instrument) # create the filter response via speclite this_grp = f[observatory][instrument] filters = [] for ff in this_grp.keys(): grp = this_grp[ff] this_filter = spec_filter.FilterResponse( wavelength=grp["wavelength"][()] * u.Angstrom, response=grp["transmission"][()], meta=dict( group_name=instrument, band_name=ff, ) ) filters.append(this_filter) fgroup = spec_filter.FilterSequence(filters) # attach the filters to the observatory setattr(this_node, instrument, fgroup) self._instruments.sort() @property def instruments(self): return self._instruments
# def __repr__(self): # return yaml.dump(self._library, default_flow_style=False)
[docs] def get_photometric_filter_library(): """ Get the 3ML filter library """ if get_speclite_filter_library().exists(): return FilterLibrary() else: raise RuntimeError("The threeML filter library does not exist!")