| instruments.py | instruments.py | |||
|---|---|---|---|---|
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | |||
| import logging | import logging, os | |||
| import configparser | ||||
| logging.basicConfig(level=logging.INFO) | logging.basicConfig(level=logging.INFO) | |||
| logger = logging.getLogger('GalPaK: Instrument: ') | import numpy as np | |||
| from .spread_functions import * | from .spread_functions import PointSpreadFunction, LineSpreadFunction, Gaus sianLineSpreadFunction, GaussianPointSpreadFunction, MoffatPointSpreadFunct ion | |||
| from . import convolution | from . import convolution | |||
| #Python3 compatibility | ||||
| try: | ||||
| basestring | ||||
| except NameError: | ||||
| basestring = str | ||||
| logger = logging.getLogger('GalPaK: Instrument ') | ||||
| def _read_psf(file_config=None): | ||||
| """ | ||||
| set PSF from config file | ||||
| """ | ||||
| psf = None | ||||
| if file_config is not None: | ||||
| if os.path.isfile(file_config): | ||||
| config = configparser.RawConfigParser() | ||||
| config.read(file_config) | ||||
| else: | ||||
| raise ValueError("PSF Config file %s not present! " % (file_con | ||||
| fig)) | ||||
| else: | ||||
| raise ValueError("PSF Config file not defined") | ||||
| config = config['PSF'] | ||||
| psf_keys={} | ||||
| for k in ['type', 'r0', 'C', 'amp', 'fwhm', 'alpha', 'beta', 'ba', 'pa' | ||||
| , 'wvl_um', 'mode']: | ||||
| if k in config.keys(): | ||||
| psf_keys[k] = k | ||||
| elif 'psf_'+k in config.keys(): | ||||
| psf_keys[k] = 'psf_'+k | ||||
| if 'type' in psf_keys: | ||||
| psf_type = config[psf_keys['type']].lower() | ||||
| logger.info("CONFIG: PSF: type {%s} found " % (psf_type)) | ||||
| else: | ||||
| logger.error("CONFIG: PSF: type not specified") | ||||
| if psf_type == 'moffat': | ||||
| psf = MoffatPointSpreadFunction | ||||
| elif psf_type == 'gaussian': | ||||
| psf = GaussianPointSpreadFunction | ||||
| elif psf_type == 'custom': | ||||
| psf = ImagePointSpreadFunction | ||||
| elif psf_type == 'maoppy': | ||||
| psf = MAOPPYPointSpreadFunction | ||||
| else: | ||||
| #@fixme add other options | ||||
| raise NotImplementedError("Currently only PSF type = `moffat` and ` | ||||
| gaussian` supported") | ||||
| args = {} | ||||
| import inspect | ||||
| var_args = inspect.getfullargspec(psf).args | ||||
| for k in var_args[1:]: | ||||
| if k in list(config.keys()): | ||||
| try: | ||||
| args[k] = eval(config[k].split()[0]) | ||||
| except: | ||||
| args[k] = config[k] | ||||
| return psf(**args) | ||||
| def _read_lsf(file_config=None): | ||||
| """ | ||||
| sets LSF from config LSF: lsf_fwhm | ||||
| :return: | ||||
| """ | ||||
| lsf = None | ||||
| if file_config is not None: | ||||
| if os.path.isfile(file_config): | ||||
| config =configparser.RawConfigParser() | ||||
| config.read(file_config) | ||||
| else: | ||||
| raise ValueError("LSF Config file %s not present! " % (file_con | ||||
| fig)) | ||||
| else: | ||||
| raise ValueError("LSF Config file not defined") | ||||
| config = config['LSF'] | ||||
| lsf_keys={} | ||||
| for k in ['type', 'fwhm']: | ||||
| if k in list(config.keys()): | ||||
| lsf_keys[k] = k | ||||
| elif 'lsf_'+k in config.keys(): | ||||
| lsf_keys[k] = 'lsf_'+k | ||||
| if 'type' in lsf_keys: | ||||
| lsf_type = config[lsf_keys['type']].lower() | ||||
| else: | ||||
| lsf_type = None | ||||
| logger.warning("CONFIG: LSF: type not specified") | ||||
| if lsf_type == 'gaussian': | ||||
| lsf = GaussianLineSpreadFunction( | ||||
| fwhm=float(config[lsf_keys['fwhm']].split()[0]) | ||||
| ) # lsf_fwhm, | ||||
| elif lsf_type is None: | ||||
| lsf = None | ||||
| else: | ||||
| #@fixme | ||||
| raise NotImplementedError | ||||
| return lsf | ||||
| def _read_instrument(file_config): | ||||
| if file_config is not None: | ||||
| if os.path.isfile(file_config): | ||||
| config = configparser.RawConfigParser() | ||||
| config.read(file_config) | ||||
| else: | ||||
| raise ValueError("Instrument Config file %s not present! " % (f | ||||
| ile_config)) | ||||
| else: | ||||
| raise ValueError("Instrument Config not defined") | ||||
| psf = _read_psf(file_config) | ||||
| try: | ||||
| lsf = _read_lsf(file_config) | ||||
| except: | ||||
| lsf = None | ||||
| logger.warning("CONFIG: LSF not found in config file") | ||||
| if 'INSTRUMENT' in config.sections(): | ||||
| config = config['INSTRUMENT'] | ||||
| myinstr = config['type'].lower() | ||||
| logger.info("CONFIG: INSTRUMENT: type {%s} found " % (myinstr)) | ||||
| if 'pixscale' in list(config.keys()): | ||||
| scale = float(config['pixscale'].split()[0]) # | ||||
| else: | ||||
| scale = None | ||||
| if 'muse' == myinstr: | ||||
| instrument = MUSE(psf=psf, lsf=lsf) | ||||
| elif 'musewfm' == myinstr: | ||||
| instrument = MUSEWFM(psf=psf, lsf=lsf) | ||||
| elif 'musenfm' == myinstr: | ||||
| instrument = MUSENFM(psf=psf, lsf=lsf) | ||||
| elif 'alma' in myinstr: | ||||
| instrument = ALMA(psf=psf, lsf=lsf, pixscale=scale) | ||||
| elif 'sinfok250' in myinstr: | ||||
| instrument = SINFOK250(psf=psf, lsf=lsf) | ||||
| elif 'sinfok100' in myinstr: | ||||
| instrument = SINFOK100(psf=psf, lsf=lsf) | ||||
| elif 'sinfoj250' in myinstr: | ||||
| instrument = SINFOJ250(psf=psf, lsf=lsf) | ||||
| elif 'sinfoj100' in myinstr: | ||||
| instrument = SINFOJ100(psf=psf, lsf=lsf) | ||||
| elif 'harmoni' in myinstr: | ||||
| instrument = HARMONI(psf=psf, lsf=lsf, pixscale=scale) | ||||
| elif 'kmos' in myinstr: | ||||
| instrument = KMOS(psf=psf, lsf=lsf) | ||||
| elif 'osiris' in myinstr: | ||||
| instrument = OSIRIS(psf=psf, lsf=lsf) | ||||
| elif 'generic' in myinstr: | ||||
| instrument = Generic(psf=psf, lsf=lsf, default_spaxel_size=scal | ||||
| e) | ||||
| else: | ||||
| # @fixme:generalize | ||||
| raise NotImplementedError | ||||
| else: | ||||
| #default | ||||
| logger.info("CONFIG: INSTRUMENT not present. Will use MUSE as defau | ||||
| lt") | ||||
| instrument = MUSE(psf=psf, lsf=lsf) | ||||
| return instrument | ||||
| class Instrument(object): | class Instrument(object): | |||
| """ | """ | |||
| This is a generic instrument class to use or extend. | This is a generic instrument class to use or extend. | |||
| psf: None|PointSpreadFunction | psf: None|PointSpreadFunction | |||
| The 2D Point Spread Function instance to use in the convolution, or None (the default). | The 2D Point Spread Function instance to use in the convolution, or None (the default). | |||
| When this parameter is None, the instrument's PSF will not be appli ed to the cube. | When this parameter is None, the instrument's PSF will not be appli ed to the cube. | |||
| lsf: None|LineSpreadFunction | lsf: None|LineSpreadFunction | |||
| The 1D Line Spread Function instance to use in the convolution, or None (the default). | The 1D Line Spread Function instance to use in the convolution, or None (the default). | |||
| Will be used in the convolution to spread the PSF 2D image through a third axis, z. | Will be used in the convolution to spread the PSF 2D image through a third axis, z. | |||
| skipping to change at line 55 | skipping to change at line 219 | |||
| if (self.xy_step is None) and (self.cube_default_xy_step is not Non e): | if (self.xy_step is None) and (self.cube_default_xy_step is not Non e): | |||
| self.xy_step = self.cube_default_xy_step | self.xy_step = self.cube_default_xy_step | |||
| if (self.z_step is not None) and (self.z_central is not None): | if (self.z_step is not None) and (self.z_central is not None): | |||
| self.z_step_kms = 3e5 * self.z_step / self.z_central | self.z_step_kms = 3e5 * self.z_step / self.z_central | |||
| else: | else: | |||
| self.z_step_kms = None | self.z_step_kms = None | |||
| if psf: | if psf: | |||
| if not isinstance(psf, PointSpreadFunction): | if isinstance(psf, basestring): | |||
| raise ValueError("PSF should be an instance of galpak.Point | psf = _read_psf(psf) | |||
| SpreadFunction") | elif not isinstance(psf, PointSpreadFunction): | |||
| raise ValueError("PSF should be an instance of galpak.Point | ||||
| SpreadFunction or a string") | ||||
| self.psf = psf | self.psf = psf | |||
| if lsf: | if lsf: | |||
| if not isinstance(lsf, LineSpreadFunction): | if not isinstance(lsf, LineSpreadFunction): | |||
| raise ValueError("LSF should be an instance of galpak.LineS preadFunction") | raise ValueError("LSF should be an instance of galpak.LineS preadFunction") | |||
| self.lsf = lsf | self.lsf = lsf | |||
| self.lsf.z_cunit = self.z_cunit | self.lsf.z_cunit = self.z_cunit | |||
| def use_pixelsize_from_cube(self, cube): | def use_pixelsize_from_cube(self, cube): | |||
| """ | """ | |||
| End of changes. 5 change blocks. | ||||
| 6 lines changed or deleted | 179 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||