Source code for species.read.read_filter

"""
Module with reading functionalities for filter profiles.
"""

import os
import configparser

import h5py
import numpy as np

from scipy.interpolate import interp1d, InterpolatedUnivariateSpline

from species.data import database


[docs]class ReadFilter: """ Class for reading a filter profile from the database. """ def __init__(self, filter_name): """ Parameters ---------- filter_name : str Filter ID as stored in the database. Filter IDs from the SVO Filter Profile Service will be automatically downloaded, stored in the database, and read from the database. Returns ------- NoneType None """ self.filter_name = filter_name config_file = os.path.join(os.getcwd(), 'species_config.ini') config = configparser.ConfigParser() config.read_file(open(config_file)) self.database = config['species']['database']
[docs] def get_filter(self): """ Function for selecting a filter profile from the database. Returns ------- numpy.ndarray Filter transmission profile. """ h5_file = h5py.File(self.database, 'r') try: h5_file[f'filters/{self.filter_name}'] except KeyError: h5_file.close() species_db = database.Database() species_db.add_filter(self.filter_name) h5_file = h5py.File(self.database, 'r') data = np.asarray(h5_file[f'filters/{self.filter_name}']) h5_file.close() return data
[docs] def interpolate_filter(self): """ Function for linearly interpolating a filter profile. Returns ------- scipy.interpolate.interpolate.interp1d Linearly interpolated filter. """ data = self.get_filter() return interp1d(data[0, ], data[1, ], kind='linear', bounds_error=False, fill_value=float('nan'))
[docs] def wavelength_range(self): """ Extract the wavelength range of the filter profile. Returns ------- float Minimum wavelength (um). float Maximum wavelength (um). """ data = self.get_filter() return np.amin(data[0, ]), np.amax(data[0, ])
[docs] def mean_wavelength(self): """ Calculate the weighted mean wavelength of the filter profile. Returns ------- float Mean wavelength (um). """ data = self.get_filter() return np.trapz(data[0, ]*data[1, ], data[0, ]) / np.trapz(data[1, ], data[0, ])
[docs] def filter_fwhm(self): """ Calculate the full width at half maximum (FWHM) of the filter profile. Returns ------- float Filter full width at half maximum (um). """ data = self.get_filter() spline = InterpolatedUnivariateSpline(data[0, :], data[1, :]-np.max(data[1, :])/2.) root = spline.roots() diff = root-self.mean_wavelength() root1 = np.amax(diff[diff < 0.]) root2 = np.amin(diff[diff > 0.]) return root2-root1