Source code for rapoc.loaders.dictLoader

from astropy import units as u


[docs]class DictLoader: ''' Dict loader class. The dictionary should contain the following information under certain keys: .. csv-table:: :header: information, default units, supported keys molecular name, ,"mol" pressure grid, :math:`Pa`,"p, P, pressure, pressure_grid" temperature grid, :math:`K`,"t, T, temperature, temperature_grid" wavenumber grid, :math:`1/cm`,"wn, wavenumber, wavenumbers, wavenumbers_grid, wavenumber_grid" opacities, :math:`m^2/kg`, "opacities" If the input data has no units attached, the defaults units are assume. If they have units, a simple conversion is performed by the code to match the default values. Notes ----- This class is implicitly called by the model when initialised if the matched input is used. Examples --------- First we prepare a data dictionary. Please be aware that this are not representative of any molecule. >>> import numpy as np >>> data_dict = {'mol': 'None', >>> 'mol_mass':42, >>> 'pressure': np.array([1.00000000e+00, 1.00000000e+01, 1.00000000e+02, 1.00000000e+03, >>> 1.00000000e+04, 1.00000000e+05, 1.00000000e+06, 1.00000000e+07]), >>> 'temperature': np.array([500, 1000, 1500, 2000, 3000]), >>> 'wavenumber': np.array([100000, 1000])} >>> opac = np.ones((data_dict['pressure'].size,data_dict['temperature'].size,data_dict['wavenumber'].size,)) >>> data_dict['opacities'] = opac Let's build the Planck method using the dictionary as input >>> from rapoc import Planck >>> model = Planck(input_data=data_dict) Now the model is ready to be used ''' def __init__(self, input_data): ''' Parameters ---------- input_data: dict input_data dictionary ''' self.input_data = input_data
[docs] def read_content(self): ''' Reads the dict content and returns the needed valued for the opacity models. Returns ------- str molecule name astropy.units.Quantity: molecular mass astropy.units.Quantity: data pressure grid in si units astropy.units.Quantity: data temperature grid in si units astropy.units.Quantity: data wavenumber grid astropy.units.Quantity: data opacities grid in si units ''' global pressure_grid, temperature_grid, wavenumber_grid try: mol = self.input_data['mol'] except KeyError: raise KeyError('molecule name not found') try: mol_mass = self.input_data['mol_mass'] except KeyError: from molmass import Formula f = Formula(mol) mol_mass = (f.mass * u.u / u.ct).to(u.g / u.ct) if any(key in self.input_data.keys() for key in ['p', 'P', 'pressure', 'pressure_grid']): for press_key in ['p', 'P', 'pressure', 'pressure_grid']: try: pressure_grid = self.input_data[press_key] except KeyError: pass if isinstance(pressure_grid, u.Quantity): pressure_grid = pressure_grid.to(u.Pa) else: pressure_grid *= u.Pa else: raise KeyError('Pressure grid not found') if any(key in self.input_data.keys() for key in ['t', 'T', 'temperature', 'temperature_grid']): for temp_key in ['t', 'T', 'temperature', 'temperature_grid']: try: temperature_grid = self.input_data[temp_key] except KeyError: pass if isinstance(temperature_grid, u.Quantity): temperature_grid = temperature_grid.to(u.K) else: temperature_grid *= u.K else: raise KeyError('Temperature grid not found') if any(key in self.input_data.keys() for key in ['wn', 'wavenumber', 'wavenumbers', 'wavenumbers_grid', 'wavenumber_grid']): for wn_key in ['wn', 'wavenumber', 'wavenumbers', 'wavenumbers_grid', 'wavenumber_grid']: try: wavenumber_grid = self.input_data[wn_key] except KeyError: pass if isinstance(wavenumber_grid, u.Quantity): wavenumber_grid = wavenumber_grid.to(1 / u.cm) else: wavenumber_grid /= u.cm else: raise KeyError('Wavenumber grid not found') try: opacities = self.input_data['opacities'] if isinstance(opacities, u.Quantity): opacities = opacities.to(u.m ** 2 / u.kg) else: opacities *= u.m ** 2 / u.kg except KeyError: raise KeyError('opacities not found') return mol, mol_mass, pressure_grid, temperature_grid, wavenumber_grid, opacities, False